AUC 高,但数据不平衡时预测不佳

Posted

技术标签:

【中文标题】AUC 高,但数据不平衡时预测不佳【英文标题】:High AUC but bad predictions with imbalanced data 【发布时间】:2018-12-13 21:45:34 【问题描述】:

我正在尝试在非常不平衡的数据集上使用 LightGBM 构建分类器。不平衡在比率97:3,即:

Class

0    0.970691
1    0.029309

我使用的参数和训练代码如下所示。

lgb_params = 
        'boosting_type': 'gbdt',
        'objective': 'binary',
        'metric':'auc',
        'learning_rate': 0.1,
        'is_unbalance': 'true',  #because training data is unbalance (replaced with scale_pos_weight)
        'num_leaves': 31,  # we should let it be smaller than 2^(max_depth)
        'max_depth': 6, # -1 means no limit
        'subsample' : 0.78
    

# Cross-validate
cv_results = lgb.cv(lgb_params, dtrain, num_boost_round=1500, nfold=10, 
                    verbose_eval=10, early_stopping_rounds=40)

nround = cv_results['auc-mean'].index(np.max(cv_results['auc-mean']))
print(nround)

model = lgb.train(lgb_params, dtrain, num_boost_round=nround)


preds = model.predict(test_feats)

preds = [1 if x >= 0.5 else 0 for x in preds]

我运行 CV 以获得最佳模型和最佳回合。我在 CV 上得到了 0.994 AUC,在验证集中得到了相似的分数。

但是当我在测试集上进行预测时,我得到了非常糟糕的结果。我确信训练集被完美地采样了。

需要调整哪些参数。?问题的原因是什么。?我应该重新采样数据集以减少最高类别吗?

【问题讨论】:

您用于预测的确切代码是什么? 我现在将更新问题以显示代码 请包括您的数据和预测的(短)样本,以及与类不平衡相关的任何信息 【参考方案1】:

问题在于,尽管您的数据集中存在极端的类不平衡,但在决定最终的硬分类时,您仍然使用“默认”阈值 0.5

preds = [1 if x >= 0.5 else 0 for x in preds]

这里应该不是

这是一个相当大的话题,我强烈建议你自己研究(尝试谷歌搜索阈值截断概率不平衡数据),但这里有一些让你开始的指针......

来自Cross Validated 的相关答案(已添加重点):

不要忘记,您应该智能地设置阈值以进行预测。当模型概率大于 0.5 时,预测 1 并不总是最好的。另一个阈值可能会更好。为此,您应该查看分类器的接收器操作特征 (ROC) 曲线,而不仅仅是使用默认概率阈值预测成功。

来自相关学术论文,Finding the Best Classification Threshold in Imbalanced Classification:

2.2.如何设置测试集的分类阈值

预测 结果 是 最终 决定 根据 到 预言 概率。 这 临界点 是 通常 放 到 0.5。 如果 这 预言 可能性 超过 0.5, 这 样本 是 预料到的 到 是 积极的; 否则, 消极的。 然而, 0.5 是 不是 理想的 为了 一些 案例, 特别 为了 不平衡 数据集。

(强烈推荐)Applied Predictive Modeling 博客中的 Optimizing Probability Thresholds for Class Imbalances 帖子也与此相关。

从以上所有内容中吸取教训:AUC 很少足够,但 ROC 曲线 本身通常是您最好的朋友...


关于阈值本身在分类过程中的作用(至少根据我的经验,许多从业者会出错),请查看 Cross 的 Classification probability threshold 线程(以及提供的链接)。已验证;重点:

当您为新样本的每个类别输出一个概率时,您的练习的统计部分就结束了。选择一个阈值,将新观察分类为 1 与 0 的阈值不再是 统计数据 的一部分。它是 decision 组件的一部分。

【讨论】:

感谢您的详细回答。我会检查那些资源。我之前也尝试过不同的阈值,但预测并不那么好。 @SreeramTP 当然,按照定义,97:3 的不平衡几乎是一个棘手的问题,不适合简单或直接的解决方案。但可以说你现在学到了一些新东西,即阈值本身的选择是一个问题...... 是的,我有。我正在探索 XGboost 在这些数据上的可能性。它在 CV 和相同的验证集上产生相似的 AUC。即使我将阈值保持在0.5,测试预测也比lgb 预测要好得多 @SreeramTP 是的,分类器性能本身是一个与阈值选择正交的问题(即,从更准确的预测开始总是更好)

以上是关于AUC 高,但数据不平衡时预测不佳的主要内容,如果未能解决你的问题,请参考以下文章

调整命中后的预测概率

横截面模型拟合优度过高的原因

如何在不平衡的数据中解释具有中等精度和召回率的高 AUC-ROC?

回归树表现不佳

auc计算方法总结

AUC与ROC