机器学习特征选择

一、特征选择概述

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

二、过滤式选择(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 = 0temp_best_feature = Nonefor 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 = accuracytemp_best_feature = featureselected_features.append(temp_best_feature)best_accuracy = temp_best_accuracyprint(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.mzph.cn/pingmian/65625.shtml

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

相关文章

如何快速又安全的实现端口转发【Windows MAC linux通用】

背景 有很多程序是在虚拟机上运行的,返回的url 又是127.0.0.1。在个人电脑上调试需要解决这个问题。端口转发是一个不错的方法 可能的解决办法: 1.修改程序,返回虚拟机的ip (要改代码,换虚拟机还要再改代码&#xf…

无人机无法返航紧急处理方式!

一、检查飞行环境 了解禁飞原因和规定:首先,需要了解所在地区的无人机飞行规定,确认是否存在禁飞区或限飞区。如果处于禁飞区,应遵守相关规定,不要强行飞行。 检查天气情况:恶劣的天气条件(如…

NLP论文速读(NeurIPS 2024)|BERT作为生成式上下文学习者BERTs are Generative In-Context Learners

论文速读|BERTs are Generative In-Context Learners 论文信息: 简介: 本文探讨了在自然语言处理(NLP)领域中,上下文学习(in-context learning)的能力,这通常与因果语言模型&#x…

vue3<script setup>中使用Swiper

swiper网址 Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 Swiper - The Most Modern Mobile Touch Slider 安装 Swiper npm安装: npm install swiper yarn安装: yarn add swiper 导入带有所有模块(捆绑包)的 Swiper //…

gala-gopher

title: 探索 Gala-Gopher:智能运维的新引擎 date: ‘2024-12-30’ category: blog tags: Gala-Gopher智能运维故障预测性能优化 sig: ebpf archives: ‘2024-12’ author:way_back summary: Gala-Gopher 作为智能运维领域的创新性项目,以其先进的技术和…

安装软件尝试

import sys import subprocess import os from PyQt5.QtWidgets import QApplication, QDialog, QVBoxLayout, QLabel, QLineEdit, QPushButtonclass InstallPathDialog(QDialog):"""提示框,用于显示并编辑安装路径"""def __init__(self, file_…

今日收获(C语言)

一.文件的打开 有这样一个结构体,它内部是文件信息区,文件信息区中的变化可以影响到硬盘中的数据。这个结构体的名字是FILE。我们如果想要写代码对文件进行各种操作,就需要一个指向文件信息区的指针,这个指针的类型是FILE*&#…

node.js卸载并重新安装(超详细图文步骤)

卸载node.js 重新安装nodejs 一、卸载 1、首先进入控制面板卸载程序 2、卸载后 到文件夹中进行进一步的删除 删除上述的几个文件夹 每个人可能不一样,总之是找到自己的nodejs安装路径,下面是我的 ①删除C:UsersAdminAppDataRoaming路径下的npm相关文件…

仓颉编程语言:编程世界的 “文化瑰宝”

我的个人主页 在当今编程领域百花齐放的时代,各种编程语言争奇斗艳,服务于不同的应用场景和开发者群体。然而,有这样一种编程语言,它承载着独特的文化内涵,宛如编程世界里一颗熠熠生辉的“文化瑰宝”,那就…

损失函数-二分类和多分类

二分类和多分类的损失函数 二分类 损失函数 L ( y , y ^ ) − ( y l o g ( y ^ ) ) ( 1 − y ) l o g ( 1 − y ^ ) L(y,\hat{y}) -(ylog(\hat{y})) (1-y)log(1-\hat{y}) L(y,y^​)−(ylog(y^​))(1−y)log(1−y^​) 其中真实标签表示为y(取值为 0 或 1&#…

【模电刷题复习--填空】

如有错误,欢迎各位大佬在评论区批评指正 模电刷题 一、填空题1.本征半导体中,若掺入微量的__五__价元素,则形成___n___型半导体,其多数载流子是自由电子,若掺入微量的__三__价元素,则形成__p__型半导体。其…

Android使用JAVA调用JNI原生C++方法

1.native-lib.cpp为要生成so库的源码文件 2.JNI函数声明说明 NewStringUTF函数会返回jstring JNI函数声明规则 3.JAVA中声明及调用JNI函数 声明: 调用

DAY178内网渗透之内网对抗:横向移动篇入口差异切换上线IPC管道ATSC任务Impacket套件UI插件

1.内网横向移动 1、横向移动篇-入口点分析-域内域外打点 2、横向移动篇-IPC利用-连接通讯&计划任务, 3、横向移动篇-IPC利用-命令模式&工具套件 1.1 横向移动入口知识点 收集到域内用户和凭据后,为后续利用各种协议密码喷射通讯上线提供条件,…

宠物行业的出路:在爱与陪伴中寻找增长新机遇

在当下的消费市场中,如果说有什么领域能够逆势而上,宠物行业无疑是一个亮点。当人们越来越注重生活品质和精神寄托时,宠物成为了许多人的重要伴侣。它们不仅仅是家庭的一员,更是情感的寄托和生活的调剂。然而,随着行业…

MySQL数据库——索引结构之B+树

本文先介绍数据结构中树的演化过程,之后介绍为什么MySQL数据库选择了B树作为索引结构。 文章目录 树的演化为什么其他树结构不行?为什么不使用二叉查找树(BST)?为什么不使用平衡二叉树(AVL树)&a…

大模型—Ollama 结构化输出

Ollama 结构化输出 Ollama现在支持结构化输出,使得可以按照由JSON模式定义的特定格式来约束模型的输出。Ollama的Python和JavaScript库已经更新,以支持结构化输出。 结构化输出的用例包括: 从文档中解析数据从图像中提取数据结构化所有语言模型响应比JSON模式更可靠和一致开…

欧拉计划 Project Euler 35 题解

欧拉计划 Problem 35 题解 题干思路code暴力筛法rotate函数使用语法示例代码 题干 思路 一个很自然的思路就是暴力找&#xff0c;遍历一百万之内的所有数&#xff0c;也可以先把一百万以内所有的素数筛出来然后从中取选。这里我使用的是暴力算法。 code 暴力 #include <…

JVM常见排查问题的命令及可视化工具

前置&#xff1a; RMI协议&#xff1a;java的一个远程调用协议&#xff0c;在不同的JVM之间可以进行接口的调用&#xff0c;但数据不安全&#xff0c;且仅限java&#xff1b; 一、常见命令及用法 1、jps&#xff1a;与Linux的ps命令有点类似&#xff0c;查看系统中在运行的J…

pytorch基础之注解的使用--003

Title 1.学习目标2.定义3.使用步骤4.结果 1.学习目标 针对源码中出现一些注解的问题&#xff0c;这里专门写一篇文章进行讲解。包括如何自定义注解&#xff0c;以及注意事项&#xff0c;相信JAVA中很多朋友业写过&#xff0c;但是今天写的是Python哦。。。 2.定义 在 Python…

C#编写的金鱼趣味小应用 - 开源研究系列文章

今天逛网&#xff0c;在GitHub中文网上发现一个源码&#xff0c;里面有这个金鱼小应用&#xff0c;于是就下载下来&#xff0c;根据自己的C#架构模板进行了更改&#xff0c;最终形成了这个例子。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 初始化&#xff1b; 将样…