sklearn.preprocessing包:
preprocessing.Binarizer
preprocessing.FunctionTransformer
preprocessing.Imputer
preprocessing.KernelCenterer
preprocessing.LabelBinarizer
preprocessing.LabelEncoder
preprocessing.MultiLabelBinarizer
preprocessing.Normalizer
preprocessing.OneHotEncoder
preprocessing.PolynomialFeatures
preprocessing.add_dummy_feature
preprocessing.binarize
preprocessing.label_binarize
1、preprocessing.scale
preprocessing.StandardScaler
2、preprocessing.maxabs_scale
preprocessing.minmax_scale
3、preprocessing.MaxAbsScaler
preprocessing.maxabs_scale
4、preprocessing.RobustScaler
preprocessing.robust_scale
5、preprocessing.QuantileTransformer
preprocessing.quantile_transform
数据集标准化:是机器学习算法中必备的过程。
对于数据集中的个别特征,看起来或多或少与标准正态分布(具有零均值和单位方差)有差异,则这些数据的在学习的算法的就不会有很好的表现。
通常情况下,经常忽略特征向量的分布情况,而是直接用均值对某个特征进行中心化,再除以标准差进行缩放。
使用sklearn.preprocessing.scale()函数,来实现对数组形式的数据集进行标准化
示例代码:
preprocessing.StandardScaler():在训练数据集上进行计算平均值和标准差,在测试集上能直接使用相同的变换。
也可以通过在构造函数:class:StandarScaler中传入参数with_mean=False或者with_std=False来取消中心化或缩放操作
2、将特征缩放至特定范围内
使用minmax_scale进行给定范围内的特征缩放,一般给定的范围是【0,1】之间。
使用maxabs_scale将特征的最大绝对值转换为单位大小。将训练集数据缩放到【-1,1】之间,缩放后的数据集是零中心化或是稀疏矩阵了。
目的:实现特征最小方差的鲁棒性,或在稀疏矩阵中保留零元素。
鲁棒性:是控制系统对特性或参数扰动的不敏感性。
示例代码:
实现和训练数据一致的缩放和移位操作:
3、稀疏矩阵缩放
当稀疏矩阵的几个特征向量不在同一个量级范围下,要考虑对其进行缩放。
使用preprocessing.MaxAbsScaler和 preprocessing.maxabs_scale,进行特征向量进行放缩
对稀疏矩阵不能进行中心化处理,因为这种处理方法会破坏稀疏矩阵的结构。
4、离群值的数据的缩放
使用preprocessing.RobustScaler和 preprocessing.robust_scale对离群数据进行缩放
离群数据一般都是异常数据,不能使用均值或方差的缩放进行数据处理。
5、非线性转换
使用preprocessing.QuantileTransformer 和 preprocessing.quantile_transform对非线性数据特征进行转换(类似于缩放)。
preprocessing.QuantileTransformer 将每个特征缩放在同样的范围或分布下。通过执行一个秩转换能够使异常的分布平滑化,并且能够比缩放更少的收到离群值的影响(但会使特征间及特征内的关联和距离失真)。
preprocessing.QuantileTransformer类以及 quantile_transform函数提供了一个基于分位数函数的无参数转换,将数据映射到了【0,1】均匀分布上。
示例代码:
使用sklearn.datasets中的iris数据集来举例说明:
归一化
是缩放单个样本以具有单位范数
的过程,如果使用二次行驶(如点积或任何其他核函数)来量化任何样本的相似度,归一化将显得及其出色。使用normalize
对数据集进行归一化处理。Normalization
主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。范数是泛函分析中定义的一个基本概念,定义在赋范线性空间中,且满足非负性,齐次性,三角不等式。常被用于度量某个向量空间中每个向量的长度和大小。最常用的范数是范数:若,那么我们将形如的距离称为范数。
二值化特征二值化
是将数值特征用阈值过滤得到布尔值
的过程。在文字处理中即使归一化计数(术语频率)和TD-IDF值特征在实践中表现稍好一些,处于简化概率估计的考虑,常常会选择使用二值化特征值。
在机器学习中,特征经常不是数据型而是分类型,虽然可以将这些分类型特征编码成整数,但是这些整数特征并不能在scikit-learn的估计器中使用,因为输入的是整数特征,估计器会认为类别之间是有序的,但实际却是无序的。故一般使用one-of-K或ono-hot编码进行分类特征转换。sklearn使用preprocessing.OneHotEncoder()
实现,该函数使用m个可能值转换为m值化特征,将分类特征的每个元素转化为一个值。
因为诸多因素,有时候我们得到的数据往往包含缺失,这些缺失值被编码成空格、NANs,或者其它占位符。由于这些数据集不能被scikit-learn算法所兼容,因为大多数的机器学习算法默认数组中的元素都是数值,每个元素都有自己的意义。对于一些没有价值的数据,处理的基本策略是直接舍弃整行或整列包含缺失值的数据。当然,最好的办法还是从已有的数据中推断出缺失的值。scikit-learn
使用Imputer
类估算缺失值,使用缺失值所在的行、列中的平均值、中位数或者众数来填充,这种处理方式显然是有点粗糙的,如果需要更高的要求可以使用scipy
的interpolate
中的插值函数进行估计,也可以使用回归分析进行预测。这里不再详细说明,可以参考数据预处理
。
在机器学习中,通过增加一些输入数据的非线性特征来增加模型的复杂度通常是十分有效的,一个比较简单的实现就是使用多项式特征。
显然,特征已从转换为
在一些情况下,只需要特征间的交互项,此时可以通过设置interaction_only=True
得到:
特征由转换为
在机器学习中,如果想要将一个函数转化为一个转换器来协助数据清理或处理,可以使用FunctionTransformer
将任意函数实现为转换器。如,构建一个实现日志转换的转换器。