【1%】100小时机器学习——数据预处理

作者: QuantumCC | 来源:发表于2018-09-27 23:31 被阅读19次

    数据预处理

    前言:

    • What's This:我自己的学习笔记,如果你不想看GitHub,这里搬运的应该也很全面。
    • 为什么要学机器学习:很厉害,应用广,缺口大,解放人力,提升自己
    • 课程来源:YouTube上的大咖Siraj Raval就发起了一个挑战:#100DaysOfMLCode。
    • GitHUb地址:中文版本点这里 —— Here For English Edition
    • 学习计划: 不强求每天都来,佛性随性,每天课程量不大,所以我把100天改成了100小时,所以只要坚持同等与两周工作量的时间里,就能完成本课程。学到就是收获。
    • 基础要求: Python的使用

    Start

    Day 1.jpg

    Step 0: 环境

    Mine——Windows10x64, Python2.7, Hyper(推荐,比原生的命令窗口好看一点。在人工智能飞速发展的当下,培养艺术审美能力是赢得未来的重要技能)

    Step 1: 导入必要的库

    NumPy——用于实现大量的数学计算
    Pandas——用于操作数据集
    So easy, 直接Python pip安装。
    pip install Numpy
    pip install Pandas
    后边数据预处理还会用到 sklearn库
    pip install sklearn
    然后sklearn又依赖scipy
    pip install scipy
    还有一个必备的
    pip install matplotlib
    装这个可能要15分钟左右,可以去上个厕所,弹弹吉他,打回太极拳,或者找女朋友聊会儿天。下边的内容等装好了边看边动手做。

    Step 2: 导入数据集

    Data sets一般以.csv格式存储,内容为纯文本样式的表格,每行代表了一条数据record.这里使用 pandas的 read_csv 方法读取本地的csv文件作为数据帧, 然后从数据帧中制作自变量和因变量的矩阵(Matrix)和向量(Vector)。
    Data sets右键另存为下载

    import numpy as np
    import pandas as pd
    data = r'your/path/to/store/Data.csv'
    dataset = pd.read_csv(data)
    

    看一眼dataset是啥样子

    dataset
       Country   Age   Salary Purchased
    0   France  44.0  72000.0        No
    1    Spain  27.0  48000.0       Yes
    2  Germany  30.0  54000.0       No
    3    Spain  38.0  61000.0        No
    4  Germany  40.0      NaN       Yes
    5   France  35.0  58000.0       Yes
    6    Spain   NaN  52000.0        No
    7   France  48.0  79000.0       Yes
    8  Germany  50.0  83000.0        No
    9   France  37.0  67000.0       Yes
    

    继续操作
    X = dataset.iloc[ : , :-1].values
    Y = dataset.iloc[ : , 3].values
    这里可以理解为类似Python序列的分片操作,得到自己想要的数据组合
    看一下我们的X,Y:

    >>> X
    array([['France', 44.0, 72000.0],
           ['Spain', 27.0, 48000.0],
           ['Germany', 30.0, 54000.0],
           ['Spain', 38.0, 61000.0],
           ['Germany', 40.0, nan],
           ['France', 35.0, 58000.0],
           ['Spain', nan, 52000.0],
           ['France', 48.0, 79000.0],
           ['Germany', 50.0, 83000.0],
           ['France', 37.0, 67000.0]], dtype=object)
    
    >>> Y
    array(['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes'],
          dtype=object)
    

    Step 3: 处理丢失的数据

    对于数据的完整性来说,我国伟大的文学家苏轼早就有了“此事古难全”的重要论断。因此为了不影响机器学习模型的性能,我们用同类数据的均值或中间值来替代。此处用到sklearn.preprocessing库中的Impputer类来完成相关操作。

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

    简单解释一下代码,导入就不用说了,
    第一句是初始化了一个imputer类,传入的参数分别为missing_values,设置为NaN,替换策略strategy为mean,即用均值替代丢失值,axis设置为0。
    第二句用新建的imputer类来fit一下X。
    第三句完成缺失数据的替代。
    Step2得到的X变成了如下内容:

    >>> X
    array([['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]], dtype=object)
    

    Step 4: 编码分类数据

    分类数据(Categorical Data)指的是非数字类型的变量,通常以标签值的形式出现,例如本例中的‘Yes’和‘No’,对于模型的数学计算,需要把它们编码成数字。这里用到的是sklearn.preprocessing库中的LabelEncoder类。

    from sklearn.preprocessing import LabelEncoder, OneHotEncoder
    labelencoder_X = LabelEncoder()
    X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])
    
    ##Creating a dummy variable
    onehotencoder = OneHotEncoder(categorical_features = [0])
    X = onehotencoder.fit_transform(X).toarray()
    labelencoder_Y = LabelEncoder()
    Y =  labelencoder_Y.fit_transform(Y)
    

    经过转化,X和Y的变化如下:

    >>> X
    array([[0L, 44.0, 72000.0],
           [2L, 27.0, 48000.0],
           [1L, 30.0, 54000.0],
           [2L, 38.0, 61000.0],
           [1L, 40.0, 63777.77777777778],
           [0L, 35.0, 58000.0],
           [2L, 38.77777777777778, 52000.0],
           [0L, 48.0, 79000.0],
           [1L, 50.0, 83000.0],
           [0L, 37.0, 67000.0]], dtype=object)
    
    >>> X
    array([[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]])
    
    >>> Y
    array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1], dtype=int64)
    

    Step 5: 将数据集分为测试集和训练集

    我们通常把数据集按照“二八原则”分为训练集(training set)和测试集(test set),前者用于训练模型,占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)
    

    Step 6: 特征缩放

    大部分模型算法计算两个数据点的欧式距离,导致的问题就是幅度变化不好控制,高幅度的特征比低幅度的特征权重更大。解决这个问题的方法是特征标准化或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)
    

    总结

    To Be Honest, 第一天主要就是个入门和环境搭建的上手,用Python作为工具,简述了进行机器学习的前6个步骤,并用相应的库简单轻松的完成了操作,不要觉得无聊,继续下去,会有新收获!

    相关文章

      网友评论

        本文标题:【1%】100小时机器学习——数据预处理

        本文链接:https://www.haomeiwen.com/subject/lcdhgftx.html