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



我正在尝试在一个非常不平衡的数据集上使用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 上获得了 0.994 AUC,在验证集中获得了类似的分数。

但是当我在测试集上预测时,我得到的结果非常糟糕。我相信火车组是完美的采样。

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

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

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

这里不应该是这种情况。

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

来自交叉验证的相关答案(着重号是加的(:

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

来自相关学术论文,在不平衡分类中寻找最佳分类阈值:

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

预测 结果 是 最终 确定 根据 自 预测 概率。 这 门槛 是 通常 设置 自 0.5. 如果 这 预测 概率 超过 0.5, 这 样本 是 预测 自 是 阳性; 否则 阴性。 然而 0.5 是 不 理想 为 一些 例 特别 为 不平衡 数据。

(强烈推荐的(应用预测建模博客中的帖子优化类不平衡的概率阈值也是相关的。

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


在更一般的层面上,关于阈值本身在分类过程中的作用(至少根据我的经验,许多从业者都弄错了(,还要检查交叉验证的分类概率阈值线程(和提供的链接(; 关键点:

练习的统计部分在您为新样本的每个类输出概率时结束。选择一个阈值,超过该阈值将新观测值分类为 1 与 0 不再是统计数据的一部分。它是决策组件的一部分。

最新更新