python 机器学习——特征筛选实现
特征筛选实现
1、特征筛选
(1)含义
特征筛选/选择( Feature Selection )也称特征⼦集选择( Feature Subt Selection , FSS ),或属性选择( Attribute Selection )。是指从已有的 M 个特征( Feature )中选择 N 个特征使得系统的特定指标最优化,是从原始特征中选择出⼀些最有效特征以降低数据集维度的过程,是提⾼学习算法性能的⼀个重要⼿段,也是模式识别中关键的数据预处理步骤。对于⼀个学习算法来说,好的学习样本是训练模型的关键。
(2)⽬的晋灭吴之战
在有限的样本数⽬下,⽤⼤量的特征来设计分类器计算开销太⼤⽽且分类性能差。特征筛选可去掉⼀些冗余特征,提⾼模型的精度,减少计算量,减少特征数量、降维,使模型泛化能⼒更强,减少过拟合。
(3)⼀些区别
① 特征筛选与特征提取区别:特征提取 ( Feature extraction )是指利⽤已有的特征计算出⼀个抽象程度更⾼的特征集,也指计算得到某个特征的算法。
② 特征筛选和 PCA 的区别:对于 PCA ⽽⾔,我们经常⽆法解释重建之后的特征,⽽特征筛选不存在对特征数值的修改,⽽更加侧重于寻找那些对模型的性能提升较⼤的少量特征。
注意:降维和特征选择都是为了使数据维度降⼩,但实际上两者的区别很⼤,它们的本质是完全不同的: 降维本质上是从⼀个维度空间映射到另⼀个维度空间,特征的多少别没有减少,当然在映射的过程中特征的数值也会相应的变化(在这个过程中,特征发⽣了根本性的变化,原始的特征消失了);⽽特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后不改变值,但是选择后的特征维数肯定⽐选择前⼩,因为只选择了其中的⼀部分特征(没有被舍弃的特征没有发⽣任何变化)。
将⾼维空间的样本通过映射或者是变换的⽅式转换到低维空间,达到降维的⽬的,然后通过特征筛选删选掉冗余和不相关的特征来进⼀步降维。
(4)特征选取的原则
① 获取尽可能⼩的特征⼦集
② 不显著降低分类精度
③ 不影响类分布
过年吉祥话④ 特征⼦集应具有稳定适应性强等特点
在筛选特征时需要注意:处理的数据类型、处理的问题规模、问题需要分类的数量、对噪声的容忍能⼒和⽆噪声环境下,产⽣稳定性好、最优特征⼦集的能⼒。
(5)特征获取⽅法
假设原始特征集中有 n 个特征(也称输⼊变量),那么存在 个可能的⾮空特征⼦集。搜索策略就是为了从包含 个候选解的搜索空间中寻找最优特征⼦集⽽采取的搜索⽅法。按照特征⼦集的形成⽅式可以分为三种:穷举法( exhaustion )、启发法( heuristic )和随机法( random )。
1)穷举式搜索它可以搜索到每个特征⼦集。缺点是它会带来巨⼤的计算开销,尤其当特征数较⼤时,计算时间很长。
2)序列搜索它避免了简单的穷举式搜索,在搜索过程中依据某种次序不断向当前特征⼦集中添加或剔除特征,从⽽获得优化特征⼦集。⽐较典型的序列搜索算法如:前向后向搜索、等。序列搜索算法较容易实现,计算复杂度相对较⼩,但容易陷⼊局部最优。
3)随机搜索由随机产⽣的某个候选特征⼦集开始,依照⼀定的启发式信息和规则逐步逼近全局最优解。例如:遗传算法(Genetic Algorithm, GA)、模拟退⽕算法(SimulatedAnnealing, SA)、粒⼦群算法(Particl Swarm Optimization,PSO)和免疫算法(Immune Algorithm, IA)等。
2−n 12−n 1
综上穷举法需要遍历特征空间中所有的特征组合,所以⽅法复杂度最⼤,实⽤性不强;启发法通过采⽤期望的⼈⼯机器调度规则,重复迭代产⽣递增的特征⼦集,复杂度略低于穷举法,但是只能获取近似最优解;随即⽅法分为完全随机⽅法和概率随机⽅法两种,对参数设置的依赖性较强。
2、特征筛选具体案例操作
以“泰坦尼克号沉船事故”数据集为例:
# 导⼊ pandas 并且更名为 pd。
import pandas as pd
# 从互联⽹读取 titanic 数据。
titanic = pd.read_csv('vanderbilt.edu/wiki/pub/Main/')
# 分离数据特征与预测⽬标。
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% ⽤于测试。
del_lection 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(_dict(orient='record'))
X_test = ansform(_dict(orient='record'))
# 输出处理后特征向量的维度。
print(len(vec.feature_names_))
10月7号我们可以看到特征向量的维度为474.土人参
# 使⽤决策树模型依靠所有特征进⾏预测,并作性能评估。
import DecisionTreeClassifier
dt = DecisionTreeClassifier(criterion='entropy')
dt.fit(X_train, y_train)
dt.score(X_test, y_test)
使⽤所有特征建⽴决策树得到的测试集准确率为0.8267
# 从 sklearn 导⼊特征筛选器。
from sklearn import feature_lection
# 筛选前 20% 的特征,使⽤相同配置的决策树模型进⾏预测,并且评估性能。
fs = feature_lection.SelectPercentile(feature_lection.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)
筛选前 20% 的特征建⽴决策树得到的测试集准确率为0.8298
# 通过交叉验证(下⼀节将详细介绍)的⽅法,按照固定间隔的百分⽐筛选特征,并作图展⽰性能随特征筛选⽐例的变化。
厨卫十大名牌排名
del_lection import cross_val_score
import numpy as np
percentiles =range(1,100,2)
results =[]
for i in percentiles:
经营计划fs = feature_lection.SelectPercentile(feature_lection.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, an())
print(results)
# 找到体现最佳性能的特征筛选的百分⽐。
opt = np.where(results == results.max())[0]
print('Optimal number of features %d'%percentiles[int(opt)])
我们可以看到筛选7%的特征能够使得我们的训练集准确率达到最⾼。
import pylab as pl
pl.plot(percentiles, results)
pl.xlabel('percentiles of features')
pl.ylabel('accuracy')
pl.show()
# 使⽤最佳筛选后的特征,利⽤相同配置的模型在测试集上进⾏性能评估。
from sklearn import feature_lection
fs = feature_lection.SelectPercentile(feature_lection.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)
由上⾯的输出结果可知:
① 经过初步的特征处理后,最终的训练与测试数据均有 474 个维度的特征;
② 如果直接使⽤全部 474 个维度的特征⽤于训练决策树模型进⾏分类预测,那么模型在测试集上的准确性约为 81.76% ;
③ 如果筛选前 20% 维度的特征,在相同的模型配置下进⾏预测,那么在测试集上表现的准确性约为 82.37% ;
贝瓦唐诗三百首
④ 如果按照固定的间隔采⽤不同百分⽐的特征进⾏训练与测试,通过交叉验证得出的准确性有着很⼤波动,并且最好的模型性能表现在选取前 7% 的维度的特征的时候;
⑤ 如果使⽤前 7% 的维度的特征,那么最终决策树模型可以在该分类预测任务的测试集上表现出 85.71% 的准确性,⽐起最初使⽤全部特征的模型性能⾼出接近 4 个百分⽐。
参考⽂献:
叶海龙[1] 范淼,李超.Python 机器学习及实践[M].清华⼤学出版社, 北京, 2016.
[2] JasonDing./p/ab697790090f
[3] 苍梧./heaad/archive/2011/01/02/1924088.html