100-Days-Of-ML-Code 评注版(Day 1)

Day 1_Data PreProcessing(数据预处理)

本文引用自 Day 1_Data PreProcessing, 对其中内容进行了评注与补充说明。

Info-graphs

导入数据

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

处理缺失数据

通过观察,可以发现导入的数据中存在部分缺失,这样的数据必须处理后才能进行数据分析,这个过程被称为数据清理。一般来说数据清理主要处理缺失值和噪声数据。<<数据挖掘概念与技>>中对数据清理有详细的描述。这里作者用了比较通用的方法,分别用Age、Salary两列的平均值来填充缺失值。

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

分离变量编码

观察Country这列的数据发现,这列的数据由France、Spain、Germany组成,这种类型的数据被称为分类变量或者称为标签变量,为了进行数据分析通常需要将这种类型的变量转换为数值型。

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

上面的代码执行后,Country中的France、Spain、Germany被编码为0, 1, 2,完成了由分类变量到到数值型变量的转换。通常为了进行进一步的处理,还需要引入哑元变量将数据从一维转为多维,sklearn包中的OneHotEncoder工具可以方便的完成这项工作。

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

划分测试数据集和训练数据集

为了得到可靠稳定的模型,通常需要进行交叉验证(Cross Validation),交叉验证是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据进行分组,一部分做为训练集,另一部分做为验证集,首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型,以此来做为评价分类器的性能指标。

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)

特征规约

通常情况下不同维度的数据单位是不同的,比如已知房价受距离市中心距离与自身面积的影响,现在有这样的数据(1.5, 50, 180), (3, 100, 200), (8, 150, 220), ...。数据中第一维度x表示距市中心距离(km),第二维度y表示面积(m^2), 第三维度z表示房价(万)。现在想获得z与x、y之间的对应关系,假定使用线性回归方法进行计算: z = w1 * x + w2 * y + b。这时会发现数据中x的变化范围较小,而y的变化范围较大,就回归方程而言y的变动将对结果起到较大的影响,而x的变化对整个方式结果的影响较小,甚至可以忽略不计,但实际情况是距市中心的距离有又实实在在的影响房价。为了解决这一问题需要对x、y进行归一化处理,将这两个变量压缩到相同的范围区间内,忽略计量单位带来的影响。比如将x、y压缩到[0, 1]或[-1, 1]的区间内。 

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

参考资料

posted @ 2018-08-14 21:24  星际行者  阅读(479)  评论(0编辑  收藏  举报