我是 ROC曲线概念的新手。我试着通过阅读网上的一些教程来理解它。我在python中找到了一个非常好的例子here,这很有帮助。
我想为我构建的多类分类器绘制 ROC曲线(在Python中)。但是,网络上的大多数解决方案都是针对 2类问题和而不是多类。
然而,我终于在 R 中的 pROC 包中找到了“multiclass.roc”函数,该函数执行多类ROC曲线绘制。
以下是一个简单的例子:
library(pROC)
data(aSAH)
multiclass.roc(aSAH$gos6, aSAH$s100b)
但是,我不明白如何解释它(因为我不知道R)。
任何人都可以指出 aSAH $ s100b 变量是指什么?我可以说 aSAH $ gos6 指向 aSAH 数据集中不同类别的数据。
答案 0 :(得分:2)
此外,您可能需要查看Fawcett, 2006以获得理解和实施ROC图的非常好的指南。他还讲述了多级ROC和AUC,以及其他资源。
答案 1 :(得分:0)
我知道这是一个老问题,但出于完整性考虑,对于将来的访问者,我将使用pROC::multiclass.roc()
函数添加示例的简短列表。谈到软件需求时,唯一的办法就是确保预测矩阵的列名与真实的类(real_values
)相匹配。
第一个示例生成随机预测。第二个产生更好的预测。第三个生成完美的预测(即始终为真实类别分配最高的概率)。
我打印了head(obj)
的结果,因此不需要R的理解就可以跟踪示例。
pROC::multiclass.roc()
使用的计算的技术细节可以在Hand & Till (2001)处找到:对于多个类别分类问题,ROC曲线下面积的简单概括。机器学习,45(2),171-186。
library(pROC)
set.seed(42)
head(real_values)
real_values <- matrix( c("class1", "class2", "class3"), nc=1 )
# [,1]
# [1,] "class1"
# [2,] "class2"
# [3,] "class3"
############################
#### Random predictions ####
############################
random_preds <- matrix(rbeta(3*3,2,2), nc=3)
random_preds <- sweep(random_preds, 1, rowSums(a1), FUN="/")
colnames(random_preds) <- c("class1", "class2", "class3")
head(random_preds)
# class1 class2 class3
# [1,] 0.3437916 0.6129104 0.4733117
# [2,] 0.6016169 0.4700832 0.9364681
# [3,] 0.6741742 0.8677781 0.4823129
multiclass.roc(real_values, random_preds)
#Multi-class area under the curve: 0.1667
############################
#### Better Predictions ####
############################
better_preds <- matrix(c(0.75,0.15,0.5,
0.15,0.5,0.75,
0.15,0.75,0.5), nc=3)
colnames(better_preds) <- c("class1", "class2", "class3")
head(better_preds)
# class1 class2 class3
# [1,] 0.75 0.15 0.15
# [2,] 0.15 0.50 0.75
# [3,] 0.50 0.75 0.50
multiclass.roc(real_values, better_preds)
#Multi-class area under the curve: 0.6667
#############################
#### Perfect Predictions ####
#############################
perfect_preds <- matrix(c(0.75,0.15,0.5,
0.15,0.75,0.5,
0.15,0.5,0.75), nc=3)
colnames(perfect_preds) <- c("class1", "class2", "class3")
head(perfect_preds)
multiclass.roc(real_values, perfect_preds)
#Multi-class area under the curve: 1