6

例如,当我在 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

4

3 回答 3

10

正如您在参考资料中看到的那样,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。

另外三个评论:

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

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

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

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

于 2013-12-11T11:40:35.563 回答
0

我复制了你的代码,得到了 0.83 的 AUC。不确定有什么不同。

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

于 2013-12-11T15:36:16.147 回答