优化阈值,使其始终是灵敏度/真阳性率的特定值

时间:2018-08-15 13:32:55

标签: r r-caret adaptive-threshold

如何在r中编码以使预测模型的阈值自动成为一个值,以使灵敏度对于模型的所有运行都是特定的比例/值?

例如,鉴于以下情况:

  1. 阈值为0.2;真阳性= 20,假阴性= 60即灵敏度0.25
  2. 阈值为0.35;真阳性= 60,假阴性= 20,即灵敏度为0.8

如何编写自动始终选择灵敏度阈值0.8的r代码,即从上方选择方案2?对于上下文,我使用的是插入符号建模框架。

这些关于阈值优化的链接没有太大帮助:

http://topepo.github.io/caret/using-your-own-model-in-train.html#Illustration5

Obtaining threshold values from a ROC curve

1 个答案:

答案 0 :(得分:0)

(1)

假设您有一个包含值和真实标签的数据。在这里,错误5和真实5

df <- data.frame(value = c(1,2,3,5,8,4,6,7,9,10),
             truth = c(rep(0,5), rep(1,5)))

在阈值9、9和10被检测为真阳性,灵敏度= 40% 在阈值6(或5到6之间的任何值)处,检测到(6,7,9,10),灵敏度= 80%

要查看ROC曲线,可以使用pROC软件包

library(pROC)
roc.demo <- roc(truth ~ value, data = df)
par(pty = "s") # make it square
plot(roc.demo) # plot ROC curve

ROC curve demo

如果要百分比,请执行以下操作

roc.demo <- roc(truth ~ value, data = df, percent = T)

,然后在下面的80中替换0.8。

您可以从roc对象获取阈值

roc.demo$thresholds[roc.demo$sensitivities == 0.8]

您可能会看到它显示4.5和5.5

您也可以使用     roc.demo $敏度> 0.79&roc.demo $敏度<0.81

(2)

或者,如果您只是想要一个阈值而又不关心特异性,则可以尝试使用分位数功能

quantile(df$value[df$truth == 1], 
     probs = c(0.00, 0.10, 0.20, 0.30), type = 1) # percentile giving the closest number

概率= 0.20对应于80%的灵敏度

0% 10% 20% 30% 

 4   4   4   6 

您正在寻找4到6之间的任何阈值。您可以根据需要更改概率。

希望它会有所帮助。