【1%】100小时机器学习——数据预处理
数据预处理
前言:
- What's This:我自己的学习笔记,如果你不想看GitHub,这里搬运的应该也很全面。
- 为什么要学机器学习:很厉害,应用广,缺口大,解放人力,提升自己
- 课程来源:YouTube上的大咖Siraj Raval就发起了一个挑战:#100DaysOfMLCode。
- GitHUb地址:中文版本点这里 —— Here For English Edition
- 学习计划: 不强求每天都来,佛性随性,每天课程量不大,所以我把100天改成了100小时,所以只要坚持同等与两周工作量的时间里,就能完成本课程。学到就是收获。
- 基础要求: Python的使用
Start
Day 1.jpgStep 0: 环境
Mine——Windows10x64, Python2.7, Hyper(推荐,比原生的命令窗口好看一点。在人工智能飞速发展的当下,培养艺术审美能力是赢得未来的重要技能)
Step 1: 导入必要的库
NumPy——用于实现大量的数学计算
Pandas——用于操作数据集
So easy, 直接Python pip安装。
pip install Numpy
pip install Pandas
后边数据预处理还会用到 sklearn库
pip install sklearn
然后sklearn又依赖scipy
pip install scipy
还有一个必备的
pip install matplotlib
装这个可能要15分钟左右,可以去上个厕所,弹弹吉他,打回太极拳,或者找女朋友聊会儿天。下边的内容等装好了边看边动手做。
Step 2: 导入数据集
Data sets一般以.csv格式存储,内容为纯文本样式的表格,每行代表了一条数据record.这里使用 pandas的 read_csv
方法读取本地的csv文件作为数据帧, 然后从数据帧中制作自变量和因变量的矩阵(Matrix)和向量(Vector)。
Data sets右键另存为下载
import numpy as np
import pandas as pd
data = r'your/path/to/store/Data.csv'
dataset = pd.read_csv(data)
看一眼dataset是啥样子
dataset
Country Age Salary Purchased
0 France 44.0 72000.0 No
1 Spain 27.0 48000.0 Yes
2 Germany 30.0 54000.0 No
3 Spain 38.0 61000.0 No
4 Germany 40.0 NaN Yes
5 France 35.0 58000.0 Yes
6 Spain NaN 52000.0 No
7 France 48.0 79000.0 Yes
8 Germany 50.0 83000.0 No
9 France 37.0 67000.0 Yes
继续操作
X = dataset.iloc[ : , :-1].values
Y = dataset.iloc[ : , 3].values
这里可以理解为类似Python序列的分片操作,得到自己想要的数据组合
看一下我们的X,Y:
>>> X
array([['France', 44.0, 72000.0],
['Spain', 27.0, 48000.0],
['Germany', 30.0, 54000.0],
['Spain', 38.0, 61000.0],
['Germany', 40.0, nan],
['France', 35.0, 58000.0],
['Spain', nan, 52000.0],
['France', 48.0, 79000.0],
['Germany', 50.0, 83000.0],
['France', 37.0, 67000.0]], dtype=object)
>>> Y
array(['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes'],
dtype=object)
Step 3: 处理丢失的数据
对于数据的完整性来说,我国伟大的文学家苏轼早就有了“此事古难全”的重要论断。因此为了不影响机器学习模型的性能,我们用同类数据的均值或中间值来替代。此处用到sklearn.preprocessing
库中的Impputer
类来完成相关操作。
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类,传入的参数分别为missing_values,设置为NaN,替换策略strategy为mean,即用均值替代丢失值,axis设置为0。
第二句用新建的imputer类来fit一下X。
第三句完成缺失数据的替代。
Step2得到的X变成了如下内容:
>>> X
array([['France', 44.0, 72000.0],
['Spain', 27.0, 48000.0],
['Germany', 30.0, 54000.0],
['Spain', 38.0, 61000.0],
['Germany', 40.0, 63777.77777777778],
['France', 35.0, 58000.0],
['Spain', 38.77777777777778, 52000.0],
['France', 48.0, 79000.0],
['Germany', 50.0, 83000.0],
['France', 37.0, 67000.0]], dtype=object)
Step 4: 编码分类数据
分类数据(Categorical Data)指的是非数字类型的变量,通常以标签值的形式出现,例如本例中的‘Yes’和‘No’,对于模型的数学计算,需要把它们编码成数字。这里用到的是sklearn.preprocessing
库中的LabelEncoder
类。
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])
##Creating a dummy variable
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
经过转化,X和Y的变化如下:
>>> X
array([[0L, 44.0, 72000.0],
[2L, 27.0, 48000.0],
[1L, 30.0, 54000.0],
[2L, 38.0, 61000.0],
[1L, 40.0, 63777.77777777778],
[0L, 35.0, 58000.0],
[2L, 38.77777777777778, 52000.0],
[0L, 48.0, 79000.0],
[1L, 50.0, 83000.0],
[0L, 37.0, 67000.0]], dtype=object)
>>> X
array([[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.40000000e+01, 7.20000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 2.70000000e+01, 4.80000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 3.00000000e+01, 5.40000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.80000000e+01, 6.10000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 4.00000000e+01, 6.37777778e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.50000000e+01, 5.80000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.87777778e+01, 5.20000000e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.80000000e+01, 7.90000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 5.00000000e+01, 8.30000000e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.70000000e+01, 6.70000000e+04]])
>>> Y
array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1], dtype=int64)
Step 5: 将数据集分为测试集和训练集
我们通常把数据集按照“二八原则”分为训练集(training set)和测试集(test set),前者用于训练模型,占80%;后者用于测试验证模型,占20%。这里用sklearn.crossvalidation
库中的train_test_split()
方法。
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)
Step 6: 特征缩放
大部分模型算法计算两个数据点的欧式距离,导致的问题就是幅度变化不好控制,高幅度的特征比低幅度的特征权重更大。解决这个问题的方法是特征标准化或Z值归一化。这里用sklearn.preprocessing
库的StandardScalar
类。
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)
总结
To Be Honest, 第一天主要就是个入门和环境搭建的上手,用Python作为工具,简述了进行机器学习的前6个步骤,并用相应的库简单轻松的完成了操作,不要觉得无聊,继续下去,会有新收获!