【问题标题】:pROC median Sensitivity vs. manual Sensitivity calculation - different ResultspROC 中值敏感度与手动敏感度计算 - 不同的结果
【发布时间】:2020-11-15 12:35:16
【问题描述】:

从混淆矩阵中手动计算敏感度,得到值0.853。

  • TN = 16
  • FP = 7
  • FN = 5
  • TP = 29

pROC 的输出不同(中位数 = 0.8235)。

y_test = c(1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
       0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0,
       0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0)

y_pred_prob = c(0.63069148, 0.65580015, 0.9478634 , 0.94471701, 0.24756774,
       0.51969906, 0.26881201, 0.6722361 , 0.30275069, 0.61676645,
       0.76116789, 0.90867332, 0.31525658, 0.10681422, 0.6890589 ,
       0.25185641, 0.54820684, 0.7175465 , 0.57194733, 0.71304872,
       0.98805141, 0.92829077, 0.38150015, 0.97653216, 0.96036858,
       0.75878699, 0.95466371, 0.52292342, 0.28296724, 0.5660834 ,
       0.91581461, 0.49574317, 0.79025422, 0.14303487, 0.66885536,
       0.07660444, 0.10342033, 0.53661914, 0.04701796, 0.83313871,
       0.37766607, 0.89157993, 0.47731778, 0.62640482, 0.47664294,
       0.0928437 , 0.13605622, 0.2561323 , 0.95572329, 0.49051571,
       0.49267652, 0.92600581, 0.48464618, 0.96006108, 0.01548211,
       0.56057243, 0.82257937)

set.seed(99)
boot = 2000
rocobj <- roc(y_test, y_pred_prob)
print(ci.thresholds(rocobj,.95, thresholds =  0.5, method = 'bootstrap',boot.n = boot))

OUT:    95% CI (2000 stratified bootstrap replicates):
     thresholds sp.low sp.median sp.high se.low se.median se.high
      0.5002624 0.5652    0.7391   0.913 0.6765    0.8235  0.9412

这是自举方法的结果吗?因为是中位数?

【问题讨论】:

  • 引导程序是一种基于随机的方法,您应该期待不同的结果。例如,尝试更改 RNG 种子。
  • @RuiBarradas 我已经尝试过这样做,但它并没有太大变化,如果有的话。所以我很好奇0.853和0.8235之间的巨大差异是如何发生的......
  • Mischa 这是使用阈值 0.5 显示的灵敏度。如果您使用 0.5 的阈值来获得手动灵敏度(例如 table(prediction = y_pred_prob &gt; 0.5, actual = y_test)),那么您会得到与您显示的不同的混淆矩阵。该混淆矩阵的灵敏度为 0.8235(它是 28/34 而不是 29/34)。您是否可能为您的混淆矩阵使用最佳截止值?如果是这样,您需要将该值传递给ci.thresholds 的阈值参数
  • 干得好@AllanCameron

标签: r roc confusion-matrix proc-r-package


【解决方案1】:

您使用了什么阈值?

报告和分析混淆矩阵的结果时需要小心。当您有数字预测时,您必须考虑生成此表的阈值。鉴于其中的数字,我假设您使用了 0.495 或接近的阈值,这使我能够获得与您相同的数字:

> table(y_test, y_pred_prob > 0.495)
      
y_test FALSE TRUE
     0    17    6
     1     5   29

如何获得 pROC 的经验敏感性和特异性?

现在我们有了一个可以使用的阈值,我们可以使用coords 函数从 pROC 中提取此阈值的数据:

> coords(rocobj, 0.495, "threshold", transpose = FALSE)
  threshold specificity sensitivity
1     0.495   0.7391304   0.8529412

这正是您计算的敏感度。

助推怎么样?

正如您所怀疑的,用于计算置信区间的增强是一个随机过程,重采样曲线的中位数将不同于经验值。

但是对于具有 2000 个引导复制的中位数,我们非常接近:

> set.seed(99)
> print(ci.thresholds(rocobj,.95, thresholds =  0.495, method = 'bootstrap',boot.n = boot))

95% CI (2000 stratified bootstrap replicates):
 thresholds sp.low sp.median sp.high se.low se.median se.high
      0.495 0.5652    0.7391   0.913 0.7353    0.8529  0.9706

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2023-04-08
    • 2019-01-12
    • 2010-12-26
    相关资源
    最近更新 更多