如何在R中找到使用kNN分类错误的单个样本?

问题描述

使用R中的Iris数据集,我正在研究使用kNN进行分类我有兴趣找到使用测试集分类错误的观察结果。我能够生成散点图,从而给出被错误分类的观察结果的视觉效果。但是,如何找到并列出所有被错误分类的观测值。我已经包含了用于获取下面的散点图的代码,这些代码来自https://rpubs.com/Tonnia/irisknn

set.seed(12345)
allrows <- 1:nrow(iris)
trainrows <- sample(allrows,replace = F,size = 0.8*length(allrows))
train_iris <- iris[trainrows,1:4]
train_label <- iris[trainrows,5]
table(train_label)
test_iris <- iris[-trainrows,1:4]
test_label <- iris[-trainrows,5]
table(test_label)

library(class)
error.train <- replicate(0,30)
for(k in 1:30) {
  pred_iris <- knn(train = train_iris,test = train_iris,cl = train_label,k)
  error.train[k]<-1-mean(pred_iris==train_label)
}

error.train <- unlist(error.train,use.names=FALSE)

error.test <- replicate(0,test = test_iris,k)
  error.test[k]<-1-mean(pred_iris==test_label)
}

error.test <- unlist(error.test,use.names = FALSE)

plot(error.train,type="o",ylim=c(0,0.15),col="blue",xlab = "K values",ylab = "Misclassification errors")
lines(error.test,type = "o",col="red")
legend("topright",legend=c("Training error","Test error"),col = c("blue","red"),lty=1:1)

pred_iris<-knn(train = train_iris,6)
result <- cbind(test_iris,pred_iris)
combinetest <- cbind(test_iris,test_label)

result%>%
  ggplot(aes(x=Petal.Width,y=Petal.Length,color=pred_iris))+
  geom_point(size=3)

combinetest%>%
  ggplot(aes(x=Petal.Width,color=test_label))+
  geom_point(size=3)

解决方法

在您的代码中,pred_iris保留了当前已训练模型响应的值。

一旦有了combinetest数据,在代码末尾,您可以执行以下操作:

combinetest[test_label != pred_iris,]

要获得预测结果与标签不同的预测结果。

或者,使用更简洁的语法:

library(tidyverse)
combinetest %>%
    filter(test_label != pred_iris)