XGBoost 分类器未捕获极端概率

机器算法验证 机器学习 随机森林 助推 大车
2022-03-20 11:58:42

我正在使用 XGBoost 进行二元分类任务——尝试根据比赛的得分和剩余时间来预测 A 队是否会击败 B 队。我知道对于某些得分时间组合,成功的概率(A 队获胜)基本上是 0 或 1(例如,在还剩 1 分钟时上升 20 分,应该是 ~0.999)。这在经验上是正确的(在以前的比赛中),无论其他特征(团队质量、比赛节奏等)如何

问题:当我查看给定这些得分时间组合的拟合值时,输出往往在 0.03 或 0.97 左右,而不是 0.0001 或 0.9999。我尝试了很多不同的参数组合,但无法让模型输出接近 0 或 1 的值。

更多细节:

  • 我有大约 630k 的观察结果,其中大约 55% 是成功的。我也至少有数万个我认为概率应该> .99 或< .01。
  • 我弄乱的参数+我尝试过的范围:(max_depth从4到12),n_estimators(最多几百个),eta(.001到.3),min_child_weight(最多几百个),reg_lambda(1-5) , gamma(0-5), colsample_byX(0.7-1), 和subsample(0.7-1)
  • 我没有搞砸,scale_pos_weight因为我的理解是这个参数适用于不平衡的数据集。我的数据集总体上不平衡,只是在特征空间的某些地方不平衡
  • 损失函数是binary:logistic

有什么想法吗?万分感谢!

3个回答

这就是我要关注的。

  • 的限制max_depth可能会导致终端节点将具有非常小的概率的观察与概率不那么小的其他观察组合在一起,因此效果是将叶权重从极值移开。同样,与大概率观察类似的东西。尝试增加max_depth.
  • lambda惩罚权重的绝对值。您需要绝对值较大的权重,因为这些权重允许概率接近 0 和 1,因此请尝试设置lambda较小的权重。
  • 列子采样可能会省略重要功能(游戏中剩余的时间听起来很重要),所以我不会使用它。
  • 显着增加树的最大数量并使用早期停止可能会有所帮助。
  • 与这些参数一起调整学习率很重要。

由于您的问题基本上是关于概率的校准,所以要知道的是,XGBoost 因产生校准不佳的预测概率而臭名昭著。目前尚不清楚这是否是您案件的罪魁祸首;通常,较差的校准是由过于接近 0 或 1 的预测引起的,但您在这里会发现相反的结果。这就是为什么我认为您可以使用不同的超参数来缩小差距。


我想知道 XGBoost 模型是否是最好的方法,因为您的数据按时间顺序排列(剩余 60、50、... 10 分钟等)。我将研究可以解释这种时间依赖性的替代模型。

如果您将每场比赛视为一个序列,那么 A 队获胜的概率在比赛开始时应该有一个很宽的范围,然后随着时间的流逝该范围应该缩小。我不知道如何建模,但直观地说,这似乎是你正在寻找的。

如果您想要精确估计概率,请不要使用基于决策树的算法。要获得决策树的概率估计,您将计算节点中出现的类并除以节点大小。这永远不会导致描述概率的平滑函数,就像回归树不会产生函数的平滑近似一样。如果你考虑许多树,这会更平滑一点,但永远不会完美。这对于极端概率而言尤其引人注目,例如您的情况(对于预测概率为 0.001 的决策树,节点需要包含 >1000 个样本)。正如 Sycroax 所提到的,如果您关心经过良好校准的概率,那么它是一个糟糕的算法选择。

正如@Sycorax 和@BenReiniger 指出的那样,问题在于概率没有经过校准(或者没有按照您的意愿进行校准)。以下是校准 XGBoost 概率的方法。使用以下模型:

P(y|x) = 1/(1+exp(-(a+x)))

其中 x 是 XGBoost 产生的原始概率的 logit 函数:

logit = log(p/(1-p))

和 y 是您已经使用的相同结果。这是基于 van den Goorbergh 等人的论文,“风险预测模型的类别不平衡校​​正的危害:使用逻辑回归进行说明和模拟”,arXiv 2022(参见方法部分)。根据我的经验,效果很好。

您可以使用以下语句在 R 中实现这一点:

recal_mod = glm(y ~ 1, offset = logit, family = "binomial")

请注意,此模型是逻辑回归,而自变量的固定权重为 1,并且仅拟合截距。据我所知,python scikit-learn LogisticRegression() 函数不支持这种类型的模型,因此我使用 R。另请注意,它对大型数据集使用大量 RAM,因此您可能希望对数据进行下采样。

下图说明了它是如何工作的。第一张图是重新校准前的校准曲线。第二张图是使用上述模型重新校准后的校准曲线。我不知道它是否会达到您想要的校准,但值得一试

重新校准前的校准曲线 使用上述模型重新校准后的校准曲线