3.1.1.2特征筛选

作者: idatadesign | 来源:发表于2017-11-30 21:41 被阅读250次

    冗杂的特征虽然不会影响到模型性能,不过却使得CPU的计算做了无用功。比如,主成分分析主要用于去除多余的那些线性相关的特征组合,原因在于这些冗余的特征组合并不会对模型训练有更多贡献。而不良的特征自然会降低模型的精度。
    特征筛选与PCA这类通过选择主成分对特征进行重建的方法略有区别:对于PCA而言,我们经常无法解释重建之后的特征;但是特征筛选不存在对特征值的修改,而更加侧重于寻找那些对模型的性能提升较大的少量特征。

    使用Titanic数据集,通过特征筛选的方法一步步提升决策树的预测性能
    import pandas as pd
    titanic=pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
    
    #分离数据特征与预测目标
    y=titanic['survived']
    X=titanic.drop(['row.names','name','survived'],axis=1)
    
    #对缺失数据进行填充
    X['age'].fillna(X['age'].mean(),inplace=True)
    X.fillna('UNKNOWN',inplace=True)
    
    #分割数据,依然采样25%用于测试
    from sklearn.cross_validation import train_test_split
    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)
    
    #类别型特征向量化
    from sklearn.feature_extraction import DictVectorizer
    vec=DictVectorizer()
    X_train=vec.fit_transform(X_train.to_dict(orient='record'))
    X_test=vec.transform(X_test.to_dict(orient='record'))
    
    #输出处理后特征向量的维度
    print(len(vec.feature_names_))
    

    474

    #使用决策树模型依靠所有特征进行预测,并作性能评估
    from sklearn.tree import DecisionTreeClassifier
    #使用信息熵作为划分标准,对决策树进行训练
    dt=DecisionTreeClassifier(criterion='entropy')
    dt.fit(X_train,y_train)
    dt.score(X_test,y_test)
    

    0.82370820668693012

    from sklearn import feature_selection
    #筛选前20%的特征,使用相同配置的决策树模型进行预测,并且评估性能
    fs=feature_selection.SelectPercentile(feature_selection.chi2,percentile=20)
    X_train_fs=fs.fit_transform(X_train,y_train)
    dt.fit(X_train_fs,y_train)
    X_test_fs=fs.transform(X_test)
    dt.score(X_test_fs,y_test)
    

    0.82066869300911849

    #通过交叉验证(下一节将详细介绍)的方法,按照固定间隔额百分比筛选特征,并作图展示性能随特征筛选比例的变化
    from sklearn.cross_validation import cross_val_score
    import numpy as np
    
    percentiles=range(1,100,2)#range(起始值,结束值,步数)
    results=[]
    
    for i in percentiles:
        fs=feature_selection.SelectPercentile(feature_selection.chi2,percentile=i)
        X_train_fs=fs.fit_transform(X_train,y_train)
        scores=cross_val_score(dt,X_train_fs,y_train,cv=5)
        results=np.append(results,scores.mean())
    print(results)
    
    #找到提现最佳性能的特征筛选的百分比
    opt=np.where(results==results.max())[0]
    print('Optimal number of features %d'%percentiles[opt])
    
    import pylab as pl
    pl.plot(percentiles,results)
    pl.xlabel('percentiles of feature')
    pl.ylabel('accuracy')
    pl.show()
    
    #使用最佳筛选后的特征,利用相同配置的模型在测试集上进行性能评估
    from sklearn import feature_selection
    fs=feature_selection.SelectPercentile(feature_selection.chi2,percentile=7)
    X_train_fs=fs.fit_transform(X_train,y_train)
    dt.fit(X_train_fs,y_train)
    X_test_fs=fs.transform(X_test)
    dt.score(X_test_fs,y_test)
    

    0.8571428571428571

    通过几个关键输出,总结如下:
    (1)经过初步的特征处理后,最终的训练与测试数据均有474个维度的特征;
    (2)如果直接使用全部474个维度的特征用于训练决策树模型进行分类预测,那么模型在测试集上的准确性约为81.76%;
    (3)如果筛选前20%维度的特征,在相同的模型配置下进行预测,那么在测试集上表现的准确性约为82.37%;
    (4)如果我们按照固定的间隔采用不同百分比的特征进行训练与测试,通过3.1.3.2交叉验证得出的准确性有着很大的波动,并且最好的模型性能表现在选取前7%维度的特征的时候;
    (5)如果使用前7%维度的特征,那么决策树模型可以在该分类预测任务的测试集上表现出85.71%的准确性,比起最初使用全部特征的模型性能高出4个百分点。

    相关文章

      网友评论

        本文标题:3.1.1.2特征筛选

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