监督分类:绘制不同样本大小和 k 值的 K-NN 精度

Posted

技术标签:

【中文标题】监督分类:绘制不同样本大小和 k 值的 K-NN 精度【英文标题】:Supervised classification: plotting K-NN accuracy for different sample sizes and k values 【发布时间】:2020-09-18 20:38:10 【问题描述】:

希望你们明白,在通用数据集上复制这样的东西是很困难的。

基本上,我要做的是执行 K-NN,对七个不同的 k 值使用两种不同大小的测试和训练集。

我的主要问题是 res 应该是一个向量,存储相同训练集大小的所有准确度值,但每次迭代显示一个值,这不允许我绘制准确度图因为它们看起来是空的。

你知道如何解决这个问题吗?

数据可直接在 R 上免费获得。

data("Sonar")

#Randomization of the sample
set.seed(123)

random <- sample(rep(1:dim(Sonar)[1]))

Sonar <- Sonar[random,]
head(Sonar)


for (i in c(50,100))   #train/test set size
  sonar.train <- Sonar[1:i,-61]
  sonar.train.label <- Sonar[1:i,61]
  sonar.test <- Sonar[(1+i) :208,-61]
  sonar.test.label <- Sonar[(1+i) :208 ,61]
  res <- rep(NA,7)
  for (j in c(3,5,7,9,11,13,15))     #values of k
    mod = knn(train= sonar.train, test = sonar.test, cl = sonar.train.label, k = j) #classification for test set
    err = sum(sonar.test.label==mod) #accuracy
    res[match(j,c(3,5,7,9,11,13,15))] = err/length(mod)  #put accuracy value in vector
    print(res)
    plot(x = c(3,5,7,9,11,13,15) ,y = res, type = "l" ,col = "blue", xlab = "Neighbours", ylab = "Accuracy") #plot the accuracy graphs for each of the two different train/test sets
    res <- rep(NA,7)
  
  
#output
> 
 0.6835443        NA        NA        NA        NA        NA        NA
        NA 0.6582278        NA        NA        NA        NA        NA
        NA        NA 0.6075949        NA        NA        NA        NA
        NA        NA        NA 0.6265823        NA        NA        NA
        NA        NA        NA        NA 0.5949367        NA        NA
        NA        NA        NA        NA        NA 0.5949367        NA
        NA        NA        NA        NA        NA        NA 0.5506329
 0.6759259        NA        NA        NA        NA        NA        NA
        NA 0.6111111        NA        NA        NA        NA        NA
        NA        NA 0.5648148        NA        NA        NA        NA
        NA        NA        NA 0.5833333        NA        NA        NA
        NA        NA        NA        NA 0.5925926        NA        NA
        NA        NA        NA        NA        NA 0.5740741        NA
        NA        NA        NA        NA        NA        NA 0.5740741

准确度图显示为空,并且 x 轴上的 k 有不同的标签。

感谢您阅读并帮助我!

【问题讨论】:

【参考方案1】:

绘图函数和res 的重新初始化应该在内循环之外,否则您将res 重置为每个内循环内的 NA 向量。

新的for循环应该如下

for (i in c(50,100))   #train/test set size
  sonar.train <- Sonar[1:i,-61]
  sonar.train.label <- Sonar[1:i,61]
  sonar.test <- Sonar[(1+i) :208,-61]
  sonar.test.label <- Sonar[(1+i) :208 ,61]
  res <- rep(NA,7)
  for (j in c(3,5,7,9,11,13,15))     #values of k
    mod = knn(train= sonar.train, test = sonar.test, cl = sonar.train.label, k = j) #classification for test set
    err = sum(sonar.test.label==mod) #accuracy
    res[match(j,c(3,5,7,9,11,13,15))] = err/length(mod)  #put accuracy value in vector
  
  plot(x = c(3,5,7,9,11,13,15) ,y = res, type = "l" ,col = "blue", xlab = "Neighbours", ylab = "Accuracy", main = paste("i =", i)) #plot the accuracy graphs for each of the two different train/test sets
  res <- rep(NA,7)

顺便说一句,我在绘图函数中添加了一个main = paste("i =", i),以便识别循环所指的迭代。


编辑

我在写完答案后才意识到@Aziz 抢占了我几秒钟:D

【讨论】:

非常感谢!我一直认为我的错误比这复杂得多。 有时会发生,不用担心:D【参考方案2】:

您的内部循环应该填充res 中的值,每次迭代一个。但是,您似乎在循环的每次迭代结束时重置了 res。这就是为什么它不保留任何以前的值。

这两行需要在内循环之外(并且在外循环内)

  plot(x = c(3,5,7,9,11,13,15) ,y = res, type = "l" ,col = "blue", xlab = "Neighbours", ylab = "Accuracy") #plot the accuracy graphs for each of the two different train/test sets
  res <- rep(NA,7)

【讨论】:

以上是关于监督分类:绘制不同样本大小和 k 值的 K-NN 精度的主要内容,如果未能解决你的问题,请参考以下文章

绘制 k-NN 错误:IndexError:索引 1 超出轴 1 的范围,大小为 1

转载K-NN算法 学习总结

如何为 k-NN 找到 k 的最佳值?

监督学习分类

k近邻算法(k-nearest neighbor,k-NN)

k近邻&kd树