机器学习 | 特征重要性判断

52 篇文章 6 订阅
15 篇文章 0 订阅

1 背景

在运用树模型建模的时候,常用的一个sklearn的子库就是看特征重要性,也就是feature_importances_,下面将从原理和Python代码实现两个角度来聊一聊!

2 原理

2.1 文字版

基于树的集成模型 特征的重要性是在所有单颗树上该特征重要性的一个平均值,而单颗树上特征重要性计算方法为:根据该特征进行分裂后平方损失的减少量的求和。

和同事沟通了一波,简单来说,特征重要性就是把这个变量在所有树上出现的节点数累计求和!看该特征在所有棵树上出现的次数!越多越重要!

2.2 公式版

在这里插入图片描述

2.3 面试遇到的问题

问题:单颗决策树,分裂特征会重复出现吗?
答案:分类特征不会,而数值型特征可能会。具体见下方例子:
在这里插入图片描述
可以看到age这个数值型变量出现了好几次,因为分裂一次之后还可以细分,而分类型变量则不会,因为一旦分裂之后,对应子节点的样本中该类别即为同一类别,非常纯!

3 Python实现

直接封装好了一个函数!Show the code!

def plot_feature_importances(fea_imp, title, fea, pic_name):
    # 函数作用:绘制变量重要性柱状图 显示重要性>0的变量
    # fea_imp:方法的.feature_importances_
    # title:图的标题
    # fea:所有变量的名称
    # pic_name:要保存的图片的名称
    
    # 设置字体 使中文正常显示
    import matplotlib as mpl
    font_ch = mpl.font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc')
    
    # 将重要性值标准化
    fea_imp = 100.0*(fea_imp/max(fea_imp))
    # 将得分从高到低排序
    index_sorted = np.argsort(-fea_imp) # 降序排列
    plt.figure(figsize=(16,4))

    # 统计非0的个数
    n = (fea_imp[index_sorted]>0).sum()
    print('重要性非0的变量共有 %d 个' % n)
    
    # 让X坐标轴上的标签居中显示 和n保持一致
    pos = np.arange(n)+0.5
    
    # 画图只画大于0的特征重要性部分
    plt.bar(pos, fea_imp[index_sorted][:n], align='center')
    plt.xticks(pos, np.array(fea)[index_sorted][:n], rotation=90, fontproperties = font_ch) # 转90度就可以了!
    plt.ylabel('变量重要性得分', fontproperties = font_ch)
    plt.title(title, fontproperties = font_ch)
    plt.savefig(pic_name + '.png', dpi=100, bbox_inches='tight') # bbox_inches='tight'这个参数可以解决输出图片横轴标签显示不全的问题   
    plt.show() 

其中有些函数还是用的蛮多的,总结一下:

3.1 解决mac下用jupyter绘图不显示中文的问题

两行代码轻松解决!

# 设置字体 使中文正常显示
import matplotlib as mpl
font_ch = mpl.font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc')

然后后面在绘图的时候,加上参数:fontproperties = font_ch 即可,注意要在所有地方都加!特别是有中文的地方!

3.2 一个神奇的函数:np.argsort

函数作用:返回一个numpy数组的按值进行顺序排列的对应的索引!听着是不是很拗口?举个栗子!

a = np.array([1,3,4,6,2,5])
a.argsort()

返回结果是什么呢?

array([0, 4, 1, 2, 5, 3])

这个该如何解释呢?一眼看过去,其实有点懵逼的!就会不自觉的想,诶,1和0对应有啥关系?千万不要陷入这个死胡同,而是自己先去把a这个数组进行升序排列!应该是[1,2,3,4,5,6] 然后这6个数分别对应的索引是多少呢?是不是就是[0, 4, 1, 2, 5, 3] ? 对的!没错!所以说返回的结果就是从小到大排序之后的值的对应的索引!

这样有什么好处呢? 知道了索引我就可以直接按顺序输出从小到大的数值!

那能不能降序排列呢?可以,非常简单!只要加个负号就好了!

np.argsort(-a)

输出为:

array([3, 5, 2, 1, 4, 0])

4 参考

  • https://blog.csdn.net/ictcxq/article/details/78754905
  • https://mp.weixin.qq.com/s/9SrciKW-nJJMA2BbTs5CLg
  • 5
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习中的特征重要性评估是衡量模型中每个特征对于预测结果贡献程度的过程。这有助于理解哪些特征对模型的性能影响最大,以及在优化模型时如何选择或调整这些特征。常见的特征重要性评估方法有: 1. **方差阈值(Variance Threshold)**:基于特征的方差来判断其对数据变化的敏感度,方差大的特征通常认为更重要。 2. **相关系数(Correlation Coefficient)**:计算特征与目标变量之间的线性相关性,高的正负相关性意味着特征可能有用。 3. **递归特征消除(Recursive Feature Elimination, RFE)**:通过反复训练模型并删除最不重要的特征,直到达到预定的复杂度或性能目标。 4. **随机森林(Random Forest)特征重要性**:随机森林提供了每个特征重要性得分,基于每个特征被错误分类的次数。 5. **梯度提升树(GBM)特征重要性**:GBM模型的每个决策树都会贡献特征重要性,这些加权平均就是最终的特征重要性。 6. **Lasso回归和Ridge回归的正则化系数**:正则化项可以提供特征选择的信息,系数接近于0的特征被认为是不重要的。 7. **Permutation Importance**:通过随机打乱特征值,观察模型性能的变化,打乱后的下降越大,特征越重要。 8. **SHAP 值(SHapley Additive exPlanations)**:这是一种基于游戏理论的方法,提供每个特征对预测值的精确贡献。 评估特征重要性的目的是为了提高模型的解释性和泛化能力,以及在特征工程阶段进行有效的资源分配。了解哪些特征最有价值可以帮助我们减少噪声、避免过拟合,并可能引导到更简洁、更高效的模型设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值