想象你要做一道美食,面对琳琅满目的食材,优秀的厨师不会把所有原料都扔进锅里,而是会选择最适合的几种。

在机器学习中,特征选择就是这个挑选过程,从原始数据中选择对预测目标最有用的特征(列),就像挑选优质食材一样重要。

1. 什么是特征选择?

特征选择是机器学习中一个至关重要的步骤,它从原始数据的众多特征中挑选出对模型最有价值的子集。

简单来说,就是从一堆可能影响结果的因素中,找出那些真正重要的因素,把不重要的、重复的或者有干扰的特征去掉。

为什么要做特征选择呢?主要有以下几个原因:

  • 提高模型性能:少而精的特征能帮助模型更专注于重要的信息,避免被无关特征干扰,从而提高准确性。
  • 加快训练速度:特征少了,模型需要处理的数据量就小了,训练时间自然也就缩短了。
  • 降低过拟合风险:过多的特征可能让模型记住噪声,而不是学习到真正的规律。特征选择能帮助模型更好地泛化。
  • 提升可解释性:特征少了,模型的决策过程更容易理解,这对很多实际应用场景非常重要。

2. 三大特征选择方法

根据特征选择模型训练过程的关系,主要可以分为以下三类方法:

2.1. 过滤式:先"筛"后"用"

过滤式方法就像用筛子筛沙子一样,先根据特征本身的统计特性对特征进行评估和筛选,然后再把选出来的特征交给模型使用。

这个过程完全独立于机器学习模型。

常见的过滤式方法包括:

  • 方差阈值:去掉那些几乎不变的特征(方差低于某个阈值)
  • 卡方检验:评估分类问题中特征与目标变量的独立性
  • 相关系数:计算特征与目标变量之间的相关性

下面的代码演示如何使用过滤式方法来进行特征选择,使用卡方检验SelectBest):

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.model_selection import train_test_split # 加载数据集
iris = load_iris()
X, y = iris.data, iris.target # 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 创建过滤式选择器,选择2个最佳特征
selector = SelectKBest(score_func=f_classif, k=2)
X_train_selected = selector.fit_transform(X_train, y_train)
X_test_selected = selector.transform(X_test) # 查看选中的特征
selected_features = selector.get_support(indices=True)
print(f"选中的特征索引: {selected_features}")
print(f"特征得分: {selector.scores_}") # 输出特征选择后的数据维度
print(f"原始训练集特征数: {X_train.shape[1]}")
print(f"选择后训练集特征数: {X_train_selected.shape[1]}") ## 输出结果:
'''
选中的特征索引: [2 3]
特征得分: [ 74.7572012 33.41979913 713.45534904 526.54162416]
原始训练集特征数: 4
选择后训练集特征数: 2
'''

最后选择的特征是23,也就是后2个特征(特征索引是从0开始的)。

从特征得分来看看,后2个特征也是得分最高的。

2.2. 包裹式:带着模型一起选

包裹式方法就像带着模型去"试衣"一样,把特征子集当作不同的"衣服",让模型试穿(训练)后看看效果如何。

根据模型的表现(比如准确性)来决定哪些特征组合最好。

常见的包裹式方法包括:

  • 递归特征消除RFE):不断移除最不重要的特征,直到达到指定数量
  • 穷举搜索:尝试所有可能的特征组合(计算成本很高)

下面的代码示例使用递归特征消除RFE):

from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier # 创建随机森林分类器
model = RandomForestClassifier(random_state=42) # 创建递归特征消除选择器
selector = RFE(model, n_features_to_select=2, step=1)
selector = selector.fit(X_train, y_train) # 查看选中的特征
selected_features = selector.get_support(indices=True)
print(f"选中的特征: {selected_features}")
print(f"特征排名: {selector.ranking_}") # 特征选择后的数据
X_train_selected = selector.transform(X_train)
X_test_selected = selector.transform(X_test) # 输出特征选择后的数据维度
print(f"原始训练集特征数: {X_train.shape[1]}")
print(f"选择后训练集特征数: {X_train_selected.shape[1]}") ## 输出结果:
'''
选中的特征: [2 3]
特征排名: [2 3 1 1]
原始训练集特征数: 4
选择后训练集特征数: 2
'''

选择的特征也是23,从特征排名来看,前两个特征排名23后两个特征并列排名第一

2.3. 嵌入式:在模型里自然选择

嵌入式方法就像在模型里内置了一个"挑食"机制,让模型在训练过程中自然地倾向于使用某些特征,而忽略其他特征。

这种方法通常通过正则化来实现。

常见的嵌入式方法包括:

  • L1正则化Lasso):会自动将不重要特征的系数缩放到零
  • 树模型中的特征重要性:如随机森林、梯度提升树等模型自带的特征重要性评分

代码示例:

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LassoCV # 创建带L1正则化的逻辑回归模型
model = LassoCV(random_state=42) # 创建嵌入式选择器
selector = SelectFromModel(model, threshold='median')
selector = selector.fit(X_train, y_train) # 查看选中的特征
selected_features = selector.get_support(indices=True)
print(f"选中的特征: {selected_features}") # 特征选择后的数据
X_train_selected = selector.transform(X_train)
X_test_selected = selector.transform(X_test) # 输出特征选择后的数据维度
print(f"原始训练集特征数: {X_train.shape[1]}")
print(f"选择后训练集特征数: {X_train_selected.shape[1]}") ## 输出结果:
'''
选中的特征: [2 3]
原始训练集特征数: 4
选择后训练集特征数: 2
'''

同样,最终选择的特征也是23

3. 三种方法的对比

选择哪种特征选择方法,取决于你的具体需求和场景,下面是三种方法的比较:

方法类型 优点 缺点 适用场景
过滤式 计算效率高,不依赖模型 可能忽略特征与模型的关系 特征数量较少,对模型不敏感的情况
包裹式 直接考虑模型性能,效果通常较好 计算开销大,容易过拟合 特征数量适中,对性能要求高的情况
嵌入式 计算效率较高,考虑了特征与模型的关系 通常需要模型本身支持特征选择 需要模型具有稀疏性的情况

4. 总结

特征选择是机器学习流程中不可忽略的重要环节。

在实际应用中,我们可以尝试多种方法,观察它们对模型性能的影响,有时候,结合多种方法甚至能取得更好的效果。

记住,特征选择不是一成不变的规则,而是一门需要根据数据和模型不断调整的艺术。

机器学习中的"食材挑选术":特征选择方法的更多相关文章

  1. 阅读源代码的重要性:如厨师选食材,耍厨具——在Eclipse中怎样查看Java、Android源代码

    首先,非常多人说,不会看jdk中的源代码就不叫学过Java.显然这是肯定的.打个例如:真正的厨师须要从食材的选取.加工.到最后的烹饪.装盘成型,甚至到最后给用户介绍食用方法等一整套流程走下来.而实际上 ...

  2. paper 56 :机器学习中的算法:决策树模型组合之随机森林(Random Forest)

    周五的组会如约而至,讨论了一个比较感兴趣的话题,就是使用SVM和随机森林来训练图像,这样的目的就是 在图像特征之间建立内在的联系,这个model的训练,着实需要好好的研究一下,下面是我们需要准备的入门 ...

  3. 机器学习中模型泛化能力和过拟合现象(overfitting)的矛盾、以及其主要缓解方法正则化技术原理初探

    1. 偏差与方差 - 机器学习算法泛化性能分析 在一个项目中,我们通过设计和训练得到了一个model,该model的泛化可能很好,也可能不尽如人意,其背后的决定因素是什么呢?或者说我们可以从哪些方面去 ...

  4. paper 126:[转载] 机器学习中的范数规则化之(一)L0、L1与L2范数

    机器学习中的范数规则化之(一)L0.L1与L2范数 zouxy09@qq.com http://blog.csdn.net/zouxy09 今天我们聊聊机器学习中出现的非常频繁的问题:过拟合与规则化. ...

  5. 【转帖】Python在大数据分析及机器学习中的兵器谱

    Flask:Python系的轻量级Web框架. 1. 网页爬虫工具集 Scrapy 推荐大牛pluskid早年的一篇文章:<Scrapy 轻松定制网络爬虫> Beautiful Soup ...

  6. 机器学习中的范数规则化之(一)L0、L1与L2范数(转)

    http://blog.csdn.net/zouxy09/article/details/24971995 机器学习中的范数规则化之(一)L0.L1与L2范数 zouxy09@qq.com http: ...

  7. 机器学习中的算法-决策树模型组合之随机森林与GBDT

    机器学习中的算法(1)-决策树模型组合之随机森林与GBDT 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使 ...

  8. 机器学习中的范数规则化之(一)L0、L1与L2范数 非常好,必看

    机器学习中的范数规则化之(一)L0.L1与L2范数 zouxy09@qq.com http://blog.csdn.net/zouxy09 今天我们聊聊机器学习中出现的非常频繁的问题:过拟合与规则化. ...

  9. 机器学习中的范数规则化-L0,L1和L2范式(转载)

    机器学习中的范数规则化之(一)L0.L1与L2范数 zouxy09@qq.com http://blog.csdn.net/zouxy09 今天我们聊聊机器学习中出现的非常频繁的问题:过拟合与规则化. ...

  10. 机器学习中的规则化范数(L0, L1, L2, 核范数)

    目录: 一.L0,L1范数 二.L2范数 三.核范数 今天我们聊聊机器学习中出现的非常频繁的问题:过拟合与规则化.我们先简单的来理解下常用的L0.L1.L2和核范数规则化.最后聊下规则化项参数的选择问 ...

随机推荐

  1. httprunner 断言报错 expect_value 和check_value类型不一致

    csv 源码 drillCode,drillName,code,msg y500,牙轮500,200,操作成功 YL201,牙轮201,500,牙轮编号已存在 运行后报错 E httprunner.e ...

  2. 池化层 Pooling Layer

    写在前面:人生就是努力.搞不懂.躺平,循环. 文章结构 池化层的相对位置 在多通道任务中,池化层和卷积层的不同 重要的参数stride 与 kernel_size 大小的相对关系决定3种池化层 参数 ...

  3. [I.1] 个人作业:阅读和提问

    个人作业:阅读和提问 项目 内容 这个作业属于哪个课程 2025年春季软件工程(罗杰.任健) 这个作业的要求在哪里 [I.1] 个人作业:阅读和提问 我在这个课程的目标是 学习并掌握软件工程方法,与团 ...

  4. 如何限制goroutine的数量

    为什么要控制goroutine的数量? 在我们开发过程中,如果不对goroutine加以控制而进行滥用的话,可能会导致服务整体崩溃.比如耗尽系统资源导致程序崩溃,或者CPU使用率过高导致系统忙不过来. ...

  5. Oracle 修改SYS、system用户密码

      by:授客 QQ:1033553122 概念 SYS用户是Oracle中权限最高的用户,而SYSTEM是一个用于数据库管理的用户.在数据库安装完之后,应立即修改SYS,SYSTEM这两个用户的密码 ...

  6. ubuntu 22.04安装harbor

    一.概述 Harbor 是一个企业级的云原生容器镜像仓库,由 VMware 开发并贡献给 Cloud Native Computing Foundation (CNCF).它在传统的 Docker R ...

  7. 手写数字识别实战教程:从零实现MNIST分类器(完整代码示例)

    引言:数字识别的魔法世界 在人工智能的奇妙宇宙中,手写数字识别堪称经典中的经典.这个看似简单的任务--让电脑像人一样"认数字",背后蕴含着模式识别的核心思想.本文将带领你亲手实现一 ...

  8. 使用Python建模量子隧穿

    引言 量子隧穿是量子力学中的一个非常有趣且令人神往的现象.在经典物理学中,我们通常认为粒子必须克服一个势垒才能通过它.但是,在量子力学中,粒子有时可以"穿越"一个势垒,即使它的能量 ...

  9. 从零实现富文本编辑器#3-基于Delta的线性数据结构模型

    数据模型的设计是编辑器的核心基础,其直接影响了选区模型.DOM模型.状态管理等模块的设计.例如在quill中的选区模型是index + len的表达,而slate中则是anchor + focus的表 ...

  10. cmd /k 解决cmd命令闪退问题

    cmd /k 的含义是执行后面的命令,并且执行完毕后保留窗口. & 是连接多条命令.PAUSE 表示运行结束后暂停,等待一个任意按键.EXIT 表示关闭命令行窗口.如果使用 cmd /c 就可 ...