如何为knn模型绘制ROC曲线

3

我正在使用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
@Backlin 我刚刚添加了一个例子。 - spektra
2个回答

6

这里有几个步骤需要解决才能得到 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!")

enter image description here


如果在predictions参数中提供的向量必须包含每个案例的正类别概率,那么为什么仅使用ifelse(knn_isolet == "-1", 1-prob, prob)无法获得这些概率呢? - ForEverNewbie

0

pred_knn<-prediction(knn_isolet$y, isolet_testing$y)

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

所以首先要做的是:

knn_isolet$y <- as.vector(knn_isolet$y, mode = "numeric")

isolet_testing$y <- as.vector(isolet_testing$y, mode = "numeric")

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接