机器学习中的预处理及Python实现

一、标准化

标准化使不同维度的特征具有可比性,但又不改变特征的分布,通常进行的是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]])

假设有特征 x 1 , x 2 ,那么组合出特征 x 1 0 x 1 x 2 x 1 2 x 2 2 x 1 x 2

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]])

猜你喜欢

转载自blog.csdn.net/bqw18744018044/article/details/80283497