机器学习-特征筛选

冗余的特征虽然不会影响到模型的性能,不过却使得CPU的计算做了无用功。比如,主成分分析主要作用于去除多余的那些线性相关的特征组合,原因在于这些冗余的特征组合并不会对模型训练有更多贡献。

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

#泰坦尼克号沉船事故

#泰坦尼克号乘客数据查验
import pandas as pd         #导入pandas用于数据分析
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
#titanic.head()              #观察前几行数据
#titanic.info()              #查看数据的统计特征

#特征选取,机器学习很重要的一个环节
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, train_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_))

#使用决策树模型依据所有的特征进行预测,并做性能评估
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(criterion='entropy')
dt.fit(X_train, y_train)
print(dt.score(X_test,y_test))

#导入特征筛选器
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)
print(dt.score(X_test_fs, y_test))

#通过交叉验证大方法,按照固定间隔的百分比筛选特征,并作图展示性能随特征筛选比例的变化
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)
    results = np.append(results, scores.mean())
print(results)

#绘图
import matplotlib.pyplot as plt
plt.plot(percentiles, results)
plt.xlabel('percentiles of feature')
plt.ylabel('accuracy')
plt.show()


猜你喜欢

转载自blog.csdn.net/u012967763/article/details/79175946
今日推荐