【问题标题】:Getting a low ROC AUC score but a high accuracyROC AUC 得分低但准确度高
【发布时间】:2018-04-16 16:17:46
【问题描述】:

flight delay dataset 的一个版本上使用scikit-learn 中的LogisticRegression 类。

我使用pandas 选择一些列:

df = df[["MONTH", "DAY_OF_MONTH", "DAY_OF_WEEK", "ORIGIN", "DEST", "CRS_DEP_TIME", "ARR_DEL15"]]

我将NaN的值填为0:

df = df.fillna({'ARR_DEL15': 0})

确保分类列标有“类别”数据类型:

df["ORIGIN"] = df["ORIGIN"].astype('category')
df["DEST"] = df["DEST"].astype('category')

然后从pandas调用get_dummies()

df = pd.get_dummies(df)

现在我训练和测试我的数据集:

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()

test_set, train_set = train_test_split(df, test_size=0.2, random_state=42)

train_set_x = train_set.drop('ARR_DEL15', axis=1)
train_set_y = train_set["ARR_DEL15"]

test_set_x = test_set.drop('ARR_DEL15', axis=1)
test_set_y = test_set["ARR_DEL15"]

lr.fit(train_set_x, train_set_y)

一旦我调用 score 方法,我得到的结果约为 0.867。但是,当我调用 roc_auc_score 方法时,我得到的数字要低得多,约为 0.583

 probabilities = lr.predict_proba(test_set_x)

 roc_auc_score(test_set_y, probabilities[:, 1])

ROC AUC 远低于score 方法提供的值有什么原因吗?

【问题讨论】:

    标签: machine-learning scikit-learn classification logistic-regression auc


    【解决方案1】:

    首先,说 AUC 为 0.583 “低于”分数* 0.867 就像比较苹果和橙子一样。

    [* 我假设您的 score 是平均准确度,但这对于本次讨论并不重要 - 原则上可以是其他任何东西]

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

    事实是,粗略地说,AUC 衡量的是二元分类器的性能在所有可能的决策阈值上取平均值

    二元分类中的(决定)threshold 是我们决定将样本标记为 1 的值(回想一下,概率分类器实际上在 [0, 1 ],通常被解释为概率 - 在 scikit-learn 中,它是 predict_proba 返回的值)。

    现在,在像 scikit-learn predict 这样返回 labels (1/0) 的方法中,这个阈值是 set to 0.5 by default,但这不是唯一的可能性,也可能不是在某些情况下甚至是可取的(例如,不平衡的数据)。

    要带回家的是:

    • 当您要求score(在后台uses predict,即标签而不是概率)时,您还隐式将此阈值设置为0.5
    • 当您询问 AUC(相比之下,它使用predict_proba 返回的概率)时,不涉及任何阈值,并且您会获得(类似于)所有可能阈值的平均准确度

    鉴于这些说明,您的特定示例提供了一个非常有趣的案例

    我的模型获得了足够好的准确率 ~ 87%;我是否应该关心,根据 0.58 的 AUC,我的分类器只比单纯的随机猜测好一点

    如果你的数据中的类表示是合理平衡,那么现在的答案应该很明显:不,你不应该关心;对于所有实际情况,您关心的是部署了特定阈值的分类器,并且当在所有可能的阈值上进行平均时,该分类器在纯理论和抽象情况下所做的事情对从业者(这确实引起了研究人员提出新算法的兴趣,但我认为这不是你的情况。

    (对于不平衡的数据,参数会发生变化;这里的准确率实际上是无用的,您应该考虑准确率、召回率和混淆矩阵)。

    出于这个原因,AUC 已开始在文献中受到严厉批评(不要误读 - ROC 曲线 本身的分析非常有用且信息量很大);强烈推荐阅读Wikipedia entry 和其中提供的参考资料:

    因此,AUC 度量的实用价值受到质疑,这增加了 AUC 实际上可能在机器学习分类准确性比较中引入比分辨率更多的不确定性的可能性。

    [...]

    最近对 ROC AUC 问题的一种解释是,将 ROC 曲线减少到一个数字忽略了这样一个事实,即它是关于不同系统或绘制的性能点之间的权衡,而不是单个系统的性能

    强调我的 - 另见On the dangers of AUC...

    【讨论】:

    • 非常关于什么是 AUC 的好文章!绝对可以帮助我更多地理解它。谢谢!
    【解决方案2】:

    我不知道AIR_DEL15 到底是什么,您将其用作标签(它不在原始数据中)。我的猜测是它是一个不平衡的特征,即 0 比 1 多得多;在这种情况下,准确度作为指标没有意义,您应该使用准确率、召回率和混淆矩阵来代替 - 另请参阅 this thread)。

    举个极端的例子,如果 87% 的标签是 0,那么通过将所有样本分类为 0,您可以简单地(并且天真地)拥有 87% 准确度的“分类器”;在这种情况下,您的 AUC 也会较低(与您的情况一样,接近 0.5)。

    有关 AUC 究竟是什么的更一般(在我看来也是非常需要的)讨论,请参阅我的其他答案。

    【讨论】:

    • 我希望我也可以将此标记为答案。我之前确实注意到数据集中有更多的 0。这确实解释了高精度分数。再次感谢!
    猜你喜欢
    • 2017-09-25
    • 2023-02-10
    • 2018-10-14
    • 1970-01-01
    • 2019-09-10
    • 2020-11-06
    • 2017-10-25
    • 2018-07-24
    • 2020-10-04
    相关资源
    最近更新 更多