【问题标题】:Why roc_auc produces weird results in sklearn?为什么 roc_auc 在 sklearn 中会产生奇怪的结果?
【发布时间】:2020-07-11 00:50:09
【问题描述】:

我有一个二进制分类问题,我使用以下代码来获取我的weighted avarege precisionweighted avarege recallweighted avarege f-measureroc_auc

df = pd.read_csv(input_path+input_file)

X = df[features]
y = df[["gold_standard"]]

clf = RandomForestClassifier(random_state = 42, class_weight="balanced")
k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
scores = cross_validate(clf, X, y, cv=k_fold, scoring = ('accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc'))

print("accuracy")
print(np.mean(scores['test_accuracy'].tolist()))
print("precision_weighted")
print(np.mean(scores['test_precision_weighted'].tolist()))
print("recall_weighted")
print(np.mean(scores['test_recall_weighted'].tolist()))
print("f1_weighted")
print(np.mean(scores['test_f1_weighted'].tolist()))
print("roc_auc")
print(np.mean(scores['test_roc_auc'].tolist()))

对于具有 2 种不同特征设置的同一数据集,我得到了以下结果。

Feature setting 1 ('accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc'):  
0.6920, 0.6888, 0.6920, 0.6752, 0.7120

Feature setting 2 ('accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc'):
0.6806  0.6754  0.6806  0.6643  0.7233

因此,我们可以看到,在 feature setting 1 中,与 feature setting 2 相比,我们在 'accuracy'、'precision_weighted'、'recall_weighted'、'f1_weighted' 方面得到了不错的结果。

但是,当谈到“roc_auc”时,feature setting 2feature setting 1 更好。我发现这很奇怪,因为 feature setting 1 的所有其他指标都更好。

一方面,我怀疑会发生这种情况,因为我使用的是weighted 分数,而不是roc_auc。 sklearn中的二元分类可以做weighted roc_auc吗?

这个奇怪的 roc_auc 结果的真正问题是什么?

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

    标签: python machine-learning scikit-learn classification auc


    【解决方案1】:

    这并不奇怪,因为将所有这些其他指标与 AUC 进行比较就像将苹果与橙子进行比较。

    这是整个过程的高级描述:

    • 概率分类器(如此处的 RF)在 [0, 1] 中生成概率输出 p
    • 为了获得硬类预测 (0/1),我们对这些概率应用了一个阈值;如果未显式设置(如此处),则此阈值隐式设为 0.5,即如果 p>0.5class=1,否则 class=0
    • 准确度、精确度、召回率和 f1 分数等指标是在硬类预测 0/1 上计算的,即在应用阈值之后
    • 相比之下,AUC 衡量的是二元分类器在所有可能阈值范围内的平均性能,而不是针对特定阈值。

    所以,它肯定会发生,而且确实会导致新从业者的困惑。

    我在this similar question 中的回答的第二部分可能有助于了解更多细节。引用:

    至少根据我的经验,大多数机器学习从业者认为 AUC 分数衡量的东西与它实际所做的不同:常见(和不幸)的使用就像任何其他的 -higher-更好的指标,比如准确度,这自然会导致你表达自己的问题。

    【讨论】:

    • 非常感谢您的澄清。坦特是有道理的。我想确定最适合我的问题的功能设置。在这种情况下,您会建议我使用roc_auc 分数并选择feature setting 2,反之亦然?请让我知道你的想法。谢谢你:)
    • @EmJ 我认为链接线程的最后一部分暗示了一个答案;)
    • 呵呵,我想通了。感谢您链接的精彩答案。我从中学到了很多。我有最后一个问题,我认为很高兴得到您的反馈。我注意到我的accuracy 始终与我的weighted recall 值相似。这让我真的很担心。你知道为什么会这样吗?谢谢你:)
    • @EmJ 抱歉,不太确定 - 检查文档中的定义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2011-10-14
    • 2015-10-04
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多