如何绘制knn模型的ROC曲线

时间:2012-07-31 13:46:09

标签: r knn roc

我正在使用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)

2 个答案:

答案 0 :(得分:4)

要在此处获取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)

您现在可以训练您的知识并从"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!")

enter image description here

答案 1 :(得分:0)

pred_knn&lt; -prediction(knn_isolet $ y,isolet_testing $ y)

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

首先这样做:

knn_isolet $ y&lt; - as.vector(knn_isolet $ y,mode =&#34; numeric&#34;)

isolet_testing $ y&lt; - as.vector(isolet_testing $ y,mode =&#34; numeric&#34;)

注意:ROCR仅支持二进制分类。因此,请检查&#39; knn_isolet $ y&#39;中的级别。和&#39; isolet_testing $ y&#39;有相同的标签。