天天看点

sklearn.preprocessing中的StandardScaler、normalize、Normalizer和LASSO中的Normalize=True

在使用以RBF为核函数的SVM时,或使用L1或L2正则化的线性模型时,通常要求各个特征具有相似的方差,否则拥有较大方差的特征将主导梯度下降的过程,从而导致无法得出真正的最优解。因此,在做之前要求对数据进行标准化,即对于每个特征(数据中的每一列)进行标准化

Xi=Xi−X¯¯¯¯sdX X i = X i − X ¯ s d X

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
X_train = ss.fit_transform(X_train)   #默认按列(feature)标准化
X_test = ss.transform(X_test)
           

在使用LASSO时,有个选项为Normalize=True,这个操作是类似于对数据进行标准化的操作,也是按列(feature)操作的。正则化处理后,每个特征的L1或L2范数相同,为1

Xi=Xi|X| 或 Xi=Xi∥X∥ X i = X i | X |   或   X i = X i ‖ X ‖

但是,需要注意的是,sklearn.preprocessing中有两个与正则化有关的选项,分别是normalize和Normalizer。它们的原理与上述类似,区别是它们默认按行操作,且Normalizer只能按行操作

from sklearn.preprocessing import normalize,Normalizer
X = normalize(norm='l2',axis=)  #按行操作
X = normalize(norm='l2',axis=)  #按列操作

normalizer = Normalizer(norm='l2').fit(X_train)  #按行操作
X_train = normalizer.transform(X_train)
X_test = normalizer.transform(X_test)
           

Normalizer需要先fit,fit这一步不会对X_train产生操作,要想生成正则化后的数据,需要transform。该操作对行进行,且不提供指定轴的选项。Normalizer可以将在X_train上训练到的规则应用到X_test的转变上。normalize可以按列操作,但对X_train训练的规则无法转换到X_test上。

因此,貌似Preprocessing中的Normalizer和normalize不适合于对数据进行预处理?

继续阅读