3(3).特征选择---嵌入法(特征重要性评估)

一、正则化

1.L1/Lasso

  L1正则方法具有稀疏解的特性,因此天然具备特征选择的特性,但是要注意,L1没有选到的特征不代表不重要,原因是两个具有高相关性的特征可能只保留了一个,如果要确定哪个特征重要应再通过L2正则方法交叉检验。

举例:下面的例子在波士顿房价数据上运行了Lasso,其中参数alpha是通过grid search进行优化

  可以看到,很多特征的系数都是0。如果继续增加alpha的值,得到的模型就会越来越稀疏,即越来越多的特征系数会变成0。然而,L1正则化像非正则化线性模型一样也是不稳定的,如果特征集合中具有相关联的特征,当数据发生细微变化时也有可能导致很大的模型差异。

  

2.L2/Ridge

举例:

  

二、基于树模型的特征重要性

1.RF

 

 

2.ExtraTree

 

 

3.Adaboost

 

 

4.GBDT

 

 

5.XGboost

xgboost的基学习器可以是gbtree也可以是gbliner。当基学习器是gbtree时,可以计算特征重要性; 在基础的xgboost模块中,计算特征重要性调用get_score() 在xgboost的sklearn API中,计算特征重要性调用feature_importance_; feature_importance_依然派生于get_score()。xgboost实现中Booster类get_score方法输出特征重要性,其中importance_type参数支持5种特征重要性的计算方法:
1
get_score(fmap='', importance_type='weight')

fmap是一个包含特征名称映射关系的txt文档; importance_type指importance的计算类型;可取值有5个:

1
2
3
4
5
‘weight’: the number of times a feature is used to split the data across all trees.
‘gain’: the average gain across all splits the feature is used in.
‘cover’: the average coverage across all splits the feature is used in.
‘total_gain’: the total gain across all splits the feature is used in.
‘total_cover’: the total coverage across all splits the feature is used in.

[1]importance_type=weight(默认值),某特征在所有树中作为划分属性的次数(某特征在整个树群节点中出现的次数,出现越多,价值就越高)

[2]importance_type=gain,某特征在作为划分属性时loss平均的降低量(某特征在整个树群作为分裂节点的信息增益之和再除以某特征出现的频次)

[3]importance_type=cover,某特征在作为划分属性时对样本的覆盖度(某特征节点样本的二阶导数和再除以某特征出现总频次)

[4]importance_type=total_gain,同gain,average_over_splits=False,这里total_gain就是除以出现次数的gain

[5]importance_type=total_cover,同cover,average_over_splits=False,这里total_cover就是除以出现次数的gain

从构造函数中发现,xgboost sklearn API在计算特征重要性的时候默认importance_type="gain",而原始的get_score方法默认importance_type="weight"

1
2
3
4
5
6
7
8
def __init__(self, max_depth=3, learning_rate=0.1, n_estimators=100,
                 verbosity=1, silent=None, objective="reg:linear", booster='gbtree',
                 n_jobs=1, nthread=None, gamma=0, min_child_weight=1,
                 max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1,
                 colsample_bynode=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1,
                 base_score=0.5, random_state=0, seed=None, missing=None,
                 # 在这一步进行了声明
                 importance_type="gain", **kwargs):

  

 

6.LightGBM

 

 

 7.RF、Xgboost、ExtraTree每个选出topk特征,再进行融合

 

  

 

 

 

 

 

参考文献:

【1】树模型特征重要性评估方法

【2】用xgboost模型对特征重要性进行排序

【3】xgboost特征重要性源代码

【4】机器学习的特征重要性究竟是怎么算的(知乎)

【5】特征工程

 

posted @   nxf_rabbit75  阅读(2442)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
一、正则化1.L1/Lasso2.L2/Ridge二、基于树模型的特征重要性1.RF2.ExtraTree3.Adaboost4.GBDT5.XGboost6.LightGBM 7.RF、Xgboost、ExtraTree每个选出topk特征,再进行融合
点击右上角即可分享
微信分享提示