特征选择(Feature Selection)引言
您应该采纳哪种特征去创建一个可预测的模型呢?
这是一个难题,可能需要您对问题有深入的了解。
自动筛选您的数据中最具价值和最相关的特征是可能的,这个过程被称为是特征选择。
在这篇文章中,您会了解到特征选择(feature selection
),下一次您可以使用同种类型的方法和一个有制可循的清单,以供您在需要选择机器学习模型特征时使用。
特征选择引言
由 John Tann
拍摄,保留部分权利
什么是特征选择
特征选择又被称为变量选择(variable selection
)或者属性选择(attribute selection
)。
这是一种自动选择数据(如表格数据中的列)的方式,它自动选择属性,属性中会包括与您正在处理的预测建模问题最相关的数据。
特征选择...是选择用于构建相关特征子集模型的过程
- 特征选择,维基百科条目。
特征选择不同于维数约简(dimensionality reduction
)。这两种方法都试图减少数据集中属性的数量,但维数约简通过创建新的属性集合来实现,特征选择则是依靠不改变数据的方式,去包含和排除数据中存在的属性来实现。
降维方法的例子包括主成分分析(Component Analysis
),奇异值分解(Singular Value Decomposition
)和 Sammon
映射 (Sammon’s Mapping.
)。
特征选择是有用的,但它主要作为一个过滤器,消除除了您现有的特征之外没有用的特征。
- 罗伯特·诺伊豪斯(Robert Neuhaus)回答“ 您认为机器学习中的特征选择有多宝贵?”
特征选择解决的问题
特征选择方法帮助您完成任务,创建精确的预测模型。在需要更少的数据的同时,他们通过特征选择能够提供不错甚至更棒的准确性。
特征选择方法可以用来识别和去除数据,这种数据中包含无用,不相关和冗余的属性,他们会造成预测失真或者降低模型的实际的准确性。
更少的属性是可取的,因为它降低了模型的复杂性,更简单的模型更容易理解和解释。
变量选择的目标有三个方面:提高预测变量的预测性能,提供更快速,更具成本效益的预测变量,并更好地理解生成数据的底层运行。
- Guyon和Elisseeff的“ 变量和特征选择引言 ”(PDF)
特征选择算法
有三大类特征选择算法:过滤方法(filter methods
),包装器方法(wrapper methods
)和嵌入方法(embedded methods.
)。
过滤方法
过滤器特征选择方法应用统计度量来为每个特征分配评分,这些特征按照得分排序,选择保留或是从数据集中删除,这些方法通常是单变量的,并且独立地考虑这个特征或者考虑因变量。
例如,过滤方法包括Chi平方检验(Chi squared test
),信息增益(information gain
)和相关系数分数(correlation coefficient scores
)。
包装器方法
包装器方法选择一组特征值来协助检索问题,在这些特性中,不同的组合被准备、评估并与其他组合进行比较。通过模型的准确性分配一个分数,建立评估功能组合的预测模型。
搜索过程可能是有条不紊的,如最佳搜索(best-first search
),它可以是随机的,如随机爬山算法(hill-climbing algorithm
),也可以使用启发式,如向前和向后遍历来添加和删除特征。
包装器方法是递归特征消除算法的一个例子。
嵌入式方法
嵌入的方法可以了解在模型创建时,哪些特性对模型的精确性做出了最好的贡献。最常见的嵌入式特征选择方法是正则化方法(regularization methods
)。
正则化方法也被称为惩罚方法(penalization methods
),其将额外的约束引入到优化预测算法(例如回归算法(regression algorithm
))中,将模型约束为较低的复杂性(较少的系数)。
正则化算法的例子是LASSO
(Least absolute shrinkage and selection operator
),弹性网络(Elastic Net
)和岭回归(Ridge regression
)。
功能选择教程和配方
我们已经在这个博客上看到了很多功能选择的例子。
-
Weka:有关如何使用
Weka
执行特征选择的教程,请参阅“ 特征选择以提高准确性和减少训练时间 ”。 -
Scikit-Learn:有关使用
Python
中的scikit-learn
递归消除的方法,请参阅“ 使用Scikit-Learn在Python中进行功能选择 ”。 -
R:有关使用
Caret R
软件包进行递归功能消除的方法,请参阅使用Caret R软件包进行功能选择 ”
选择功能时的陷阱
特征选择是应用机器学习过程的另一个关键部分,如模型选择,您不能一劳永逸。
将特征选择作为模型选择过程的一部分是很重要的。如果您不这样做,您可能会无意中将偏差引入您的模型中,导致过度拟合。
...应该在不同的数据集上进行特征选择,而不是在训练您的预测模型上进行特征选择......不这样做的效果是您会过度训练您的训练数据。
- Ben Allison在回答“ 使用相同的数据进行特征选择和交叉验证是否存在偏差?”
例如,当您使用交叉验证等准确性估计方法时,必须在内部循环中包含特征选择。这意味着在模型训练之前,在准备好的文件夹上执行特征选择。一个错误的做法是首先执行特征选择,然后准备数据,再对所选特征执行模型选择和训练。
如果我们采用适当的程序,并在每一个文件夹中进行特征选择,那么在文件夹中所使用的特征选择中就不再有任何关于这些特征的信息。
- Dikran Marsupial回答“ 在机器学习中执行交叉验证时,最终模型的特性选择 ”
原因是,选择这些特性的决策是在整个训练集上做出的,而这些决定又被传递到模型上。这可能会生成一种模型,该模型被选中的特性被增强,而不是通过其他模型进行反馈的,以获得更好的结果,所以实际上它是有偏差的结果。
如果您对所有数据执行特征选择,然后进行交叉验证,那么交叉验证程序的每个文件夹中的测试数据也用于选择特征,这就是性能分析的偏差。
- Dikran Marsupial回答“ 特征选择和交叉验证 ”
功能选择清单
“ 变量和特征选择介绍 ”(PDF)的作者Isabelle Guyon和Andre Elisseeff 提供了一个极好的清单,您可以在下次需要为您预测建模问题选择特征数据时使用。
我在这里展示了部分清单的内容:
- 您有该领域知识吗?如果是的话,构建一组更好的临时“特性”。
- 您的功能相称吗?如果不是,请考虑使其正常化。
- 你怀疑特征的相互依存吗?如果是,通过构造连接特性或特性的产品来扩展您的特性,就像您的计算机资源允许的那样。
- 您是否需要删除输入变量(例如,成本,速度或数据理解的原因)?如果没有,构造析取特征或特征的加权和。
- 您是否需要单独评估特性(例如,了解它们对系统的影响,或者因为它们的数量太大,您需要进行第一次筛选)?如果是,则使用可变排序方法; 否则,无论如何,要获得基准的结果。
- 您需要预测吗?如果否,停止
- 您怀疑您的数据是“脏的”(有几个无意义的输入模式和/或噪声输出或错误的类标签)?如果是,则使用在步骤5中获得的排名最高的变量作为表示来检测异常值示例,检查和/或丢弃它们。
- 您知道先做什么吗?如果没有,使用线性预测器。使用“探针”方法的正向选择方法作为停止标准,或者使用0-norm嵌入式方法进行比较,按照步骤5的排序,使用增加的特征子集构造一个相同性质的预测因子序列。您是否可以匹配或改进一个较小的子集的性能?如果是,可以尝试使用该子集的非线性预测器。
- 您有新的想法,时间,计算资源和足够的例子吗?如果是的话,比较几种特征选择方法,包括您的新想法,相关系数,后向选择和嵌入方法。使用线性和非线性预测变量。选择最佳的模型选择方法
- 您想要一个稳定的解决方案(以提高性能和/或理解)?如果是,请对数据进行子采样,并对几个“bootstrap”重新进行分析。
进一步阅读
在特定平台上选择功能需要帮助吗?以下是一些可以帮助您快速入门的教程:
为了更深入地讨论这个话题,您可以选择一个关于这个话题的专业书籍,比如下面的任何一个:
特征选择是特征工程的一个子课题。您可能想在帖子中深入研究特征工程:
您可能想在帖子中深入了解功能工程:
- Angular Service入门
- spring:如何用代码动态向容器中添加或移除Bean ?
- WebComponent魔法堂:深究Custom Element 之 标准构建
- druid 数据源 使用属性文件的一个坑
- Angular企业级开发(3)-Angular MVC实现
- spring: 加载远程配置
- java:如何让程序按要求自行重启?
- Angular学习-指令入门
- java:如何让程序按要求自行重启?
- linux:nohup 不生成 nohup.out的方法
- 让VIM支持Python2 by update-alternatives
- Angular中ngCookies模块介绍
- 如何让jboss eap 6.2+ 的多个war应用共享 jar 包?
- scala 学习笔记(07) 一等公民的函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP实现小程序批量通知推送
- Thinkphp5.0 框架Model模型简单用法分析
- php设计模式之单例模式用法经典示例分析
- PHP实现统计代码行数小工具
- redis+php实现微博(三)微博列表功能详解
- php设计模式之工厂模式用法经典实例分析
- laravel 关联关系遍历数组的例子
- PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
- 解决Laravel 使用insert插入数据,字段created_at为0000的问题
- 关于php unset对json_encode的影响详解
- php进行md5加密简单实例方法
- Laravel timestamps 设置为unix时间戳的方法
- php实现每日签到功能
- php+redis实现消息队列功能示例
- php使用curl模拟浏览器表单上传文件或者图片的办法