sklearn.preprocessing包提供了几个常用的转换函数,用于把原始特征向量转换为更适合估计器的表示。

转化器(Transformer)用于对数据的处理,例如标准化、降维以及特征选择等,提供的函数大致是:

  • fit(x,y):该方法接受输入和标签,计算出数据变换的方式。
  • transform(x):根据已经计算出的变换方式,返回对输入数据x变换后的结果(不改变x)
  • fit_transform(x,y) :该方法在计算出数据变换方式之后对输入x就地转换。

在转化器中,fit_transform()函数等价于先执行fit()函数,后执行transform()函数。有如下的数据,使用preprocessing包对数据进行标准化和归一化处理:

from sklearn import preprocessing
import numpy as np X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])

一,数据标准化

数据标准化是指对数据经过处理后,使每个特征中的数值的均值变为0,标准差变为1。

1,标准正态分布

scale()是数据标准化的快捷方式:

X_scaled = preprocessing.scale(X_train)

对应的fit-transform组合是:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train)

2,把数据缩放到范围

把数据缩放到给定的范围内,通常在0和1之间,或者使用每个特征的最大绝对值按比例缩放到单位大小。

MinMaxScaler(feature_range=(0, 1), copy=True)
MaxAbsScaler(copy=True)

举个例子,MinMaxScaler() 用于把数据按照max和min缩放到0和1之间,其中max和min是缩放区间的最大值和最小值,缩放的公式如下:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

使用MinMaxScaler()函数进行缩放:

scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
X_scaled=scaler.fit_transform(X_train)

二,数据归一化

通过对原始数据进行线性变换把数据映射到[0,1]或[-1,1]之间,常用的变换函数为:

sklearn提供函数normalize或者fit-transform组合来实现数据的归一化。参数norm是用于标准化每个非0数据的范式,可用的值是 l1和l2 范式,默认值是l2范式。

#X_normalized = preprocessing.normalize(X, norm='l2')
normalizer = preprocessing.Normalizer( norm='l2').fit(X)
normalizer.transform(X) #out
array([[ 0.40..., -0.40..., 0.81...],
[ 1. ..., 0. ..., 0. ...],
[ 0. ..., 0.70..., -0.70...]])

三,对分类数据进行编码

把分类数据(标称数据)转换为数值编码,以整数的方式表示,对分类数据编码,有两种方式:顺序编码 和 OneHot编码。

1,顺序编码

顺序编码把每一个categorical 特征变换成有序的整数数字特征 (0 到 n_categories - 1),然而,这种整数表示不能直接用于所有scikit-learn估计器,因为估计器期望连续输入,并且把类别解释为有序的,但是,集合通常是无序的,无法实现顺序。

enc = preprocessing.OrdinalEncoder()
X = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
enc.fit(X)
enc.transform([['female', 'from US', 'uses Safari']])
array([[0., 1., 1.]])

有序编码对象中包含 categories_ 属性,用于查看分类数据:

>>> enc.categories_
[array(['female', 'male'], dtype=object), array(['from Europe', 'from US'], dtype=object), array(['uses Firefox', 'uses Safari'], dtype=object)]

把转换的结果 [0., 1., 1.],代入到categories_ 属性中,数组的第一个元素是0,对应categories_ 属性中female类别;数组的第二个元素是1,对应categories_ 属性中from US类别,以此类推。

2,OneHot编码

另外一种将标称型特征转换为能够被scikit-learn中模型使用的编码是OneHot(独热码)、one-out-of-N(N取一编码)或dummy encoding(虚拟编码),这种编码类型已经在类OneHotEncoder中实现,该类把每一个具有n个可能取值的categorical特征变换为长度为n的特征向量,里面只有一个地方是1,其余位置都是0。

>>> from sklearn import preprocessing
>>> enc = preprocessing.OneHotEncoder()
>>> X = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
>>> enc.fit(X)
>>> enc.transform([['female', 'from US', 'uses Safari']]).toarray()
[[1., 0., 0., 1., 0., 1.]]
>>> enc.categories_
[array(['female', 'male'], dtype=object), array(['from Europe', 'from US'], dtype=object), array(['uses Firefox', 'uses Safari'], dtype=object)]

如何理解OneHot编码的结果?原始数据中,有三个特征,分别是Gender、From 和 Browser,每个特征有2个取值,OneHot编码在原始数据中新增6个特征,分别是female、male、from Europe、from US、uses Firefox和uses Safari。

对于数据点 ['female', 'from US', 'uses Safari']的取值,对分类数据的编码结果是:[1., 0., 0., 1., 0., 1.],这对应着新增特征(female, male, from Europe, from US, uses Firefox, uses Safari)的取值:

属性categories_  是长度为n的特征向量,代表新增特征(female, male, from Europe, from US, uses Firefox, uses Safari)。

三,离散化

离散化 (Discretization) 也叫 分箱(binning),用于把连续特征划分为离散特征值。

sklearn.preprocessing.KBinsDiscretizer(n_bins=5, encode=’onehot’, strategy=’quantile’)

参数注释:

n_bins:分箱的数量,默认值是5,也可以是列表,指定各个特征的分箱数量,例如,[feature1_bins,feature2_bins,...]

encode:编码方式,{‘onehot’, ‘onehot-dense’, ‘ordinal’}, (default=’onehot’)

  • onehot:以onehot方式编码,返回稀疏矩阵
  • onehot-dense:以onehot方式编码,返回密集矩阵
  • ordinal:以ordinal方式编码,返回分箱的序号

strategy:定义分箱宽度的策略,{‘uniform’, ‘quantile’, ‘kmeans’}, (default=’quantile’)

  • uniform:每个分箱等宽
  • quantile:每个分箱中拥有相同数量的数据点
  • kmeans:每个箱中的值具有与1D k均值簇最近的中心

举个例子,对于以下二维数组,有三个特征,可以创建分箱数组,为每个维度指定分箱的数量:

from sklearn import preprocessing
X = np.array([[ -3., 5., 15 ],
[ 0., 6., 14 ],
[ 6., 3., 11 ]])
est = preprocessing.KBinsDiscretizer(n_bins=[3, 2, 2], encode='ordinal').fit(X)
est.transform(X)
#out
array([[ 0., 1., 1.],
[ 1., 1., 1.],
[ 2., 0., 0.]])

参考文档:

归一化和标准化的一些理解

5.3. Preprocessing data

sklearn 第二篇:数据预处理的更多相关文章

  1. sklearn中的数据预处理和特征工程

    小伙伴们大家好~o( ̄▽ ̄)ブ,沉寂了这么久我又出来啦,这次先不翻译优质的文章了,这次我们回到Python中的机器学习,看一下Sklearn中的数据预处理和特征工程,老规矩还是先强调一下我的开发环境是 ...

  2. 机器学习实战基础(八):sklearn中的数据预处理和特征工程(一)简介

    1 简介 数据挖掘的五大流程: 1. 获取数据 2. 数据预处理 数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字 ...

  3. matlab、sklearn 中的数据预处理

    数据预处理(normalize.scale) 0. 使用 PCA 降维 matlab: [coeff, score] = pca(A); reducedDimension = coeff(:,1:5) ...

  4. 机器学习实战基础(十):sklearn中的数据预处理和特征工程(三) 数据预处理 Preprocessing & Impute 之 缺失值

    缺失值 机器学习和数据挖掘中所使用的数据,永远不可能是完美的.很多特征,对于分析和建模来说意义非凡,但对于实际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的 ...

  5. 机器学习实战基础(九):sklearn中的数据预处理和特征工程(二) 数据预处理 Preprocessing & Impute 之 数据无量纲化

    1 数据无量纲化 在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”.譬如梯度和矩阵为核心的算法中,譬如逻辑回 ...

  6. Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别

    敲<Python机器学习及实践>上的code的时候,对于数据预处理中涉及到的fit_transform()函数和transform()函数之间的区别很模糊,查阅了很多资料,这里整理一下: ...

  7. 机器学习实战基础(十三):sklearn中的数据预处理和特征工程(六)特征选择 feature_selection 简介

    当数据预处理完成后,我们就要开始进行特征工程了. 在做特征选择之前,有三件非常重要的事:跟数据提供者开会!跟数据提供者开会!跟数据提供者开会!一定要抓住给你提供数据的人,尤其是理解业务和数据含义的人, ...

  8. 机器学习实战基础(十四):sklearn中的数据预处理和特征工程(七)特征选择 之 Filter过滤法(一) 方差过滤

    Filter过滤法 过滤方法通常用作预处理步骤,特征选择完全独立于任何机器学习算法.它是根据各种统计检验中的分数以及相关性的各项指标来选择特征 1 方差过滤 1.1 VarianceThreshold ...

  9. 机器学习实战基础(十二):sklearn中的数据预处理和特征工程(五) 数据预处理 Preprocessing & Impute 之 处理分类特征:处理连续性特征 二值化与分段

    处理连续性特征 二值化与分段 sklearn.preprocessing.Binarizer根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量.大于阈值的值映射为1,而小于或等于阈值的值 ...

随机推荐

  1. 容器化之Docker小知识普及

    Docker确实是个好东西,相当于一个小型虚拟机,里面环境隔离只要有对应的镜像就能运行业务应用.运行基础应用.能跑数据库等等,还能跑linux等等. Docker 从狭义上来讲就是一个进程,从广义上来 ...

  2. 【设计模式】行为型07备忘录模式(Memento Pattern)

    参考地址:http://www.runoob.com/design-pattern/memento-pattern.html 对原文总结调整,以及修改代码以更清晰的展示: 备忘录模式(快照模式):   ...

  3. spring源码深度解析— IOC 之 自定义标签解析

    概述 之前我们已经介绍了spring中默认标签的解析,解析来我们将分析自定义标签的解析,我们先回顾下自定义标签解析所使用的方法,如下图所示: 我们看到自定义标签的解析是通过BeanDefinition ...

  4. java-NIO-FileChannel(文件IO)

    Java NIO中的FileChannel是一个连接到文件的通道.可以通过文件通道读写文件. FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下. 对于文件的复制,平时我们都是使用输入 ...

  5. Codeforces 778A:String Game(二分暴力)

    http://codeforces.com/problemset/problem/778/A 题意:给出字符串s和字符串p,还有n个位置,每一个位置代表删除s串中的第i个字符,问最多可以删除多少个字符 ...

  6. sqlserver、oracle数据库排序空值null问题解决办法

    转:https://www.cnblogs.com/pacer/archive/2010/03/02/1676371.html [sqlserver]: sqlserver 认为 null 最小. 升 ...

  7. MySQL数据库设计与开发规范

    目录 1. 规范背景与目的 2. 设计规范 2.1. 数据库设计 2.1.1. 库名 2.1.2. 表结构 2.1.3. 列数据类型优化 2.1.4. 索引设计 2.1.5. 分库分表.分区表 2.1 ...

  8. 56. Merge Interval

    56. Merge Interval 0. 参考文献 序号 文献 1 花花酱 LeetCode 56. Merge Intervals 2 [LeetCode] Merge Intervals 合并区 ...

  9. async与await详解

    async和await只是编译器功能.编译器会用Task类创建代码.如果不适用这两个关键字,也可以用C#4.0和Task类实现同样的功能,只是没有那么方便. 题主在概念上确实混淆的不行,但是确实asy ...

  10. leetcode 141 Linked List Cycle Hash fast and slow pointer

    Problem describe:https://leetcode.com/problems/linked-list-cycle/ Given a linked list, determine if ...