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

文章目录

      • 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.mzph.cn/news/841209.shtml

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

相关文章

MTK下载AP

只升级选Firemare Upgrade ,点下载后,关机下插入USB

无人机反制:光电干扰一体设备技术详解

一、光电干扰技术原理 光电干扰技术是一种利用光学和电子技术手段对无人机实施干扰和控制的先进技术。该技术通过向无人机发射特定频率和强度的光信号或电磁信号,干扰无人机的视觉系统、控制系统或通信链路,进而达到反制无人机的目的。光电干扰技术具有…

N进制计数器【01】

N进制计数器 前面介绍过二进制计数器和十进制计数器,但是在很多时候需要到其他进制的计数器,我们把这些任意进制的计数器简称为 N 进制计数器 设计 N 进制计数器的方法有两种: 用时钟触发器和门电路设计(前面常用的方法&#xf…

垃圾回收机制及算法

文章目录 概要对象存活判断引用计数算法可达性分析算法对象是否存活各种引用 垃圾收集算法分代收集理论复制算法标记清除算法标记-整理算法 概要 垃圾收集(Garbage Collection, 下文简称GC),其优缺点如下: 优点&#…

Nature Communications | 柔性半导体器件的大规模集成(柔性半导体器件/柔性电子)

韩国中央大学Sung Kyu Park、 韩国成均馆大学Jong-Woong Kim和Yong-Hoon Kim团队,在《Nature Communications》上发布了一篇题为“Full integration of highly stretchable inorganic transistors and circuits within molecular-tailored elastic substrates on a large scal…

OZONBIGSELL分析产品工具,OZON平台数据分析

在当今的数字化时代,电商平台的竞争日趋激烈,数据成为了企业决策的重要支撑。OZON作为俄罗斯领先的电商平台,其背后蕴含的海量数据对于卖家而言,既是挑战也是机遇。接下来看看OZONBIGSELL这一分析产品工具,以及如何利用…

等保2.0看这一篇就够了

一、等级保护介绍 1.1什么是等级保护 网络安全等级保护是指对国家重要信息、法人和其他组织及公民的专有信息以及信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统中发生的信息安…

ROS | C++和python实现发布结点和订阅结点

发布者结点: 代码实现: python: C: C和Python发布结点的差异: python: 发布结点pub 大管家rospy调用publisher函数发布话题 (话题,类型,话题长度) C: 先定义一个大管家:NodeHandle 然后大管家发布话题…

C# NetworkStream 流的详解与示例

文章目录 一、NetworkStream类的基本概念1.1 NetworkStream类概述1.2 NetworkStream类属性1.3 NetworkStream类方法 二、NetworkStream的连接方式三、NetworkStream的传输模式四、NetworkStream类示例服务器端代码:客户端代码: 五、总结 在C#中&#xff…

VS Code添加高亮缩进功能

当代码缩进层次较多时,为了视觉上容易识别,一般希望可以多个缩进以不同颜色进行高亮显示, VS Code 中 indent-rainbow 插件可以实现这个功能。

python列表生成式的魅力:轻松创建新列表

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 1. 列表生成式的基本结构 2. 列表生成式的进阶应用 3. 结合其他结构使用列表生成式 1. 列表…

HTML静态网页成品作业(HTML+CSS)——利物浦足球俱乐部介绍网页设计制作(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,共有5个页面。 二、作品演示 三、代码目录 四、网站代码 HTML部分代…

校园招新之获取进QQ群但未报名人员

校园的社团、实验室招新一般由是校领导会发一个QQ通知,让各个班的同学们进一个招新群。 群里面会有负责人提示大家报名,但是群成员不总是都会报名,我们需要的就是,找到那些,已经进群,但是没有报名的同学&am…

ELK 日志监控平台(一)- 快速搭建

文章目录 ELK 日志监控平台(一)- 快速搭建1.ELK 简介2.Elasticsearch安装部署3.Logstash安装部署4.Kibana安装部署5.日志收集DEMO5.1.创建SpringBoot应用依赖导入日志配置文件 logback.xml启动类目录结构启动项目 5.2.创建Logstash配置文件5.3.重新启动L…

当HR问你是否单身时,该怎么回答?

知识星球(星球名:芯片制造与封测技术社区,星球号:63559049)里的学员问:我是晶圆厂厂务工程师,最近在面试新工作,但是几乎每家HR都会问我同一个问题:你结婚没有&#xff1…

解密Spring Boot Starter与自动配置:探秘神奇的背后

starter可以理解为Spring Boot中的一站式集成启动器,包含了一系列可以集成到应用中的依赖项,可以快递集成spring组件及其框架,而不需要到处找示例代码。 一、为什么要用starter? 在springboot还没有出来之前,我们使用…

wps使用(解决毕业论文)

目录自动生成 页码自动生成 一部分使用I II III IV 格式,一部分使用1,2,3,4 格式 先设置全部文章为I II III IV 格式,然后再需要的地方再设置1,2,3,4 格式 一键设置中文、英文、数…

2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享

B 题:大学生平衡膳食食谱的优化设计及评价 1 数据预处理2 问题一2.1 问题1.12.1.1 评价体系的构建2.1.2 指标计算2.1.3 指标计算结果2.1.4 基于层次分析法的膳食营养评价模型2.1.5 评价模型的求解 2.2 问题1.22.2.1 食物与成分间拓扑关系的构建2.2.2 微调模型的建立…

【SpringBoot】整合百度文字识别

流程图 一、前期准备 1.1 打开百度智能云官网找到管理中心创建应用 全选文字识别 1.2 保存好AppId、API Key和Secret Key 1.3 找到通用场景文字识别,立即使用 1.4 根据自己需要,选择要开通的项目 二、代码编写 以通用文字识别(高精度版&am…

蚁小二:又一款高效自媒体工具,免费用户可发5个账号

其实自媒体的群发工具有几个,除了前几天介绍的融媒宝还有蚁小二等。因为融媒宝免费用户只能添加5个账号,所以不够用的朋友可以再下载蚁小二使用,这样就有10个账号可以发布了: 蚁小二简介 蚁小二是由长沙草儿绽放科技有限公司自主…