100day of ML DAY1 ——data preprocessing

这个100天搞定机器学习编程的项目,现在已经是爆红GitHub。

项目地址

100day of ML DAY1 ——data preprocessing_第1张图片

day1

数据预处理

第一步
导入一些库,numpy和pandas

Numpy里面有各种数学函数,Pandas是用来导入数据集、管理数据集的。

import numpy as np
import pandas as pd

第二步
导入数据集

在Pandas库里面,用read_csv的方法,来读取本地的CSV文件,每个文件是一个数据帧 (Data Frame) 。

给每个数据帧里的自变量和因变量,分别做矩阵和向量。

dataset = pd.read_csv('Data.csv')
X = dataset.iloc[ : , :-1].values
Y = dataset.iloc[ : , 3].values

项目中给的csv,如下所示

Country,Age,Salary,Purchased
France,44,72000,No
Spain,27,48000,Yes
Germany,30,54000,No
Spain,38,61000,No
Germany,40,,Yes
France,35,58000,Yes
Spain,,52000,No
France,48,79000,Yes
Germany,50,83000,No
France,37,67000,Yes

iloc是基于索引位来选取数据集。iloc[ : , :-1]中逗号前半部分意思是选取所有行,后半部分是除了最后一列的所有列
iloc[ : , 3]选取Purchased这一列

第三步
处理缺失数据
可以把缺失的数据,用整列数据的平均值或者中位数代替。拿sklearn.preprocessing里的Imputer来处理。

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0)
imputer = imputer.fit(X[ : , 1:3])
X[ : , 1:3] = imputer.transform(X[ : , 1:3])

imputer = imputer.fit(X[ : , 1:3]) 使用数组X去得到一个Imputer类,缺失值的处理方式是使用X中的均值(axis=0表示按列进行)代替X中的缺失值。
X[ : , 1:3] = imputer.transform(X[ : , 1:3]) 用Imputer类的对象去处理数组X中的缺失值

第四步
编码分类数据

分类数据 (Categorical Data) 里的变量,不包含数值,只包含分类标签。
比如,是/否,性别,这样的变量,是没办法当成数值直接运算的。
所以,才需要把它们编码成能够运算的数值。用sklearn.preprocessing里面的LabelEncoder就可以了。

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])

LabelEncoder可以将标签分配一个0—n_classes-1之间的编码
由于该csv中国家有三个,国家名转换得到的编码就是0,1,2

Dummy Variable(虚拟变量)又称虚设变量、名义变量或哑变量,用以反映质的属性的一个人工变量,是量化了的质变量,通常取值为0或1。
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。

onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y =  labelencoder_Y.fit_transform(Y)

上面要用到OneHotEncoder,先看一个例子


>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = 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.n_values_
array([2, 3, 4])

OneHotEncoder 类传递进来的数据集:

[[0, 0, 3], 
[1, 1, 0], 
[0, 2, 1], 
[1, 0, 2]]

对象enc的n_values_成员变量,记录着每一个属性的最大取值数目,如本例第一个属性:
0, 1, 0, 1 ⇒ 2,
0, 1, 2, 0 ⇒ 3,
3, 0, 1, 2 ⇒ 4;
即各个属性(feature)在 one hot 编码下占据的位数;

>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

进一步通过 fit 好的 one hot encoder 对新来的特征向量进行编码:
前 2 位 1, 0,对 0 进行编码
中间 3 位 0, 1, 0 对 1 进行编码;
末尾 4 位 0, 1, 0, 0 对 1 进行编码;

>>> enc.transform([[0, 1, 2]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.]])

同理,对新来的特征向量 [0,1,2] 编码
但是

>>> enc.transform([[2, 1, 3]]).toarray()
ValueError: unknown categorical feature present [2] during transform.

超过了原先one hot 编码下占据的位数就报错了。

第五步
分开训练集和测试集

from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)

废弃警告大意是cross_validation将要在 0.20被废弃
改为从 sklearn.model_selection 中调用train_test_split 函数可以解决此问题。

第六步
特征缩放

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)

大部分机器学习算法,都会拿两个数据点之间的欧几里得距离 (Euclidean Distance) 做计算。
这样一来,如果一个特征比其他特征的范围值更大,这个特征值就会成为主导。
而我们希望其他特征,也得到同等的重视,所以用特征标准化 (Feature Standardization) 来解决这个问题。

StandardScaler通过删除均值和缩放到单位方差来标准化特征

以上就是第一天的内容。

参考

1 https://github.com/Avik-Jain/100-Days-Of-ML-Code
2 火爆GitHub:100天搞定机器学习编程,超赞信息图+代码 https://zhuanlan.zhihu.com/p/41315875
3 pandas入门——loc与iloc函数 https://blog.csdn.net/weixin_39501270/article/details/76833836
4 python数组索引 https://blog.csdn.net/god_wen/article/details/78410973
5 关于缺失值(missing value)的处理 https://www.cnblogs.com/chaosimple/p/4153158.html
6 Dummy Variable & One-Hot Encoding https://blog.csdn.net/wendaomudong_l2d4/article/details/78075421
7 sklearn preprocessing 数据预处理(OneHotEncoder)https://blog.csdn.net/bbbeoy/article/details/73850303
8 使用sklearn之LabelEncoder将Label标准化 https://blog.csdn.net/u010412858/article/details/78386407
9 sklearn.cross_validation 0.18版本废弃警告及解决方法 https://blog.csdn.net/cheneyshark/article/details/78640887

你可能感兴趣的:(python)