【数据处理系列】深入理解递归特征消除法(RFE):基于Python的应用

news2024/11/26 23:32:14

目录

一、递归特征消除法介绍

二、方法介绍

三、导入数据并选择模型

(一)导入数据

(二) 递归特征消除需要选择模型吗

四、RFE方法进行递归特征消除法

五、RFECV方法进行递归特征消除法(建议使用这种方法) 

       即交叉验证递归特征消除法

(一)参数介绍

(二)python使用RFECV方法

(三) 输出最优特征数

 (四)输出最优特征名称

 (五)以布尔形式输出最优特征

(六) 输出特征重要性排序

 (七)输出选择特征的索引

(八)交叉验证得分随特征数量的变化

(九)曲线图查看特征选择的结果


一、递归特征消除法介绍

递归特征消除是一种常用的特征选择方法,它可以用于回归和分类问题。RFE的基本思想是在不断迭代中递归地删除特征,直到达到预设的特征数量为止。

工作原理如下:

  1. 首先,使用所有特征训练一个模型,并计算每个特征的权重或系数。
  2. 然后,排序这些特征的权重或系数,并删除权重或系数最小的特征。
  3. 重复步骤1和步骤2,直到特征数量达到预设的值

二、方法介绍

想要用python实现递归特征消除法,有两种通用的方法,本篇博文会逐一介绍。在这里先简单介绍一下两种方法的区别。

分别是:

①from sklearn.feature_selection import RFE

②from sklearn.feature_selection import RFECV

`RFECV`和`RFE`都是用于特征选择的工具,但它们之间有一些区别。

①`RFE`(递归特征消除)是一种基于模型预测性能的特征选择方法。它通过递归地移除特征并重新训练模型来评估每个特征的重要性。在每次迭代中,它都会移除最不重要的特征,并重新训练模型。这个过程会一直持续到达到指定的特征数量或没有更多的特征可以移除为止。

②`RFECV`(递归特征消除与交叉验证)是`RFE`的扩展,它使用交叉验证来评估特征的重要性。在每次迭代中,它都会使用交叉验证来评估模型的性能,并选择最佳的特征数量。这个过程会一直持续到找到最佳的特征数量为止。

因此,`RFECV`比`RFE`更可靠,因为它使用交叉验证来评估特征的重要性,从而减少了过拟合的风险。此外,`RFECV`还可以自动确定最佳的特征数量,而`RFE`需要手动指定。

总的来说,如果你需要更可靠的特征选择方法,并且希望自动确定最佳的特征数量,那么你应该使用`RFECV`。如果你只需要简单的特征选择方法,并且可以手动指定特征数量,那么你可以使用`RFE`。

三、导入数据并选择模型

(一)导入数据

本次选取的是python内置的鸢尾花数据,是有标签的数据,一共150个样本,四个特征。

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
 
 
# 导入鸢尾花数据集
iris = load_iris()
X = iris.data # 特征
y = iris.target # 类别
feature_names = iris.feature_names # 特征名称
class_names = iris.target_names # 类别名称

(二) 递归特征消除需要选择模型吗

是的,递归特征消除需要选择一个模型作为其基础。这个模型被称为“基模型”或“估计器”,它用于评估特征的重要性。使用这个基模型来构建模型,并根据模型的性能来选择或排除特征。

基模型的选择对结果有重要影响,因为不同的模型可能会以不同的方式评估特征的重要性。例如,决策树模型可能会根据特征对决策树的分割贡献来评估特征的重要性,而线性模型可能会根据特征的系数大小来评估。

在选择基模型时,应考虑以下因素:

  1. 模型的解释性:选择一个能够提供特征重要性评分的模型,这样RFE就可以根据这些评分来选择特征。

  2. 模型的稳定性:选择一个在特征选择过程中表现稳定的模型,以减少随机性对特征选择结果的影响。

  3. 模型的复杂度:选择一个复杂度适当的模型,以避免在特征选择过程中过度拟合或欠拟合。

  4. 数据集的特点:根据数据集的类型和特点选择合适的模型。例如,如果数据集是线性的,那么线性模型可能是一个好的选择;如果数据集是非线性的,那么决策树或支持向量机等非线性模型可能更合适。

在实际应用中,通常需要尝试不同的基模型,并评估它们在特征选择和最终模型性能上的表现,以确定最佳的基模型。在scikit-learn库中,几乎所有的监督学习模型都可以用作RFE的基模型,包括但不限于线性回归、逻辑回归、决策树、随机森林、支持向量机等。

本次选择的模型是分类决策树

#实例化
clf = DecisionTreeClassifier()

四、RFE方法进行递归特征消除法

from sklearn.feature_selection import RFE
from sklearn.model_selection import cross_val_score
#递归特征消除法

selector1 = RFE(clf, n_features_to_select=3, step=1).fit(X, y) 
# n_features_to_select表示筛选最终特征数量,step表示每次排除一个特征

selector1.support_.sum()
#计算在 RFE 过程中被选中的特征数量,即布尔数组中值为 True 的个数,也就是最终选择的特征数量。


print(selector1.ranking_)
#这个属性返回的是特征的排名,从1开始,表示每个特征在所有特征中的重要性排名,1为最重要的特征。
                                             
print(selector1.n_features_)  
#这是RFE在执行完所有递归步骤后最终选择的特征数量。

                                        
X_wrapper1 = selector1.transform(X) 
#通过transform方法,selector1只保留了被选中的特征,生成新的特征矩阵X_wrapper1。   

                               
score =cross_val_score(clf, X_wrapper1, y, cv=9).mean()
#使用cross_val_score进行9折交叉验证,评估clf模型在选择特征后的表现。mean()函数计算所有验证分数的平均值,作为模型性能的估计。


print(score)

结果如上,表明选择了三个特征,分别是原始数据中的第一个、第三个、第四个特征。

五、RFECV方法进行递归特征消除法(建议使用这种方法) 

       即交叉验证递归特征消除法

(一)参数介绍

交叉验证递归特征消除法(Recursive Feature Elimination with Cross-Validation, RFECV)是一种基于特征重要性的特征选择方法。它结合了递归特征消除法和交叉验证。该方法通过训练模型,不断剔除最不重要的特征,并评估模型的性能,直到达到预设的特征数量或性能指标。在这个过程中,RFECV使用交叉验证来评估模型性能,并选择最优的特征子集。最后,RFECV输出被选择的特征子集。

from sklearn.feature_selection import RFECV

rfecv=RFECV(estimator, step=1,min_features_to_select=1, cv=None,scoring=None, verbose=0, n_jobs=None, importance_getter='auto')

 当你使用`RFECV`时,你可以使用以下参数来配置该工具:

1. estimator:用于评估特征重要性的估计器对象。这可以是一个分类器或回归器,具体取决于你的用例。


2. step:在递归过程中每次迭代移除的特征数量。默认值为1,表示每次迭代移除一个特征。若step为小数,如step=0.1,说明每次删除10%的特征变量。


3. min_features_to_select:在递归过程中至少保留的特征数量。默认值为1,表示在任何情况下都保留至少一个特征。


4. cv:用于评估估计器性能的交叉验证生成器。默认值为`None`。
5. scoring:用于评估估计器性能的评分函数。默认值为`None`。


6. verbose:输出信息的详细程度。默认值为0,表示不输出任何信息。


7. n_jobs:用于并行化的工作进程数。默认值为`None`,表示使用默认的值。


8. importance_getter:用于获取特征重要性的函数。默认值为`'auto'`,表示自动选择。如果`estimator`是一个分类器或回归器,则使用`feature_importances_`属性。如果`estimator`是一个集成学习器,则使用`feature_importances_`或`coef_`属性。如果`estimator`没有这些属性,则使用`n_features_`作为特征重要性。

(二)python使用RFECV方法

#交叉验证递归特征消除法
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
from sklearn.feature_selection import RFECV


clf = DecisionTreeClassifier()
selector = RFECV(clf, step=1, cv=5,min_features_to_select=1)   
#使用RFECV进行特征选择。selector = RFECV(clf, step=1, cv=10)表示使用决策树分类器作为基模型,每次迭代移除一个特征,共进行10次交叉验证。
#在RFECV中,迭代次数是由特征数量和步长决定的。在这个例子中,步长为1,表示每次迭代移除一个特征。因此,迭代次数等于特征数量减去1。
# 假设有n个特征,那么迭代次数为n - 1

selector = selector.fit(X, y)
#使用训练数据拟合特征选择器:selector = selector.fit(X_train, y_train)


X_wrapper = selector.transform(X)  
#将训练数据转换为经过特征选择后的数据:X_wrapper = selector.transform(X_train)。

score =cross_val_score(clf , X_wrapper, y, cv=5).mean()   
#使用交叉验证计算模型在经过特征选择后的训练数据上的得分

print(score)

在上面的代码中,我们使用了sklearn中的RFECV类进行特征选择。其中clf是一个决策树分类器,step参数指定每次迭代移除一个特征,cv参数指定进行交叉验证的次数。selector = selector.fit(X, y)表示使用训练数据进行特征选择。X_wrapper = selector.transform(X)将原始数据转换为经过特征选择后的数据。score =cross_val_score(clf , X_wrapper, y, cv=5).mean()用选择后的特征子集进行交叉验证,并计算模型的平均性能得分。 

(三) 输出最优特征数

indx_n=-1
op_feature_list=[]
for i in selector.ranking_:
    indx_n=indx_n+1
    if i == 1:
        op_feature_list.append(iris.feature_names[indx_n])
        
#最终选择的特征数量
print("最优特征数 : %d" % selector.n_features_) 

 (四)输出最优特征名称

print ('最优特征为:',op_feature_list)

 (五)以布尔形式输出最优特征

#True表示保留特征,False表示剔除特征
print('被选择的特征为Ture :',selector.support_)

(六) 输出特征重要性排序

print('特征重要性排序 = :',selector.ranking_) #数值越小越重要

 (七)输出选择特征的索引

selected_features = [i for i in range(len(selector.support_)) if selector.support_[i]]
print("选择的特征索引:", selected_features)

(八)交叉验证得分随特征数量的变化

print ('5折交叉验证得分随特征数量的变化:', selector.grid_scores_)

在selector.grid_scores_中,每个元素对应于对应特征数量下模型在交叉验证中的得分。通常情况下,selector.grid_scores_的长度等于特征数量的范围,每个元素的值代表在对应特征数量下的平均得分。

是一个列表,其中一共有四个元素,列表中的每个元素表示不同数量的特征被选中时模型的平均性能得分。列表中的第一个元素表示只选择一个最重要的特征时模型的性能得分,第二个元素表示选择两个最重要的特征时模型的性能得分,以此类推。

(九)曲线图查看特征选择的结果

import matplotlib.pyplot as plt
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score")
plt.plot(range(1,5),selector.grid_scores_)
# 设置x轴刻度
plt.xticks(range(1, 5))
plt.show()

 

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

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

相关文章

我们真的需要5G吗?再读《5G将是一个彻底的失败通信技术》

目录 投入与产出不成正比 《5G将是一个彻底的失败通信技术》 无线通信技术体制 无线通信技术演进 5G需求 移动通信与WiFi 5G之局 未来之路 参考 投入与产出不成正比 2018年开始大规模装备5G设备,因此2018年被称为5G元年。一般5G基站的寿命为8年左右&#…

GeoServer 任意文件上传漏洞分析研究 CVE-2023-51444

目录 前言 漏洞信息 代码审计 漏洞复现 前言 时隔半月,我又再一次地审起了这个漏洞。第一次看到这个漏洞信息时,尝试复现了一下,结果却很不近人意。从官方公布的漏洞信息来看细节还是太少,poc不是一次就能利用成功的。也是当时…

工器具管理(基于若依)

文章目录 前言一、工器具管理项目总览 二、入库功能1. 前端1.1 界面展示1.2 具体操作实现1.3 js文件 2. 后端2.1 工器具信息回显2.2 工器具入库 三、领用功能1. 前端1.1 界面展示1.2 具体实现操作1.3 js文件 2. 后端2.1 工器具信息回显2.2 工器具领用 遇到的问题1. 同一页面展示…

2024最新版守约者二级域名分发系统源码,提供全面的二级域名管理服务

主要功能 二级域名管理:我们的系统提供全面的二级域名管理服务,让您轻松管理和配置二级域名。 下 载 地 址 : runruncode.com/php/19756.html 域名分发:利用我们先进的域名分发技术,您可以自动化地分配和管理域名&…

【教程向】从零开始创建浏览器插件(二)深入理解 Chrome 扩展的 manifest.json 配置文件

第二步:深入理解 Chrome 扩展的 manifest.json 配置文件 上一次我们已经着手完成了一个自己的浏览器插件,链接在这里:我是链接 在本篇博客中,我们将更详细地探讨 Chrome 扩展中的 manifest.json 文件。这个文件是每个浏览器扩展…

keep健身小程序源码搭建/部署/上线/运营/售后/更新

基于FastAdminThinkPHPUniApp(目前仅支持微信小程序和公众号)开发的健身相关行业微信小程序,程序适用于健身房、瑜伽馆、游泳馆、篮球馆等健身培训场所。平台拥有课程售卖、课程预约、多门店管理、私教预约、教练端、会员卡办理、在线商城、分…

超分辨率专题 | 3 种方法、4 个教程、10 个数据集,一文 Get 核心知识点

2010 年 12 月,清华大学电子工程系教授苏光大接到一通不寻常的电话,内蒙古自治区准格尔刑警队的警员拿着一张模糊不清的犯罪嫌疑人人脸图像,向苏光大寻求帮助。 「这张图像是由路边的监控摄像头拍摄的,像素非常低,肉眼…

一文搞懂什么是外贸企业邮箱?

一文搞懂什么是外贸企业邮箱?外贸企业邮箱,也就是外贸行业使用的企业邮箱系统,一般需要具备海外抵达率高、安全稳定等特点,通过外贸企业邮箱,企业可以和国内国外的客户或者同事进行业务的沟通交流。 一、什么是外贸企…

接口自动化框架篇:使用python连接数据库 - PySQL介绍!

PySQL介绍:使用Python连接数据库的接口自动化框架 在接口自动化测试中,经常需要使用数据库来操作测试数据,验证接口返回的数据是否正确。Python是一种功能强大的编程语言,可以轻松地连接数据库,并进行各种数据库操作。…

林更新博士之路星途璀璨再启航

林更新:博士之路,星途璀璨再启航在这个充满机遇与挑战的时代,有一位演员以其出色的演技和不懈的努力,赢得了无数观众的喜爱。他,就是林更新。今日,一条消息如重磅炸弹般在娱乐圈炸开,让无数粉丝…

将AI融入项目开发工作中去吧

目录 1.提高编写开发日报的效率 2.提高编写代码注释的效率 3.提高代码重构的效率 4.编写测试用例及测试报告 5. 协助进行代码走查与工作量分析 在AI元年后,作为一名程序员,相信各位友友已经深切地感受到了它带来的变革。作为一个从小白到资深码农的…

【c++线程】condition_variable的简单使用

尝试用两个线程交替打印1-100的数字&#xff0c;要求一个线程打印奇数&#xff0c;另一个线程打印偶数&#xff0c;并且打印数字从小到大依次递增。 #include <iostream> using namespace std; #include <thread> #include <mutex> #include <condition_…

海外邮件群发工具的使用方法?有哪些限制?

海外邮件群发工具怎么选择&#xff1f;使用邮件群发工具的优势&#xff1f; 海外邮件群发工具成为了企业开展海外推广、联系客户、推广产品和服务的重要工具。但如何有效地使用这一工具&#xff0c;成为了众多营销人员关注的问题。接下来&#xff0c;AokSend将详细探讨海外邮件…

文件批量重命名技巧:文本内容即文件名,打造个性化文件命名新体验

在日常工作和学习中&#xff0c;我们经常需要处理大量的文件&#xff0c;而给这些文件命名则成为了一个既繁琐又重要的任务。传统的文件命名方式&#xff0c;如使用数字、字母或简单的描述性词汇&#xff0c;往往难以体现出文件的实际内容和特点。那么&#xff0c;有没有一种方…

搭建一个vue3+vant4+vite4+pinia 的移动端h5模板

效果图 项目的创建和组件库的安装 项目创建 pnpm create vite vue3-vant4-vite-pinia-pro-h5注意&#xff1a; node版本控制在 18&#xff0c; 可以通过nvm来管理本地的node版本&#xff0c;具体可以看这篇文章 nvm的简单使用 vant-ui库的安装【这里安装的是 ^4.6.0 版本的】…

云南区块链商户平台优化开发

背景 云南区块链商户平台是全省统一区块链服务平台。依托于云南省发改委、阿里云及蚂蚁区块链的国内首个省级区块链平台——云南省区块链平台同步上线&#xff0c;助力数字云南整体升级。 网页版并不适合妈妈那辈人使用&#xff0c;没有记忆功能&#xff0c;于是打算自己开发…

不想让Win系统更新,那就让它暂停一万年

按照下图所示进行操作 winR 输入 regedit&#xff0c;进入注册表编辑器 随后依次点击 HKEY_LOCAL_MACHINE ⬇ SOFTWARE ⬇ Microsoft ⬇ WindowsUpdate ⬇ UX ⬇ Settings 最后在右侧空白处 文件类型 新建DWORD&#xff08;32位&#xff09;值&#xff08;D&#xff09; 命名…

sharding-jdbc如何实现分页查询

写在文章开头 在之前的文章中笔者简单的介绍了sharding-jdbc的使用&#xff0c;而本文从日常使用的角度出发来剖析一下sharding-jdbc底层是如何实现分页查询的。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CSDN的博客…

私域流量优化:如何利用 AIPL 模型洞察客户生命周期价值

在当今这个数字化时代&#xff0c;商业战场的硝烟从未如此浓烈。随着互联网红利的逐渐消退&#xff0c;公域流量的成本水涨船高&#xff0c;企业间对于有限用户资源的争夺已进入白热化阶段。每一次点击、每一个曝光背后&#xff0c;都是企业不得不承担的高昂代价。在此背景下&a…

1725 ssm资产管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm资产管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/…