高AUC,但在不平衡数据下预测表现差

10

我正在尝试使用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]

我进行了交叉验证以获取最佳模型和最佳轮次。我在交叉验证中获得了0.994的AUC分数,并在验证集中获得了类似的分数。

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

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


你用于预测的确切代码是什么? - desertnaut
我将更新问题以展示代码。 - Sreeram TP
请翻译以下与程序相关的内容从英文到中文。只返回已翻译的文本:请同时包含您的数据和预测的(简短)示例,以及与班级不平衡相关的任何信息。 - desertnaut
1个回答

11

问题在于,尽管您的数据集存在极端的类别不平衡,但在决定最终的硬分类时,您仍在使用“默认”阈值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之间的阈值不再是统计学的一部分。它是决策的一部分。


谢谢您详细的回答。我会查看这些资源。我之前也尝试过不同的阈值,但预测结果并不是很好。 - Sreeram TP
1
@SreeramTP 当然,97:3的不平衡几乎可以定义为一个棘手的问题,不容易或直接解决。但可以说你现在已经学到了一些新东西,即阈值本身的选择是一个问题... - desertnaut
是的,我有。我正在探索在这个数据上使用XGboost的可能性。它在交叉验证和相同的验证集上产生类似的AUC。即使我将阈值保持在0.5,测试预测结果也比“lgb”预测结果好得多。 - Sreeram TP
@SreeramTP 是的,分类器性能本身是与阈值选择无关的问题(即从更准确的预测开始总是更好)。 - desertnaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接