如何为 knn 模型绘制 ROC 曲线

Posted

技术标签:

【中文标题】如何为 knn 模型绘制 ROC 曲线【英文标题】:How to plot a ROC curve for a knn model 【发布时间】:2012-07-29 07:22:43 【问题描述】:

我正在使用 ROCR 包,我想知道如何在 R 中为 knn 模型绘制 ROC 曲线?有没有办法用这个包把它全部绘制出来?

我不知道如何使用ROCR的预测功能进行knn。这是我的示例,我正在使用来自 UCI 存储库的 isolet 数据集,其中我将类属性重命名为 y:

cl<-factor(isolet_training$y)
knn_isolet<-knn(isolet_training, isolet_testing, cl, k=2, prob=TRUE)

现在我的问题是,传递给 ROC 预测函数的参数是什么。我尝试了以下两种无效的替代方法:

library(ROCR)
pred_knn<-prediction(knn_isolet$y, cl)
pred_knn<-prediction(knn_isolet$y, isolet_testing$y)

【问题讨论】:

我想这是可以做到的,因为 ROCR 包是关于可视化分类器的各个方面的。如果您能提供一个玩具示例来展示您如何适合您的 kNN 分类器,那就太好了。 @Backlin 我刚刚添加了一个示例。 【参考方案1】:

为了在此处获得 ROC 曲线,需要解决几个步骤。我只是要弥补一些数据,因为你没有提供一种简单的方法来获取你正在使用的数据。请注意,ROCR 包希望类标签是正/负,而不是因子,所以让我们像这样。

# Generate fake data
isolet_training <- sweep(matrix(rnorm(400), 40, 10), 1, rep(0:1, each=20))
isolet_testing <- sweep(matrix(rnorm(400), 40, 10), 1, rep(0:1, each=20))
# Generate class labels
cl <- cl_testing <- rep(c(-1, 1), each=20)

您现在可以训练您的 knn 并从 "prob" 属性中获取其类别概率。

knn_isolet <- class::knn(isolet_training, isolet_testing, cl, k=2, prob=TRUE)
prob <- attr(knn_isolet, "prob")
# you can probably use just `knn` instead of `class::knn`,
# but for some reason it did not work for me.

但是,它们以ROCR 不接受的形式出现,因此我们需要将它们反转为-1 类并重新调整它们。

prob <- 2*ifelse(knn_isolet == "-1", 1-prob, prob) - 1

现在您可以将“概率”输入ROCR 包的函数并获得 ROC 曲线。

pred_knn <- prediction(prob, cl_testing)
pred_knn <- performance(pred_knn, "tpr", "fpr")
plot(pred_knn, avg= "threshold", colorize=T, lwd=3, main="Voilà, a ROC curve!")

【讨论】:

如果predictions参数中要提供的向量必须包含每个案例的正类别概率,为什么单独ifelse(knn_isolet == "-1", 1-prob, prob)不足以获得这样的概率?【参考方案2】:

pred_knn

这一行可以正常工作,但根据文档,两个参数都必须是向量。

所以先做:

knn_isolet$y

isolet_testing$y

注意:ROCR 仅支持二进制分类。因此,请检查“knn_isolet$y”和“isolet_testing$y”中的级别是否具有相同的标签。

【讨论】:

以上是关于如何为 knn 模型绘制 ROC 曲线的主要内容,如果未能解决你的问题,请参考以下文章

ROC曲线——相关文献实例、原理和绘制方法

R语言中绘制ROC曲线和PR曲线

python 将多个模型的ROC曲线绘制在一张图里(含图例)

如何在自动编码器模型上绘制ROC曲线并计算AUC?

ROC曲线绘制(Python)

如何绘制 ROC 曲线的平均值?