文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一文介绍机器学习中的三种特征选择方法

2024-12-02 06:02

关注

机器学习中的特征需要选择,人生又何尝不是如此?

特征选择是指从众多可用的特征中选择一个子集的过程,其目的和预期效果一般有如下三方面考虑:

另一方面,理解特征选择方法的不同,首先需要按照特征对训练任务的价值高低而对特征作出如下分类:

在实际应用中,特征选择方法主要可分为如下三类:

本文将围绕这三种方法分别介绍,最后以sklearn中自带的数据集为例给出简单的应用和效果对比。

01 过滤法

基于过滤法(Filter)实现特征选择是最为简单和常用的一种方法,其最大优势是不依赖于模型,仅从特征的角度来挖掘其价值高低,从而实现特征排序及选择。实际上,基于过滤法的特征选择方案,其核心在于对特征进行排序——按照特征价值高低排序后,即可实现任意比例/数量的特征选择或剔除。显然,如何评估特征的价值高低从而实现排序是这里的关键环节。

为了评估特征的价值高低,大体可分为如下3类评估标准:

当然,基于过滤法的特征选择方法其弊端也极为明显:

02 包裹法

过滤法是从特征重要性高低的角度来加以排序,从而完成目标特征选择或者低效特征滤除的过程。如前所述,其最大的弊端之一在于因为不依赖任何模型,所以无法针对性的选择出相应模型最适合的特征体系。同时,其还存在一个隐藏的问题:即特征选择保留比例多少的问题,实际上这往往是一个超参数,一般需要人为定义或者进行超参寻优。

与之不同,包裹法将特征选择看做是一个黑盒问题:即仅需指定目标函数(这个目标函数一般就是特定模型下的评估指标),通过一定方法实现这个目标函数最大化,而不关心其内部实现的问题。进一步地,从具体实现的角度来看,给定一个含有N个特征的特征选择问题,可将其抽象为从中选择最优的K个特征子集从而实现目标函数取值最优。易见,这里的K可能是从1到N之间的任意数值,所以该问题的搜索复杂度是指数次幂:O(2^N)。

当然,对于这样一个具有如此高复杂度的算法,聪明的前辈们是不可能去直接暴力尝试的,尤其是考虑这个目标函数往往还是足够expensive的(即模型在特定的特征子集上的评估过程一般是较为耗时的过程),所以具体的实现方式一般有如下两种:

图源:《A survey on feature selection methods》

基于包裹法的特征选择方案是面向模型的实现方案,所以理论而言具有最佳的选择效果。但实际上在上述实现过程中,其实一般也需要预先指定期望保留的特征数量,所以也就涉及到超参的问题。此外,基于包裹法的最大缺陷在于巨大的计算量,虽然序贯选择的实现方案将算法复杂度降低为平方阶,但仍然是一个很大的数字;而以遗传算法和粒子群算法为代表的启发式搜索方案,由于其均是population-based的优化实现,自然也更是涉及大量计算。

03 嵌入法

与包裹法依赖于模型进行选择的思想相似,而又与之涉及巨大的计算量不同:基于嵌入法的特征选择方案,顾名思义,是将特征选择的过程"附着"于一个模型训练任务本身,从而依赖特定算法模型完成特征选择的过程。

个人一直以为,"嵌入"(embedded)一词在机器学习领域是一个很魔性的存在,甚至在刚接触特征选择方法之初,一度将嵌入法和包裹法混淆而不能感性理解。

实际上,行文至此,基于嵌入法的特征选择方案也就呼之欲出了,最为常用的就是树模型和以树模型为基础的系列集成算法,由于模型提供了特征重要性这个重要信息,所以其可天然的实现模型价值的高低,从而根据特征重要性的高低完成特征选择或滤除的过程。另外,除了决策树系列模型外,LR和SVM等广义线性模型也可通过拟合权重系数来评估特征的重要程度。

基于嵌入法的特征选择方案简洁高效,一般被视作是集成了过滤法和包裹法两种方案的优点:既具有包裹法中面向模型特征选择的优势,又具有过滤法的低开销和速度快。但实际上,其也具有相应的短板:不能识别高相关性特征,例如特征A和特征B都具有较高的特征重要性系数,但同时二者相关性较高,甚至说特征A=特征B,此时基于嵌入法的特征选择方案是无能为力的。

04 三种特征选择方案实战对比

本小节以sklearn中的乳腺癌数据集为例,给出三种特征选择方案的基本实现,并简单对比特征选择结果。

加载数据集并引入必备包:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import SelectFromModel, SelectKBest, RFE
from sklearn.ensemble import RandomForestClassifier

默认数据集训练模型,通过在train_test_split中设置随机数种子确保后续切分一致:

%%time
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=3)
rf = RandomForestClassifier(max_depth=5, random_state=3)
rf.fit(X_train, y_train)
rf.score(X_test, y_test)
# 输出结果
CPU times: user 237 ms, sys: 17.5 ms, total: 254 ms
Wall time: 238 ms
0.9370629370629371

过滤法的特征选择方案,调用sklearn中的SelectKBest实现,内部默认采用F检验来度量特征与标签间相关性,选择特征维度设置为20个:

%%time
X_skb = SelectKBest(k=20).fit_transform(X, y)
X_skb_train, X_skb_test, y_train, y_test = train_test_split(X_skb, y, random_state=3)
rf = RandomForestClassifier(max_depth=5, random_state=3)
rf.fit(X_skb_train, y_train)
rf.score(X_skb_test, y_test)
# 输出结果
CPU times: user 204 ms, sys: 7.14 ms, total: 211 ms
Wall time: 208 ms
0.9300699300699301

包裹法的特征选择方案,调用sklearn中的RFE实现,传入的目标函数也就是算法模型为随机森林,特征选择维度也设置为20个:

%%time
X_rfe = RFE(RandomForestClassifier(), n_features_to_select=20).fit_transform(X, y)
X_rfe_train, X_rfe_test, y_train, y_test = train_test_split(X_rfe, y, random_state=3)
rf = RandomForestClassifier(max_depth=5, random_state=3)
rf.fit(X_rfe_train, y_train)
rf.score(X_rfe_test, y_test)
# 输出结果
CPU times: user 2.76 s, sys: 4.57 ms, total: 2.76 s
Wall time: 2.76 s
0.9370629370629371

嵌入法的特征选择方案,调用sklearn中的SelectFromModel实现,依赖的算法模型也设置为随机森林,特征选择维度仍然是20个:

%%time
X_sfm = SelectFromModel(RandomForestClassifier(), threshold=-1, max_features=20).fit_transform(X, y)
X_sfm_train, X_sfm_test, y_train, y_test = train_test_split(X_sfm, y, random_state=3)
rf = RandomForestClassifier(max_depth=5, random_state=3)
rf.fit(X_sfm_train, y_train)
rf.score(X_sfm_test, y_test)
# 输出结果
CPU times: user 455 ms, sys: 0 ns, total: 455 ms
Wall time: 453 ms
0.9370629370629371

通过以上简单的对比实验可以发现:相较于原始全量特征的方案,在仅保留20维特征的情况下,过滤法带来了一定的算法性能损失,而包裹法和嵌入法则保持了相同的模型效果,但嵌入法的耗时明显更短。

来源:AI科技大本营内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯