特征选择(筛选特征)

article/2025/11/5 16:06:00

根据特征选择的形式可以将特征选择方法分为3种:

Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。


使用sklearn中的feature_selection库来进行特征选择:


Filter

一、方差选择法

使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征使用feature_selection库的VarianceThreshold类来选择特征:

(1)其特征选择原理只关心特征变量X,而不需要数据中的输出结果y,因此可以被用于无监督学习。

(2)code:

from sklearn.feature_selection import VarianceThreshold

x=data(特征数据)

y=data_1(标签)

var=VarianceThreshold(threshold=3)  #参数threshold为方差的阈值。threshold:可以有很多选择【特征中位数np.median(x.var.valuse);特征/特征均值:x/x.mean ;x.var().mean()等等】

var.fit_transform(x)#返回值为选择后的数据

var.feature_names_in_     #查看模型拟合时导入的特征名称
var.get_feature_names_out()   #查看被留下特征的字符名称
var.variances_      #每个特征对应的方差值

(3)缺点:

每个特征的方差不一,其重要程度无法准确估量,用一个特征方差去评估另一个,风险太大。

二、相关系数法

使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。使用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数

x=data (特征)

y=label(biaoqian)

SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T,k=2).fit_transform(x, y)

三、卡方检验

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(x,y)



Wrapper
 

递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
 #递归特征消除法,返回特征选择后的数据
 #参数estimator为基模型
 #参数n_features_to_select为选择的特征个数

x=data(特征)

y=label(标签)
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(x,y)



Embedded

一、基于惩罚项的特征选择法

使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:

1 from sklearn.feature_selection import SelectFromModel
2 from sklearn.linear_model import LogisticRegression
4 #带L1惩罚项的逻辑回归作为基模型的特征选择
5 SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(x,y)

L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。故,可结合L2惩罚项来优化。

使用feature_selection库的SelectFromModel类结合带L1以及L2惩罚项的逻辑回归模型,来选择特征的代码如下:

1 from sklearn.feature_selection import SelectFromModel
3 #带L1和L2惩罚项的逻辑回归作为基模型的特征选择
4 #参数threshold为权值系数之差的阈值
5 SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(x,y)

二、基于树模型的特征选择法

树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:

1 from sklearn.feature_selection import SelectFromModel
2 from sklearn.ensemble import GradientBoostingClassifier
4 #GBDT作为基模型的特征选择
5 SelectFromModel(GradientBoostingClassifier()).fit_transform(x,y)




当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,要进行降低特征矩阵维度

常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。

PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。

1 from sklearn.decomposition import PCA
3 #主成分分析法,返回降维后的数据
4 #参数n_components为主成分数目
5 PCA(n_components=2).fit_transform(x)

1 from sklearn.lda import LDA
3 #线性判别分析法,返回降维后的数据
4 #参数n_components为降维后的维数
5 LDA(n_components=2).fit_transform(x,y)


不管是数据预处理,还是特征选择,抑或降维,它们都是通过某个类的方法fit_transform完成的,fit_transform要不只带一个参数:特征矩阵,要不带两个参数:特征矩阵加目标向量。



特征筛选是指从所有特征中选出最重要的特征用于模型训练,以提高模型的准确性和泛化能力。以下是一些特征筛选方法的示例代码:

  1. 相关系数法:
import pandas as pd
import numpy as npdata = pd.read_csv('data.csv')
corr_matrix = data.corr().abs()
# 取出与目标特征相关系数大于等于0.5的特征
important_features = [col for col in corr_matrix.columns if any(corr_matrix[col] >= 0.5)]
  1. 方差选择法:
from sklearn.feature_selection import VarianceThresholddata = pd.read_csv('data.csv')
# 特征方差小于0.1的特征将被删除
selector = VarianceThreshold(threshold=0.1)
selector.fit_transform(data)
important_features = [col for i, col in enumerate(data.columns) if selector.get_support()[i]]
  1. 卡方检验:
from sklearn.feature_selection import SelectKBest, chi2data = pd.read_csv('data.csv')
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
# 选择前10个最重要的特征
selector = SelectKBest(chi2, k=10)
selector.fit_transform(X, y)
important_features = X.columns[selector.get_support()]
  1. 基于模型的特征选择:
from sklearn.ensemble import RandomForestClassifierdata = pd.read_csv('data.csv')
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
# 使用随机森林模型进行特征选择
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X, y)
important_features = X.columns[np.argsort(rf.feature_importances_)[::-1]][:10]

以上是一些特征筛选方法的示例代码,具体应该选择哪种方法取决于数据集的特点和实际情况。



补充:

20230316

特征筛选代码:

 

 


http://chatgpt.dhexx.cn/article/SyuBYHL1.shtml

相关文章

机器学习 基础理论 学习笔记 (8)特征选择(feature selection)(一)

0.说明 本文也许比较乱,请看目录再食用。 后续会 出文 机器学习 基础理论 学习笔记 (8)特征选择(feature selection)(二) 将 分类问题 和 回归问题 分开总结。 以及或将出文 机器学习 基础理…

三种常见的特征选择方法

特征选择 特征选择是特征工程里的一个重要问题,其目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。并且常能听到“数据和特征决定…

特征选择方法最全总结!

上个月扫读完《阿里云天池大赛赛题解析》[1]后,看到书中对特征选择的讲述,于是便打算借此机会,系统梳理下各种特征选择方法。如有不足,还望指正。 一、背景介绍 在处理结构型数据时,特征工程中的特征选择是很重要的一个…

运行时错误 '-2147467259 (80004005)'

运行时错误 -2147467259 (80004005)方法 getFooterColor 作用于对象 IFPLayoutRegion 时失败遇到这样的错误主要是因为在 VBA 访问布局表格时,没有启用表尾。解决方法:在布局表格设置中启用表尾。注:同样的错误和解决方法也适用于表首。

win12服务器之常见错误:运行时错误(/应用程序中的服务器错误)

阿里云解答参考&#xff1a;https://www.cnblogs.com/xrtd/p/3704532.html 原因1: 这是由于配置中 Asp.Net 程序 没有显示详细的错误信息. 解决: 您必须修改 web.config 文件 将 <customErrors mode"On"/> 设置为mode "Off", 上传到网站根目录.然后…

问题:当运行exe程序时遇到错误0000007时如何解决

这里我是需要用的一个DDS库安装程序&#xff0c;但是经过一系列安装操作后&#xff0c;最后一步验证是否成功时出现了问题&#xff1a; 点击 该exe应用程序提示&#xff1a;应用程序错误0xc000007b 给出我使用后成功了的解决方法&#xff1a; 首先下载All in One Runtimes 简…

C++编译错误与运行时错误

笔试题里经常会有这样的题目&#xff0c;让你判断运行时错误还是编译错误。在这里将它总结一下。 在调试过程中&#xff0c;运行时错误是最麻烦的问题。因为编译错误可以由编译器检查出来&#xff0c;而大多数编译器对运行时错误却无能为力。查错和纠错的工作完全由用户自己来…

下面的程序运行时哪里会出现错误

1、下面的程序运行时哪里会出现错误&#xff1a;struct S { int i; int * p; }; int main() { S s; int * p &s.i; p[0] 4; p[1] 3; s.p p; s.p[1] 1; s.p[0] 2; return 0; } 【题目解析】 这道题考的是对结构体内存使用情况的理解。在32位的操作系统中&#xff0c;i…

Word粘贴文字时遇到报错:运行时错误‘53’:文件未找到:mathpage.WLL 解决方案

Word粘贴文字时遇到报错&#xff1a; 运行时错误‘53’&#xff1a; 文件未找到&#xff1a;mathpage.WLL 问题&#xff1a; 每次装完MathType后&#xff0c;在word里面进行粘贴操作时&#xff0c;总是出现“运行时错误‘53’&#xff1a;文件未找到&#xff1a;MathPage.WLL…

MathType 运行时错误‘53’:文件未找到:MathPage.WLL

问题描述 环境 MathType7.4Microsoft Office 365Windows 11 问题 情景1. Microsoft Word 启动时显示 Please reload Word to load MathType addin properly 情景2. 安装MathType后在 Microsoft Word 中使用复制粘贴时报错 运行时错误‘53’ 情景3. 在 Microsoft Word 中使…

JAVA的编译时错误和运行时错误

1. 要区分编译时错误和运行时错误&#xff0c;就应该先明白什么是编译&#xff1f;什么是运行&#xff1f; 首先&#xff0c;先看一下这张图&#xff1a; 编译期就是将我们写的java源代码交给编译器执行的过程&#xff0c;起翻译的作用&#xff0c;该过程主要对java源代码的…

【Word】MathType 运行时错误‘53’:文件未找到:MathPage.WLL

问题描述 1. 环境&#xff1a; MathType7.4Microsoft Office 365Windows 11 2. 问题 情景1. Microsoft Word 启动时显示 Please reload Word to load MathType addin properly 情景2. 安装MathType后在 Microsoft Word 中使用复制粘贴时报错 运行时错误‘53’ 情景3. 在 M…

运行程序报错怎么办?

Dev c中常见的报错有几种 一. ld return 1 exit status 这种报错是最常见的&#xff0c;下面是可能的原因 1.库函数拼写错误。如&#xff1a;printf&#xff0c;scanf,等 2.定义的函数名在调用时&#xff0c;函数名拼写错误&#xff08;这个主要自定义函数啊啥的可能比较多…

java clh队列_J.U.C|同步队列(CLH)

一、写在前面 在上篇我们聊到AQS的原理&#xff0c;具体参见《J.U.C|AQS原理》。 这篇我们来给大家聊聊AQS中核心同步队列(CLH)。 二、什么是同步队列(CLH) 同步队列 一个FIFO双向队列&#xff0c;队列中每个节点等待前驱节点释放共享状态(锁)被唤醒就可以了。 AQS如何使用它&a…

Java CLH队列

一、SMP和NUMA简要介绍 1.1 SMP SMP&#xff08;Symmetric MultiProcessing&#xff09;对称多处理是一种包括软硬件的多核计算机架构&#xff0c;会有两个或以上的相同的核心共享一块主存&#xff0c;这些核心在操作系统中地位相同&#xff0c;可以访问所有I/O设备。它的优点…

AQS-CLH同步队列

1:什么是同步队列&#xff08;CLH&#xff09; 同步队列 一个FIFO双向队列&#xff0c;队列中每个节点等待前驱节点释放共享状态&#xff08;锁&#xff09;被唤醒就可以了。 AQS如何使用它&#xff1f; AQS依赖它来完成同步状态的管理&#xff0c;当前线程如果获取同步状态…

java clh_【死磕Java并发】-J.U.C之AQS:CLH同步队列 - Java 技术驿站-Java 技术驿站

在上篇博客【死磕Java并发】-----J.U.C之AQS&#xff1a;AQS简介中提到了AQS内部维护着一个FIFO队列&#xff0c;该队列就是CLH同步队列。 CLH同步队列是一个FIFO双向队列&#xff0c;AQS依赖它来完成同步状态的管理&#xff0c;当前线程如果获取同步状态失败时&#xff0c;AQS…

J.U.C之AQS:CLH同步队列

此篇博客所有源码均来自JDK 1.8 在上篇博客中提到了AQS内部维护着一个FIFO队列&#xff0c;该队列就是CLH同步队列。 CLH同步队列是一个FIFO双向队列&#xff0c;AQS依赖它来完成同步状态的管理&#xff0c;当前线程如果获取同步状态失败时&#xff0c;AQS则会将当前线程已经等…

CLH Lock 原理

背景 SMP(Symmetric Multi-Processor) 对称多处理器结构&#xff0c;它是相对非对称多处理技术而言的、应用十分广泛的并行技术。在这种架构中&#xff0c;一台计算机由多个CPU组成&#xff0c;并共享内存和其他资源&#xff0c;所有的CPU都可以平等地访问内存、I/O和外部中断…

AQS: CLH 介绍

AQS内部维护着一个FIFO队列&#xff0c;该队列就是CLH同步队列。 CLH同步队列是一个FIFO双向队列&#xff0c;AQS依赖它来完成同步状态的管理&#xff0c;当前线程如果获取同步状态失败时&#xff0c;AQS则会将当前线程已经等待状态等信息构造成一个节点&#xff08;Node&…