【问题标题】:How to plot ROC curve for cross validation from Weka output for binary class and multiclass data?如何从 Weka 输出中为二元类和多类数据绘制 ROC 曲线以进行交叉验证?
【发布时间】:2015-07-20 04:37:05
【问题描述】:

我尝试了不同的 matlab 函数,如 plotroc 和 R 中的包,如 pROC、ROCR 和 cvAUC。每个包或函数产生不同的图形并给出与 Weka 结果不同的 AUC。

我想使用 10 倍交叉验证来比较多个分类器,并希望对每个分类器进行 ROC。我已经在 Weka 中收集了结果,但我不想在 Weka 本身中绘制它。

我的实验基于二元类和多类数据。

我的 Weka 输出交叉验证实例预测位于 https://drive.google.com/folderview?id=0BzRIG3kN-8Z9fnh5OElKTExNT2NuZUVna2tKcmMzU1VBankwdVc2OGxBSXFnaFJqSEhHYVE&usp=sharing

请建议我如何为二元类和多类的附加结果绘制图表。

【问题讨论】:

    标签: r matlab weka cross-validation


    【解决方案1】:

    我没有找到该问题的确切解决方案。但是,这是我从 Weka 输出中观察到的一些要点

    1. 虽然 weka 绘制 ROC,但它直接从分类器评估输出中获取预测。
    2. Wek​​a 使用最多 6 位小数的预测值来计算阈值(更高的精度有助于计算更多的 ROC 曲线阈值)。
    3. 默认情况下,在 Weka 资源管理器中,分类器仅输出小数点后 3 位的预测(如我所附的实验结果所示)。

    除此之外,我不明白 Weka 如何从预测中计算阈值。我观察到,使用相同的 Weka 预测输出,我在 Weka 和 R(以及 Matlab)中发现了不同的阈值。

    最后,我使用 Weka API 代码绘制 ROC Generate ROC Curve 并提取 TPR 和 FPR 进行实验(我重新运行了所有实验)。提取 TPR 和 FPR 后,我可以在 Excel、gnuplot、Matlab 或 R 等任何工具中绘制图形。

    【讨论】:

    • 能否请教如何通过 rWeka 计算 ROC AUC?
    【解决方案2】:

    这是一个占位符答案,但首先要注意的是,您的观察得到的交叉验证不到 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 ,而很容易看出有 773 个观察结果在 772 个案例中重复了 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)
    

    【讨论】:

    • 共有 7724 个观测值。我正在运行 10 倍交叉验证。因此,在测试集中,4 折有 773 个观察值,而其余部分有 772 个观察值。附加的文件是 Weka 的输出,据我所知,默认情况下它不包括迭代次数。谢谢。
    • 运行您的代码时出现错误:找不到函数“%>%”我缺少任何库吗?
    • @b.bhavesh 如果你加载了dplyr,它应该已经加载了magrittr。如果没有,你可以显式加载library(magrittr)
    • @b.bhavesh 对我来说inst. 看起来像是观察号,并注意除了观察号 773 之外,每个观察重复 10 次。检查上面的额外输出。
    • 谢谢。我现在加载了 magrittr 及其工作。正如我在上面回答的那样,总共有 7724 个观察值。所以 772 次观测重复了 10 次,而 773 次观测仅重复了 4 次。这就是 Weka 划分数据以进行交叉验证的方式。我是否必须忽略第 773 号观察才能继续?
    猜你喜欢
    • 2021-05-08
    • 2021-01-30
    • 1970-01-01
    • 2020-01-02
    • 2016-09-09
    • 2012-09-11
    • 2021-12-06
    • 2019-01-25
    • 2019-08-15
    相关资源
    最近更新 更多