当前位置: 首页 > news >正文

特征选择方法

一、特征选择方法概述

首先,我们来了解一下常见的特征选择方法,主要分为三类:

  1. 过滤法(Filter:特征选择独立于数据挖掘任务,按照特征的发散程度或者特征与目标变量之间的相关性对各个特征进行评分,然后设定阈值选出评分较高的特征子集。
  2. 包装法(Wrapper:特征选择和数据挖掘算法相关,直接使用数据挖掘模型在特征子集上的评价结果衡量该子集的优劣,然后采用一定的启发式方法在特征空间中搜索,直至选择出最优的特征子集。
  3. 嵌入法(Embedded:特征选择和数据挖掘任务融为一体,两者在同一个优化过程中完成,即在训练数据挖掘模型的同时完成特征选择,选择出能够使得该模型性能达到最佳的特征子集。

这三种方法各有特点,适用场景也不同,后面我们会逐一详细介绍。

二、过滤法

过滤式特征选择方法从数据集内在的性质出发,选择特征的发散程度高或者它与目标变量之间的相关度大的特征或特征子集,选择过程与数据挖掘算法无关,因此具有较好的通用性。过滤方法一般分为单变量过滤和多变量过滤两类。

(一)单变量过滤方法

  1. 方差阈值法

方差低于某个阈值的特征无法解释目标变量的变化规律,因此直接将它们删除。这种方法要求特征必须为离散型变量,连续变量需要进行离散化处理后才能使用。

在 Python 的feature_selection模块中,VarianceThreshold类实现了该方法。它的主要参数有threshold,即设定的阈值,默认是 0;主要属性是variances,用于存储计算的每个特征的方差;主要函数有fit(X),用于在数据集 X 上执行特征选择方法;transform(X),返回用选择后的特征对原始数据 X 进行压缩的结果;fit_transform(X),运行特征选择,并返回利用所选特征进行压缩后的数据集;get_support(indices),得到所选特征的掩码(indices=False)或者索引(indices=True)。

举个例子,有一个具有 4 个特征的模拟数据,输出的 4 个特征的方差分别为 [0.139, 5.472, 1.806, 8.472]。当阈值为 1.0 时,第一个特征会被去除;当阈值为 2.0 时,只选择第 2 个和第 4 个特征。

  1. 卡方统计量法

这种方法主要用于分类任务。在feature_selection模块中,提供了SelectKBestSelectPercentile两个类以及chi2函数来支持基于卡方统计量的特征选择。

创建一个基于卡方统计量的单变量过滤特征选择模型的过程如下:selector = SelectKBest(chi2, k=2),其中参数 k=2 意味着只选择出两个特征变量。

我们来看一个实例,模拟数据集 X 和 Y,通过SelectKBestchi2进行特征选择,输出各特征的卡方统计量值为 [0.1, 5.565, 0.276, 10.580],显然第 2 个特征和第 4 个特征的卡方值较大,得以保留。

  1. 互信息法

互信息法可用于分类和回归任务。在 Scikit-learn 库的feature_selection模块中,mutual_info_classifmutual_info_regression两个函数分别实现了分类任务和回归任务中的互信息计算。

结合SelectKBest类,创建基于互信息的单变量过滤特征选择模型的方式为:selector = SelectKBest(mutual_info_classif, k=2)

例如,在一个模拟数据集中,各特征和目标变量的互信息值为 [0, 0.2, 0, 0.617],第 2 个特征和第 4 个特征的互信息值较大,会被保留。

(二)多变量过滤方法

常见的多变量过滤方法有最大相关最小冗余法(mRMR)、基于相关性的特征选择(CFS)、基于相关性的快速特征选择(FCBF)等。

(三)过滤法的优缺点

  1. 优点:算法通用性强,省去了模型训练步骤,算法复杂度低,适用于大规模数据集;能快速去除大量不相关特征,适合作为特征的预筛选器。
  2. 缺点:特征选择过程独立于数据挖掘算法,所选特征子集对于数据挖掘任务而言通常不是最优的,性能常低于其他两类方法。

三、包装法

包装法(Wrapper)直接采用数据挖掘算法在特征子集上的效果对该子集进行评价,将特征选择视为搜索问题,目标是找到最佳特征子集,使数据挖掘算法在该子集上取得最优性能。常见的包装法有递归特征消除(RFE)方法、序列前向选择(SFS)方法、序列后向选择(SBS)方法。

(一)递归特征消除(RFE)

RFE 是一种局部搜索最优特征子集的贪心搜索方法,从全部特征开始,建立数据挖掘模型,剔除模型识别的不重要特征,再用剩余特征迭代重新训练模型,直到剩余指定数量的特征。它要求所依赖的数据挖掘算法在训练时能给出特征的重要性系数,如决策树和随机森林的feature_importances_属性、线性回归模型和线性支持向量机的coef_属性。

在 scikit-learn 库的feature_selection模块中,RFE 的基本语法为:sklearn.feature_selection.RFE(estimator, n_features_to_select=None),其中estimator是监督式数据挖掘算法模型,能提供特征的重要性系数;n_features_to_select是选择的特征数量,默认为选择一半的特征。其返回值有n_features_,即选择的特征数量;ranking_,即对特征的重要性排序。

举个实例,使用葡萄酒数据集,通过 RFE 选择 5 个特征,选取的特征为 [6, 9, 10, 11, 12],在该特征子集上决策树的测试精度为 97.78%。

(二)包装法的优缺点

  1. 优点:与过滤法相比,特征选择过程与数据挖掘任务相关,选择结果是数据挖掘算法表现最佳时的特征子集;对数据挖掘模型要求不高,适用性较广。
  2. 缺点:是迭代式方法,对每个特征子集都需建立数据挖掘模型,特征数量较多时计算量大,效率远低于过滤法;采用启发式搜索,可能找到局部最优子集。

四、嵌入法

嵌入法(Embeding)将特征选择过程完全融入数据挖掘模型的构建过程,在创建模型时完成特征子集选择。它比过滤法性能更好,比包装法计算效率更高,是目前应用最广泛的特征选择方法之一。常见的嵌入法有基于正则化线性模型的方法和基于树的方法。

(一)基于正则化线性模型的方法

feature_selection模块中,SelectFromModel类能在训练数据挖掘模型(如线性回归模型、决策树模型等)时,利用模型重要性系数(coef_feature_importances_)实现嵌入式特征选择。

其基本语法为:sklearn.feature_selection.SelectFromModel(estimator, threshold=None),其中estimator是数据挖掘模型;threshold是阈值,可取‘mean’(默认)、‘median’或数值,系数低于阈值的特征将被丢弃。

(二)基于树模型的方法

基于树的数据挖掘模型,如决策树、随机森林、GBDT、XGboost,在构建树的过程中,会贪婪选择当前最优特征构造属性测试条件,特征被用于构造属性测试条件的次数越多,重要性越高。同样可借助SelectFromModel类实现基于树的嵌入式特征选择。

(三)嵌入法的优缺点

  1. 优点:特征选择与模型构建完全融合,结果是数据挖掘取得最优性能时的子集;与包装法相比,无需耗时的迭代搜索过程,效率更高。
  2. 缺点:性能依赖特定数据挖掘模型,尤其与模型参数设置密切相关;目前仅正则线性模型和树模型适用,对聚类模型、神经网络模型、贝叶斯模型等不适用。

http://www.xdnf.cn/news/1114957.html

相关文章:

  • 数据库3.0
  • Java SE--图书管理系统模拟实现
  • PHP语法高级篇(二):文件处理
  • JVM 锁自动升级机制详解
  • 【AI论文】GLM-4.1V-Thinking:迈向具备可扩展强化学习的通用多模态推理
  • Java面试基础:面向对象(2)
  • 数学与应用数学核心课程有哪些?全文解析!
  • 【webrtc】gcc当前可用码率2:设置阈值通知码率改变
  • 梯度下降算法:像下山一样找到最优解
  • Linux驱动开发1:设备驱动模块加载与卸载
  • ControlNet与T2IAdapter
  • 三种网络类型
  • WordPress Ads-pro 本地文件包含漏洞复现(CVE-2025-4380)
  • 设计模式之工厂模式:对象创建的智慧之道
  • 从“被动巡检”到“主动预警”:塔能物联运维平台重构路灯管理模式
  • Docker安装Nginx
  • Leaflet面试题及答案(61-80)
  • 全国青少年信息素养大赛-算法创意实践挑战赛小学组复赛(代码版)
  • Gin框架统一响应与中间件机制学习笔记
  • JAVA-springboot 整合Activemq
  • Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)脚步
  • jeepay开源项目开发中金支付如何像其他支付渠道对接那样简单集成,集成服务商模式,极简集成工具。
  • HarmonyOS-ArkUI Web控件基础铺垫1-HTTP协议-数据包内容
  • Docker三剑客
  • AWS Lambda Container 方式部署 Flask 应用并通过 API Gateway 提供访问
  • 手写std::optional:告别空指针的痛苦
  • 系规备考论文:论IT服务知识管理
  • 010_学习资源与社区支持
  • C语言基础教程(002):变量介绍
  • Spring Boot 配置注解处理器 - spring-boot-configuration-processor