scikit-learn系列之如何做数据准备

作者: coolspider2015 | 来源:发表于2017-02-21 16:52 被阅读270次
    如何准备数据

    几乎所有的机器学习算法都需要对数据进行准备,不同的算法根据其假设,可能要求不同的数据转化。原文作者的建议是:使用一个数据驱动的方法,组合多种数据准备方法和多种算法,比较表现优劣,建立起数据转化和算法的对应关系。

    1. 调整数据尺度(Rescale data)

    当你的数据处于不同的尺度时,把所有的数据属性都统一到一个标准尺度,对提升ML算法表现是很有帮助的。这种rescale可以看出是一种标准化,通常会把属性范围调整到0-1。使用的场景:如gradient descent的最优化算法、回归、神经网络和使用距离的算法(以权重作为输入)。使用scikit-learn 中的MinMaxScaler类实现。代码如下:

    import pandas as pd
    import numpy as np
    #import scipy
    from sklearn.preprocessing import MinMaxScaler
    data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
    names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
    df = pd.read_csv(data_link,names=names)
    data = df.values
    X = data[:,0:8]
    Y = data[:,8]
    scaler = MinMaxScaler(feature_range=(0,1))
    rescaledX = scaler.fit_transform(X)
    np.set_printoptions(precision = 3)
    print(X)
    print(rescaledX)
    

    结果如下:

    [[   6.     148.      72.    ...,   33.6      0.627   50.   ]
     [   1.      85.      66.    ...,   26.6      0.351   31.   ]
     [   8.     183.      64.    ...,   23.3      0.672   32.   ]
     ..., 
     [   5.     121.      72.    ...,   26.2      0.245   30.   ]
     [   1.     126.      60.    ...,   30.1      0.349   47.   ]
     [   1.      93.      70.    ...,   30.4      0.315   23.   ]]
    [[ 0.353  0.744  0.59  ...,  0.501  0.234  0.483]
     [ 0.059  0.427  0.541 ...,  0.396  0.117  0.167]
     [ 0.471  0.92   0.525 ...,  0.347  0.254  0.183]
     ..., 
     [ 0.294  0.608  0.59  ...,  0.39   0.071  0.15 ]
     [ 0.059  0.633  0.492 ...,  0.449  0.116  0.433]
     [ 0.059  0.467  0.574 ...,  0.453  0.101  0.033]]
    

    2. 正态化数据(standardize data)

    标准化使用高斯分布,把不同mean和SD的数据转化为标准分布(mean为0,SD为1)。使用场景:线性回归、logistic回归和线性区分问题。 使用scikit-learn 中的StandardScaler类实现。代码如下:

    import pandas as pd
    import numpy as np
    #import scipy
    from sklearn.preprocessing import StandardScaler
    data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
    names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
    df = pd.read_csv(data_link,names=names)
    data = df.values
    X = data[:,0:8]
    Y = data[:,8]
    scaler = StandardScaler().fit(X)
    rescaledX = scaler.transform(X)
    np.set_printoptions(precision = 3)
    print(X)
    print(rescaledX)
    

    结果如下:

    [[   6.     148.      72.    ...,   33.6      0.627   50.   ]
     [   1.      85.      66.    ...,   26.6      0.351   31.   ]
     [   8.     183.      64.    ...,   23.3      0.672   32.   ]
     ..., 
     [   5.     121.      72.    ...,   26.2      0.245   30.   ]
     [   1.     126.      60.    ...,   30.1      0.349   47.   ]
     [   1.      93.      70.    ...,   30.4      0.315   23.   ]]
    [[ 0.64   0.848  0.15  ...,  0.204  0.468  1.426]
     [-0.845 -1.123 -0.161 ..., -0.684 -0.365 -0.191]
     [ 1.234  1.944 -0.264 ..., -1.103  0.604 -0.106]
     ..., 
     [ 0.343  0.003  0.15  ..., -0.735 -0.685 -0.276]
     [-0.845  0.16  -0.471 ..., -0.24  -0.371  1.171]
     [-0.845 -0.873  0.046 ..., -0.202 -0.474 -0.871]]
    

    3. 标准化数据(normalize data)

    把每一行调整到长度为1(线性代数中的a unit norm,这个不太懂,需要深入挖掘)。用于稀疏数据,使用场景:使用权重输入的神经网络和使用距离的k近邻算法。使用scikit-learn 中的 Normalizer 类实现。代码如下:

    import pandas as pd
    import numpy as np
    #import scipy
    from sklearn.preprocessing import Normalizer
    data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
    names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
    df = pd.read_csv(data_link,names=names)
    data = df.values
    X = data[:,0:8]
    Y = data[:,8]
    scaler = Normalizer().fit(X)
    normalizedX = scaler.transform(X)
    np.set_printoptions(precision = 3)
    print(X)
    print(normalizedX)
    

    结果如下:

    [[   6.     148.      72.    ...,   33.6      0.627   50.   ]
     [   1.      85.      66.    ...,   26.6      0.351   31.   ]
     [   8.     183.      64.    ...,   23.3      0.672   32.   ]
     ..., 
     [   5.     121.      72.    ...,   26.2      0.245   30.   ]
     [   1.     126.      60.    ...,   30.1      0.349   47.   ]
     [   1.      93.      70.    ...,   30.4      0.315   23.   ]]
    [[ 0.034  0.828  0.403 ...,  0.188  0.004  0.28 ]
     [ 0.008  0.716  0.556 ...,  0.224  0.003  0.261]
     [ 0.04   0.924  0.323 ...,  0.118  0.003  0.162]
     ..., 
     [ 0.027  0.651  0.388 ...,  0.141  0.001  0.161]
     [ 0.007  0.838  0.399 ...,  0.2    0.002  0.313]
     [ 0.008  0.736  0.554 ...,  0.241  0.002  0.182]]
    

    4. 二值数据(binarize data)

    使用阈值,把数据转化为二值,大于阈值设置为1,小于阈值设置为0。使用场景:当生成crisp values的时候使用(不知道什么意思),还有就是feature egnineering的时候增加属性。使用scikit-learn 中的 Binarizer 类实现。代码如下:

    import pandas as pd
    import numpy as np
    #import scipy
    from sklearn.preprocessing import Binarizer
    data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
    names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
    df = pd.read_csv(data_link,names=names)
    data = df.values
    X = data[:,0:8]
    Y = data[:,8]
    binarizer = Binarizer(threshold=0.0).fit(X)
    binaryX = binarizer.transform(X)
    np.set_printoptions(precision = 3)
    print(X)
    print(binaryX)
    

    结果如下:

    [[   6.     148.      72.    ...,   33.6      0.627   50.   ]
     [   1.      85.      66.    ...,   26.6      0.351   31.   ]
     [   8.     183.      64.    ...,   23.3      0.672   32.   ]
     ..., 
     [   5.     121.      72.    ...,   26.2      0.245   30.   ]
     [   1.     126.      60.    ...,   30.1      0.349   47.   ]
     [   1.      93.      70.    ...,   30.4      0.315   23.   ]]
    [[ 1.  1.  1. ...,  1.  1.  1.]
     [ 1.  1.  1. ...,  1.  1.  1.]
     [ 1.  1.  1. ...,  1.  1.  1.]
     ..., 
     [ 1.  1.  1. ...,  1.  1.  1.]
     [ 1.  1.  1. ...,  1.  1.  1.]
     [ 1.  1.  1. ...,  1.  1.  1.]]
    

    5. 总结:

    可以使用以下4种方法准备数据:rescale,standardize,normalize,binarizer。但是更为重要的,我认为是:在实践中熟练不同数据准备方法的使用场景,在使用中建立其对算法提升的理论和知觉,更为重要。

    6. 知识点:

    1. MinMaxscaler
    2. StandardScaler
    3. Normalizer
    4. Binarizer
    5. xx.fit(X)
    6. scaler.transform(X)

    原文链接:How To Prepare Your Data For Machine Learning in Python with Scikit-Learn

    相关文章

      网友评论

        本文标题:scikit-learn系列之如何做数据准备

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