XGBoost 输出趋于极端

数据挖掘 机器学习 分类 xgboost 可能性 概率校准
2021-09-16 00:37:02

我目前正在使用 XGBoost 进行风险预测,它似乎在二元分类部门做得很好,但概率输出还差得很远,即在一个观察中改变一个特征的值非常小的量可以使概率输出从 0.5 跳到 0.99。

我几乎看不到 0.6-0.8 范围内的输出。在所有情况下,概率都小于 0.99 或 1。

我知道训练后校准方法,例如 Platt Scaling 和 Logistic Correction,但我想知道在 XGBoost 训练过程中是否有什么可以调整的。

我使用 FFI 从不同的语言调用 XGBoost,所以如果我可以在不引入其他校准库的情况下解决此问题,例如,将评估指标从 AUC 更改为日志损失,那就太好了。

4个回答

我要问的第一个问题是“什么是正/负比率?”。只是因为当课程非常不平衡时,我多次遇到类似的问题。如果是您的情况,您可以尝试平衡数据集或尝试使用scale_pos_weightXGboost 的参数。在 50/50 类比率的情况下,概率可能或多或少归一化。

此外,您很可能同时存在过度拟合。尝试调整学习率、采样参数和正则化参数(reg_alpha、reg_lambda)。

XGBoost 在概率上不是自然校准的。你需要使用类似的东西:

objective = "binary:logistic"

确保模型的输出可以解释为概率。否则,您可能只能获得分数,只能用于对实例进行排名。由于大多数性能指标都可以根据分数来计算,因此使用看起来像概率(与良好的性能指标相关)而不是“真实”概率是一个常见的错误。

至于模型不稳定性(这里解释变量的微小变化会大大改变预测),您需要重新检查整个校准过程:变量选择、训练/测试分区、超参数调整/交叉验证、性能使用的指标,以确保您的模型不会过拟合。

是的,随着迭代次数的增加检查对数损失分布。如果它在您的最终提升迭代之前开始上升,那么它就是过度拟合。

首先,在使用 XGBoost 和 LightGBM 等基于树的算法时,您应该确保您的数据足够大,这种突然的变化可能表明过度拟合。(至少 10,000 个样本,经验法则)

第二,你的基数如何;如果您有 3-4 个功能,则可以预期功能的更改会导致这种影响。

第三,你选择的超参数是什么?基于树的模型对参数的变化非常敏感。确保您仔细实施超参数调整。

最后,在处理二元分类时;错误指标变得非常重要。你可以做二进制日志丢失和二进制错误的组合(XGBoost允许你选择多个);还要确保通过在 XGBoost 的 train 方法中选择early_stopping_rounds = N来实现提前停止,其中 N 是迭代的选择。这样,您的算法将在损失停止减少的合理点提前停止,从而避免过度拟合。