如何将混淆矩阵发送到插入符号的混淆矩阵?
How to send a confusion matrix to caret's confusionMatrix?
我正在查看这个数据集:https://archive.ics.uci.edu/ml/datasets/Credit+Approval。我建立了一个ctree:
myFormula<-class~. # class is a factor of "+" or "-"
ct <- ctree(myFormula, data = train)
现在我想将该数据放入插入符号的 confusionMatrix 方法中,以获取与混淆矩阵相关的所有统计数据:
testPred <- predict(ct, newdata = test)
#### This is where I'm doing something wrong ####
confusionMatrix(table(testPred, test$class),positive="+")
#### ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ####
$positive
[1] "+"
$table
td
testPred - +
- 99 6
+ 20 88
$overall
Accuracy Kappa AccuracyLower AccuracyUpper AccuracyNull AccuracyPValue McnemarPValue
8.779343e-01 7.562715e-01 8.262795e-01 9.186911e-01 5.586854e-01 6.426168e-24 1.078745e-02
$byClass
Sensitivity Specificity Pos Pred Value Neg Pred Value Precision Recall F1
0.9361702 0.8319328 0.8148148 0.9428571 0.8148148 0.9361702 0.8712871
Prevalence Detection Rate Detection Prevalence Balanced Accuracy
0.4413146 0.4131455 0.5070423 0.8840515
$mode
[1] "sens_spec"
$dots
list()
attr(,"class")
[1] "confusionMatrix"
所以敏感度是:
(来自 caret 的 confusionMatrix 文档)
如果你拿我的混淆矩阵:
$table
td
testPred - +
- 99 6
+ 20 88
您可以看到这并没有加起来:Sensetivity = 99/(99+20) = 99/119 = 0.831928
。在我的 confusionMatrix 结果中,该值表示特异性。然而特异性是 Specificity = D/(B+D) = 88/(88+6) = 88/94 = 0.9361702
,灵敏度的值。
我试过这个 confusionMatrix(td,testPred, positive="+")
但得到了更奇怪的结果。我做错了什么?
更新:我还意识到我的混淆矩阵与 caret 认为的不同:
Mine: Caret:
td testPred
testPred - + td - +
- 99 6 - 99 20
+ 20 88 + 6 88
如你所见,它认为我的 False Positive 和 False Negative 是倒过来的。
UPDATE:我发现发送数据比 table 作为参数要好得多。来自 confusionMatrix 文档:
reference
a factor of classes to be used as the true results
我认为这是指什么符号构成了积极的结果。在我的例子中,这将是 +
。但是,'reference' 指的是数据集的实际结果,也就是因变量。
所以我应该使用 confusionMatrix(testPred, test$class)
。如果您的数据由于某种原因乱序,它会将其转换为正确的顺序(因此正数和负数 outcomes/predictions 在混淆矩阵中正确对齐。
但是,如果您担心结果是正确的因子,请安装 plyr
库,然后使用 revalue
更改因子:
install.packages("plyr")
library(plyr)
newDF <- df
newDF$class <- revalue(newDF$class,c("+"=1,"-"=0))
# You'd have to rerun your model using newDF
我不确定为什么会这样,但我只是删除了正参数:
confusionMatrix(table(testPred, test$class))
我的混淆矩阵:
td
testPred - +
- 99 6
+ 20 88
Caret 的混淆矩阵:
td
testPred - +
- 99 6
+ 20 88
虽然现在它说 $positive: "-"
所以我不确定这是好是坏。
我正在查看这个数据集:https://archive.ics.uci.edu/ml/datasets/Credit+Approval。我建立了一个ctree:
myFormula<-class~. # class is a factor of "+" or "-"
ct <- ctree(myFormula, data = train)
现在我想将该数据放入插入符号的 confusionMatrix 方法中,以获取与混淆矩阵相关的所有统计数据:
testPred <- predict(ct, newdata = test)
#### This is where I'm doing something wrong ####
confusionMatrix(table(testPred, test$class),positive="+")
#### ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ####
$positive
[1] "+"
$table
td
testPred - +
- 99 6
+ 20 88
$overall
Accuracy Kappa AccuracyLower AccuracyUpper AccuracyNull AccuracyPValue McnemarPValue
8.779343e-01 7.562715e-01 8.262795e-01 9.186911e-01 5.586854e-01 6.426168e-24 1.078745e-02
$byClass
Sensitivity Specificity Pos Pred Value Neg Pred Value Precision Recall F1
0.9361702 0.8319328 0.8148148 0.9428571 0.8148148 0.9361702 0.8712871
Prevalence Detection Rate Detection Prevalence Balanced Accuracy
0.4413146 0.4131455 0.5070423 0.8840515
$mode
[1] "sens_spec"
$dots
list()
attr(,"class")
[1] "confusionMatrix"
所以敏感度是:
如果你拿我的混淆矩阵:
$table
td
testPred - +
- 99 6
+ 20 88
您可以看到这并没有加起来:Sensetivity = 99/(99+20) = 99/119 = 0.831928
。在我的 confusionMatrix 结果中,该值表示特异性。然而特异性是 Specificity = D/(B+D) = 88/(88+6) = 88/94 = 0.9361702
,灵敏度的值。
我试过这个 confusionMatrix(td,testPred, positive="+")
但得到了更奇怪的结果。我做错了什么?
更新:我还意识到我的混淆矩阵与 caret 认为的不同:
Mine: Caret:
td testPred
testPred - + td - +
- 99 6 - 99 20
+ 20 88 + 6 88
如你所见,它认为我的 False Positive 和 False Negative 是倒过来的。
UPDATE:我发现发送数据比 table 作为参数要好得多。来自 confusionMatrix 文档:
reference
a factor of classes to be used as the true results
我认为这是指什么符号构成了积极的结果。在我的例子中,这将是 +
。但是,'reference' 指的是数据集的实际结果,也就是因变量。
所以我应该使用 confusionMatrix(testPred, test$class)
。如果您的数据由于某种原因乱序,它会将其转换为正确的顺序(因此正数和负数 outcomes/predictions 在混淆矩阵中正确对齐。
但是,如果您担心结果是正确的因子,请安装 plyr
库,然后使用 revalue
更改因子:
install.packages("plyr")
library(plyr)
newDF <- df
newDF$class <- revalue(newDF$class,c("+"=1,"-"=0))
# You'd have to rerun your model using newDF
我不确定为什么会这样,但我只是删除了正参数:
confusionMatrix(table(testPred, test$class))
我的混淆矩阵:
td
testPred - +
- 99 6
+ 20 88
Caret 的混淆矩阵:
td
testPred - +
- 99 6
+ 20 88
虽然现在它说 $positive: "-"
所以我不确定这是好是坏。