LIUKK的工作站
LiuKK
Apr 26, 2017
阅读本文需要 7 分钟

1、预处理

1.1.1 标准化

如果一个特征的方差量级远大于其他特征,它就可能主导整个学习过程,使得算法不能从其它特征学到东西。在preprocessing模块中,scale函数可以将一个特征(数量型)快速标准化(均值为0, 方差为1)。

例子:

from sklearn import preprocessing
import numpy as np
X = np.array([[ 1., -1.,  2.],
              [ 2.,  0.,  0.],
              [ 0.,  1., -1.]])
X_scaled = preprocessing.scale(X)
X_scaled
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])
X_scaled.mean(axis=0)
array([ 0.,  0.,  0.])
X_scaled.std(axis=0)
array([ 1.,  1.,  1.])

1.1.2 将特征缩放到一个范围

大部分情形下我们希望将特征缩放到0,1之间,用MinMaxScaler与之前标准化的区别就是,可以保留稀疏数据中的0.

例子:

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_minmax
array([[ 0.5       ,  0.        ,  1.        ],
       [ 1.        ,  0.5       ,  0.33333333],
       [ 0.        ,  1.        ,  0.        ]])

1.1.3 处理类别数据

比如一个人可能有以下数据["男", "女"], ["中国", "日本", "美国"], ["用ie", "用firefox", "用chrome", "用其它"],这些类别特征虽然可以很容易用数字编码,但是这些用整数(离散型)编码的很难被算法用来学习,因为它们大部分都只接受连续型数据。
一种常用的方法就是进行独热编码,它将类别特征中m个可能的值转换为m个二值特征,每条数据只有一个有效。

例子:

enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3],
                 [1, 1, 0],
                 [0, 2, 1],
                 [1, 0, 2]])
OneHotEncoder(categorical_features='all', dtype=<type 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)
enc.transform([[0, 1, 3]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])

1.1.4 缺失值的处理

由于很多原因,我们的数据会有缺失值(NaN),必须对这些值进行处理,因为分类器只能接受连续型数值数据。最简单的方法就是删除有缺失值的记录,这只能在有缺失数据的记录较少时使用,因为这样很可能会同时删除一些有价值的数据,所以常用的方法就是根据已有数据进行插值(Imputer类)(用均值,中位数,出现频率最高的数等等)。

例子:

import numpy as np
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN',strategy='mean', axis=0)
print(imp.fit_transform([[1, 2], [np.nan, 3], [7, 6]]))
[[ 1.  2.]
 [ 4.  3.]
 [ 7.  6.]]

1.1.5 生成多项式特征

有时在考虑模型时需要使用非线性模型,这时使用PolynomialFeatures

例子:将$(X_{1}, X_{2})$转换为$(1, X_{1}, X_{2}, X_{1}^2, X_{1}X_{2}, X_{2}^2)$

import numpy as np
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.]])

1.1.6 将函数变成转换器

有时我们需要把一个现成的函数对数据的每列使用,当然我们可以使用匿名函数而避免用循环,还有一种方法就是用转换器,之前的例子中可以看到,在sklearn中转换器可以方便的对列或者行使用。

例子:

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

>