AI数据乐园程序员

机器学习之特征工程-数据预处理

2017-07-25  本文已影响1517人  jacksu在简书

通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:

无量纲化

标准化

数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。
公式为:(X-mean)/std 计算时对每个属性/每列分别进行。
将数据按属性(按列进行)减去其均值,并除以其方差。得到结果是,对于每个属性(每列)来说所有数据都聚集在0附近,方差为1。

from sklearn.datasets import load_iris
import numpy as np

X = np.array([[ 1., -1.,  2.],
              [ 2.,  0.,  0.],
              [ 0.,  1., -1.]])
from sklearn import preprocessing
X_scaled = preprocessing.scale(X)
print(X_scaled)
print(X_scaled.mean(axis=0))
print(X_scaled.std(axis=0))

out

[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]
[ 0.  0.  0.]
[ 1.  1.  1.]

sklearn 还提供了StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。

scaler = preprocessing.StandardScaler().fit(X)
print(scaler)

print(scaler.mean_)                                     

print(scaler.scale_)                                     

print(scaler.transform(X))
scaler.transform([[-1.,  1., 0.]])

out

StandardScaler(copy=True, with_mean=True, with_std=True)
[ 1.          0.          0.33333333]
[ 0.81649658  0.81649658  1.24721913]
[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]
Out[9]:
array([[-2.44948974,  1.22474487, -0.26726124]]) 

区间缩放

另一种常用的方法是将属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现。

使用这种方法的目的包括:
1、对于方差非常小的属性可以增强其稳定性。
2、维持稀疏矩阵中为0的条目。

image.png
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)
print(X_train_minmax) 

out

[[ 0.5         0.          1.        ]
 [ 1.          0.5         0.33333333]
 [ 0.          1.          0.        ]]

归一化

归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:


image.png

该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。

X_normalized = preprocessing.normalize(X_train, norm='l2')
print(X_normalized)
normalizer = preprocessing.Normalizer().fit(X_train)
normalizer.transform(X_train)

out

[[ 0.40824829 -0.40824829  0.81649658]
 [ 1.          0.          0.        ]
 [ 0.          0.70710678 -0.70710678]]
Out[16]:
array([[ 0.40824829, -0.40824829,  0.81649658],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.        ,  0.70710678, -0.70710678]])

后面接着介绍数据预处理

参考

关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化
统计数据归一化与标准化
标准化和归一化什么区别?
特征工程到底是什么?
sklearn preprocess

上一篇下一篇

猜你喜欢

热点阅读