使用两个不同的R包(Caret和pROC),灵敏度和特异性值有所不同

时间:2019-08-15 16:17:38

标签: r r-caret roc

我正在尝试计算敏感性和特异性。我使用了插入符号包和pROC包。但是,为什么使用两个不同的程序包会得到不同的结果?

我已将数据转换为二进制格式(只要有正确的调用,就将其标记为1和0表示错误的调用,即其余39个类中的任何一个)。

混乱矩阵如下:

 table(actual_labels,app_labels)
             app_labels
actual_labels    0    1
             0 1183   23
             1    5   18

方法1:使用插入符程序包

> sensitivity(table(actual_labels,app_labels))
[1] 0.9957912
> specificity(table(actual_labels,app_labels))
[1] 0.4390244

cutoff of =0.5

方法2:使用 pROC 软件包

aa <- roc(actual_labels,app_labels)
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> aa$sensitivities
[1] 1.0000000 0.7826087 0.0000000
> aa$specificities
[1] 0.0000000 0.9809287 1.0000000
> aa$thresholds
[1] -Inf  0.5  Inf

为什么使用两个不同的程序包会得到不同的结果?

2 个答案:

答案 0 :(得分:2)

根据the documentation of the sensitivity function in caret,在Details部分中,该表应如下所示:

            Reference   
Predicted   Event   No Event
Event       A       B
No Event    C       D 

请注意,真正的标签在列中,而预测的标签在行中,这与您所拥有的相反。要获得正确的表格,您应该使用:

 table(app_labels, actual_labels)

此语法非常容易出错,并且使用替代方法(这是早期插入符号中唯一可用的替代方法)是一个好主意:

sensitivity(data, reference, ...)

具有:

data       for the default functions, a factor containing the discrete measurements. [...]
reference  a factor containing the reference values

因此,您的情况应该是这样

sensitivity(app_labels, actual_labels)

答案 1 :(得分:1)

确定您正确使用了插入符号中的功能吗?

手动计算敏感性和特异性,您将得到pROC的结果。自己尝试:

>>> re.sub(r'-\s*[0-9]:[0-9]{2}(/[0-9]:[0-9]{2})?\s*[AP]M', "", data)
'8:30 AM\n9:00  AM \n08:00 AM-03:00 PM\nM, T, W, Th: 7:45 AM F:  7:45 AM\n8:15/8:45 AM'