我正在尝试使用 iris 数据集执行 knn,其中 k 的多个奇数值在 1 - 21(含)之间。组合所有 knn 并仍然收到正确结果的正确方法是吗?另外,我将如何创建结果的混淆矩阵并检查准确性?
创建混淆矩阵和检查准确性时出现以下错误...
ERROR 1: Error in table(knn_class, train.labels) : all arguments must have the same length
ERROR 2: In
==.default
(knn_class, train.labels) : longer object length is not a multiple of shorter object length
当我使用多个 k 执行 knn 时,train.labels
小于 knn_class
但我不明白如何解决。
这是到目前为止我的代码...
library(class)
data(iris)
# Generate a random sample that is 2/3 of the total number of rows in dataset.
ran <- sample(2, nrow(iris), replace=TRUE, prob=c(0.80, 0.20))
ran
# Compose training labels
train.labels <- iris[ran==1, 5]
# Compose test labels
test.labels <- iris[ran==2, 5]
# Compose training set.
training <- iris[ran==1, 1:4]
data_train <- cbind(train.labels,training)
# Compose test set.
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
# Checking Accuracy of knn.
# Error 1 here.
con_mat <- confusionMatrix(table(knn_class, train.labels))
# Error 2 here.
mean(knn_class == train.labels) # success rate
如有任何帮助,我们将不胜感激。
最佳答案
第一个问题是您正在使用训练标签来比较您的结果,这会给您带来不同的尺寸。 KNN 类是一个 25 行到 11 列的矩阵。您需要将结果与测试标签进行比较。
另一个错误是您需要创建混淆矩阵并获取每个 K 值的准确性。此代码解决了您的问题:
accuracy <- c()
con_mat <- list()
for(i in 1:ncol(knn_class)) #iterating over columns
{
con_mat[[i]] <- table(knn_class[,i], test.labels) #geting the confusion matrix
accuracy = c(accuracy,mean(knn_class[,i] == test.labels)) #geting the accuracy
}
关于r - 对R中k在1到21之间的所有奇数值进行knn分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59589482/