竞赛知识点:Null Importances

介绍

Null Importances是竞赛中比较靠谱的特征筛选方法,且在多个Kaggle结构化比赛中被验证过。

特征筛选从原始特征空间筛选部分特征,具体筛选方法可以分为:

  • 过滤法;

  • 包装法;

  • 嵌入法;

过滤法思路使用相关统计值来计算特征有效性,然后完成筛选;包装法使用特征带来的精度增益来衡量;嵌入法使用特征在模型内部权重来衡量重要性。

在竞赛中一般使用包装法来筛选特征,但单纯追求精度收益非常容易过拟合,导致线上和线下不一致。

原理

使用包装法嵌入法筛选特征,容易筛选得到有较高CV(验证集)精度,但导致分布一致的特征。

  • CV精度增加,线上不一定有提高;

  • 树模型重要性高,不一定有效的;

举一个例子:样本标签和ID两列,两列是一一对应,如果将ID列加入训练,CV精度可能不会增加,但ID在树模型特征重要性会很高。

Null Importances的出发点也是如此,特征重要性只反映特征的信息增益或使用次数,但并不能说明特征一定有效。

步骤

Null Importances思路如下:

步骤1:将原有特征和标签使用树模型训练,得到每个特征原始重要性A

步骤2:将数据的标签打乱,特征不变再此训练,记录下打散后的每个特征重要性B,将此步骤重复N次;

步骤3:将步骤1中特征步骤2两个特征重要性进行比较。

  • A远大于B,则特征为有效特征;

  • A小于等于B,则特征为无效特征;

步骤2重复N是为了看标签打散后的特征重要性分布,AB的分布比较,会更加清晰。

Null Importances是借助了嵌入法的重要性计算过程,然后使用重要性变化来完成衡量过程。如下图所示,使用LightGBM模型来完成上述操作。红色为原始重要性A,蓝色为打乱后的重要性。

每一行对应一个特征,左边特征使用次数,右边为特征信息增益。

25593a4a87193ac215ce596a691224fc.png
无效特征
8398bf892831c681a1e5aeb4c0eeea4b.png
有效特征

参考资料

  • https://academic.oup.com/bioinformatics/article/26/10/1340/193348

  • https://www.kaggle.com/ogrellier/feature-selection-with-null-importances

 
 

c23948b3f962c288f7852275f1492987.jpeg

 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常是由于选中的特征名称和特征重要性的数量不致所引起的。请确保创建 `feature_importances_df` 数据帧时,选中的特征名称和特征重要性具有相同的长度。 以下是一个修正后的示例代码: ```python import pandas as pd import numpy as np from sklearn.ensemble import RandomForestClassifier from sklearn.feature_selection import SelectFromModel import matplotlib.pyplot as plt # 1. 加载数据集 data = pd.read_csv('genotype_dataset.csv') X = data.iloc[:, 1:] # 特征 y = data.iloc[:, 0] # 标签 # 2. 数据预处理(如果有需要) # 3. 特征选择 rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X, y) feature_importances = rf.feature_importances_ selector = SelectFromModel(rf, threshold='median', prefit=True) X_selected = selector.transform(X) selected_features = X.columns[selector.get_support()] # 4. 输出结果为CSV文件(候选特征) selected_data = pd.concat([y, pd.DataFrame(X_selected, columns=selected_features)], axis=1) selected_data.to_csv('selected_features.csv', index=False) # 5. 输出排名前50的特征为CSV文件 feature_importances_df = pd.DataFrame({'Feature': selected_features, 'Importance': feature_importances}) top_50_features = feature_importances_df.nlargest(50, 'Importance') top_50_features.to_csv('top_50_features.csv', index=False) # 6. 绘制特征重要性图表 plt.bar(feature_importances_df['Feature'], feature_importances_df['Importance']) plt.xticks(rotation=90) plt.xlabel('Feature') plt.ylabel('Importance') plt.title('Feature Importance') plt.show() ``` 在修正后的代码中,我将 `selected_features` 和 `feature_importances` 作为字典传递给 `pd.DataFrame`,以确保它们具有相同的长度。另外,我还添加了一个特征重要性的图表绘制部分。请确保你的数据集中的特征名称与代码中的特征名称一致,并确保已安装所需的Python库(如pandas、numpy、sklearn和matplotlib)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值