机器学习 Day 1 | Data PreProcessing

作者: raphah | 来源:发表于2018-08-08 23:07 被阅读49次

    机器学习第一天 数据预处理

    数据表格地址:
    https://www.xiehaoo.com/media/record/pinke/2018/08/Data.csv
    我爬的淘宝多肉类7万数据集:
    https://www.xiehaoo.com/media/record/pinke/2018/08/taobao.csv

    20万的,100万,1000万的数据集如果有需要再放8

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

    import numpy as np
    import pandas as pd
    from sklearn.preprocessing import Imputer
    from sklearn.cross_validation import train_test_split
    from sklearn.preprocessing import StandardScaler
    from 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量数据进行测试~

    感谢原作者 Avik-Jain 以及 zhyongquan
    后面周末准备资瓷一下100-Days-Of-ML-Code汉化工作

    相关文章

      网友评论

        本文标题:机器学习 Day 1 | Data PreProcessing

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