Kaggle竞赛技巧集合(其三)——Boruta:最稳定的重要特征筛选算法

引言

打Kaggle比赛的时候,最重要的步骤就是进行特征工程,筛选出有用特征,已有的一些算法,比如随机森林/xgboost/lightgbm等,能在模型构建过程中自动计算出特征重要性。但它并不具有统计学意义:高基数特征/连续性特征的重要性会天生的高于离散性特征。因此,仅凭ACS得分不足以识别出对模型预测有实际贡献的特征。

目前已经有很多基于统计学的特征重要性计算方法,包括简单的置换重要性测试(Permutation Importance, Perm),还有Boruta、递归相关变量重要性(recurrent relative variable importance, r2VIM)和Vita等。

根据已有的综述论文给出的结论:

在上述算法中,Boruta和Vita算法在处理高维数据时稳定性最强。这表明它们特别适合于分析那些变量众多的复杂数据集。尽管Vita在计算速度上明显快于Boruta,使其更适合处理大型数据集,但Boruta算法也有其独到之处,特别是它还能适用于那些特征相对较少的低维数据环境。

核心思想

既然已经有这么多特征筛选算法,为什么还需要Boruta呢?

Boruta与已有方法在进行特征选择时的目标导向是有区别的:

  • Boruta进行特征选择的目标是: 筛选出所有与因变量具有相关性的特征集合
  • 通常意义上在机器学习实践过程中进行特征选择的目标是: 筛选出可以使得当前模型loss function最小的特征集合。

通常我们进行特征选择的时候基于如下2个规则:

  1. 如果删掉某维特征后重新训练模型,导致模型性能下降,则认为该特征很重要;
  2. 如果删掉某维特征后重新训练模型,模型性能没有变化,则认为该特征不重要;

而问题就出在第二条规则上了,去除特征后模型性能不变,只能说明该特征不会使得loss减小,但该特征仍有可能是和数据标签高度相关的!Boruta算法的意义在于可以帮助我们更全面的寻找因变量的影响因素。

Boruta算法流程

Boruta算法可以识别所有对分类或回归有显著贡献的变量。其核心思想是统计比较数据中真实存在的特征变量与随机加入的变量(也称为影子变量)的重要性。

  1. 初次建模时,把原始变量拷贝一份作为影子变量。
  2. 原始变量的值随机化后作为对应影子变量的值 (随机化就是打乱原始变量值的顺序)。
  3. 将两份变量拼接在一起,使用随机森林建模并计算每个变量的重要性得分。
  4. 对于每一个真实特征变量,统计检验其与所有影子变量的重要性最大值的差别。即计算真实特征和影子特征的 <math xmlns="http://www.w3.org/1998/Math/MathML"> Z s c o r e Z_{score} </math>Zscore。
  5. 计算影子特征中 <math xmlns="http://www.w3.org/1998/Math/MathML"> Z s c o r e Z_{score} </math>Zscore的最大值记为 <math xmlns="http://www.w3.org/1998/Math/MathML"> Z m a x Z_{max} </math>Zmax,将 <math xmlns="http://www.w3.org/1998/Math/MathML"> Z s c o r e Z_{score} </math>Zscore 高于 <math xmlns="http://www.w3.org/1998/Math/MathML"> Z m a x Z_{max} </math>Zmax 的真实特征变量定义为 重要 。 <math xmlns="http://www.w3.org/1998/Math/MathML"> Z s c o r e Z_{score} </math>Zscore 低于 <math xmlns="http://www.w3.org/1998/Math/MathML"> Z m a x Z_{max} </math>Zmax 的真实特征变量定义为 不重要
  6. 删除所有不重要的变量和影子变量。
  7. 将剩余变量构成的数据集再次重复刚才的建模和选择过程,直到所有变量都被分类为 重要不重要 ,或达到预先设置的迭代次数。

重要性识别部分的python代码如下所示:

python 复制代码
def get_important_features(X, y):# Initiliaze Random Forest CLassifier
rf = RandomForestClassifier(max_depth=20)# Fit Random Forest on provided data
rf.fit(X,y)# Create dictionary of feature importances
importances = {feature_name: f_importance for feature_name, f_importance in zip(X.columns, rf.feature_importances_)}# Isolate importances of Shadow features
only_shadow_feat_importance = {key:value for key,value in importances.items() if "shadow" in key}# get importance level of most important shadow feature
highest_shadow_feature = list(dict(sorted(only_shadow_feat_importance.items(), key=lambda item: item[1], reverse=True)).values())[0]# get original feature which fulfill boruta selection criteria
selected_features = [key for key, value in importances.items() if value > highest_shadow_feature]return selected_features

优点

  1. 同时适用于分类问题和回归问题
  2. 考虑多个变量的关系信息
  3. 会输出所有与模型性能相关的变量,而不是只返回一个最小变量集合
  4. 可以识别出变量的相互作用
  5. 可以规避随机森林自身计算变量重要性的随机波动性问题和不能计算显著性的问题
相关推荐
罗小罗同学29 分钟前
医工交叉入门书籍分享:Transformer模型在机器学习领域的应用|个人观点·24-11-22
深度学习·机器学习·transformer
孤独且没人爱的纸鹤32 分钟前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
羊小猪~~36 分钟前
tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
人工智能·python·深度学习·机器学习·cnn·tensorflow·neo4j
长风清留扬1 小时前
一篇文章了解何为 “大数据治理“ 理论与实践
大数据·数据库·面试·数据治理
不去幼儿园2 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
无脑敲代码,bug漫天飞3 小时前
COR 损失函数
人工智能·机器学习
HPC_fac130520678164 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
老艾的AI世界12 小时前
AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
人工智能·深度学习·神经网络·机器学习·ai·ai翻唱·ai唱歌·ai歌曲
DK2215112 小时前
机器学习系列----关联分析
人工智能·机器学习
周三有雨13 小时前
【面试题系列Vue07】Vuex是什么?使用Vuex的好处有哪些?
前端·vue.js·面试·typescript