我尝试过不同的 matlab 函数,如 plotroc 和 R 中的包,如 pROC、ROCR 和 cvAUC。每个包或函数生成不同的图形并给出与 Weka 结果不同的 AUC。
我想使用 10 折交叉验证比较多个分类器,并希望对每个分类器进行 ROC。我已经在 Weka 中收集了结果,但我不想在 Weka 本身中绘制它。
我的实验基于二元类和多类数据。
我的 Weka 输出交叉验证实例预测位于 https://drive.google.com/folderview?id=0BzRIG3kN-8Z9fnh5OElKTExNT2NuZUVna2tKcmMzU1VBankwdVc2OGxBSXFnaFJqSEhHYVE&usp=sharing
请建议我如何为二进制类和多类的附加结果绘制图形。
最佳答案
这是一个占位符答案,但首先要注意的是,您的观察得到的交叉验证次数少于 10 次:
library(pROC)
library(dplyr)
filenameROC = "Data/term3_IBk_3_multiclass.txt"
fileROC = readLines(filenameROC)
dfCV = read.csv2(text = fileROC,
nrows = length(fileROC) - 51 - 19,
header = TRUE,
sep = ",",
skip = 19, stringsAsFactors = FALSE)
dfCV %>%
group_by(inst.) %>%
tally() %>%
filter(n < 10)
给出:
> dfCV %>%
+ group_by(inst.) %>%
+ tally() %>%
+ filter( n < 10)
Source: local data frame [1 x 2]
inst. n
1 773 4
你能解释一下吗?
此外,您还需要添加交叉验证迭代标识符。一旦你这样做了,这只是一个通过 CV 迭代从 pROC
包运行 multiclass.roc
的问题。
编辑:
OP 声称有 7724 个 *observations` 而很容易看出在 772 个案例中有 773 个观察重复 10 次,观察编号 772 重复 4 次——与 10 倍交叉验证数据一致:
> dfCV %>%
+ group_by(inst.) %>%
+ tally()
Source: local data frame [773 x 2]
inst. n
1 1 10
2 2 10
3 3 10
4 4 10
5 5 10
6 6 10
7 7 10
8 8 10
9 9 10
10 10 10
.. ... ..
编辑2:
这是通过 CV 折叠生成多类 ROC 的代码:
dfCVROC = dfCV %>%
dplyr::filter(inst. != 773) %>%
arrange(inst.) %>%
dplyr::mutate(cvfold = rep.int(1:10, 772)) %>%
group_by(cvfold) %>%
do(multiclass_roc = multiclass.roc(as.factor(.$actual), as.numeric(.$prediction)))
# get the AUCs by CV fold
sapply(dfCVROC$multiclass_roc, function(x) x$auc)
关于r - 如何绘制 ROC 曲线以从 Weka 输出的二元类和多类数据进行交叉验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30137768/