随机森林明显优于 XGBoost - 问题还是可能?

数据挖掘 机器学习 r 随机森林 xgboost 阶级失衡
2021-09-29 04:36:14

我有13 个变量(数字和分类特征的混合)的大约18 万个观测值的数据集。这是二元分类问题,但类不平衡(负类为 25:1)。我想部署 XGBoost(在 R 中)并达到最好的 Precision & Recall。为了处理不平衡,我尝试了正类的上采样,以及正类的 XGB 高权重。然而,尽管 Recall 相当高,但Precision 却很差(大约 0.10)。

我为 XGB 调整的参数:

  • 随机搜索参数 - 10 次交互

    5倍简历

参数间隔:max_depth = 3-10 lambda = 0 - 50 gamma = 0 -10 min_child_weight = 1 -10 eta = 0.01-0.20

然后,我尝试了带有上采样数据集的随机森林,它Recall 0.88 和Precision 0.73(在测试数据集上)的表现非常出色。

有人可以告诉我,如果 RF 有可能远远优于 XGB,或者这表明我做错了什么?非常感谢你。

1个回答

随机森林中有两个重要的东西:“装袋”和“随机”。从广义上讲:bagging 意味着一次只使用一部分“行”(请参阅此处的详细信息),而“随机”意味着只有一小部分“列”(特征,通常默认情况下)用于进行单个拆分。这也有助于让看似“弱”的特征在预测中有发言权,或者避免模型中少数特征占主导地位(从而避免过度拟合)。

查看您的 XGB 参数,我注意到您没有对行和列进行二次采样,这可以通过使用参数 colsample_bytreesubsample. 你也可以scale_pos_weight用来解决不平衡的类。如果您的数据中有一些主要特征或观察结果,则对列和行进行子集化可能会很有用。我怀疑使用二次采样(这将是“随机梯度提升”),XGB 结果会改善并且“更接近”使用随机森林获得的结果。

还要确保你有足够的提升轮次(以获得良好的学习进度)。你可以添加一个watchlist和一个early_stopping_rounds标准来停止提升,以防没有更多的进展。在这种情况下,您将设置nrounds为“高”数字并停止提升,以防在执行此通用代码early_stopping_rounds中的步骤后没有更多的学习进展