为了账号安全,请及时绑定邮箱和手机立即绑定

机器学习 Day 1 | Data PreProcessing

标签:
Python

先上代码
后面进行逐步分析

import numpy as npimport pandas as pdfrom sklearn.preprocessing import Imputerfrom sklearn.cross_validation import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.preprocessing import LabelEncoder, OneHotEncoder

dataset = pd.read_csv('/Users/xiehao/Desktop/100-Days-Of-ML-Code-master/datasets/Data.csv')
X = dataset.iloc[:, :-1].values
Y = dataset.iloc[:, 3].values  
imputer = Imputer(missing_values="NaN", strategy="mean", axis=0)
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
onehotencoder = OneHotEncoder(categorical_features=[0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)

第一步:导入需要的库

Numpy   包含数学计算函数
Pandas  用于导入和管理数据集

第二步:导入数据集

数据集通常是.csv格式。CSV文件以文本形式保存表格数据。文件的每一行是一条数据记录。用Pandas的read_csv方法读取本地csv文件为一个数据样本,然后从数据样本中制作自变量和因变量的矩阵和向量。

dataset = pd.read_csv('/Users/xiehao/Desktop/100-Days-Of-ML-Code-master/datasets/Data.csv')"""
数据表格
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
"""X = dataset.iloc[:, :-1].values  # [['France' 44.0 72000.0],['Spain' 27.0 48000.0],['Germany' 30.0 54000.0].....]Y = dataset.iloc[:, 3].values  # [No,Yes,No,No,......]"""
pandas.DataFrame.iloc
Purely integer-location based indexing for selection by position.
整数索引
"""

第三步:处理丢失数据

数据一般很少是完整的,数据可能因为各种原因丢失(如我们的数据表格中age和salary中各缺失了一个数据),为了不降低机器学习模型的性能,需要处理数据。我们可以用sklearn.preprocessing库中的Imputer类完成这个任务。

strategy采用均值策略

imputer = Imputer(missing_values="NaN", strategy="mean", axis=0)
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])>>> print(X)
[['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]]

第四步:解析分类数据
分类数据指的是含有标签值而不是数字值的变量。取值范围通常是固定的。例如表格中Purchased中的Yes和No不能用于模型的数字计算,所以要解析成数字,为了实现这一功能,我们从sklearn.precocesing库导入 LabelEncoder类。

from sklearn.preprocessing import LabelEncoder, OneHotEncoder"""
sklearn.preprocessing.LabelEncoder():标准化标签,将标签值统一转换成range(标签值个数-1)范围内。

标准化的前提是特征值服从正太分布(即 x 服从 N(μ,σ^2)),标准化后,转化为标准的正太分布。标准化是按照特征矩阵的列处理数据,其通过求 z-score 的方法,将样本的特征值转换到同一量纲下。
"""labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])"""
X[:,0]处理前  ['France' 'Spain' 'Germany' 'Spain' 'Germany' 'France' 'Spain' 'France' 'Germany' 'France']
X[:,0]处理后  [0 2 1 2 1 0 2 0 1 0]

对于预测值采用标签编码是没有问题的,然而,在类目特征中,标签编码转换是不够的,国家一列,特征按照0-2顺序编码,这里还需要对数据进行亚编码,one-hot encoding. 采用sklearn.preprocessing 包下的 OneHotEncoder
"""onehotencoder = OneHotEncoder(categorical_features=[0])
X = onehotencoder.fit_transform(X).toarray()  
labelencoder_Y = LabelEncoder()
>>print(Y)
  ['No' 'Yes' 'No' 'No' 'Yes' 'Yes' 'No' 'Yes' 'No' 'Yes']
Y = labelencoder_Y.fit_transform(Y)
>>print(Y)
  [0 1 0 0 1 1 0 1 0 1]

>>print(X)
[[  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]]

第五步:拆分数据集为测试

集合和训练集合
把数据集拆分成两个
一个是用来训练模型的训练集合,另一个是用来验证模型的测试集合。两者的比例一般是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)>>print(X_train)
  [[  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.70000000e+01
    6.70000000e+04]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00   2.70000000e+01
    4.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   0.00000000e+00   1.00000000e+00   3.80000000e+01
    6.10000000e+04]
 [  1.00000000e+00   0.00000000e+00   0.00000000e+00   4.40000000e+01
    7.20000000e+04]
 [  1.00000000e+00   0.00000000e+00   0.00000000e+00   3.50000000e+01
    5.80000000e+04]]>>print(X_test)
  [[  0.00000000e+00   1.00000000e+00   0.00000000e+00   3.00000000e+01
    5.40000000e+04]
 [  0.00000000e+00   1.00000000e+00   0.00000000e+00   5.00000000e+01
    8.30000000e+04]]>>print(Y_train)
  [1 1 1 0 1 0 0 1]>>print(Y_test)
  [0 0]

第六步:特征量化
大部分模型算法使用两点间的欧式距离表示,但此特征在幅度、单位和范围姿态问题上变化很大。在距离计算中,高幅度的特征比低幅度的特征权重更大。可用特征标准化或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)
>>print(X_train)
  [[-1.          2.64575131 -0.77459667  0.26306757  0.12381479]
 [ 1.         -0.37796447 -0.77459667 -0.25350148  0.46175632]
 [-1.         -0.37796447  1.29099445 -1.97539832 -1.53093341]
 [-1.         -0.37796447  1.29099445  0.05261351 -1.11141978]
 [ 1.         -0.37796447 -0.77459667  1.64058505  1.7202972 ]
 [-1.         -0.37796447  1.29099445 -0.0813118  -0.16751412]
 [ 1.         -0.37796447 -0.77459667  0.95182631  0.98614835]
 [ 1.         -0.37796447 -0.77459667 -0.59788085 -0.48214934]]
>>print(X_test)
  [[ 0.  0.  0. -1. -1.]
 [ 0.  0.  0.  1.  1.]]

学习中只使用了少量数据,明天从本地100W量数据进行测试~




作者:raphah
链接:https://www.jianshu.com/p/4de0be3f62b2


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消