注:禁止转载,转账五毛钱给我可转载
这个项目是最近在GitHub上比较火的一个机器学习入门指南,我看了部分觉得非常好,觉得有必要写成中文博客,供自己闲暇翻看
第一天的网址:https://github.com/Avik-Jain/100-Days-Of-ML-Code/blob/master/Code/Day%201_Data%20PreProcessing.md
导入两个重要的数学计算和数据管理的库,numpy和pandas
numpy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))
附numpy简易教程:https://www.yiibai.com/numpy/
pandas 是基于numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
附pandas简易教程;https://www.yiibai.com/pandas/python_pandas_series.html
导入库:
import numpy as np
import pandas as pd
数据长什么样?
利用pandas读取数据
dataset=pd.read_csv('data.csv')
X=dataset.iloc[:,:-1].values
Y=dataset.iloc[:,3].values
iloc可以自行学习一下:
打印X,Y
首先导入sklearn的预处理包
from sklearn.preprocessing import Imputer
sklearn英文官方文档:http://scikit-learn.org/stable/
sklearn中文官方文档: http://sklearn.apachecn.org/cn/0.19.0/
至于sklearn的preprocessing库是用来对数据预处理,包括无量纲化,特征二值化,定性数据量化等
API文档链接:http://scikit-learn.org/stable/modules/classes.html#module-sklearn.preprocessing
处理代码:
imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0)
imputer = imputer.fit(X[ : , 1:3])
X[ : , 1:3] = imputer.transform(X[ : , 1:3])
解释一下:
第一行中:missing_values = "NaN"代表丢失值的占位符
axis=0代表列( columns),axis=1代表行(rows)
strategy默认值为"mean",即利用沿axis(文中沿列)求均值代替缺失处的值
第二行中:拟合数据
第三行:补足数据
先导库:
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
接下来:
labelencoder_X=LabelEncoder()
X[:,0]=labelencoder_X.fit_transform(X[:,0])
介绍一下sklearn.preprocessing.
LabelEncoder
官方介绍是:Encode labels with value between 0 and n_classes-1.
我的解释是对数据进行贴标签,假设有n个分类,分别贴0,1,2,...n-1
labelencoder_X=LabelEncoder()类似于java中的初始化一个对象(哈哈,我是java的忠实拥护者)
fit_transform
(y):贴标签(编码)吧
打印一下上述语句出现的结果:
和原始数据对比,可以发现0是France,1是Spain,2是Germany,哈哈哈,可以了解上述的目的了吧
接下啊,就是创建一个虚拟变量:
先上代码在解析
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
OneHotEnCoder:独热编码,在分类和聚类运算中我们经常计算两个个体之间的距离,对于连续的数字(Numric)这一点不成问题,但是对于名词性(Norminal)的类别,计算距离很难。即使将类别与数字对应,例如{‘A’,‘B’,‘C’}与[0,1,2]对应,我们也不能认为A与B,B与C距离为1,而A与C距离为2。独热编码正是为了处理这种距离的度量,该方法认为每个类别之间的距离是一样的。该方法将类别与向量对应,例如{‘A’,‘B’,‘C’}分别与[1,0,0],[0,1,0],[0,0,1]对应,注意现在各个类别之间的欧式距离是相同的。比较好的博客链接:https://www.cnblogs.com/zhoukui/p/9159909.html
官方文档中的函数:
OneHotEncoder
(n_values=’auto’,categorical_features=’all’,dtype=
n_values是对应categorical_features中各列下类别的数目
categorical_features是需要独热编码的列索引
sparse,默认为True,将返回一个稀疏矩阵,否则返回数组
handle_unknown:当转换的时候如果出现一个未知的分组特征,是否抛出错误,默认为抛出,否则忽略
导库
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在导入时会出现了废弃警告,解决方法有从sklearn.model_selection中调用train_test_split方法分出训练集和测试集
什么是特征缩放:
特征缩放的目标就是数据规范化,使得特征的范围具有可比性。它是数据处理的预处理处理,对后面的使用数据具有关键作用。
为什么要特征缩放:
特征缩放还可以使机器学习算法工作的更好。比如在K近邻算法中,分类器主要是计算两点之间的欧几里得距离,如果一个特征比其它的特征有更大的范围值,那么距离将会被这个特征值所主导。因此每个特征应该被归一化,比如将取值范围处理为0到1之间。 第二个原因则是,特征缩放也可以加快梯度收敛的速度。
同样的:先导库
from sklearn.preprocessing import StandardScaler
StandardScaler:作用:去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)