机器学习特征选择

news2025/1/4 9:24:39

一、特征选择概述

在实际的数据集中,往往包含了大量的特征,但并非所有特征都对我们要预测的目标变量(如分类任务中的类别标签,回归任务中的数值目标)有积极作用。有些特征可能携带的信息量极少,甚至会引入噪声,干扰模型的学习和预测。特征选择就是要解决如何从这些繁杂的特征里挑出 “精华” 的问题。

二、过滤式选择(Filter Methods)

(一)基本原理

过滤式选择相对独立且计算效率较高,它依据数据本身的固有特性,像变量之间的相关性、数据的统计特征等,不依赖具体的机器学习算法模型,来对特征进行评估和筛选。就好比先用一个 “过滤器” 把明显不重要的特征筛除掉,其评估指标通常基于统计学原理、距离度量、信息论等相关概念,用以衡量每个特征与目标变量之间的相关性或者区分度。

(二)常用的评估指标及示例

  1. 方差阈值(Variance Threshold):主要用于去除那些方差极低的特征。例如在一个包含多个传感器采集的数据集中,如果某个传感器在长时间内采集到的数据始终近乎恒定,也就是方差趋近于 0,意味着它携带的信息量极少,很难对目标变量的预测起到作用,那么这个传感器对应的特征就可以通过方差阈值法筛选掉。
  2. 相关系数(Correlation Coefficient):比如皮尔逊相关系数(Pearson correlation coefficient)常用于衡量特征与目标变量之间的线性相关程度,取值范围在 -1 到 1 之间,绝对值越接近 1,表示相关性越强,若接近 0 则表示相关性很弱。以分析房屋价格(目标变量)与多个特征(如房屋面积、房龄、周边学校数量等)的关系为例,可以计算各特征与房价的皮尔逊相关系数,剔除相关性极低的特征。
  3. 互信息(Mutual Information):基于信息论,它衡量的是两个随机变量之间的相互依赖程度,在特征选择中,可用来评估特征与目标变量共享的信息量。比如在文本分类任务中,计算某个词语特征与文档所属类别之间的互信息,筛选出对分类有较高价值的词语作为有效特征。

(三)Python 代码示例

以下是使用皮尔逊相关系数进行特征筛选的 Python 代码示例,假设我们有一个数据集,目标是预测房屋价格(price),特征包含房屋面积(area)、房龄(age)等多个变量。

import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression

# 加载波士顿房价数据集(示例数据集,有多个特征用于预测房价)
data = load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target

# 使用SelectKBest结合f_regression(基于F检验的回归问题特征选择,这里与皮尔逊相关系数类似思路)
# 选择与目标变量(房价)相关性最强的5个特征
selector = SelectKBest(score_func=f_regression, k=5)
X_new = selector.fit_transform(X, y)

# 获取被选中的特征名称
selected_feature_names = X.columns[selector.get_support()]
print("Selected features:", selected_feature_names)

在上述代码中:

  • 首先导入所需的库,加载了经典的波士顿房价数据集,其中包含多个可用于预测房价的特征以及对应的房价目标值。
  • 然后使用 SelectKBest 类(sklearn 中实现过滤式特征选择的工具),通过 f_regression 函数(适用于回归场景下基于相关性的特征选择)来评估每个特征与目标变量(房价 y)的相关性,这里设定选择相关性最强的 k = 5 个特征。
  • 最后输出被选中的特征名称,这些特征就是经过过滤式选择后认为对预测房价较有价值的部分。

(四)优点与缺点

  • 优点
    • 计算效率高:不需要反复训练机器学习模型,直接基于数据的统计等特性进行计算,能快速筛选特征,尤其适用于大规模数据集的初步特征筛选。
    • 通用性强:不依赖特定的模型,可应用于多种机器学习任务,如分类、回归等不同场景。
  • 缺点
    • 缺乏对模型的针对性:仅从数据自身角度考虑特征重要性,没有结合后续要使用的具体机器学习算法进行综合评估,可能会筛掉一些虽然单独看与目标相关性不强,但结合模型后能发挥重要作用的特征。

三、包裹式选择(Wrapper Methods)

(一)基本原理

包裹式选择将特征选择看作是一个搜索问题,它把具体的机器学习算法(如决策树、支持向量机等)以及要评估的特征子集作为一个整体进行考虑。通过不断改变特征子集(比如添加或移除某些特征),利用选定的机器学习模型在验证集或交叉验证等方式下的性能表现(如准确率、均方误差等指标)来评价该特征子集的优劣,最终找到使模型性能最优的特征子集。也就是说,它用具体的模型 “包裹” 住特征选择的过程,模型的性能成为判断特征好坏的关键依据。

(二)常用的搜索策略及示例

  1. 完全搜索(Exhaustive Search):理论上会遍历所有可能的特征子集组合,但在实际应用中,除非特征数量极少,否则计算成本过高,几乎难以实现。例如只有 3 个特征时,其所有子集组合共有 8 种情况(包括空集和全集),可以全部尝试并比较模型在各子集下的性能,但当特征数量达到几十甚至更多时,计算量会呈指数级增长。
  2. 启发式搜索(Heuristic Search):像顺序向前选择(Sequential Forward Selection,SFS),开始时特征子集为空,每次从剩余的特征中选择一个加入子集,选择的标准是加入该特征后能最大程度提升模型性能;与之对应的顺序向后选择(Sequential Backward Selection,SBS)则是从所有特征开始,每次移除一个特征,移除后使模型性能下降最少的那个特征被确定移除,如此反复,直到达到某个停止条件(比如达到预设的特征数量或者模型性能不再有明显提升等)。例如在一个有 10 个特征的数据集用于构建分类模型时,使用 SFS 逐步增加特征构建子集,每次都在验证集上看分类准确率的变化来决定添加哪个特征。

(三)Python 代码示例

以下是一个简单的基于顺序向前选择(Sequential Forward Selection,SFS)的包裹式特征选择示例,用于分类任务(假设是一个简单的鸢尾花分类数据集),这里为了简化,没有采用复杂的模型训练评估框架,仅示意基本思路。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

# 加载鸢尾花数据集
data = load_iris()
X = data.data
y = data.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 特征数量
n_features = X.shape[1]
selected_features = []
best_accuracy = 0

# 顺序向前选择
for _ in range(n_features):
    temp_best_accuracy = 0
    temp_best_feature = None
    for feature in range(n_features):
        if feature not in selected_features:
            current_selected = selected_features + [feature]
            X_train_subset = X_train[:, current_selected]
            X_test_subset = X_test[:, current_selected]
            model = DecisionTreeClassifier()
            model.fit(X_train_subset, y_train)
            accuracy = model.score(X_test_subset, y_test)
            if accuracy > temp_best_accuracy:
                temp_best_accuracy = accuracy
                temp_best_feature = feature
    selected_features.append(temp_best_feature)
    best_accuracy = temp_best_accuracy
    print(f"Selected features: {selected_features}, Accuracy: {best_accuracy}")

在上述代码中:

  • 同样先导入相关库并加载鸢尾花分类数据集,然后划分出训练集和测试集。
  • 设定初始的空特征子集 selected_features,开始循环添加特征。每次循环遍历所有未被选中的特征,将其加入当前特征子集构建新的训练集和测试集子集,用决策树分类器(这里仅作为示例模型)进行训练并在测试集上评估准确率。选择能使准确率提升最高的那个特征加入到已选特征子集中,并更新最佳准确率等信息。不断重复这个过程,直到达到特征数量上限或者准确率不再有明显提升等停止条件(这里简单示例只是按特征数量全部遍历完)。

(四)优点与缺点

  • 优点
    • 针对性强:紧密结合具体的机器学习模型来选择特征,所选出来的特征子集能够很好地契合该模型,往往能使模型达到比较好的性能表现。
  • 缺点
    • 计算成本高:由于需要多次训练不同特征子集对应的机器学习模型,并在验证集等进行性能评估,尤其是在特征数量较多或者采用复杂的搜索策略时,计算开销非常大,耗时较长。
    • 容易过拟合:过于依赖特定模型在有限验证数据上的性能表现,所选的特征子集可能在训练数据对应的模型上表现好,但泛化能力不一定强,容易出现过拟合问题。

四、嵌入式选择(Embedded Methods)

(一)基本原理

嵌入式选择把特征选择过程融入到机器学习模型的构建过程之中。在模型训练的同时,模型自身的算法机制会自动根据一定的规则确定特征的重要性程度,进而进行特征的筛选或者权重分配等操作。不同的机器学习算法有不同的嵌入式特征选择实现方式,例如正则化方法在训练过程中通过添加惩罚项来抑制不重要特征的权重,决策树类算法通过计算特征在节点分裂过程中的重要性来衡量特征价值。

(二)常见的嵌入式选择实现示例

  1. 基于正则化的线性模型(如 Lasso 和 Ridge 回归):在普通的线性回归中添加正则化项,Lasso(Least Absolute Shrinkage and Selection Operator)回归使用 L1 正则化,它能够使得部分特征的系数收缩为 0,从而起到特征选择的作用,那些系数变为 0 的特征就相当于被筛除掉了;Ridge(岭)回归采用 L2 正则化,虽然不会使特征系数严格为 0,但会对特征的权重进行衰减,相对不重要的特征权重会变得很小,间接体现了特征的重要性差异。例如在预测房屋价格的回归模型中,运用 Lasso 回归可能会发现一些与房价关联不大的特征(如小区内某个很少使用的小型设施对应的特征)其系数变为 0 而被去除。
  2. 基于树模型的特征重要性评估(如决策树、随机森林等):在决策树生长过程中,每次选择分裂特征时,对分类或预测结果贡献越大的特征越有可能被选中,通过统计每个特征在整个树构建过程中被用作分裂节点的次数等指标来衡量特征的重要性。在随机森林中,综合多棵决策树对特征重要性的评估结果(通常是平均各树中特征的重要性得分),可以得到各个特征的重要性排序,进而选择重要的特征用于后续的分析或模型构建。

(三)Python 代码示例

以下是在回归任务中,利用 Lasso 回归(一种基于正则化实现嵌入式特征选择的方法)进行特征选择的 Python 代码示例,同样以波士顿房价数据集为例。

import pandas as pd
from sklearn.datasets import load_boston
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split

# 加载波士顿房价数据集
data = load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用Lasso回归进行特征选择,设置正则化参数alpha(可根据实际调整)
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)

# 获取特征重要性(非零系数对应的特征视为重要特征)
selected_feature_names = X.columns[lasso.coef_!= 0]
print("Selected features:", selected_feature_names)

在上述代码中:

  • 导入库后加载波士顿房价数据集并划分训练集和测试集。
  • 创建 Lasso 回归模型实例,设置正则化参数 alpha(该参数控制对特征系数的惩罚程度,影响特征选择效果,需根据实际情况调整优化),然后使用训练集进行模型训练。
  • 通过查看模型系数 lasso.coef_,将系数不为 0 的特征对应的名称提取出来,这些就是通过 Lasso 回归嵌入式选择出来的、被认为对预测房价较重要的特征。

(四)优点与缺点

  • 优点
    • 结合了计算效率和模型针对性:一方面,不像包裹式选择那样需要大量额外的模型训练和搜索过程,计算成本相对可控;另一方面,又考虑到了模型自身的特点,所选特征与模型训练紧密结合,对提升模型性能有较好的帮助。
  • 缺点
    • 依赖特定模型结构:特征选择的效果受限于所采用的特定嵌入式模型,不同模型对特征重要性的衡量方式和结果可能存在差异,并且对于一些复杂、非线性关系的挖掘可能不如某些专门的包裹式或其他灵活的方法全面。

五、总结

过滤式选择、包裹式选择和嵌入式选择这三种特征选择方法各有优劣,在实际的数据分析和机器学习项目中,需要根据数据特点、任务要求以及计算资源等多方面因素综合考虑来选用合适的特征选择方式。希望通过本文的详细介绍以及代码示例,能帮助大家更好地理解和运用这些特征选择方法,提升机器学习模型的性能和效果。

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

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

相关文章

QT------模型/视图

一、模型/视图结构概述 基本原理: Qt 的模型/视图(Model/View)架构将数据的存储和显示分离,提高了代码的可维护性和复用性。模型(Model):负责存储和管理数据,提供数据的访问接口&am…

vue3+ts+element-plus 表单el-form取消回车默认提交

问题描述:在表单el-form中的el-input中按回车后,页面会刷新,url也会改变, 回车前: 回车后: 相关代码: 解决方法1:在 el-form 上阻止默认的 submit 事件,增加 submit.pre…

掌握大数据处理利器:Flink 知识点全面总结【上】

1.Flink的特点 Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。 Flink主要特点如下: 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。结果的准确性。Flink提供了事件时间(event--time)和处理时间(proces…

国产数据库-崖山使用介绍

本文档基于崖山数据库23.3 个人版本,单机(主备)部署模式的情况下的使用介绍。 数据库实例状态: NOMOUNT:仅读取参数文件,不加载数据库 MOUNT:读取控制文件,加载数据库&#xff…

Pytest基础01: 入门demo脚本

目录 1 Pytest接口测试 1.1 最简单版hello world 1.2 pytest.ini 2 pytest兼容unittest 3 封装pytest执行入口 1 Pytest接口测试 Pyest是一个可以用于接口测试的强大框架,开源社区也有非常多的pytest插件。 按江湖传统,学习一个新语言或者新框架&…

如何在没有 iCloud 的情况下将数据从 iPhone 传输到 iPhone

概括 您可能会遇到将数据从 iPhone 转移到 iPhone 的情况,尤其是当您获得新的 iPhone 15/14 时,您会很兴奋并希望将数据转移到它。 使用iCloud最终可以做到这一点,但它的缺点也不容忽视,阻碍了你选择它。例如,您需要…

streamlit、shiny、gradio、fastapi四个web APP平台体验

streamlit、shiny、gradio、fastapi四个web APP平台体验 经常被问的问题就是:web APP平台哪个好?该用哪个?刚开始只有用streamlit和shiny,最近体验了一下gradio和fastapi,今天根据自己的体会尝试着回答一下。 使用R语…

HTML5滑块(Slider)

HTML5 的滑块&#xff08;Slider&#xff09;控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例&#xff1a; <…

探索 .idea 文件夹:Java Maven 工程的隐形守护者

一、.idea文件夹深度解析&#xff1a;IntelliJ IDEA项目配置的核心 在Java Maven工程的开发环境中&#xff0c;.idea文件夹扮演着举足轻重的角色。这是IntelliJ IDEA项目特有的一个配置文件夹&#xff0c;它包含了项目所需的各种配置信息&#xff0c;以确保项目能够在不同的开发…

遥感图像车辆检测-目标检测数据集

遥感图像车辆检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接: https://pan.baidu.com/s/1XVlRTVWpXZFi6ZL_Xcs7Rg?pwdaa6g 提取码: aa6g 数据集信息介绍&#xff1a; 共有 1035 张图像和一一对应的标注文件 标注文件格式提供了…

[Qt] Qt介绍 | 搭建SDK

目录 1. Qt 简介 什么是 Qt&#xff1f; 1.1 引入 1.2 GUI 1.3 Qt 介绍 2. Qt 发展史 3. Qt 支持的平台 4. Qt 版本信息 5. Qt 的优点 6. Qt 应用场景 7. Qt 成功案例 8. Qt 发展前景及就业分析 二. Qt 开发环境搭建 1. 开发工具概述 2.Qt SDK 安装 3.使用 1. …

【机器学习】机器学习的基本分类-自监督学习-对比学习(Contrastive Learning)

对比学习是一种自监督学习方法&#xff0c;其目标是学习数据的表征&#xff08;representation&#xff09;&#xff0c;使得在表征空间中&#xff0c;相似的样本距离更近&#xff0c;不相似的样本距离更远。通过设计对比损失函数&#xff08;Contrastive Loss&#xff09;&…

xterm + vue3 + websocket 终端界面

xterm.js 下载插件 // xterm npm install --save xterm// xterm-addon-fit 使终端适应包含元素 npm install --save xterm-addon-fit// xterm-addon-attach 通过websocket附加到运行中的服务器进程 npm install --save xterm-addon-attach <template><div :…

记一次护网通过外网弱口令一路到内网

视频教程在我主页简介或专栏里 目录&#xff1a; 资产收集 前期打点 突破 完结 又是年底护网季&#xff0c;地市护网有玄机&#xff0c;一路磕磕又绊绊&#xff0c;终是不负领导盼。 扯远了-_-!!&#xff0c;年底来了一个地市级护网&#xff0c;开头挺顺利的&#xff0c…

XIAO ESP32 S3网络摄像头——2视频获取

本文主要是使用XIAO Esp32 S3制作网络摄像头的第2步,获取摄像头图像。 1、效果如下: 2、所需硬件 3、代码实现 3.1硬件代码: #include "WiFi.h" #include "WiFiClient.h" #include "esp_camera.h" #include "camera_pins.h"// 设…

uniapp:微信小程序文本长按无法出现复制菜单

一、问题描述 在集成腾讯TUI后&#xff0c;为了能让聊天文本可以复制&#xff0c;对消息组件的样式进行修改&#xff0c;主要是移除下面的user-select属性限制&#xff1a; user-select: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms…

2025:OpenAI的“七十二变”?

朋友们&#xff0c;准备好迎接AI的狂欢了吗&#xff1f;&#x1f680; 是不是跟我一样&#xff0c;每天醒来的第一件事就是看看AI领域又有什么新动向&#xff1f; 尤其是那个名字如雷贯耳的 OpenAI&#xff0c;简直就是AI界的弄潮儿&#xff0c;一举一动都牵动着我们这些“AI发…

无人机频射信号检测数据集,平均正确识别率在94.3%,支持yolo,coco json,pasical voc xml格式的标注,364张原始图片

无人机频射信号检测数据集&#xff0c;平均正确识别率在94.3&#xff05;&#xff0c;支持yolo&#xff0c;coco json&#xff0c;pasical voc xml格式的标注&#xff0c;364张原始图片 可识别下面的信号&#xff1a; 图像传输信号LFST &#xff08;Image_Transmission_sign…

柱状图中最大的矩形 - 困难

************* c topic: 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; ************* chenck the topic first: Think about the topics I have done before. the rains project comes:盛最多水的容器 - 中等难度-CSDN博客https://blog.csdn.net/ElseWhe…

第17篇 使用数码管实现计数器___ARM汇编语言程序<四>

Q&#xff1a;如何使用定时器实现数码管循环计数器&#xff1f; A&#xff1a;DE1-SoC_Computer系统有许多硬件定时器&#xff0c;本次实验使用A9 Private Timer定时器实现延时&#xff1a;定时器首先向Load寄存器写入计数值&#xff0c;然后向Control寄存器中的使能位E写1来启…