AUC-ROC 可以在 0-0.5 之间吗?

机器算法验证 模型评估 奥克
2022-02-12 01:33:21

AUC-ROC 值可以在 0-0.5 之间吗?模型是否曾经输出 0 到 0.5 之间的值?

3个回答

完美预测器的 AUC-ROC 得分为 1,进行随机猜测的预测器的 AUC-ROC 得分为 0.5。

如果你得到 0 分,这意味着分类器完全不正确,那么它 100% 的时间都在预测错误的选择。如果您只是将此分类器的预测更改为相反的选择,那么它可以完美预测并且 AUC-ROC 得分为 1。

因此,在实践中,如果您的 AUC-ROC 分数介于 0 和 0.5 之间,您可能在标记分类器目标的方式上存在错误,或者您可能有一个糟糕的训练算法。如果你得到 0.2 的分数,这表明数据包含足够的信息来得到 0.8 的分数,但是出了点问题。

我很抱歉,但这些答案是危险的错误。不,您不能在看到数据后就翻转 AUC。想象一下你在买股票,而且你总是买错股票,但你对自己说,那没关系,因为如果你买的股票与你的模型预测的相反,那么你就会赚钱。

问题是,有许多通常不明显的原因可以使您的结果产生偏差并始终低于平均水平。如果你现在翻转你的 AUC,你可能会认为你是世界上最好的建模者,尽管数据中从来没有任何信号。

这是一个模拟示例。请注意,预测变量只是一个随机变量,与目标无关。此外,请注意平均 AUC 约为 0.3。

library(MLmetrics)
aucs <- list()
for (sim in seq_len(100)){
  n <- 100
  df <- data.frame(x=rnorm(n),
               y=c(rep(0, n/2), rep(1, n/2)))
  
  predictions <- list()
  for(i in seq_len(n)){
    train <- df[-i,]
    test <- df[i,]
    
    glm_fit <- glm(y ~ x, family = 'binomial', data = train)
    predictions[[i]] <- predict(glm_fit, newdata = test, type = 'response')
  }
  predictions <- unlist(predictions)
  aucs[[sim]] <- MLmetrics::AUC(predictions, df$y)
}
aucs <- unlist(aucs)
plot(aucs); abline(h=mean(aucs), col='red')

结果

在此处输入图像描述

当然,分类器不可能从数据中学到任何东西,因为数据是随机的。因为 LOOCV 创建了一个有偏见的、不平衡的训练集,所以存在 AUC 的机会如下。然而,这并不意味着如果你不使用 LOOCV,你就是安全的。这个故事的重点是,即使数据中没有任何内容,结果也可以通过多种方式获得低于平均水平的性能,因此除非您知道自己在做什么,否则您不应该翻转预测。而且由于您的表现低于平均水平,因此您看不到自己在做什么:)

这里有几篇涉及这个问题的论文,但我相信其他人也这样做了

神经科学中基于分类的假设检验: Jamalabadi 等人 (2016)的低于机会水平的分类率和线性参数分类器被忽视的统计特性。

Snoek 等人 (2019)在解码神经影像数据分析时如何控制混淆。

他们可以,如果您正在分析的系统执行低于机会水平。简单地说,你可以很容易地构造一个 AUC 为 0 的分类器,方法是让它总是回答与事实相反的问题。

当然,在实践中,您在某些数据上训练分类器,因此非常小于 0.5 的值通常表明您的算法、数据标签或训练/测试数据的选择存在错误。例如,如果您错误地切换了火车数据中的类别标签,您的预期 AUC 将是 1 减去“真实”AUC(给定正确的标签)。如果您将数据拆分为训练和测试分区,以使要分类的模式系统地不同,则 AUC 也可能小于 0.5。这可能会发生(例如),如果一个类在训练集中比测试集中更常见,或者如果每组中的模式具有系统性不同的截距,而您没有纠正。

最后,它也可能随机发生,因为从长远来看,您的分类器处于机会级别,但碰巧在您的测试样本中变得“不走运”(即错误多于成功)。但在这种情况下,这些值仍应相对接近 0.5(接近程度取决于数据点的数量)。