当前位置 博文首页 > 靖墨c的博客:Python机器学习从零开始(三)数据准备

    靖墨c的博客:Python机器学习从零开始(三)数据准备

    作者:[db:作者] 时间:2021-08-21 19:13

    目录

    1.数据预处理

    1.1调整数据尺度

    1.2正态化数据

    1.3标准化数据

    1.4二值数据

    2.数据特征选定

    2.1单变量特征选定

    2.2递归特征消除

    2.3数据降维

    2.4特征重要性

    总结


    ? ? ? ? 特征选择时困难耗时的,也需要对需求的理解和专业知识的掌握。在机器学习的应用开发中,最基础的是特征工程。

    ——吴恩达?

    1.数据预处理

    数据预处理需要根据数据本身的特性进行,有缺失的要填不,有无效的要剔除,有冗余维的要删除,这些步骤都和数据本身的特性紧密相关。

    1.1调整数据尺度

    如果数据的各个属性按照不同的方式度量数据,那么通过调整数据的尺度让所有属性按照相同的尺度来度量,就会给机器学习的算法模型训练带来极大的方便。

    在scikit-learn中,可以通过Min Max Scalar类来调整数据尺度。将不同计量单位的数据统一成相同的尺度,利于对事物的分类或分组。Min Max Scalar其实是将属性缩放到一个指定范围,或者对数据进行标准化并将数据都聚集到0附近,方差为1。

    from numpy import set_printoptions
    from pandas import read_csv
    from sklearn.preprocessing import MinMaxScaler
    
    filename = 'pima_data.csv'
    names = ['preg','plas','pres','skin','test','mass','pedi','age','class']
    data = read_csv(filename,names = names)
    
    #将数据分为输入数据和输出结果
    array = data.values
    X = array[:,0:8]
    #X相当于所有数据
    Y = array[:,8]
    #Y为最后的class,即结果
    transformer = MinMaxScaler(feature_range=(0,1)).fit(X)
    #数据转化
    newX = transformer.fit_transform(X)
    #设定数据的打印格式
    set_printoptions(precision=3)
    #设置精度
    print(newX)
    [[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]]

    1.2正态化数据

    正态化数据是有效的处理符合高斯分布数据的手段,输出结果以0为中位数,方差为1。使用scikit-learn提供的Standard Scalar类来进行正态化处理。

    transformer = StandardScaler().fit(X)
    #数据转换
    _newX = transformer.transform(X)
    #设定数据打印格式
    set_printoptions(precision=3)
    #设置精度
    #print(_newX)
    [[ 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]]

    1.3标准化数据

    标准化数据是将每一行数据距离处理成1(在线性代数中矢量距离为1),又叫“归一元”处理,适合处理稀疏数据(具有很多为0的数据),归一元处理的数据对使用权重输入的神经网络和使用距离的K近邻算法的准确度的提升有显著作用

    使用scikit-learn中的Normalizer类实现。

    transformer = Normalizer().fit(X)
    #数据转换
    __newX = transformer.transform(X)
    #设置数据打印格式
    set_printoptions(precision=3)
    print(__newX)
    [[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]]

    1.4二值数据

    二值数据是使用值将数据转化为二值,大于阈值设置为1,小于阈值设置为0。

    使用scikit-learn中的Binarizer类实现。

    transformer = Binarizer(threshold=0.0).fit(X)
    #数据转换
    newX_ = transformer.transform(X)
    #设置数据打印格式
    set_printoptions(precision=3)
    print(newX_)
    [[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.]]

    2.数据特征选定

    在开始建立模型之前,执行特征选定有助于:降低数据的拟合度,提高算法精度,减少训练时间

    2.1单变量特征选定

    统计分析可以用来分析选择对结果影响最大的数据特征。在scikit-learn中通过SelectKBest类来实现,使用一系列统计方法来选定数据特征,也是对卡方检验的实现。

    卡方值越大,实际观测值与理论推断值之间越不符合;卡方值越小,实际观测值与理论推断值之间越符合;若两个值完全相等,卡方值为0。

    from pandas import read_csv
    from numpy import set_printoptions
    from sklearn.feature_selection import chi2
    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import RFE
    from sklearn.linear_model import LogisticRegression
    from sklearn.decomposition import PCA
    from sklearn.ensemble import ExtraTreesClassifier
    
    filename = 'pima_data.csv'
    names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
    data = read_csv(filename, names=names)
    array = data.values
    X = array[:,0:8]
    Y = array[:,8]
    
    #通过卡方检验选定数据特征
    #特征选定
    test = SelectKBest(score_func=chi2,k=4)
    fit = test.fit(X,Y)
    set_printoptions(precision=3)
    print(fit.scores_)
    features = fit.transform(X)
    print(features)

    执行后得到了卡方检验对每一个数据特征的评分,以及得分最高的四个数据特征。

    [ 111.52  1411.887   17.605   53.108 2175.565  127.669    5.393  181.304]
    [[148.    0.   33.6  50. ]
     [ 85.    0.   26.6  31. ]
     [183.    0.   23.3  32. ]
     ...
     [121.  112.   26.2  30. ]
     [126.    0.   30.1  47. ]
     [ 93.    0.   30.4  23. ]]

    2.2递归特征消除

    递归特征消除(RFE)使用一个及模型来进行多轮训练,每轮训练后消除若干权值系数的特征,再基于新的特征集进行下一轮训练。通过每一个基模型的精度,找到对最终预测结果影响最大的数据特征。

    #递归特征消除
    #特征选定
    model = LogisticRegression(max_iter=3000)#需要手动设置最大迭代次数
    rfe = RFE(model,3)
    fit = rfe.fit(X,Y)
    print("特征个数:")
    print(fit.n_features_)
    print("被选定的特征:")
    print(fit.support_)
    print("特征排名:")
    print(fit.ranking_)
    特征个数:
    3
    被选定的特征:
    [ True False False False False  True  True False]
    特征排名:
    [1 2 4 6 5 1 1 3]

    2.3数据降维

    常见降维方法有PCA(主要成分分析)和LDA(线性判别分析)。在聚类算法中,通常会用PCA对数据进行降维处理,以利于对数据的简化分析和可视化。

    #主要成分分析(数据降维)
    #通过主要成分分析选定数据特征
    pca = PCA(n_components=3)
    fit = pca.fit(X)
    print("解释方差:%s"% fit.explained_variance_ratio_)
    print(fit.components_)
    解释方差:[0.889 0.062 0.026]
    [[-2.022e-03  9.781e-02  1.609e-02  6.076e-02  9.931e-01  1.401e-02
       5.372e-04 -3.565e-03]
     [-2.265e-02 -9.722e-01 -1.419e-01  5.786e-02  9.463e-02 -4.697e-02
      -8.168e-04 -1.402e-01]
     [-2.246e-02  1.434e-01 -9.225e-01 -3.070e-01  2.098e-02 -1.324e-01
      -6.400e-04 -1.255e-01]]

    2.4特征重要性

    使用袋装决策树算法、随机森林算法和极端随机树算法可以计算数据特征的重要性。

    #特征重要性
    #特征选定
    model = ExtraTreesClassifier()
    fit = model.fit(X,Y)
    print(fit.feature_importances_)
    [0.109 0.234 0.101 0.077 0.076 0.14  0.121 0.142]

    总结

    本文主要讲了机器学习中的数据准备工作,包括数据预处理和数据特征选定,这些都是为了后序优化算法所做的准备工作。

    cs