数据预处理(Python scikit-learn)
在机器学习任务中,经常会对数据进行预处理.如尺度变换,标准化,二值化,正规化.至于采用哪种方法更有效,则与数据分布和采用算法有关.不同算法对数据的假设不同,可能需要不同的变换,而且有时无需进行变换,也可能得到相对更好的效果.因此推荐使用多种数据变换方式,用多个不同算法学习和测试,选择相对较好的变换方式和算法.
下面对在 Python scikit-learn 库(也称 sklearn 库)中的预处理过程进行介绍:
1. 加载数据集;
2. 将数据集分为用于机器学习的输入变量和输出变量;
3. 对输入变量进行变换(或预处理);
4. 显示变换结果(可选).
本文采用 scikit-learn 库自带的鸢尾花数据集(Iris Plants Database)作为示例.
首先,加载数据集,获取输入变量 X 和输出变量 y ,示例代码如下:
from sklearn import datasets
import numpy as np
data = datasets.load_iris()
X, y = data.data, data.target
np.set_printoptions(precision=3)
print ("\n" "Preprocess input variables: " "\n")
print ("Raw Data: ")
print (X[:5, :])
然后,变换输入变量 X (类型为 <type 'numpy.ndarray'>),具体变换如下:
尺度变换
将输入变量变换到某一范围,如 0 ~ 1 区间.在 sklearn 库中,使用 MinMaxScaler 类实现.常用于类似梯度下降的优化算法,回归和神经网络中的加权输入,以及类似 K 近邻的距离度量.示例代码如下:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
rescaledX = scaler.fit_transform(X)
# Print transformed data
print ("\nRescaled Data: ")
print(rescaledX[0:5,:])
标准化
通常适用于高斯分布的输入变量.具体来说,将输入变量中的每个属性值减去其平均值,然后除以标准差,得到标准正态分布的属性值.在 sklearn库中,使用 StandardScaler 类实现.常用于假定输入变量高斯分布的线性回归,Logistic回归和线性判决分析.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(X)
standardizedX = scaler.transform(X)
print ("\nStandardized Data: ")
print (standardizedX[0:5,:])
正规化
将输入变量变换为具有单位范数长度的数据.常用的范数有L1,L2,详见我之前的博文 "数据正规化 (data normalization) 的原理及实现 (Python sklearn)". 在 sklearn 库中,使用 Normalizer 类实现.常用于含有许多 0 的稀疏数据集,像神经网络的采用加权输入的算法和像 K 近邻采用距离度量的算法.
from sklearn.preprocessing import Normalizer
scaler = Normalizer().fit(X)
normalizedX = scaler.transform(X)
print ("\nNormalized Data: ")
print (normalizedX[0:5,:])
二值化
使用门限值,将输入数据二值化.当输入变量值大于门限值时,变换为 1;当输入变量值小于或等于门限值时,变换为 0.在 sklearn 库中,使用 Binarizer 类实现.常用于获取清晰的值的概率,产生新的有意义的属性的特征工程.
from sklearn.preprocessing import Binarizer
binarizer = Binarizer(threshold=0.0).fit(X)
binaryX = binarizer.transform(X)
print ("\nBinarized Data: ")
print (binaryX[0:5,:])
参考资料
Jason Brownlee. How To Prepare Your Data For Machine Learning in Python with Scikit-Learn.
https://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/