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特征筛选

    冗杂的特征虽然不会影响到模型性能,不过却使得CPU的计算做了无用功。比如,主成分分析主要用于去除多余的那些线性相关...

  • 特征筛选

    看到一个相关内容写得不错的博客,先贴一下,后续有时间整理按自己的思路写(to be continued)https...

  • 特征筛选面试

    对于一个传统的Kaggle比赛,比如信用评分项目,当面试官问到如何做特征筛选的时候,怎样的回答可能会让面试官比较满...

  • 特征筛选工具

    做模型时常常是特征越多模型准确率越高(至少在训练集上)。但过多的特征又增加了数据收集、处理、存储的工作量,以及模型...

  • Task 3:特征工程

    特征工程 导入数据 特征构造 特征筛选 过滤式 包裹式 嵌入式

  • Task3

    特征选择 TF-IDF原理以及利用其进行特征筛选 互信息的原理以及利用其进行特征筛选 TF-IDF 原理: 如何提...

  • 特征工程之_筛选

    1. 说明  本文并非介绍某个成熟算法或者工具,只是个人的一点感悟,写得可能不正确,不全面,希望能给大家带来...

  • 特征工程-指标筛选

    数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。 在数据建模前期,很重要的一步是特征工程的构建,...

  • 特征筛选(随机森林)

    随机森林能够度量每个特征的重要性,我们可以依据这个重要性指标进而选择最重要的特征。sklearn中已经实现了用随机...

  • 特征选择与特征学习算法研究--笔记1

    特征选择与特征学习算法研究 2.1特征选择 特征选择过程特征选择是对数据进行预处理的机器学习算法,通过从数据中筛选...

网友评论

    本文标题:3.1.1.2特征筛选

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