一、标准化
标准化使不同维度的特征具有可比性,但又不改变特征的分布,通常进行的是0均值1标准差的标准化,也称做z-score.通常标准化的特征在机器学习算法中表现的更好,而sklearn提供了scale方法可以方便的进行z-score.
1.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_train进行z-score标准化
print(X_scaled.mean(axis=0))
print(X_scaled.std(axis=0))
[ 0. 0. 0.]
[ 1. 1. 1.]
2.StandardScaler
preprocessing模块提供了类StandardScaler,用来计算给定数据集上的均值和标准差。之后使用transform可以对其他数据集做同样的标准化操作。
from sklearn import preprocessing
import numpy as np
scaler = preprocessing.StandardScaler().fit(X_train) # 计算在X_train的列中均值和方差
X_train = scaler.transform(X_train) # 对X_train执行标准化操作
print(X_train.mean(axis=0))
print(X_train.std(axis=0))
X_test = [[-1,1,0]]
X_test = scaler.transform(X_test) # 对应X_test执行同样的操作
print(X_test.mean(axis=0))
print(X_test.std(axis=0))
[ 0. 0. 0.]
[ 1. 1. 1.]
[-2.44948974 1.22474487 -0.26726124]
[ 0. 0. 0.]
二、归一化
对不同维度的特征进行缩放,使这些特征对目标函数的影响权重一致。但是这样会改变原来数据的分布。
1.MinMaxScaler
可以将特征缩放到指定的范围内,一般而言是[0,1].
from sklearn import preprocessing
import numpy as np
X_train = np.array([[1.,-1.,2.],
[2.,0.,0.],
[0.,1.,-1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train) # 对X_train进行拟合和转换
print(X_train_minmax)
X_test = np.array([[ -3., -1., 4.]])
X_test_minmax = min_max_scaler.transform(X_test) #对X_test进行转换
print(X_test_minmax)
[[ 0.5 0. 1. ]
[ 1. 0.5 0.33333333]
[ 0. 1. 0. ]]
[[-1.5 0. 1.66666667]]
2.MaxAbsScaler
与MinMaxScaler类似,只不过会将特征标准化到[-1,1]之间。
X_train = np.array([[1.,-1.,2.],
[2.,0.,0.],
[0.,1.,-1.]])
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
print(X_train_maxabs)
X_test = np.array([[ -3., -1., 4.]])
X_test_maxabs = max_abs_scaler.transform(X_test)
print(X_test_maxabs)
[[ 0.5 -1. 1. ]
[ 1. 0. 0. ]
[ 0. 1. -0.5]]
[[-1.5 -1. 2. ]]
3.稀疏数据的处理
对稀疏数据进行标准化时没有意义的,这样会破坏其稀疏性。但是进行归一化时可以的,MaxAbsScaler,maxabs_scale就是为稀疏数据设计的。
4.离群点(异常值)的处理
如果数据上有离群点,那么对数据进行均值和方差的标准化效果不好。这种情况就使用RobustScaler和robust_scaler作为替代。
三、正则化
通常是将数据除以向量的范数。
1.L1和L2正则化
normalize
X = np.array([[1.,-1.,2.],
[2.,0.,0.],
[0.,1.,-1.]])
X_normalized = preprocessing.normalize(X, norm='l2')
print(X_normalized)
[[ 0.40824829 -0.40824829 0.81649658]
[ 1. 0. 0. ]
[ 0. 0.70710678 -0.70710678]]
Normalizer
normalizer = preprocessing.Normalizer().fit(X)
print(normalizer.transform(X))
print(normalizer.transform([[-1., 1., 0.]]))
[[ 0.40824829 -0.40824829 0.81649658]
[ 1. 0. 0. ]
[ 0. 0.70710678 -0.70710678]]
[[-0.70710678 0.70710678 0. ]]
四、二值化
给定一个阈值,将小于阈值的值和大于阈值的值转换为两种类型
X = [[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]]
binarizer = preprocessing.Binarizer().fit(X)
binarizer.transform(X)
array([[ 1., 0., 1.],
[ 1., 0., 0.],
[ 0., 1., 0.]])
调整阈值
binarizer = preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
array([[ 0., 0., 1.],
[ 1., 0., 0.],
[ 0., 0., 0.]])
五、生成多项式特征
在输入数据中增加非线性特征可以有效的提高模型的复杂度。简单且常用的方法就是使用多项式特征,可以得到特征的高阶交叉项。
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(6).reshape(3, 2)
X
array([[0, 1],
[2, 3],
[4, 5]])
假设有特征 ,那么组合出特征
poly = PolynomialFeatures(2)
poly.fit_transform(X)
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
如果只需要特征的交叉项,可以设置interaction_only=True来实现
X = np.arange(9).reshape(3, 3)
poly = PolynomialFeatures(degree=3, interaction_only=True)
poly.fit_transform(X)
array([[ 1., 0., 1., 2., 0., 0., 2., 0.],
[ 1., 3., 4., 5., 12., 15., 20., 60.],
[ 1., 6., 7., 8., 42., 48., 56., 336.]])
六、自定义转换
如果以上的方法觉得都不够,譬如你想用对数据取对数,可以自己用 FunctionTransformer自定义一个转化器,并且可以在Pipeline中使用。
import numpy as np
from sklearn.preprocessing import FunctionTransformer
transformer = FunctionTransformer(np.log1p)
X = np.array([[0, 1], [2, 3]])
transformer.transform(X)
array([[ 0. , 0.69314718],
[ 1.09861229, 1.38629436]])