翻译本文档,系统学习以下数据的预处理方式。
原文档地址:https://scikit-learn.org/stable/modules/preprocessing.html#preprocessing
4.3 预处理数据
sklearn.preprocessing
包提供了几种常用的工具函数以及转换类来将原始的特征向量数据转换为更加适合后续模型使用的表达。
一般来说,学习算法能够从数据集的标准化中受益。如果数据集中存在异常数据,那么健壮的scalers
和transformers
会更适用(这里没有对scalers和transformer进行翻译,目的是保持和API的一种联系)。不同的scalers
,transformers
和normalizers
在包含边缘异常数据的数据集上的表现可以参考这篇文章:包含异常数据的数据集上的不同scalers
的效果比较。
4.3.1 Standardization
PS: 这个也称之为均值移除+方差缩放。在深入到背后的原理后,就更好理解了。
对数据集进行标准化,是很多scikit-learn
中的机器学习预测器的要求。如果有单个特征不是多多少受看起来像是标准正态分布–均值为0方差为1的高斯分布,那模型的表现可能就很差。
实际上,我们通常会选择忽略数据的分布形状,而是直接对数据变换:通过对每个特征去除均值使其中心分布,然后对非常数特征进行缩放,使其方差为1。
比如,很多学习算法中的目标函数的组成元素假定了所有的特征是均值为0且方差在同一量级的。如果某个特征的方差的数量级大于其他的特征,那么它就可能主导整个目标函数,使得学习器不能从其他特征中学到我们期待的东西。
函数scale
为我们提供了一个快速易用的方法,对数组类型的数据集执行标准化操作:
# scale函数
from sklearn import preprocessing
import numpy as np
X_train = np.array([
[1., -1., 2.],
[2., 0., 0.],
[0., 1., -1.]
])
X_scaled = preprocessing.scale(X_train)
X_scaled
输出结果:
array([[ 0. , -1.22474487, 1.33630621],
[ 1.22474487, 0. , -0.26726124],
[-1.22474487, 1.22474487, -1.06904497]])
>>> X_scaled.mean(axis=0)
array([0., 0., 0.])
>>> X_scaled.std(axis=0)
array([1., 1., 1.])
可以看出,通过调用preprocessing.scale(X_train)
可以将数据集变成标准正态分布。
实际上,preprocessing
模块进一步提供了一个工具类叫StandardS