R中具有自定义重要性的Boruta特征选择(xgboost特征重要性)

数据挖掘 r 特征选择 特征提取 xgboost
2022-02-11 07:02:11

根据文档 - CRAN

Boruta 是一种所有相关的特征选择包装算法,能够与任何输出变量重要性度量 (VIM) 的分类方法一起工作;默认情况下,Boruta 使用随机森林。

资料来源:Boruta 文档

该包有一个参数getImp定义要使用的重要性,默认情况下是来自 Ranger 包的随机森林。所以理论上可以使用 xgboost 的xgb.importance()函数作为特征重要性的来源,但我找不到如何在实践中使用此类参数的示例,因为到目前为止我很不走运。是否有可能使用Boruta 包来做到这一点,或者我是否已经使用 xgboost 从头开始​​实现了 Boruta 算法?如果有可能怎么办?

1个回答

Boruta 是众所周知的狗慢而且不是很好。Boruta 运行需要数小时或数天。无论如何,VIF 特征选择算法并不客观。您可以编写自己的运行速度更快的功能选择。我在各种数据集上运行了几次 Boruta,它浪费了我 4 天的时间,结果没有定论。

这是一种快速而肮脏的非 100% 科学方法,它是从许多 Kaggle 比赛等的共识中挑选出来的。它比 Boruta 快 10-1000 倍,而且可能更准确。

  1. 运行一些快速探索树(RF/XGB),即不是很深,也不是太多的树。提取特征重要性。重复几个随机种子并查看平均或 absmax 特征重要性。
  2. 现在,丢弃非常高基数的特征(例如用户 ID、邮政编码等),因为树不会倾向于在它们上分裂,直到非常深和非常小的节点,所以最初排除它们。让我们将“非常高的基数”定义为每条记录 >= ~0.3 个不同的值,或者在更大的数据集中更少。
  3. 丢弃所有接近零的特征、零和非常低重要性的特征(< 0.02-0.05 fi 或更低是经验法则)。
  4. 测量哪些特征彼此高度相关(< 0.4)的矩阵。Corrplot 是一种很好的方式来可视化这些,并在彼此附近排列相关特征)。选择一个合理的色标。识别相关特征的子组。从这些组中任意选择一个特征(您可以稍后重新访问此选择)。或者您可以决定是否需要使用 PCA。
  5. 重新运行,你的 CV 准确率应该会提高很多,而且你的训练时间会更快(因为树训练是特征数量的二次方)。重新选择边缘低重要性或相关特征,并再次使用多个随机种子。
  6. 对于探索性,5 倍 CV 很好,但如果训练时间是一个问题,3 倍有效。10倍是不必要的。
  7. 对于剩余功能的子集,请使用“可敬”的方法。请参阅特征选择中CrossValidated上的优秀帖子。

拥有统计学博士学位的人可能会为此对我摇摆手指:)