特征筛选实现

  • 1、特征筛选
  • 2、特征筛选具体案例操作
  • 参考文献:

1、特征筛选

(1)含义

特征筛选/选择( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ),或属性选择( Attribute Selection )。是指从已有的 M 个特征( Feature )中选择 N 个特征使得系统的特定指标最优化,是从原始特征中选择出一些最有效特征以降低数据集维度的过程,是提高学习算法性能的一个重要手段,也是模式识别中关键的数据预处理步骤。对于一个学习算法来说,好的学习样本是训练模型的关键。

(2)目的

在有限的样本数目下,用大量的特征来设计分类器计算开销太大而且分类性能差。特征筛选可去掉一些冗余特征,提高模型的精度,减少计算量,减少特征数量、降维,使模型泛化能力更强,减少过拟合。

(3)一些区别

① 特征筛选与特征提取区别:特征提取 ( Feature extraction )是指利用已有的特征计算出一个抽象程度更高的特征集,也指计算得到某个特征的算法。

② 特征筛选和 PCA 的区别:对于 PCA 而言,我们经常无法解释重建之后的特征,而特征筛选不存在对特征数值的修改,而更加侧重于寻找那些对模型的性能提升较大的少量特征。

注意:降维和特征选择都是为了使数据维度降小,但实际上两者的区别很大,它们的本质是完全不同的: 降维本质上是从一个维度空间映射到另一个维度空间,特征的多少别没有减少,当然在映射的过程中特征的数值也会相应的变化(在这个过程中,特征发生了根本性的变化,原始的特征消失了);而特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后不改变值,但是选择后的特征维数肯定比选择前小,因为只选择了其中的一部分特征(没有被舍弃的特征没有发生任何变化)。

将高维空间的样本通过映射或者是变换的方式转换到低维空间,达到降维的目的,然后通过特征筛选删选掉冗余和不相关的特征来进一步降维。

(4)特征选取的原则

① 获取尽可能小的特征子集

② 不显著降低分类精度

③ 不影响类分布

④ 特征子集应具有稳定适应性强等特点

在筛选特征时需要注意:处理的数据类型、处理的问题规模、问题需要分类的数量、对噪声的容忍能力和无噪声环境下,产生稳定性好、最优特征子集的能力。

(5)特征获取方法

假设原始特征集中有 n 个特征(也称输入变量),那么存在 2 n − 1 2^n-1 2n−1个可能的非空特征子集。搜索策略就是为了从包含 2 n − 1 2^n-1 2n−1 个候选解的搜索空间中寻找最优特征子集而采取的搜索方法。按照特征子集的形成方式可以分为三种:穷举法( exhaustion )、启发法( heuristic )和随机法( random )。

1)穷举式搜索它可以搜索到每个特征子集。缺点是它会带来巨大的计算开销,尤其当特征数较大时,计算时间很长。

2)序列搜索它避免了简单的穷举式搜索,在搜索过程中依据某种次序不断向当前特征子集中添加或剔除特征,从而获得优化特征子集。比较典型的序列搜索算法如:前向后向搜索、等。序列搜索算法较容易实现,计算复杂度相对较小,但容易陷入局部最优。

3)随机搜索由随机产生的某个候选特征子集开始,依照一定的启发式信息和规则逐步逼近全局最优解。例如:遗传算法(Genetic Algorithm, GA)、模拟退火算法(SimulatedAnnealing, SA)、粒子群算法(Particl Swarm Optimization,PSO)和免疫算法(Immune Algorithm, IA)等。

综上穷举法需要遍历特征空间中所有的特征组合,所以方法复杂度最大,实用性不强;启发法通过采用期望的人工机器调度规则,重复迭代产生递增的特征子集,复杂度略低于穷举法,但是只能获取近似最优解;随即方法分为完全随机方法和概率随机方法两种,对参数设置的依赖性较强。

2、特征筛选具体案例操作

以“泰坦尼克号沉船事故”数据集为例:

# 导入 pandas 并且更名为 pd。
import pandas as pd
# 从互联网读取 titanic 数据。
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.model_selection 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.8267

# 从 sklearn 导入特征筛选器。
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)


筛选前 20% 的特征建立决策树得到的测试集准确率为0.8298

# 通过交叉验证(下一节将详细介绍)的方法,按照固定间隔的百分比筛选特征,并作图展示性能随特征筛选比例的变化。
from sklearn.model_selection 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)
# 找到体现最佳性能的特征筛选的百分比。
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_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)


由上面的输出结果可知:

① 经过初步的特征处理后,最终的训练与测试数据均有 474 个维度的特征;

② 如果直接使用全部 474 个维度的特征用于训练决策树模型进行分类预测,那么模型在测试集上的准确性约为 81.76% ;

③ 如果筛选前 20% 维度的特征,在相同的模型配置下进行预测,那么在测试集上表现的准确性约为 82.37% ;

④ 如果按照固定的间隔采用不同百分比的特征进行训练与测试,通过交叉验证得出的准确性有着很大波动,并且最好的模型性能表现在选取前 7% 的维度的特征的时候;

⑤ 如果使用前 7% 的维度的特征,那么最终决策树模型可以在该分类预测任务的测试集上表现出 85.71% 的准确性,比起最初使用全部特征的模型性能高出接近 4 个百分比。

参考文献:

[1] 范淼,李超.Python 机器学习及实践[M].清华大学出版社, 北京, 2016.
[2] JasonDing.http://www.jianshu.com/p/ab697790090f
[3] 苍梧.http://www.cnblogs.com/heaad/archive/2011/01/02/1924088.html

python 机器学习——特征筛选实现相关推荐

  1. 机器学习特征筛选:方差选择法VarianceThreshold

    机器学习特征筛选:方差选择法VarianceThreshold 方差是衡量一个变量的离散程度(即数据偏离平均值的程度大小): 变量的方差越大,我们就可以认为它的离散程度越大,也就是意味着这个变量对模型 ...

  2. 机器学习特征筛选:互信息法(mutual information)

    机器学习特征筛选:互信息法(mutual information) 互信息法多为分类问题的分类变量的筛选方法 经典的互信息也是评价定性自变量对定性因变量的相关性的,为了处理定量数据,最大信息系数法被提 ...

  3. 机器学习特征筛选:相关系数法(correlation)

    机器学习特征筛选:相关系数法(correlation) 通过计算特征与特征之间的相关系数的大小,可判定两两特征之间的相关程度. 取值区间在[-1, 1]之间,取值关系如下: corr(x1,x2)相关 ...

  4. R语言基于Boruta进行机器学习特征筛选(Feature Selection)

    R语言基于Boruta进行机器学习特征筛选(Feature Selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为"特征"(f ...

  5. Python机器学习—特征工程

    文章目录 1.数据集 1.1 可用数据集 1.2 scikit-learn数据集 sklearn小数据集 sklearn大数据集 1.3 数据集的划分 数据集划分API 2.特征工程 2.1特征工程包 ...

  6. 特征工程用java或python,机器学习-特征工程-Feature generation 和 Feature selection(示例代码)...

    Feature generation.对于这个技术点,其实没有什么诀窍,就是一个,深刻理解咱们的数据的意义再加上一点点创造力.大家是不是很懵逼,哈哈,这就完啦????哈哈当然不是啦,但是这一块缺失没有 ...

  7. 【Python】Pandas/Sklearn进行机器学习之特征筛选,有效提升模型性能

    今天小编来说说如何通过pandas以及sklearn这两个模块来对数据集进行特征筛选,毕竟有时候我们拿到手的数据集是非常庞大的,有着非常多的特征,减少这些特征的数量会带来许多的好处,例如 提高预测的精 ...

  8. 【Python机器学习及实践】进阶篇:模型实用技巧(特征提升)

    Python机器学习及实践--进阶篇:模型实用技巧(特征提升) 所谓特征抽取,就是逐条将原始数据转化为特征向量的形式,这个过程同时涉及对数据特征的量化表示:而特征筛选则进一步,在高维度.已量化的特征向 ...

  9. sklearn与机器学习系列专题之降维(五)一文弄懂Isomap特征筛选降维

    目录 1.Isomap算法简介 2.Isomap算法原理 3.Isomap算法优缺点 4.python实战Isomap 5.下篇预告 1.Isomap算法简介 等度量映射(Isometric Feat ...

最新文章

  1. 连接LilyPad之Linux平台的驱动
  2. SBT搭建Spark
  3. 怎么向easyui grid里面插入空数据_浅谈数据结算(三)
  4. 【转】SQL Server 2005 数据类型和.Net数据类型的对应关系
  5. OpenCV | Laplacian算子的使用
  6. python监控键盘输入_Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】...
  7. C++(STL):14--- forward_list比list更高效的容器
  8. 前端多个圆圈均匀横向排列_web前端工程师必须掌握的24条宝贵经验!让你在前端路上更轻松!...
  9. 你一定不知道的 AppStore 秘密
  10. 【ONE·Linux || 权限 】
  11. 抖音视频解析PHP源码
  12. JDK8新特性02 Lambda表达式02_Lambda语法规则
  13. kafka内外网连接问题
  14. 响应式布局的基本介绍及原理
  15. 股票python量化交易002-常见量化指标(基本面)
  16. 生活不可能像你想象的那么好,但也不会像你想象的那么糟。 ——莫泊桑《羊脂球》
  17. 怎样用计算机求立方根的近似数,第三讲·立方根
  18. R语言数据框中创建新的变量的三种方法
  19. 【postgresql】centos7安装postgresql-devel步骤
  20. 高中教学有计算机课吗,谈高中信息技术课教学

热门文章

  1. linux查询历史登入系统的主机名称或IP地址
  2. HDU 6194 string string string (后缀数组+线段树)
  3. Unity3d 制定游戏循环的策略
  4. ZIP entry size is too large
  5. windows开机的问题
  6. 什么是IDC?数据中心该如何选择?
  7. 三菱modbusRTU通讯实例_三菱PLC的无线通讯实例
  8. 德州学院计算机专业怎样,2017德州学院各专业录取分数线
  9. OpenSSL SSL_read: Connection was aborted, errno 10053的问题
  10. shp、tif文件坐标系转换