【问题标题】:How to deal with multiple class ROC analysis in R (pROC package)?如何处理 R(pROC 包)中的多类 ROC 分析?
【发布时间】:2013-12-29 09:08:45
【问题描述】:

当我在 R(pROC 包)中使用 multiclass.roc 函数时,例如,我通过随机森林训练了一个数据集,这是我的代码:

# randomForest & pROC packages should be installed:
# install.packages(c('randomForest', 'pROC'))
data(iris)
library(randomForest)
library(pROC)
set.seed(1000)
# 3-class in response variable
rf = randomForest(Species~., data = iris, ntree = 100)
# predict(.., type = 'prob') returns a probability matrix
multiclass.roc(iris$Species, predict(rf, iris, type = 'prob'))

结果是:

Call:
multiclass.roc.default(response = iris$Species, predictor = predict(rf,     
iris, type = "prob"))
Data: predict(rf, iris, type = "prob") with 3 levels of iris$Species: setosa,   
versicolor, virginica.
Multi-class area under the curve: 0.5142

这是对的吗?谢谢!!!

“pROC”参考:http://www.inside-r.org/packages/cran/pROC/docs/multiclass.roc

【问题讨论】:

    标签: r data-mining random-forest roc proc-r-package


    【解决方案1】:

    正如您在参考资料中看到的,multiclass.roc 需要一个“数字向量 (...)”,并且从那里链接的 roc 的文档(由于某种原因不在您提供的链接中)进一步说“长度与response 相同”。您正在传递一个包含 3 列的数字矩阵,这显然是错误的,并且自 pROC 1.6 以来不再受支持。我不知道它之前在做什么,可能不是你所期望的。

    这意味着您必须在一个数字模式的原子向量中总结您的预测。对于您的模型,您可以使用以下内容,尽管将因子转换为数字通常没有意义:

    predictions <- as.numeric(predict(rf, iris, type = 'response'))
    multiclass.roc(iris$Species, predictions)
    

    此代码的真正作用是根据您的预测计算 3 条 ROC 曲线(一条使用 setosa 与 versicolor,一条使用 versicolor 与 virginica,一条使用 setosa 与 virginica)并平均它们的 AUC。

    另外三个cmets:

    • 我说将因子转换为数字没有意义,因为如果您没有完美的分类并重新排序级别,您将得到不同的结果。这就是为什么它不会在 pROC 中自动完成:您必须在设置中考虑它。
    • 一般来说,这种多类平均并没有真正意义,您最好根据二进制分类重新考虑您的问题。还有更高级的多类方法(使用 ROC 表面等)尚未在 pROC 中实现
    • 正如@cbeleites 所述,使用训练数据(重新替换)评估模型是不正确的,因此在实际示例中,您必须保留测试或使用交叉验证。

    【讨论】:

      【解决方案2】:

      我复制了您的代码,得到的 AUC 为 0.83。不知道有什么不同。

      你是对的,s100b 列不是概率。 aSAH(动脉瘤性蛛网膜下腔) 出血)数据集是临床数据集。 s100b 是一种存在于大脑神经胶质细胞中的蛋白质。从数据集的研究论文中,s100b 列似乎代表了血液样本中可能存在的 s100b 蛋白浓度 (ug/l)。

      【讨论】:

      • 你的意思是你的实验结果是0.83??另外,您的意思是s100b 是一个实变量而不是“分数”?但是当我使用multiclass.roc 函数时,predictor 是一个概率矩阵,因此它应该是错误的。这个问题的准确答案是什么?
      • 对不起,如果我让事情变得更加混乱。 pROC 帮助文档只是指出 predictor 参数是一个数字向量。所以我相信你最初关于虹膜数据的例子是正确的。所以我在评论你在 pROC 文档上链接到的例子(使用了 aSAH 数据集)。在data(aSAH) 之后,我查看了帮助中链接的研究论文(?aSAH)。如果您搜索 s100b,您会发现它看起来像是一种蛋白质的浓缩物。
      • 其实我最初的例子iris data 使用概率矩阵作为multiclass.roc 函数中的predictor。但问题是AUC的结果并不显着(0.5142)!因此,我认为我的代码是错误的,尽管我不知道如何纠正它。谢谢!
      • 对了,我修改了这段代码,请看一下:hereThanks!
      【解决方案3】:

      假设您只是为了最小的工作示例而进行重新替换估计,您的代码对我来说看起来不错。

      我很快尝试使用“prob”类型进行 oob 预测,但没有成功。因此,您需要在randomForest 函数之外进行验证。

      就个人而言,我不会尝试将整个多类模型总结为一个无条件的数字。但这是一个完全不同的问题。

      【讨论】:

      • 很抱歉,我不太明白你的意思。
      • 有一个例子展示了multiclass.auclink的方法,但是我不知道s100b是什么意思。它一定不是概率,而是它是什么?谢谢!
      猜你喜欢
      • 2015-03-21
      • 2019-08-23
      • 2020-09-11
      • 2016-08-06
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 2018-10-23
      • 2012-07-10
      相关资源
      最近更新 更多