【问题标题】:ROC-AUC FPR FNR in Python and R? [closed]Python 和 R 中的 ROC-AUC FPR FNR? [关闭]
【发布时间】:2018-09-15 14:47:25
【问题描述】:

我在 R/Python 中有一个数据框对象,如下所示:

df columns:
fraud = [1,1,0,0,0,0,0,0,0,1]
score = [0.84, 1, 1.1, 0.4, 0.6, 0.13, 0.32, 1.4, 0.9, 0.45]

当我在 Python 中使用roc_curve 时,我得到fprfnrthresholds

我有 2 个问题,可能有点理论,但请给我解释一下:

  1. 这些阈值是真的计算出来的吗?我手动计算了fprfnr,但是这些阈值=上面的分数吗?

  2. 如何在R 中生成相同的fprfnrthresholds

【问题讨论】:

  • 你是如何手动计算fpr和fnr的?你使用了什么阈值?
  • @pault 我使用了欺诈列表中的第二个点 - 第一个 0 是我的阈值 - 在此阈值以下 = false 并且大于 = true。
  • @pault 如果我错了请纠正我,我将使用 len(fraud) 数量的阈值并绘制 roc?
  • 我假设fraud 是真正的标签,score 是某个分类模型的输出。我不知道这是否是 roc_curve 的实现方式(如果您愿意,可以查看源代码),但可以通过改变您拥有的值的阈值来计算 TPR 和 FPR。然后使用这对 (TPR, FPR) 来绘制 ROC 曲线。
  • 我每个阈值都有一对 TPR 和 FPR,请纠正我。你知道第二个问题的答案吗?请张贴作为答案。 @pault

标签: python r roc auc false-positive


【解决方案1】:

阈值通常对应于最大化 tpr + tnr(敏感性 + 特异性)的值,这称为 Youden J 指数 (tpr + tnr - 1),但还有其他几个名称。

以 Sonar 数据集为例:

library(mlbench)
library(xgboost)
library(caret)
library(pROC)
data(Sonar)

让我们在声纳数据的一部分上拟合模型并在另一部分上进行预测:

ind <- createDataPartition(Sonar$Class, p = 0.7, list = FALSE)
train <- Sonar[ind,]
test <- Sonar[-ind,]
X = as.matrix(train[, -61])
dtrain = xgb.DMatrix(data = X, label = as.numeric(train$Class)-1)
dtest <- xgb.DMatrix(data = as.matrix(test[, -61]))

在训练数据上拟合模型:

model = xgb.train(data = dtrain, 
                  eval = "auc",
                  verbose = 0,  maximize = TRUE, 
                  params = list(objective = "binary:logistic",
                                eta = 0.1,
                                max_depth = 6,
                                subsample = 0.8,
                                lambda = 0.1 ), 
                  nrounds = 10)

preds <- predict(model, dtest)
true <- as.numeric(test$Class)-1


plot(roc(response = true,
         predictor =  preds,
         levels=c(0, 1)),
     lwd=1.5, print.thres = T, print.auc = T, print.auc.y = 0.5)

因此,如果您将阈值设置为 0.578,您将最大化值 tpr + tnr,并且图上括号中的值是 tpr 和 tnr。验证:

sensitivity(as.factor(ifelse(preds > 0.578, "1", "0")), as.factor(true))
#output
[1] 0.9090909
specificity(as.factor(ifelse(preds > 0.578, "1", "0")), as.factor(true))\
#output
[1] 0.7586207

您可以在许多可能的阈值上创建预测:

do.call(rbind, lapply((1:1000)/1000, function(x){
  sens <- sensitivity(as.factor(ifelse(preds > x, "1", "0")), as.factor(true))
  spec <- specificity(as.factor(ifelse(preds > x, "1", "0")), as.factor(true))
  data.frame(sens, spec)
})) -> thresh

现在:

thresh[which.max(rowSums(thresh)),]
#output
         sens      spec
560 0.9090909 0.7586207

你也可以看看这个:

thresh[555:600,]

话虽如此,通常在考虑财务数据时,不仅课程不感兴趣,而且与错误预测相关的成本对于假阴性和假阳性通常是不一样的。因此,这些模型适合使用成本敏感分类。 More on the mater。 另一方面,在决定阈值时,您应该在交叉验证数据或专门为该任务指定的验证集上进行。如果你使用它一个不可避免地导致过度乐观预测的测试集。

【讨论】:

    猜你喜欢
    • 2017-11-06
    • 1970-01-01
    • 2020-10-01
    • 2015-01-05
    • 2018-05-29
    • 1970-01-01
    • 2012-05-05
    • 2020-06-07
    • 2016-01-23
    相关资源
    最近更新 更多