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 高,但数据不平衡时预测不佳的主要内容,如果未能解决你的问题,请参考以下文章