通过强化学习策略进行特征选择

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 本文探讨了使用强化学习策略进行特征选择以提升机器学习模型性能。强调在高维数据集中,有效选择特征至关重要。文章介绍了马尔可夫决策过程在强化学习中的应用,并提出了一种新的特征选择方法。通过定义状态(特征子集)、动作(添加特征)、奖励(如准确性提升),建立了一个RL模型。此外,还介绍了Python库FSRLearning,用于实现这一方法。文中展示了如何使用该库,并通过与 sklearn 的 RFE 方法比较,证明了RL方法在选择模型特征方面的优越性。

特征选择是构建机器学习模型过程中的决定性步骤。为模型和我们想要完成的任务选择好的特征,可以提高性能。

如果我们处理的是高维数据集,那么选择特征就显得尤为重要。它使模型能够更快更好地学习。我们的想法是找到最优数量的特征和最有意义的特征。

在本文中,我们将介绍并实现一种新的通过强化学习策略的特征选择。我们先讨论强化学习,尤其是马尔可夫决策过程。它是数据科学领域的一种非常新的方法,尤其适用于特征选择。然后介绍它的实现以及如何安装和使用python库(FSRLearning)。最后再使用一个简单的示例来演示这一过程。

强化学习:特征选择的马尔可夫决策问题

强化学习(RL)技术可以非常有效地解决像游戏解决这样的问题。而强化学习的概念是基于马尔可夫决策过程(MDP)。这里的重点不是要深入定义而是要大致了解它是如何运作的,以及它如何对我们的问题有用。

强化学习背后的想法是,代理从一个未知的环境开始。采取行动来完成任务。在代理在当前状态和他之前选择的行为的作用下,会更倾向于选择一些行为。在每到达一个新状态并采取行动时,代理都会获得奖励。以下是我们需要为特征选择而定义的主要参数:

状态、行动、奖励、如何选择行动

首先,状态是数据集中存在的特征的子集。例如,如果数据集有三个特征(年龄,性别,身高)加上一个标签,则可能的状态如下:

 []                                              --> Empty set                           
 [Age], [Gender], [Height]                       --> 1-feature set
 [Age, Gender], [Gender, Height], [Age, Height]  --> 2-feature set
 [Age, Gender, Height]                           --> All-feature set

在一个状态中,特征的顺序并不重要,我们必须把它看作一个集合,而不是一个特征列表。

对于动作,我们可以从一个子集转到任何一个尚未探索的特性的子集。在特征选择问题中,动作就是是选择当前状态下尚未探索的特征,并将其添加到下一个状态。以下是一些可能的动作:

 [Age] -> [Age, Gender]
 [Gender, Height] -> [Age, Gender, Height]

下面是一个不可能动作的例子:

 [Age] -> [Age, Gender, Height]
 [Age, Gender] -> [Age]
 [Gender] -> [Gender, Gender]

我们已经定义了状态和动作,还没有定义奖励。奖励是一个实数,用于评估状态的质量。

在特征选择问题中,一个可能的奖励是通过添加新特征而提高相同模型的准确率指标。下面是一个如何计算奖励的例子:

 [Age] --> Accuracy = 0.65
 [Age, Gender] --> Accuracy = 0.76
 Reward(Gender) = 0.76 - 0.65 = 0.11

对于我们首次访问的每个状态,都会使用一组特征来训练一个分类器(模型)。这个值存储在该状态和对应的分类器中,训练分类器的过程是费时费力的,所以我们只训练一次。因为分类器不会考虑特征的顺序,所以我们可以将这个问题视为图而不是树。在这个例子中,选择“性别”作为模型的新特征的操作的奖励是当前状态和下一个状态之间的准确率差值。

在上图中,每个特征都被映射为一个数字(“年龄”为1,“性别”为2,“身高”为3)。我们如何从当前状态中选择下一个状态或者我们如何探索环境呢?

我们必须找到最优的方法,因为如果我们在一个有10个特征的问题中探索所有可能的特征集,那么状态的数量将是

 10! + 2 = 3 628 802

这里的+2是因为考虑一个空状态和一个包含所有可能特征的状态。我们不可能在每个状态下都训练一个模型,这是不可能完成的,而且这只是有10个特征,如果有100个特征那基本上就是无解了。

但是在强化学习方法中,我们不需要在所有的状态下都去训练一个模型,我们要为这个问题确定一些停止条件,比如从当前状态随机选择下一个动作,概率为epsilon(介于0和1之间,通常在0.2左右),否则选择使函数最大化的动作。对于特征选择是每个特征对模型精度带来的奖励的平均值。

这里的贪心算法包含两个步骤:

1、以概率为epsilon,我们在当前状态的可能邻居中随机选择下一个状态

2、选择下一个状态,使添加到当前状态的特征对模型的精度贡献最大。为了减少时间复杂度,可以初始化了一个包含每个特征值的列表。每当选择一个特性时,此列表就会更新。使用以下公式,更新是非常理想的:

AORf:特征“f”带来的奖励的平均值

K: f被选中的次数

V(F):特征集合F的状态值(为了简单描述,本文不详细介绍)

所以我们就找出哪个特征给模型带来了最高的准确性。这就是为什么我们需要浏览不同的状态,在在许多不同的环境中评估模型特征的最全局准确值。

因为目标是最小化算法访问的状态数,所以我们访问的未访问过的状态越少,需要用不同特征集训练的模型数量就越少。因为从时间和计算能力的角度来看,训练模型以获得精度是最昂贵方法,我们要尽量减少训练的次数。

最后在任何情况下,算法都会停止在最终状态(包含所有特征的集合)而我们希望避免达到这种状态,因为用它来训练模型是最昂贵的。

上面就是我们针对于特征选择的强化学习描述,下面我们将详细介绍在python中的实现。

用于特征选择与强化学习的python库

有一个python库可以让我们直接解决这个问题。但是首先我们先准备数据

我们直接使用UCI机器学习库中的数据:

 #Get the pandas DataFrame from the csv file (15 features, 690 rows)
 australian_data = pd.read_csv('australian_data.csv', header=None)

 #DataFrame with the features
 X = australian_data.drop(14, axis=1)

 #DataFrame with the labels
 y = australian_data[14]

然后安装我们用到的库

 pip install FSRLearning

直接导入

 from FSRLearning import Feature_Selector_RL

Feature_Selector_RL类就可以创建一个特性选择器。我们需要以下的参数

feature_number (integer): DataFrame X中的特性数量

feature_structure (dictionary):用于图实现的字典

eps (float [0;1]):随机选择下一状态的概率,0为贪婪算法,1为随机算法

alpha (float [0;1]):控制更新速率,0表示不更新状态,1表示经常更新状态

gamma (float[0,1]):下一状态观察的调节因子,0为近视行为状态,1为远视行为

nb_iter (int):遍历图的序列数

starting_state (" empty "或" random "):如果" empty ",则算法从空状态开始,如果" random ",则算法从图中的随机状态开始

所有参数都可以机型调节,但对于大多数问题来说,迭代大约100次就可以了,而epsilon值在0.2左右通常就足够了。起始状态对于更有效地浏览图形很有用,但它非常依赖于数据集,两个值都可以测试。

我们可以用下面的代码简单地初始化选择器:

 fsrl_obj = Feature_Selector_RL(feature_number=14, nb_iter=100)

与大多数ML库相同,训练算法非常简单:

 results = fsrl_obj.fit_predict(X, y)

下面是输出的一个例子:

输出是一个5元组,如下所示:

DataFrame X中特性的索引(类似于映射)

特征被观察的次数

所有迭代后特征带来的奖励的平均值

从最不重要到最重要的特征排序(这里2是最不重要的特征,7是最重要的特征)

全局访问的状态数

还可以与Scikit-Learn的RFE选择器进行比较。它将X, y和选择器的结果作为输入。

 fsrl_obj.compare_with_benchmark(X, y, results)

输出是在RFE和FSRLearning的全局度量的每一步选择之后的结果。它还输出模型精度的可视化比较,其中x轴表示所选特征的数量,y轴表示精度。两条水平线是每种方法的准确度中值。

 Average benchmark accuracy : 0.854251012145749, rl accuracy : 0.8674089068825909 
 Median benchmark accuracy : 0.8552631578947368, rl accuracy : 0.868421052631579 
 Probability to get a set of variable with a better metric than RFE : 1.0 
 Area between the two curves : 0.17105263157894512

可以看到RL方法总是为模型提供比RFE更好的特征集。

另一个有趣的方法是get_plot_ratio_exploration。它绘制了一个图,比较一个精确迭代序列中已经访问节点和访问节点的数量。

由于设置了停止条件,算法的时间复杂度呈指数级降低。即使特征的数量很大,收敛性也会很快被发现。下面的图表示一定大小的集合被访问的次数。

在所有迭代中,算法访问包含6个或更少变量的状态。在6个变量之外,我们可以看到达到的状态数量正在减少。这是一个很好的行为,因为用小的特征集训练模型比用大的特征集训练模型要快。

总结

我们可以看到RL方法对于最大化模型的度量是非常有效的。它总是很快地收敛到一个有趣的特性子集。该方法在使用FSRLearning库的ML项目中非常容易和快速地实现。

如果你对这个方法比较感兴趣,可以看看下面两篇论文:

https://avoid.overfit.cn/post/a1b42bed18ea4e8ea25543c73cbecf8c

目录
相关文章
|
SQL 运维 数据库
12-TDengine数据迁移:导入与导出
12-TDengine数据迁移:导入与导出
4076 0
12-TDengine数据迁移:导入与导出
2026最新丨1688新手开店必做的操作指南,运营自学全流程!
2025倒计时开启,计划在1688开店?本文为新手商家梳理八大必备操作:完善企业信息、下载商家工具、关联收款账户、开通买家保障与先采后付、设置自动回复、配置运费模板、持续上新商品。从信任建立到服务优化,助力新店快速提升竞争力,获取平台流量支持。细节决定成败,专业成就未来,掌握【1688超级运营成长手册】,实现店铺持续增长!
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 内存表可选项 - unlogged table
标签 PostgreSQL , 内存表 , unlogged table 背景 内存表,通常被用于不需要持久化,变更频繁,访问RT低的场景。 目前社区版本PostgreSQL没有内存表的功能,postgrespro提供了两个插件可以实现类似内存表的功能。
4352 0
|
机器学习/深度学习 算法 机器人
基于Qlearning强化学习的机器人路线规划matlab仿真
本内容展示了基于Q-learning强化学习算法的路径规划研究,包括MATLAB仿真效果、理论知识及核心代码。通过训练与测试,智能体在离散化网格环境中学习最优策略以规避障碍并到达目标。代码实现中采用epsilon-贪婪策略平衡探索与利用,并针对紧急情况设计特殊动作逻辑(如后退)。最终,Q-table收敛后可生成从起点到终点的最优路径,为机器人导航提供有效解决方案。
443 20
|
算法 IDE 开发工具
蓝桥杯备赛经验帖
本文是作者blue分享的蓝桥杯备赛经验帖,旨在帮助刚接触算法竞赛的新手。文章从个人参赛经历出发,详细介绍了蓝桥杯的OI赛制特点、比赛流程以及备赛建议。作者强调了重点掌握基础数论、DFS、数组操作、二分法、动态规划等知识,并建议多参与线上赛,熟悉输入输出规则,同时避免盲目刷题或过度依赖力扣。通过参赛,作者不仅提升了编码能力,还结识了优秀的朋友,认识到自身差距,激励自己不断进步。此经验适合新手参考,大佬可略过。
1543 6
|
运维 Kubernetes Java
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
通过引入Koupleless框架,解决了多应用部署中资源浪费和运维成本高的问题,实现了模块瘦身、快速部署及流量控制优化,大幅降低了服务器资源占用和发布耗时,提升了系统稳定性和运维效率。最终,人力家成功实现了多应用的轻量集中部署,显著减少了运维成本。
 Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
|
存储 缓存 开发工具
HarmonyOS Next~HarmonyOS应用开发工具之AppGallery Connect
AppGallery Connect(AGC)是华为为HarmonyOS开发者提供的全生命周期服务平台,支持开发、测试、上架到运营全流程。其核心功能包括应用分发、云数据库、认证服务和云函数等,助力开发者提升效率、缩短开发周期。AGC采用分层架构设计,集成40+云端服务能力,覆盖170+国家/地区,支持全球化业务拓展。通过事件跟踪、异常监控等工具,帮助开发者优化性能与用户体验。未来,AGC将引入低代码开发、增强现实等新能力,助力构建高质量HarmonyOS应用。
1296 4
|
机器学习/深度学习 自然语言处理 vr&ar
ICML 2024:复杂组合3D场景生成,LLMs对话式3D可控生成编辑框架来了
【8月更文挑战第24天】近年来,3D内容生成技术为虚拟现实和游戏领域带来革新,但仍面临处理复杂场景和多对象交互的挑战。为此,研究者提出了Layout-guided Gaussian Splatting (LGS)框架,结合大型语言模型(LLMs)和扩散模型,实现高质量3D场景生成。LGS通过LLMs提取文本描述中的实例关系并转化为布局,再使用扩散模型和自适应几何控制技术优化3D高斯表示,生成更准确、细腻的场景。实验表明,LGS在复杂场景生成方面表现优异,但计算成本和训练时间较长,且主要针对静态场景。论文详情参见:https://arxiv.org/pdf/2402.07207
553 3
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
2508 0
|
机器学习/深度学习 存储 人工智能
揭秘工业级大规模GNN图采样
互联网下的图数据纷繁复杂且规模庞大,如何将GNN应用于如此复杂的数据上呢?答案是图采样。结合阿里巴巴开源的GNN框架Graph-Learn(https://github.com/alibaba/graph-learn),本文重点介绍GNN训练过程中的各种图采样和负采样技术。
4067 0
揭秘工业级大规模GNN图采样