sklearn中的数据预处理

sklearn.preprocessing.StandardScaler
sklearn.preprocessing.LabelEncoder
sklearn.preprocessing.minmax_scale
sklearn.preprocessing.RobustScaler

StandardScaler

这个实质上就是将数据减去均值除以标准差,那为什么不直接做,而用StandardScaler呢,其好处是可以保存均值和方差供后续使用
比如下面这个:

1
2
X_train.loc[:, numerical_features] = stdSc.fit_transform(X_train.loc[:, numerical_features])
X_test.loc[:, numerical_features] = stdSc.transform(X_test.loc[:, numerical_features])

前面的训练数据先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之间,即对不连续的数字和文本进行编号,也没找到具体这么做的原因?
具体使用如下:

1
2
3
lbl = LabelEncoder()
lbl.fit(list(all_data['Mosold'].values))
all_data[c] = lbl.transform(list(all_data['Mosold'].values))

minmax_scale

sklearn.preprocessing.minmax_scale(X, feature_range=(0, 1), axis=0, copy=True)
将数据转为指定范围,做如下处理

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

RobustScaler

如果数据有离群点,对数据进行均差和方差的标准化效果不好,这种情况可以使用robust_scale和RobustScaler,它们有对数据中心化和数据的缩放鲁棒性更强的参数;根据第1个四分位数和第3个四分位数之间的范围来缩放数据[这里我也不知道为什么用1-3的范围来缩放数据后会有什么明显的变化,下面的图示也不是非常清楚]
接收参数中X为一个二维数组[n_samples,n_features]
在官网的例子中,是将离群点给删除了,这个函数并不能删除离群点
原始数据如下图所示:

1
plt.scatter(X[:,0],X[:,1])

sklearn0201
官网的代码Compare the effect of different scalers on data with outliers看的特别头大,一点都不简洁,实际上就是做了下面的处理:将数据标准化,然后去除异常点(这里取得是大于最小的[并不是一一对应],小于第二大的)

1
2
3
4
5
6
7
8
9
10
11
12
ro=RobustScaler()
X=ro.fit_transform(X)
zoom_in_percentile_range = (0, 99)#元组,包含两个元素
#在X[:,0]中选取第0%位置的元素和第99%位置的元素
cutoffs_X0 = np.percentile(X[:, 0], zoom_in_percentile_range)
cutoffs_X1 = np.percentile(X[:, 1], zoom_in_percentile_range)
#np.all对所给数据按评估结果在不同维度上返回true或false的值或列表
non_outliers_mask = (
np.all(X > [cutoffs_X0[0], cutoffs_X1[0]], axis=1) &
np.all(X < [cutoffs_X0[1], cutoffs_X1[1]], axis=1))
#通过返回的true,false列表来获取为true的行
plt.scatter(X[non_outliers_mask,0],X[non_outliers_mask,1])

sklearn0202
同样以上面的数据为例,看看该异常数据在使用StandardScaler和使用RobustScaler的区别:
原始数据:

1
2
3
from scipy.stats import norm
import seaborn as sns
sns.distplot(X[:,0], fit=norm)

sklearn0203
StandardScaler后的数据

1
2
3
scaler = StandardScaler()
X=scaler.fit_transform(X)
sns.distplot(X[:,0], fit=norm)

sklearn0204
RobustScaler后的数据

1
2
3
ro=RobustScaler()
X=ro.fit_transform(X)
sns.distplot(X[:,0], fit=norm)

sklearn0205

给出一些相关的比较好的文章
机器学习基础与实践(二)——数据转换

如果觉得有帮助,给我打赏吧!