特征筛选(复习15)

本文是个人学习笔记,内容主要基于sklearn库的特征筛选器对Titanic数据集进行特征预处理后,再进行分类。

特征筛选与PCA这类通过选择主成分对特征进行重建的方法略有区别:对于PCA而言,经常无法解释重建之后的特征;但是特征筛选不存在对特征值的修改,其更侧重于寻找那些对模型的性能提升较大的少量特征

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)
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'))   #类别型特征one-hot
X_test=vec.transform(X_test.to_dict(orient='record'))
print(len(vec.feature_names_))
#Output:474
from sklearn.tree import DecisionTreeClassifier
dt=DecisionTreeClassifier(criterion='entropy')
dt.fit(X_train,y_train)
dt.score(X_test,y_test)
#Output:0.81458966565349544
from sklearn import feature_selection
fs=feature_selection.SelectPercentile(feature_selection.chi2,percentile=20)   #筛选前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)
#Output:0.82674772036474165
from sklearn.cross_validation import cross_val_score
import numpy as np
percentiles=range(1,100,2)
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)   #通过交叉验证,按固定间隔2%的步长筛选特征
    results=np.append(results,scores.mean())
print(results)

opt=np.where(results==results.max())[0]
print('Optimal number of features %d' % percentiles[opt[0]])

这里写图片描述

import pylab as pl
pl.plot(percentiles,results)
pl.xlabel('percentiles of features')
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)

这里写图片描述

从上图可见,按固定的间隔采用不同百分比的特征进行训练和测试,当使用前7%维度的特征时,最终决策树模型可以在该分类预测任务的测试集上表现出85.71%的准确性,比起初使用全部特征的模型性能高4个百分点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值