特征选择-嵌入式选择

article/2025/11/5 12:55:51

嵌入式特征选择是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动地进行了特征选择。

嵌入式思维导图.png

基于惩罚项的特征选择法

给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x n , y n ) } D = \{(x_1, y_1), (x_2, y_2), \cdots, (x_n, y_n)\} D={(x1,y1),(x2,y2),,(xn,yn)},其中 x ∈ R d , y ∈ R x \in R^d, y \in R xRd,yR。我们考虑最简单的线性回归模型,以平方误差为损失函数,则优化目标为
m i n w ∑ i = 1 n ( y i − w T x i ) 2 min_w \sum_{i=1}^n(y_i - w^Tx_i)^2 minwi=1n(yiwTxi)2
当样本特征很多,而样本数相对较少时,上式很容易陷入过拟合。为了缓解过拟合问题,可对上式引入正则化项。

  • 使用 L2 范数正则化,则称为“岭回归”(ridge regression)。

m i n w ∑ i = 1 n ( y i − w T x i ) 2 + λ ∣ ∣ w ∣ ∣ 2 2 min_w \sum_{i=1}^n(y_i - w^Tx_i)^2 + \lambda ||w||_2^2 minwi=1n(yiwTxi)2+λw22
通过引入 L2 范数正则化,确能显著降低过拟合的风险。

  • 使用 L1 范数正则化,则称为 LASSO(Least Absolute Shrinkage and Selection Operator)。

m i n w ∑ i = 1 n ( y i − w T x i ) 2 + λ ∣ ∣ w ∣ ∣ 1 min_w \sum_{i=1}^n(y_i - w^Tx_i)^2 + \lambda ||w||_1 minwi=1n(yiwTxi)2+λw1
L1 范数和 L2 范数正则化都有助于降低过拟合风险,但 L1 范数比 L2 范数更易于获得“稀疏”(sparse)解,即它求得的 w 会有更少的非零向量。

同时使用 L1 范数和 L2 范数,即可避免过拟合,同时也实现了降维,并筛选出相应的特征。
m i n w ∑ i = 1 n ( y i − w T x i ) 2 + λ 1 ∣ ∣ w ∣ ∣ 1 + λ 2 ∣ ∣ w ∣ ∣ 2 2 min_w \sum_{i=1}^n(y_i - w^Tx_i)^2 + \lambda_1 ||w||_1 + \lambda_2||w||_2^2 minwi=1n(yiwTxi)2+λ1w1+λ2w22

那么如何通过惩罚项来进行特征选择呢?对于回归问题,我们可以直接引入 Lasso,通过 Lasso 对数据集进行训练,挑选非零向量所对应的特征。

【代码实现】:Lasso 实现特征选择。

from sklearn.linear_model import Lasso
from sklearn.datasets import load_boston# 引入数据集
dataset_boston = load_boston()
data_boston = dataset_boston.data
target_boston = dataset_boston.target# 模型训练
model_lasso = Lasso()
model_lasso.fit(data_boston, target_boston)# 获取权重向量
print(model_lasso.coef_)
# 输出
array([-0.06343729,  0.04916467, -0.        ,  0.        , -0.        ,0.9498107 ,  0.02090951, -0.66879   ,  0.26420643, -0.01521159,-0.72296636,  0.00824703, -0.76111454])

然后使用 sklearn.feature_selection.SelectFromModel 方法来从模型中挑选特征子集。

from sklearn.feature_selection import SelectFromModel
model_sfm = SelectFromModel(model_lasso, prefit=True)
print(model_sfm.transform(data_boston).shape)
# 输出
(506, 10)
print(data_boston.shape)
# 输出
(506, 13)

可以看出,SelectFromModel 方法剔除了权值向量为零的特征。

那么对于分类问题该如何使用惩罚项来进行特征选择呢?

【代码实现】:

from sklearn.linear_model import LogisticRegression# 引入数据集
dataset_iris = load_iris()
data_iris = dataset_iris.data
target_iris = dataset_iris.target# 训练模型
model_lr = LogisticRegression(penalty='l1', C=0.01)
model_lr.fit(data_iris, target_iris)
print(model_lr.coef_)
# 输出
array([[ 0.        ,  0.        , -0.18016819,  0.        ],[-0.03183986,  0.        ,  0.        ,  0.        ],[-0.00677759,  0.        ,  0.        ,  0.        ]])# 对比添加 l1 惩罚项和没有添加 l1 惩罚项的模型
model_lr2 = LogisticRegression()
model_lr2.fit(data_iris, target_iris)
print(model_lr2.coef_)
# 输出
array([[ 0.41021713,  1.46416217, -2.26003266, -1.02103509],[ 0.4275087 , -1.61211605,  0.5758173 , -1.40617325],[-1.70751526, -1.53427768,  2.47096755,  2.55537041]])model_sfm = SelectFromModel(model_lr, prefit=True)
print(model_sfm.transform(data_iris).shape)
# 输出
(150, 2)
print(data_iris.shape)
# 输出
(150, 4)

通过上述代码可以看到添加了 l1 惩罚项的逻辑回归模型能够对特征集做特征选择,并且在 SelectFromModel 方法的协助下挑选权值向量非零的特征。当然,我们也可以同时使用 l1 惩罚项和 l2 惩罚项,阅读本篇博客的各位可以自行实现。

除此之外,也可以使用 SVM 中的 LinearSVC 来实现分类问题的特征选择。

【代码实现】:

from sklearn.svm import LinearSVC# 注意:dual 设置为 False,否则会报错
model_lsvc = LinearSVC(penalty='l1', C=0.01, dual=False)
model_lsvc.fit(data_iris, target_iris)
print(model_lsvc.coef_)
array([[ 0.        ,  0.21702532, -0.28757517,  0.        ],[ 0.        , -0.09200224,  0.        ,  0.        ],[-0.02505729, -0.18225482,  0.12929954,  0.        ]])model_sfm = SelectFromModel(model_lsvc, prefit=True)
model_sfm.transform(data_iris).shape
# 输出
(150, 3)

SVM 包中的 LinearSVR 则可以实现对回归问题的特征选择。

【重要】:对于 SVM 和逻辑回归,参数 C 控制稀疏程度,C 越小,被选中的特征也越少;对于 Lasso,参数 alpha 越大,被选中的特征越少。

基于树模型的特征选择法

决策树可用于特征选择,树节点的划分特征所组成的集合就是选择出的特征子集。先演示决策树模型计算特征的重要度,然后再演示森林模型计算特征的重要度。

由于树模型即可用于分类问题,又可用于回归问题,因此数据集我们选择波士顿房价数据集以及鸢尾花数据集,先演示回归问题,后演示分类问题。

from sklearn.datasets import load_boston
from sklearn.datasets import load_iris

树模型-回归问题

树模型算法选用 CART,这样既可以处理连续型数据,也可以处理离散型数据,同时以基尼系数作为特征选择标准。

【实现代码】:

from sklearn.tree import DecisionTreeRegressordataset_boston = load_boston()
data_boston = dataset_boston.data
target_boston = dataset_boston.target
model_dtc = DecisionTreeRegressor()
model_dtc.fit(data_boston, target_boston)# 为了方便查看,我们将精度设置为 3
np.set_printoptions(precision=3)
print(model_dtc.feature_importances_)
# 输出:
array([5.070e-02, 1.071e-03, 4.064e-03, 1.090e-03, 5.009e-02, 5.758e-01,1.433e-02, 7.363e-02, 3.362e-04, 1.257e-02, 7.155e-03, 1.413e-02,1.950e-01])

我们可以使用 sklearn.feature_selection.SelectFromModel 方法来从模型中挑选特征子集。

from sklearn.feature_selection import SelectFromModelmodel_sfm = SelectFromModel(model_dtc, prefit=True)
print(model_sfm.transform(data_boston))
# 输出
array([[6.575, 4.98 ],[6.421, 9.14 ],[7.185, 4.03 ],...,[6.976, 5.64 ],[6.794, 6.48 ],[6.03 , 7.88 ]])

SelectFromModel 能够用于拟合后拥有 coef_feature_importance 属性的模型。如果特征对应的 coef_ 或 feature_importances_ 值低于设定的阈值 threshold,那么这些特征将被移除。关于 SelectFromModel 的更多介绍和用法请参考官方文档 传送门

森林模型-回归问题

常见的森林模型有随机森林模型以及极端森林模型,在此分别演示这两种模型对回归问题特征选择的作用。

【代码实现】:随机森林

from sklearn.ensemble import RandomForestRegressormodel_rfr = RandomForestRegressor(n_estimators=50)
model_rfr.fit(data_boston, target_boston)
print(model_rfr.feature_importances_)
# 输出
array([0.036, 0.001, 0.005, 0.001, 0.024, 0.396, 0.017, 0.063, 0.003,0.016, 0.016, 0.013, 0.409])model_sfm = SelectFromModel(model_rfr, prefit=True)
print(model_sfm.transform(data_boston))
# 输出
array([[6.575, 4.98 ],[6.421, 9.14 ],[7.185, 4.03 ],...,[6.976, 5.64 ],[6.794, 6.48 ],[6.03 , 7.88 ]])

【代码实现】:极端森林

from sklearn.ensemble import ExtraTreesRegressormodel_etr = ExtraTreesRegressor(n_estimators=50)
model_etr.fit(data_boston, target_boston)
print(model_etr.feature_importances_)
# 输出
array([0.034, 0.004, 0.052, 0.016, 0.039, 0.326, 0.02 , 0.029, 0.017,0.044, 0.056, 0.02 , 0.342])model_sfm = SelectFromModel(model_etr, prefit=True)
print(model_sfm.transform(data_boston))
# 输出
array([[6.575, 4.98 ],[6.421, 9.14 ],[7.185, 4.03 ],...,[6.976, 5.64 ],[6.794, 6.48 ],[6.03 , 7.88 ]])

树模型-分类问题

树模型的分类问题,处理方式与树模型的回归问题相同,区别就在于调用不同的树模型方法(从 DecisionTreeRegressor 转换为 DecisionTreeClassifier),其他操作都相同。

【代码实现】:

from sklearn.tree import DecisionTreeClassifierdataset_iris = load_iris()
data_iris = dataset_iris.data
target_iris = dataset_iris.targetmodel_dtc = DecisionTreeClassifier()
model_dtc.fit(data_iris, target_iris)
print(model_dtc.feature_importances_)
# 输出
array([0.027, 0.   , 0.051, 0.923])

森林模型-分类问题

【代码实现】:

model_etc = ExtraTreesClassifier(n_estimators=50)
model_etc.fit(data_iris, target_iris)
print(model_etc.feature_importances_
# 输出
array([0.06393643, 0.04529532, 0.39042913, 0.50033912])model_rfc = RandomForestClassifier(n_estimators=50)
model_rfc.fit(data_iris, target_iris)
print(model_rfc.feature_importances_)
# 输出
array([0.07155676, 0.01874959, 0.47878474, 0.43090891])

虽然不同模型输出的特征重要程度值不同,但特征的排序(按重要程度降序排列)是一致的。

参考

  • 《机器学习》周志华
  • 《百面机器学习》
  • 特征选择:https://blog.csdn.net/shingle_/article/details/51725054
  • 特征选择 (feature_selection):https://www.cnblogs.com/stevenlk/p/6543628.html#移除低方差的特征-removing-features-with-low-variance
  • SelectKBest:https://blog.csdn.net/weixin_33962923/article/details/87837426

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

相关文章

特征选择案例

特征降维(P443) 特征降低维度分两种方法:特征选择和特征抽取。 特征选择:选择全部特征的一个子集作为特征向量。 特征抽取:通过已有特征的组合建立一个新的特征子集。 主成分分析方法(PCA)就…

机器学习-特征选择

特征选择 1、简述特征选择的目的。 减轻维数灾难问题:特征个数越多,模型也会越复杂,其泛化能力会下降。 降低学习任务的难度: 特征个数越多,分析特征、训练模型所需的时间就越长。 特征选择能够明显的改善学习器的精…

lasso特征选择python_特征选择怎么做?这篇文章告诉你

原标题:特征选择怎么做?这篇文章告诉你 照片由 Clem Onojeghuo 发布在 Unsplash 上面 作者 | Pier Paolo Ippolito 翻译 | Skura 编辑 | 唐里 原文标题:Feature Selection Techniques 原文链接:https://towardsdatascience.com/feature-selection-techniques-1bfab5fe0784 …

python方差特征选择_特征选择-Filter过滤法(方差)

3.1 Filter过滤法 过滤方法通常用作预处理步骤,特征选择完全独立于任何机器学习算法。它是根据各种统计检验中的分数以及相关 性的各项指标来选择特征。 3.1.1 方差过滤 3.1.1.1 VarianceThreshold 这是通过特征本身的方差来筛选特征的类。比如一个特征本身的方差很小,就表示…

特征选择与特征提取

目录 一、 特征选择1、特征2、特征选择3、扩展——特征选择算法(有兴趣和精力可了解)拓展--完全搜索:拓展--启发式搜索:拓展--随机搜索:拓展--遗传算法: 二、 特征提取三、特征提取主要方法——PCA(主成分分析)1、PCA算法是如何实现的?PCA--零均值化(中心…

特征选择简述

目录 一、 特征选择的意义 二、特征选择的方法 1. 排序方法(Ranking methods) 2. 过滤方法(Filter approaches) 3.包装器方法(wrapper methods) 4.混合方法(Hybrid methods) …

特征提取与特征选择

特征抽取和特征选择是DimensionalityReduction(降维)的两种方法,针对于the curse of dimensionality(维度灾难),都可以达到降维的目的。但是这两个有所不同。 特征提取(Feature Extraction):Cre…

特征选择方法总结

问题 在数据处理中经常会遇到特征太多造成的计算负担和一些其他的影响,如过拟合等,不但使得预测结果不准确,还消耗计算时间。所以特征选择就显得非常重要了。 特征选择:从给定的特征集合中选取出相关特征子集的过程成为“特征选择…

利用sklearn进行特征选择

3种特征选择 Filter 过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。 (先对数据集进行特征选择,然后再训练学习器) Wrapper 包装法,根据目标函数&…

如何进行特征选择

如何进行特征选择 原文地址: http://blog.csdn.net/u010670689/article/details/73196546 特征选择对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、…

光谱特征选择

光谱特征选择(谱特征选择) 简介算法框架算法推导总结 Spectral feature selection可翻译为谱特征选择,之前的特征提取学习中陷入了光谱特征选择翻译的误区。 参考论文为"Spectral feature selection for supervised and unsupervised le…

模型特征选择

RF、GBDT、XGboost都可以做特征选择,属于特征选择中的嵌入式方法。比如在sklearn中,可以用属性feature_importances_去查看特征的重要度, 比如: from sklearn import ensemble#grd ensemble.GradientBoostingClassifier(n_estimators30)grd …

sklearn 数据处理与特征工程

1、数据处理的流程 2 数据预处理 Preprocessing & Impute 2.1 数据无量纲化 在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”。譬如梯度…

特征选择

一、特征选择基本问题 我们将属性称为“特征”(feature),对当前学习任务有用的属性称为“相关特征”(relevant feature)、没什么用的属性称为“无关特征”(irrelevant feature)。 从给定的特征集…

特征选择(筛选特征)

根据特征选择的形式可以将特征选择方法分为3种: Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。Wrapper:包装法,根据目标函数(通常…

机器学习 基础理论 学习笔记 (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", 上传到网站根目录.然后…