使用scikit-learn对数据进行预处理

post-091-640x200

数据对于算法和模型的表现至关重要。原始数据中会包含各种各样的问题,我们在使用这些数据前要预先对这些问题进行处理。数据预处理的内容包括数据的清洗,如缺失值和零值的填充,数据标准化,二值化和哑编码等等。本篇文章介绍如何使用sklearn中的数据预处理库(preprocessing)对数据进行标准化处理。

准备工作

开始前的准备工作包括三个部分,首先导入需要使用的库,这里包括常规的数值计算库numpy和pandas,用于数据预处理的preprocessing库,用于分割训练集和测试集的交叉检验库cross_validation。

#导入数值计算库
import numpy as np
#导入科学计算库
import pandas as pd
#导入数据预处理库
from sklearn import preprocessing
#导入交叉验证库
from sklearn import cross_validation
#导入缺失值填充库
from sklearn.preprocessing import Imputer

第二个准备工作是读取数据并创建数据表,通过查看可以发现数据表中存在缺失值NaN。

#读取并创建数据表
data=pd.DataFrame(pd.read_csv('p_data.csv'))
#查看数据表
data.head()

%e6%9f%a5%e7%9c%8b%e6%95%b0%e6%8d%ae%e8%a1%a8

第三个准备工作是将数据表分解为特征值和目标值,并分割为训练集和测试集数据。在后面的数据处理和标准化过程中我们也将分别对训练集和测试集进行处理。

#设置特征值和目标值
X = np.array(data[['loan_amnt','grade','annual_inc']])
y = np.array(data['loan_status'])
#将数据分割为训练集和测试集
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.4, random_state=0)

填充缺失值

数据预处理的第一步是处理缺失值,这里使用sklearn中preprocessing库对数据表中的缺失值进行填充,在下面的代码中,missing_values的值可以为NaN,也可以为0。前者对缺失值填充,后者对0值进行填充。Strategy的值为填充的方式,这里使用均值mean填充缺失值。

#使用均值填充缺失值
imp = Imputer(missing_values="NaN", strategy='mean', axis=0)
imp.fit(X_train)
imp.transform(X_train)

以下是完成缺失值填充后的训练集数据。

#填充训练集
X_train=imp.transform(X_train)

%e5%a1%ab%e5%85%85na%e5%80%bc_%e8%ae%ad%e7%bb%83%e9%9b%86

我们以同样的方式填充测试集,以保证测试集和训练集的数据填充方式保持一致。

#填充测试集
X_test=imp.transform(X_test)

%e5%a1%ab%e5%85%85na%e5%80%bc_%e6%b5%8b%e8%af%95%e9%9b%86

数据二值化

二值化是对特征的一种标准化处理,这里我们以数据表中的目标值为例进行说明。数据表中的目标值也就是贷款状态中还款的标记为大于200的数字,未还款的标记为小于200的数字。这里我们通过设置阈值对目标值进行二值化。下面的代码中threshold的值为设置的阈值,大于阈值的被标记为1,小于阈值则被标记为0。

#数据二值化,阈值200,大于阈值标记为1
binarizer = preprocessing.Binarizer(threshold=200)
#训练集二值化
y_train=binarizer.transform(y_train)

%e6%95%b0%e6%8d%ae%e4%ba%8c%e5%80%bc%e5%8c%96_%e8%ae%ad%e7%bb%83%e9%9b%86

#测试集二值化
y_test=binarizer.transform(y_test)

%e6%95%b0%e6%8d%ae%e4%ba%8c%e5%80%bc%e5%8c%96_%e6%b5%8b%e8%af%95%e9%9b%86

数据标准化(Z-score)

数据的标准化(normalization)是将数据按比例缩放,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较。其中最典型的就是0-1标准化和Z标准化。在数据表中,用户贷款金额,年收入和等级是三个不同量级的数据。无法直接放在一起进行处理和分析。因此需要先进行标准化处理。
第一种标准化的方法是Z-score 标准化(zero-mean normalization) ,也叫标准差标准化,经过处理的数据符合均值为0,标准差为1的标准正态分布。下面是计算公式,其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

z%e6%a0%87%e5%87%86%e5%8c%96

数据预处理Preprocessing库中的StandardScaler()函数可以实现对数据的标准化处理,下面是具体的代码和结果。

#数据标准化
scaler = preprocessing.StandardScaler().fit(X_train)
#训练集数据标准化
scaler.transform(X_train)

%e6%95%b0%e6%8d%ae%e6%a0%87%e5%87%86%e5%8c%96_%e8%ae%ad%e7%bb%83%e9%9b%86

同时对测试集的数据进行标准化处理,以保证训练集和测试集的变换方式相同。
#测试集数据标准化
scaler.transform(X_test)

%e6%95%b0%e6%8d%ae%e6%a0%87%e5%87%86%e5%8c%96_%e6%b5%8b%e8%af%95%e9%9b%86

范围缩放标准化(0-1 normalization)

第二种数据标准化的方法是0-1标准化(0-1 normalization) 或离差标准化,0-1标准化对原始数据的线性变换,使结果落到[0,1]区间。下面是计算公式,其中max为样本数据的最大值,min为样本数据的最小值。

0-1%e6%a0%87%e5%87%86%e5%8c%96

数据预处理preprocessing库中的MinMaxScaler()函数可以实现0-1标准化处理。下面是具体的代码和结果。

#范围缩放标准化
min_max_scaler = preprocessing.MinMaxScaler()
#训练集缩放标准化
min_max_scaler.fit_transform(X_train)

%e8%8c%83%e5%9b%b4%e7%bc%a9%e6%94%be%e6%a0%87%e5%87%86%e5%8c%96_%e8%ae%ad%e7%bb%83%e9%9b%86

#测试集缩放标准化
min_max_scaler.fit_transform(X_test)

%e8%8c%83%e5%9b%b4%e7%bc%a9%e6%94%be%e6%a0%87%e5%87%86%e5%8c%96_%e6%b5%8b%e8%af%95%e9%9b%86

数据正则化

最后一种数据标准化的方法是正则化,下面是具体的代码和处理结果。

#数据正则化
normalizer = preprocessing.Normalizer().fit(X_train)
#训练集正则化
normalizer.transform(X_train)

%e6%95%b0%e6%8d%ae%e6%ad%a3%e5%88%99%e5%8c%96_%e8%ae%ad%e7%bb%83%e9%9b%86

#测试集正则化
normalizer.transform(X_test)

%e6%95%b0%e6%8d%ae%e6%ad%a3%e5%88%99%e5%8c%96_%e6%b5%8b%e8%af%95%e9%9b%86

哑编码

哑编码是对分类特征进行标准化处理的一种方法,下面以sklearn官网上的一个例子来说明哑编码的过程。下面是一张分类特征表,表中包含三个特征和4条记录。

1

我们将每个特征可能出现的结果以数字进行标识。例如男性标识为0,女性标识为1。

2

完成标识后之前的分类特征表变成了下面的样子。Uid1的男性,欧洲,IE浏览器记录被对应的标记为了0,0,3。这些被标记的分类特征值不能直接使用,因为他们有可能被误认为是连续型特征。因此还需要一步OneHotEncoder转换。

3

这里我们新增了一条男性,US,IE浏览器的记录,被标记为0,1,3。使用OneHotEncoder将条记录转换为哑编码。下面是具体的过程。首先在gender中,male=0,female=1,因此第一个数字0被转换为1,0,即男性。以此类推第二个数字1在country中被转换为0,1,0,。第三个数字3在browser中被标记为0,0,0,1。男性,US,IE浏览器的记录0,1,3通过OneHotEncoder转换为1,0,0,1,0,0,0,0,1。

4
在sklearn的preprocessing库中使用OneHotEncoder()函数可以完成哑编码操作。下面是具体的代码,我们对0,1,3进行编码结果为1,0,0,1,0,0,0,0,1。

#哑编码
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])

%e5%93%91%e7%bc%96%e7%a0%811

enc.transform([[0, 1, 3]]).toarray()

%e5%93%91%e7%bc%96%e7%a0%812
—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,但请注明转自“蓝鲸网站分析博客”。】—

 

Speak Your Mind

*