这是Github上的一个开源教程:
原创在此:https://github.com/Avik-Jain/100-Days-Of-ML-Code
中文版在此:https://github.com/MLEveryday/100-Days-Of-ML-Code
教程的作者希望通过简单易懂的方式教会大家如何进行机器学习,但是过程中仍然有很多小白不明白的概念。所以笔者尝试再把理解门槛拉低,在中文版的基础上把过程里面的概念再讲得直白一些(否则就成搬运转发了)。
笔者使用的环境是Anaconda,这个环境直接安装好了许多必要的程序包,使得后续使用非常方便。
https://www.anaconda.com/download/
第1步:导入库 (引入程序包)
import numpy as np
import pandas as pd
NumPy是python的科学计算程序包
pandas(Python Data Analysis Library)数据分析程序包
第2步:导入数据集
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[ : , :-1].values
Y = dataset.iloc[ : , 3].values
点击数据下载,和代码放在同一个文件夹下面。
上面的代码:X相当于不要最后一列的数据集,Y是目标列,就是第4列(对,程序猿喜欢把第1列叫0)
再啰嗦一下,X的写法是不要最后1列,所以写了-1
(这里的减号是指不要的意思)
Y取的是第4列,来,和我一起数数:0,1,2,3 所以这里的3是第4列的意思(也就是Purchased这一列)。
csv数据其实就是文本文件,数据字段之间用逗号分隔,第一行是字段名称:
在不同的数据分析软件工具里,字段也有叫做变量的。上面的数据如果导入到excel等工具里,其实就是列的概念:
也就是 字段 = 变量 = 数据列
数据行有些软件叫做观测(Observation)
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 |
第3步:处理丢失数据
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])
笔者建议把“丢失数据”改为“缺失数据”会更好一些,因为缺失的原因有很多,有主观责任也有客观原因,而丢失是偏主观责任了。
对于缺失值的处理大致分为两派观点:
- 要把缺失值通过某种方式补上
- 缺失本身也是一种信息,不需要处理
哪种方法对?都有道理,说法不一。
上面的代码是把缺失值用平均值的方式填补上,比较简单,也比较粗暴。
补之前和补之后的数据大家感受一下:
补之前:
补之后:
有好多xxx.77777778
那些对应的之前的nan
被平均值取代了。
第4步:解析分类数据 (分类数据贴标签)
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])
这一段代码实际上是对分类变量贴标签,不明白中文版的作者为什么写的是“解析”。
Encode labels with value between 0 and n_classes-1.
上面这段话来自sklearn的官方文档解释。
看看实际执行结果感受一下:
这么看不太直观,做个对应表大家仔细对照一下:
Country | 编码后 |
---|---|
France | 0 |
Germany | 1 |
Spain | 2 |
也就是说,这个编码是按照按照字母表排序后顺序从0开始递增编号对应。
再换句话说,只需要有个编号即可。分类变量对于数据分析的来说就是个编号。
再啰嗦一下,现在France对应的是0,以后0就代表了France,不可以是别的。
只有对应关系是重要的,具体叫什么名字不重要。
创建虚拟变量
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
还是先看看英文版的原文:
Creating a dummy variable
这种转换方式到底有什么好处?我们先来看看转换之后的结果:
看不懂对不对?没关系,来理一下:
原来第一行的数据是:
Country | Age | Salary |
---|---|---|
France | 44 | 72000 |
经过贴标签编码后变成:
Country | Age | Salary |
---|---|---|
0 | 44 | 72000 |
已知Country有3个,分别是0,1,2 对应 France,Germany,Spain。
好了,OneHotEncoder实际上对分类变量Country做了个转换,看下表就知道了:
是否'France' | 是否'Germany' | 是否'Spain' | Age | Salary |
---|---|---|---|---|
1 | 0 | 0 | 44 | 72000 |
还是看不明白?再换个表达方式:
是否'France' | 是否'Germany' | 是否'Spain' | Age | Salary |
---|---|---|---|---|
1.00000000e+00 | 0.00000000e+00 | 0.00000000e+00 | 4.40000000e+01 | 7.20000000e+04 |
注:
e+00
是科学计数法。e+01
就是10,e+02
就是10的2次方:100;e-01
就是10的-1次方:0.1
现在应该看懂了吧。为什么要采用这样的方式?
刚才已经讲过了,分类对于计算机来说没有意义,只有变成数字才有意义,计算机才能处理。
具体可以参考这个文章:《LabelEncoder和OneHotEncoder 在特征工程中的应用》
第5步:拆分数据集为训练集合和测试集合
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)
格式:
X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.3, random_state=0)
参数解释:
train_data:被划分的样本特征集
train_target:被划分的样本标签(目标变量)
test_size:如果是浮点数,在0-1之间,表示样本占比;如果是整数的话就是样本的数量
random_state:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。
注意随机种子的描述,基本上所有的语言都是这么设置的。
第6步:特征缩放
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
这个翻译个人觉得还是有点怪怪的,不过也想不出来更好的词语,看看原文吧:
Step 6: Feature Scaling
笔者对这一步的理解其实是“统一量纲”。
为什么要统一量纲?因为不同的字段的量纲是不一致的。
量纲不一致,算什么都不对!
就拿这个数据集本身来说,年龄(Age)、薪资(Salary)本身就是在说两件事情。
如果要把两件不同的事情在数学上统一起来,使得“苹果”对着“苹果”,统一量纲后的加减乘除以及各种数学运算才是有意义的。
统一量纲有很多方式,比如方差归一化。这篇文章有具体的细化代码实现:《sklearn 数据预处理1: StandardScaler》
从数学上统一量纲后,后续的计算操作才有意义。
也许还是会有人看不明白。举个生活中的例子:
一斤米、一斤西瓜、一斤大豆....都是一斤,但是量纲上的概念还是不一样的。
怎么办?一斤米多少钱?一斤西瓜多少钱?一斤大豆多少钱?通过货币定价的方式,量纲得到统一。
不管是哪种数据分析方法,都会有涉及到统一量纲处理的步骤。
本案例运算完以后的情况大概是这样的:
~~~直接跳到这一步的话,鬼才看得懂。
上述过程就是从人能看得懂的数据转换为计算机能运算处理的数据准备过程。
KevinZhang
Sep 18, 2018
网友评论