【feature selection】特征选择学习笔记

news2024/11/16 13:41:55

文章目录

      • 1. 什么是特征选择
      • 2. 特征选择与特征提取的区别
      • 3. 特征选择的方法
        • 3.1 Filtering过滤法
        • 3.2 Wrapper包装法
        • 3.3 Embedding嵌入法
      • 4. 特征选择示例
        • 4.1 方差选择法示例
        • 4.2 递归特征消除法示例

1. 什么是特征选择

  • 特征选择是特征工程的内容, 其目标是寻找最优特征子集。剔除不相关或冗余特征, 减小特征数量

    在这里插入图片描述

  • 特征选择的作用

    • (1) 过拟合的表现是模型太贴合训练数据而在测试集上表现不好, 特征选择能通过减少不相关或冗余特征降低过拟合的风险
    • (2) 在数据预处理阶段, 能够帮助识别缺失值过多, 异常值过多, 特征高度相关的特征
    • (3) 对大型数据集或实时应用来说, 能够减少计算量, 提高计算效率
    • (4) 能够提高模型的可解释性。特征选择能够帮助识别哪些特征对模型预测有影响, 从而提高模型的可解释性
    • (5) 特征选择还能降低数据维度, 同样的, 特征提取也可以降低维度

2. 特征选择与特征提取的区别

  • 如上图所示, 用数学的话来解释:

    • 特征选择后的特征是原来特征的一个子集
    • 特征提取后的新特征是原来特征的一个映射
  • 比如, 有长、宽两个特征,特征选择是根据模型的目标来选择这个特征或者选择这个特征,而特征提取是把长和宽两个特征提取成面积这个"新特征"

3. 特征选择的方法

  • 特征选择主要从两个方面考虑: 方差和相关性
    • 方差:特征是否发散。如果一个特征不发散,比如方差接近0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用
    • 相关性:特征与目标的相关性。与目标相关性高的特征,应当优选选择
3.1 Filtering过滤法
  • 基本思想:分别对每个特征 x i x_i xi,计算 x i x_i xi相对于类别标签 y y y的信息量 S ( i ) S(i) S(i),得到 n n n个结果。然后将 n n n S ( i ) S(i) S(i)按照从大到小排序,输出前前k个特征,完成特征选择。问题的关键在于如何计算信息量 S ( i ) S(i) S(i)

  • 过滤法方法如下:

    • 方差选择法
      • 先计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征
      • 不需要计算特征与标签的信息量
      • 基于各特征分布方式较为接近的时候,才能以方差的逻辑来衡量信息量,连续变量不适合用方差选择法
      • 可以使用sklearn.feature_selection库的VarianceThreshold类来选择k个最好的特征
    • 相关系数法
      • 计算各个特征对目标值的相关系数以及相关系数的P值,选择k个最好的特征
      • 相关系数是一种最简单的,能帮助理解特征和相应变量之间关系的方法。衡量的是变量之间的线性相关性,结果的取值区间为[-1, 1],-1表示表示完全负相关,+1表示完全正相关,0表示没有线性相关性
      • 速度快,易于计算,数据清洗第一阶段可执行
      • 明显缺陷是只对线性关系敏感,非线性关系即使一一对应,P相关系数也可能为0
      • 可以用sklearn.feature_selection库的SelectKBest类结合相关系数来选择k个最好的特征
    • 卡方验证
      • 构建卡方分布统计量,检验自变量n个取值因变量m个取值的相关性
      • 可以用sklearn.feature_selection库的SelectKBest类结合卡方检验来选择k个最好的特征
    • 互信息法和最大信息系数法
      • 采用互信息评价定性自变量对定性因变量的相关性
      • 互信息直接用于特征选择不方便,不方便归一化且不方便计算连续数据,需要对连续数据进行离散化
      • 最大信息系数法统计定量数据
      • 可以用sklearn.feature_selection库的SelectKBest类结合最大信息系数法来选择k个最好的特征
3.2 Wrapper包装法
  • 基本思想:基于留出法hold-out,对每一个待选的特征子集,都在训练集上训练一遍模型,然后在测试集上根据误差大小选择出特征子集。需要先选定特定算法,通常选用普遍效果较好的算法(想训练什么算法就选择什么算法进行评估),例如RF、SVM、KNN等

  • 包装法方法如下:

    • 前向搜索:每次增量从剩余未选特征中选出一个加入特征集,待达到阈值或n时,从所有的特征集中选出错误率最小的特征集。 O ( n 2 ) O(n^{2} ) O(n2)的时间复杂度
    • 后向搜索:增量减,开始特征集包含{1,2,…,n},每次删除一个特征,直到达到阈值或为空。选择最佳的特征集。 O ( n 2 ) O(n^{2} ) O(n2)的时间复杂度
    • 递归特征消除法:使用基模型进行多轮训练,每轮根据学习器返回的coeff和feature_importance来消除若干权重较低的特征,再根据新的特征集进行下一轮训练
3.3 Embedding嵌入法
  • 基本思想:先使用某些机器学习的模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征,类似于Filtering,只不过系数是通过训练得到的
  • 嵌入法的方法:
    • 基于惩罚项的特征选择法:使用sklearn.feature_selection库的SelectFromModel类结合带L1以及L2惩罚项的基本模型如LR/SVM模型,来选择特征
    • 基于树模型的特征选择法:树模型中选择GBT决策树作为基模型选择特征。使用sklearn.feature_selection库的SelectFromModel类结合GBDT模型,来选择特征

4. 特征选择示例

4.1 方差选择法示例
  • 不使用基模型

  • 不计算特征与目标相关性

  • 设置过滤阈值

    import numpy as np
    from sklearn.feature_selection import VarianceThreshold
    from sklearn.datasets import make_regression
    
    # 创建一个模拟的回归数据集,但是添加一些方差很低的特征
    X, y = make_regression(n_samples=1000, n_features=20, noise=0.1)
    
    # 添加一些几乎恒定的特征
    constant_value = 10  # 设定一个几乎恒定的值
    X = np.hstack((X, np.ones((X.shape[0], 5)) * constant_value))
    
    print("X的shape: ", X.shape) # [1000, 25]
    
    # 查看原始特征的数量
    print(f"原始特征数量: {X.shape[1]}")
    
    # 初始化方差选择法,设定阈值为某个较小的值(例如,我们期望移除方差接近于0的特征)
    selector = VarianceThreshold(threshold=(.8 * (1 - .8)))  # 假设我们设定阈值为方差的20%
    
    # 在数据上拟合方差选择法
    X_new = selector.fit_transform(X)
    
    # 查看选择后的特征数量
    print(f"选择后的特征数量: {X_new.shape[1]}")
    
    # 输出被移除的特征的索引
    print(f"被移除的特征索引: {np.setdiff1d(np.arange(X.shape[1]), selector.get_support(indices=True))}")
    
    # 如果你想要查看每个特征的方差,可以使用numpy的var函数
    variances = np.var(X, axis=0)
    print(f"各特征的方差: {variances}") # 可以看到,那些方差接近0的特征(即我们添加的恒定值特征)现在已经被移除了,如下图
    
  • 被过滤掉的特征的方差:

4.2 递归特征消除法示例
  • 可以使用LR、SVM等基模型,使用的模型最好是训练任务要用的模型

  • 设置要保留的特征个数

    import numpy as np
    from sklearn.datasets import make_classification
    from sklearn.linear_model import LogisticRegression
    from sklearn.feature_selection import RFE
    from sklearn.model_selection import train_test_split
    
    # 创建一个模拟的二分类数据集,具有一些非线性关系
    # 数据集有1000个样本, 特征数20, 其中10个是与输出相关的特征, 5个冗余特征
    X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=5, random_state=42)
    
    # 划分数据集为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # 初始化逻辑回归模型
    lr = LogisticRegression(solver='lbfgs', max_iter=1000, random_state=42)
    
    # 初始化递归特征消除对象,并设置要选择的特征数量(或者传递一个step参数来控制每次迭代中移除的特征数量)
    # 在这个例子中,我们让RFE自动决定保留的特征数量; 返回特征选择后的数
    # 参数estimator为基模型; n_features_to_select为要选择的特征数量
    rfe = RFE(estimator=lr, n_features_to_select=10, step=1, verbose=1)
    
    # 在训练数据上拟合RFE模型
    rfe.fit(X_train, y_train)
    
    # 输出被选择的特征的索引: true表示特征被选择, false表示特征被排除
    # print("Selected features indices:", rfe.support_(indices=True))
    selected_feature_indices = np.where(rfe.support_)[0]
    print("Selected feature indices:", selected_feature_indices)
    
    # 输出被选择的特征数量
    print("Number of selected features: %d" % rfe.n_features_)
    
    # 可以通过transform方法获取训练集和测试集上的所选特征
    X_train_selected = rfe.transform(X_train)
    X_test_selected = rfe.transform(X_test)
    
    # print("所选择的训练特征: ", X_train_selected)
    # print("所选择的测试特征: ", X_test_selected)
    
    # 现在可以使用X_train_selected和X_test_selected在新的逻辑回归模型上进行训练和评估
    lr_selected = LogisticRegression(solver='lbfgs', max_iter=1000, random_state=42)
    lr_selected.fit(X_train_selected, y_train)
    score = lr_selected.score(X_test_selected, y_test)
    print("Test accuracy with selected features:", score)
    
  • 被选择特征的索引:

 


 
创作不易,如有帮助,请 点赞 收藏 支持
 


 

[参考文章]

[1]. 特征选择vs特征提取
[2]. 特征工程和特征选择
[3]. 特征选择方法汇总
[4]. 百度文心一言大模型

created by shuaixio, 2024.05.24

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

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

相关文章

暴雨“彩虹”行业大模型加速器平台全新发布

近日,在第七届数字中国建设峰会期间,暴雨信息全新发布“彩虹”行业大模型加速器平台,聚焦于为客户降本增效减负,将海量通用数据与行业特有数据融合,专注于流程工艺的智能化改进,因地制宜深挖业务需求&#…

图像上下文学习|多模态基础模型中的多镜头情境学习

【原文】众所周知,大型语言模型在小样本上下文学习(ICL)方面非常有效。多模态基础模型的最新进展实现了前所未有的长上下文窗口,为探索其执行 ICL 的能力提供了机会,并提供了更多演示示例。在这项工作中,我…

【论文速读】GPT-1:Improving Language Understanding by Generative Pre-Training

摘要 自然语言理解包括广泛的不同的任务,如文本隐含、问题回答、语义相似性评估和文档分类。虽然大量的未标记文本语料库非常丰富,但用于学习这些特定任务的标记数据非常稀缺,这使得经过区别训练的模型要充分执行任务具有挑战性。我们证明&a…

mongoengine,一个非常实用的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个超酷的 Python 库 - mongoengine。 Github地址:https://github.com/MongoEngine/mongoengine 在现代应用程序开发中,NoSQL数据库因其灵活性和高性能而广受欢迎。MongoD…

基于Android Studio图书管理,图书借阅系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 用户 书架:搜索书籍,查看书籍,借阅书籍,收藏书籍,借阅书籍必须在一个月之内还书; 我的:可以修改密码,退出登录&#xff…

M功能-支付平台(三)

target:离开柬埔寨倒计时-221day 前言 今天周六,但是在柬埔寨还是工作日,想着国内的朋友开始休周末就羡慕呀,记不清在这边过了多少个周六了,多到我已经习惯了。而且今天技术部还停电了,真的是热的受不了呀…

网络安全的重要组成部分:数据库审计

数据库审计(简称DBAudit)以安全事件为中心,以全面审计和精确审计为基础,实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行实时告警。它通过对用户访问数据…

MCU复位电路

【单片机复位电路,巧妙的RC无处不在。】https://www.bilibili.com/video/BV1XW4y1571r?vd_source3cc3c07b09206097d0d8b0aefdf07958 左侧的RESET引脚正常情况下是低电平,是高电平复位;右侧的RESET引脚正常情况下是高电平,是低电…

刷代码随想录有感(77):回溯算法——含有重复元素的全排列

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<int> tmp;vector<vector<int>> res;void backtracking(vector<int> nums, vector<int> used){if(tmp.size() nums.size()){res.push_back(tmp);return;}sort(nums.begin(),…

第十六节:带你梳理Vue2: 生命周期与钩子函数

前沿: 通过前面几节的学习&#xff0c;我们已经对vue有了初步的了解&#xff0c;大致了解了vue可以帮我们干什么&#xff0c; 那么接下来我们就来看看vue的生命周期和它常用的钩子函数, 1. 理解生命周期的含义 生命周期&#xff1a;就是一个组件从实例化创建并添加到DOM树开…

每日5题Day8 - LeetCode 36 - 40

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;36. 有效的数独 - 力扣&#xff08;LeetCode&#xff09; 题目要求我们进行判断&#xff0c;我们不需要自己填写&#xff0c;所以要一个标志位&#xff0c;来看当…

MySQL 存储过程(实验报告)

一、实验名称&#xff1a; 存储过程 二、实验日期&#xff1a; 2024 年5 月 25 日 三、实验目的&#xff1a; 掌握MySQL存储过程的创建及调用&#xff1b; 四、实验用的仪器和材料&#xff1a; 硬件&#xff1a;PC电脑一台&#xff1b; 配置&#xff1a;内存&#xff0…

外卖霸王餐返利外卖会员卡小程序开发

外卖霸王餐返利外卖会员卡小程序开发 "社交电商赋能下的外卖返利小程序"是专为商家与用户双赢而设计的创新平台。 以下是其开发方案的详细步骤&#xff1a; 一、需求梳理&#xff1a;首先&#xff0c;我们需要明确小程序的核心功能和特色。包括设定活动类型、返利…

7款好用到离谱的神级App推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 转眼间&#xff0c;2024年已经是下个月。最近有很多小伙伴的咨询&#xff0c;我也赶紧整理了7款好用的软件&#xff0c;希望对大家有所帮助。 …

Spring MVC/Web

1.Spring MVC 的介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;也是Spring框架的一部分。它提供了灵活可扩展的MVC架构&#xff0c;方便开发者构建高性能的Web应用程序&#xff0c;并与 Spring 生态系统无缝集成。 2.MVC 设计模式 MVC&#xff08;Model…

【静态分析】在springboot使用太阿(Tai-e)01

参考&#xff1a;使用太阿&#xff08;Tai-e&#xff09;进行静态代码安全分析&#xff08;spring-boot篇一&#xff09; - 先知社区 ---------------------------------------------------------------------- 由于spring-boot实现了控制反转与面向切面编程的设计思想&#x…

Ubuntu 如何根据NVIDIA显卡型号确定对应的显卡驱动版本并安装

目录 一、查询推荐安装的驱动版本 二、安装推荐版本的驱动 1. 通过终端安装&#xff0c;只安装 nvidia 驱动&#xff08;亲测可用&#xff01;&#xff09; 2. 通过 software & Updates 安装&#xff0c;安装 nvidia 驱动。 三、查询能安装的最新的显卡驱动版本 1. 方…

微信好友这样打标签更高效!

为什么要做标签管理? ① 通过标签管理&#xff0c;可以清晰的知道每个私域好友的关系程度&#xff0c;如哪些是忠诚客户&#xff0c;哪些是意向客户&#xff0c;哪些是刚加上的客户等等。 这样就知道下一步要怎么操作&#xff0c;做到精细化运营。如忠诚客户跟进维护&#x…

逍遥模拟器安装xp时报错处理

在执行script.sh&#xff0c;无法执行程序&#xff0c;报错如下&#xff1a; Mounting /system and /vendor read-write /dev/block/sda6 is read-only 尝试了很多种的方法&#xff0c;都不行 经过研究发现是逍遥模拟器的设置问题&#xff1a; 出问题时&#xff0c;磁盘共享…

VBA批量合并带有图片、表格与文本框的Word

本文介绍基于VBA语言&#xff0c;对大量含有图片、文本框与表格的Word文档加以批量自动合并&#xff0c;并在每一次合并时添加分页符的方法。 在我们之前的文章基于Python中docx与docxcompose批量合并多个Word文档文件并逐一添加分页符&#xff08;https://blog.csdn.net/zhebu…