我正在尝试使用iris数据集进行knn分类,使用1到21之间的多个奇数值(包括1和21)。这样组合所有knn分类是否能得到正确的结果?另外,如何创建结果的混淆矩阵并检查准确性?
在创建混淆矩阵和检查准确性时,我遇到了以下错误…
错误1:在table(knn_class, train.labels)中出错:所有参数必须具有相同的长度
错误2:在
==.default
(knn_class, train.labels)中:较长对象的长度不是较短对象长度的倍数
因为我使用多个k值进行knn分类,train.labels
的长度小于knn_class
,但我不明白如何解决这个问题。
这是我目前的代码…
library(class)data(iris)# 生成一个随机样本,样本量为数据集总行数的2/3。ran <- sample(2, nrow(iris), replace=TRUE, prob=c(0.80, 0.20))ran# 组成训练标签train.labels <- iris[ran==1, 5]# 组成测试标签test.labels <- iris[ran==2, 5]# 组成训练集.training <- iris[ran==1, 1:4]data_train <- cbind(train.labels,training)# 组成测试集.test <- iris[ran==2, 1:4]data_test <- cbind(test.labels,test)k_values <- seq(from=1, to=21, by=2)knn_class <- sapply(k_values, function(k) { knn(train = training, test = test, cl = train.labels, k=k)})colnames(knn_class) <- c(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21)summary(knn_class) 1 3 5 7 9 11 13 setosa :13 setosa :13 setosa :13 setosa :13 setosa :13 setosa :13 setosa :13 versicolor:11 versicolor:10 versicolor: 9 versicolor: 9 versicolor: 9 versicolor:10 versicolor:10 virginica : 9 virginica :10 virginica :11 virginica :11 virginica :11 virginica :10 virginica :10 15 17 19 21 setosa :13 setosa :13 setosa :13 setosa :13 versicolor:11 versicolor:11 versicolor:10 versicolor:11 virginica : 9 virginica : 9 virginica :10 virginica : 9 # 检查knn的准确性。# 错误1在这里。con_mat <- confusionMatrix(table(knn_class, train.labels))# 错误2在这里。mean(knn_class == train.labels) # 成功率
任何帮助将不胜感激。
回答:
第一个问题是你使用训练标签来比较结果,这导致了不同的大小。KNN类是一个25行11列的矩阵。你需要用测试标签来比较结果。
另一个错误是你需要为每个K值创建混淆矩阵并计算准确性。以下代码解决了你的问题:
accuracy <- c()con_mat <- list()for(i in 1:ncol(knn_class)) #遍历列{ con_mat[[i]] <- table(knn_class[,i], test.labels) #获取混淆矩阵 accuracy = c(accuracy,mean(knn_class[,i] == test.labels)) #获取准确性 }