100-Days-Of-ML-Code day 1

一. 数据

git地址:100-Days-of-ml,用到的数据集如下:

二. 流程 

day1 

三. 代码 

#step1: 导入相应的包
import numpy as np
import pandas as pd
 
#step2:导入数据集
'''
pandas读取excel的示例
.iloc:根据标签的所在位置,从0开始计数,选取列,iloc[a:b,c:d]选取a-b行的c-d列的数据
loc:根据DataFrame的具体标签选取列

filename='../file/testiloc'
data=pd.read_excel(filename)
data_test1=data.iloc[:,:8]  #选取位置为[0,8)列的整列数据
data_test2=data.iloc[0:2,8]  #选取位置为8的列的[0,2)行的数据
data_test3=data.loc[0:2,'工龄']  #选取列名为‘工龄’的[0,2]行的数据

'''
data = pd.read_csv('./Data.csv', encoding='gb18030')
X = data.iloc[: , :-1].values # 取所有行的从第一列到最后一列的数据
Y = data.iloc[: , 3].values # 取所有行的第3列的数据
#step3:处理缺失数据 NaN
'''
这里解释一下transform和fit_transform
fit(x,y)传两个参数的是有监督学习的算法,fit(x)传一个参数的是无监督学习的算法,比如降维、特征提取、标准化
fit和transform没有任何关系,仅仅是数据处理的两个不同环节,之所以出来这么个函数名,仅仅是为了写代码方便,
所以会发现transform()和fit_transform()的运行结果是一样的。
注意:运行结果一模一样不代表这两个函数可以互相替换,绝对不可以!!!
transform函数是一定可以替换为fit_transform函数的
fit_transform函数不能替换为transform函数!!!理由解释如下:
 sklearn里的封装好的各种算法都要fit、然后调用各种API方法,transform只是其中一个API方法,
 所以当你调用除transform之外的方法,必须要先fit,为了通用的写代码,还是分开写比较好 
也就是说,这个fit相对于transform而言是没有任何意义的,但是相对于整个代码而言,fit是为
后续的API函数服务的,所以fit_transform不能改写为transform。
'''
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])
 
#step4:编码解析分类数据
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
 #创建一个虚拟变量
#categorical_features = 'all',这个参数指定了对哪些特征进行编码,默认对所有类别都进行编码。
# 也可以自己指定选择哪些特征,通过索引或者 bool 值来指定
onehotencoder = OneHotEncoder(categorical_features=[0]) #等价于true(第一列特征),表示就对第一列特征进行编码
X = onehotencoder.fit_transform(X).toarray() #或者这里也可以在上一行设置成OneHotEnconder(sparse = False)就不需要.toarray()
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)  #疑问,为什么这里不用将Y转换成OneHotEncoder编码形式?
 
#step5:把数据分为训练集和测试集
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)
 
#step6:特征缩放
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)

四. 详解

第一步:导入库
导入所需要的python库,首先确保已经安装了numpy库、pandas库,为了使用方便,用as进行重命名。

import numpy as np
import pandas as pd


第二步:导入数据
导入准备好的csv数据,数据。注意这里的Data.csv存放在当前的工作目录下,否则要使用绝对路径。

dataset = pd.read_csv('Data.csv')


可以查看一下数据的前几行:

dataset.head()


è¿éåå¾çæè¿°
 
还可以查看数值型数据的统计信息:

dataset.describe()


è¿éåå¾çæè¿°
 
对数据进行切片,iloc表示取数据集中的某些行和某些列,逗号前表示行,逗号后表示列,这里表示取所有行,列取除了最后一列的其他列,而最后一列是应变量(Y)

X = dataset.iloc[ : , :-1].values
Y = dataset.iloc[ : , 3].values


数据如下: 
y

第三步:处理缺失值
刚才的X数据中我们可以看到部分数据为NaN,对于这些缺失值常用的处理办法有:1、删除包含缺失值的数据列,2、填补缺失值(平均值、众数)。对于本例中的数据,我们使用平均数填充缺失值。这里用到python机器学习中最常用的sklearn库。

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])

现在来观察一下处理后的X: 
 tx
可以看到NaN值已经被处理为平均值了。

第四步:对分类变量的处理
我们可以看到上面X的Country列都是类别字符,这对机器学习来说是无法处理的类型,所以要对这一列进行类别编码。这里给的编码不太合理,不同的国家的地位应该是一样的,却给了不一样的数值,可能会造成机器学习的偏差,建议使用OneHot编码。

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

现在来看看处理后的X: 
 tx1
处理完X,我们再来处理Y,这里我们用onehot编码:

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

ty
第五步:划分测试集、训练集
训练集和测试集的比例为4:1

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)

第六步:特征缩放
也就是常说的归一化处理,防止某些特征的值特别大而影响机器学习的效果。

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

来看看现在得到的数据: 
 ex
到这里,预处理就全部完成了,这样的数据就可以直接进行机器学习了。

猜你喜欢

转载自blog.csdn.net/jinking01/article/details/84250849