通过强化学习彻底改变大型数据集特征选择

news2024/11/23 5:00:41

在这里插入图片描述

文章目录

  • 一、说明
  • 二、强化学习:特征选择的马尔可夫决策问题
  • 三、用于使用强化学习进行特征选择的 python 库
    • 3.1. 数据预处理
    • 3.2. 安装和导入FSRLearning库
  • 四、结论和参考文献

一、说明

   了解强化学习如何改变机器学习模型的特征选择。通过实际示例和专用的 Python 库了解这种创新方法的过程、实现和好处。

   特征选择是构建机器学习模型过程中的决定性步骤。为模型和我们想要实现的任务选择好的功能绝对可以提高性能。事实上,一个特征可能会增加一些噪声,然后干扰模型。

   此外,如果我们要处理高维数据集,选择特征尤其重要。它使模型能够更快、更好地学习。然后,我们的想法是找到最佳数量的功能和最有意义的功能。

   在本文中,我将解决这个问题,并通过介绍一种新实现的特征选择方法来解决这个问题。尽管它存在许多不同的功能选择过程,但这里不会介绍它们,因为很多文章已经在处理它们。我将重点介绍使用强化学习策略的特征选择。

   首先,将讨论强化学习,尤其是马尔可夫决策过程。这是数据科学领域的一种非常新的方法,尤其是对于特征选择目的。之后,我将介绍它的实现以及如何安装和使用 python 库 (FSRLearning)。最后,我将证明这种实现的效率。在包装器或过滤等可能的特征选择方法中,强化学习是最强大和最有效的。

   本文的目的是强调具体和面向实际问题的利用的实现。这个问题的理论方面将通过示例进行简化,尽管最后将提供一些参考资料。

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

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

   RL 背后的天真想法是代理从未知环境中开始。此代理必须执行操作才能完成任务。根据智能体的当前状态和他之前选择的动作,智能体会更倾向于选择一些动作。在达到每个新状态并采取任何行动时,代理都会获得奖励。以下是我们需要为特征选择目的定义的主要参数:

  • 什么是状态?
  • 什么是动作?
  • 奖励是什么?
  • 我们如何选择一个动作?
       首先,状态只是数据集中存在的特征的子集。例如,如果数据集具有三个特征(年龄、性别、身高)和一个标签,则可能是以下状态:
[]                                              --> 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 possible states

   +2 是因为我们考虑了一个空状态和一个包含所有可能特征的状态。在这个问题上,我们必须在所有状态上训练相同的模型,以获得最大化准确性的特征集。在 RL 方法中,我们不必进入所有状态,也不必每次进入已经访问过的州时都训练模型。

   我们必须为这个问题确定一些停止条件,稍后将详细介绍。目前,已经选择了 epsilon-greedy 状态选择。这个想法是从当前状态开始,我们随机选择下一个动作,概率为 epsilon(介于 0 和 1 之间,通常在 0.2 左右),否则选择使函数最大化的动作。对于特征选择,函数是每个特征为模型精度带来的奖励的平均值。

   epsilon-greedy 算法包含两个步骤:

   随机相位:使用概率 epsilon,我们在当前状态的可能邻居中随机选择下一个状态(我们可以想象均匀或 softmax 选择)
   贪婪阶段:我们选择下一个状态,使添加到当前状态的特征对模型的精度贡献最大。为了降低时间复杂性,我们初始化了一个包含每个特征的此值的列表。每次选择功能时,此列表都会更新。由于以下公式,更新非常优化:

在这里插入图片描述
更新每个功能的平均奖励列表(图片由作者提供)

AORf : 功能“f”带来的平均奖励
k : 选择“f”的次数
V(F) :特征集 F 的状态值(出于清晰起见,本文未详述)
   全局的想法是找出哪个特征为模型带来了最大的准确性。这就是为什么我们需要浏览不同的状态,以便在许多不同的环境中评估模型特征的最全局准确值。

   最后,我将详细介绍两个停止条件。由于目标是最小化算法访问的状态数量,因此我们需要小心它们。我们访问的从未访问过的州越少,我们必须使用不同特征集训练的模型数量就越少。就时间和计算能力而言,训练模型以获得准确性是最昂贵的阶段。

   在任何情况下,该算法都会在最终状态(包含所有特征的集合)中停止。我们希望避免达到这种状态,因为它是训练模型最昂贵的。
   此外,如果一系列访问状态的值连续下降,它会停止浏览图形。设置了一个阈值,使得数据集中总要素数的平方根之后,该阈值将停止探索。
   现在已经解释了问题的建模,我们将详细介绍 python 中的实现。

三、用于使用强化学习进行特征选择的 python 库

   可以使用解决此问题的 python 库。我将在这一部分中解释它是如何工作的,并证明它是一种有效的策略。此外,本文作为文档,您将能够在本部分结束时将此库用于您的项目。

3.1. 数据预处理

   由于我们需要评估所访问状态的准确性,因此我们需要为模型提供用于此特征选择任务的特征和数据。数据必须经过归一化,分类变量必须编码,并且行数尽可能少(行越小,算法越快)。此外,如上一部分所述,在要素和一些整数之间创建映射非常重要。此步骤不是强制性的,但非常推荐。此步骤的最终结果是获取一个包含所有特征的 DataFrame,以及另一个包含要预测的标签的 DataFrame。下面是一个使用数据集作为基准的示例(可以在此处找到

#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]

3.2. 安装和导入FSRLearning库

   第二步是使用 pip 安装库。以下是安装它的命令:

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 (浮点 [0, 1]):观察下一个状态的调节因子,0 表示近视条件,1 表示远视行为
  • nb_iter (int):要通过图形的序列数
  • starting_state (“empty” or “random”) : 如果 “empty”,则算法从空状态开始,如果 “random”,则算法从图中的随机状态开始
       所有参数都可以调整,但对于大多数问题来说,只有少数迭代可以是好的(大约 100 次),而 0.2 左右的 epsilon 值通常就足够了。起始状态对于更有效地浏览图形很有用,但它可能非常依赖于数据集,并且可以测试这两个值。

   最后,我们可以非常简单地使用以下代码初始化选择器:

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 轴上是精度。两条水平线是每种方法的精度中位数。下面是一个示例:
在这里插入图片描述
   RL和RFE方法的比较(图片由作者提供)

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 更好的特征集。然后,我们可以在排序的特征集中确定地选择任何子集,这将为模型提供更好的准确性。我们可以多次运行模型和比较器以获得非常准确的估计,但 RL 方法总是更好。

   另一个有趣的方法是get_plot_ratio_exploration。它绘制一个图表,比较已访问节点的数量和按顺序访问的节点的数量,以便进行精确迭代。
在这里插入图片描述
   每次迭代时访问和未访问状态的比较(图片由作者提供)

   此外,由于第二个停止条件,算法的时间复杂度呈指数级降低。那么即使特征的数量很大,也会很快找到收敛点。下面的图是访问一定大小的集合的次数。
在这里插入图片描述
访问状态的数量与其大小的函数关系

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

四、结论和参考文献

   总的来说,我们可以看到RL方法对于最大化模型的指标非常有效。它总是快速收敛到一个有趣的特征子集。此外,此方法在具有 FSRLearning 库的 ML 项目中非常容易和快速实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TrueNAS开启SSH登录ROOT

简介: 从 SCALE Bluefin 22.12.0 开始,为了加强安全性并遵守联邦信息处理标准 (FIPS),root帐户登录已被弃用。所有 TrueNAS 用户都应创建具有所有必需权限的本地管理员帐户,并开始使用它来访问 TrueNAS。当根用户密码被禁用时,只有管理用户帐户才能登录 TrueNAS Web 界面。…

[Linux]重定向

一、struct file内核对象 struct file是在内核中创建,专门用来管理被打开文件的结构体。struct file中包含了打开文件的所有属性,文件的操作方法集以及文件缓冲区(无论读写,我们都需要先将数据加载到文件缓冲区中。)等…

#centos7搭建php8+nginx环境#

场景:为了实现上传的pdf文件转成png图片,需要搭建一个php8nginx的运行环境,最后安装imagic扩展 安装顺序 php-> linux-> imagemagick -> ghostscript -> imagick 一:安装phpnginx环境 1、安装remi扩展源 remi源是Remi repository是包含最新…

消安一体化解决方案

前言 随着信息技术的飞速发展,物联网技术正以前所未有的速度渗透至生活的各个角落,其中智能家居作为物联网技术应用的重要场景之一,不仅提升了居住的便捷性,更是对家庭安全提出了新的挑战和要求。在这样的背景下,将消防…

161.二叉树:在每个树中找最大值(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

易联众智能自动办理平台,AI赋能让数字政务服务“触手可及”

“城乡居民参保怎么办”“要去XX省工作了,帮我办理异地就医备案”……通过口语化的文字、语音提问,易联众智能自动办理平台的AI助理都可以准确理解对话,并依据政策文件给出详细回答,人机对话像聊天一样轻松。 近日,宁德市民王先生高兴地说:“过去办理医保业务不懂流程,容易走弯…

第22讲:文件操作

文章目录 第22讲:文件操作1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件?4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. 文件的顺序读写5.1 顺序读写函数介…

文刻创作ai工具

文刻创作AI工具是一种利用人工智能技术来辅助创作文本的工具。 领取激活方式:https://qvfbz6lhqnd.feishu.cn/wiki/HsY4wmoffiNp4FkB2AbcpL4tn6d 它能够生成、修改、编辑和优化各种类型的文本内容,包括文章、故事、诗歌、广告文案等。 通过分析大量的文…

比较好的Python课程

最近在学习夜曲编程的Python进阶课程——办公效率化;夜曲编程之前有推出一款学习Python的入门课程,在手机端和电脑端都可以学习的,如果没有时间在手机端学习都很好的。每节课程学习下来,可以收集到Python入门的知识卡片&#xff0…

全志H616 通过Cedrus和v4l2_request API实现硬件编解码加速(香橙派zero2)

编译安装或加载cedrus驱动模块,加载v4l2-mem2mem Sunxi-Cedrus 致力于为全志 SoC 提供硬件加速的视频解码和编码支持,并将其引入主线 Linux 内核。此外,还为典型的基于 GNU/Linux 的系统提供了与内核驱动程序接口的其他用户空间组件。 Sunx…

Java使用Hutool工具类轻松生成验证码

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、效果展示1.1 扭曲干扰的验证码1.…

C++学习第十一天——vector的模拟实现

✨ 生于火焰,落俗不可避免,但浪漫至死不渝 🌏 📃个人主页:island1314 🔥个人专栏:C学习 🚀 欢迎关注:👍点赞 &…

白玉兰之争王一博vs王阳谁将摘得男主荣耀

白玉兰之争:王一博VS王阳,谁将摘得男主荣耀?在这个星光璀璨的夜晚,白玉兰奖的提名名单犹如一道耀眼的闪电,点燃了娱乐圈的硝烟。其中,王一博与王阳入围白玉兰男主角的消息更是引发了热议狂潮。两位实力派演…

使用pytorch构建ResNet50模型训练猫狗数据集

数据集 1.导包 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, models import numpy as np import matplotlib.pyplot as plt import os from tqdm.auto import t…

iOS ------ 多线程 GCD

一,GCD简介 GCD是Apple开发的一个多线程的较新的解决方案。它主要用于优化应用程序以支持多核处理器以及其他对称处理系统。它是一个在线程池模式的基础上执行的并发任务。 为什么要使用GCD? GCD!可用于多核的并行运算GCD会自动利用更多的…

dockers安装mysql

1.dockerhub上搜索自己需要安装得镜像版本 dockerhub网址:https://hub-stage.docker.com docker pull mysql:5.7 #下载自己需要得版本2.启动容器实例,并且挂载容器数据卷 docker run -d -p 3306:3306 --privilegedtrue \ -v /home/mysql/log:/var/log/…

模拟 CMOS 逆变器的开关功耗

我们不会进一步讨论静态功耗。相反,本文和下一篇文章将介绍 SPICE 仿真,以帮助您更全面地了解逆变器的不同类型的动态功耗。本文重点讨论开关功率——输出电压变化时电容充电和放电所消耗的功率。 LTspice 逆变器实施 图 1 显示了我们将使用的基本 LTsp…

小白跟做江科大32单片机之OLED驱动

原理部分 代码测试 1.江科大老师提供的以下代码文件放入工程中,进行测试 2.正常显示即可

一点连接千家银行,YonSuite让“企业资金”实时在线

用友YonSuite作为全场景SaaS应用服务,是成长型企业实现数智转型的不二选择。多年来,凭借不断的技术革新,通过与千家银行的一站式连接,实现了企业资金的实时在线管理,为成长型企业带来了极大的便利和效益。这一举措不仅…

618适合入手哪些数码好物?实用数码好物清单分享,错过拍烂大腿!

在一年一度的618购物狂欢节里,许多数码爱好者们都在这次盛大的购物盛宴中觅得心仪的数码好物,数码产品不仅改变了我们的生活方式,更让我们享受到了前所未有的便捷和乐趣,那么在这个618,哪些数码好物值得我们入手呢&…