sklearn.preprocessing.StandardScaler
sklearn.preprocessing.LabelEncoder
sklearn.preprocessing.minmax_scale
sklearn.preprocessing.RobustScaler
StandardScaler
这个实质上就是将数据减去均值除以标准差,那为什么不直接做,而用StandardScaler呢,其好处是可以保存均值和方差供后续使用
比如下面这个:
前面的训练数据先fit,然后transform来中心化后,后面的测试数据直接用之前的均值和方差来transform
那么用StandardScaler的目的是什么呢,官网教程说的非常清楚了:数据集的标准化是许多机器学习估计的共同要求,如果一个特征对应的数据的方差很大,那么它可能支配目标函数,使得模型无法向预期那样学习其它特征。
观察上面的代码,原文有这么一句:Standardization cannot be done before the partitioning, as we don’t want to fit the StandardScaler on some observations that will later be used in the test set.
就是说测试数据和训练数据不能放到一起预处理,而应该先用测试数据预处理,然后将预处理的结果用在测试数据上
LabelEncoder
就是将特征列的类别变为0-num_class-1之间,即对不连续的数字和文本进行编号,也没找到具体这么做的原因?
具体使用如下:
minmax_scale
sklearn.preprocessing.minmax_scale(X, feature_range=(0, 1), axis=0, copy=True)
将数据转为指定范围,做如下处理
RobustScaler
如果数据有离群点,对数据进行均差和方差的标准化效果不好,这种情况可以使用robust_scale和RobustScaler,它们有对数据中心化和数据的缩放鲁棒性更强的参数;根据第1个四分位数和第3个四分位数之间的范围来缩放数据[这里我也不知道为什么用1-3的范围来缩放数据后会有什么明显的变化,下面的图示也不是非常清楚]
接收参数中X为一个二维数组[n_samples,n_features]
在官网的例子中,是将离群点给删除了,这个函数并不能删除离群点
原始数据如下图所示:
官网的代码Compare the effect of different scalers on data with outliers看的特别头大,一点都不简洁,实际上就是做了下面的处理:将数据标准化,然后去除异常点(这里取得是大于最小的[并不是一一对应],小于第二大的)
同样以上面的数据为例,看看该异常数据在使用StandardScaler和使用RobustScaler的区别:
原始数据:
StandardScaler后的数据
RobustScaler后的数据
给出一些相关的比较好的文章
机器学习基础与实践(二)——数据转换