0

我正在尝试对数据拆分(训练集、验证集和测试集)进行分配,以找到最合适的分类器——在本例中为 k,因为我使用的是 k-最近邻(kknn 函数,kernlab 的一部分)包裹)。但是,当我使用下面的初始代码来随机化数据拆分过程并运行 for 循环以确定最准确的 k 值时,每次运行循环时都没有得到一致的 k 值。数字到处都是。我是否正确分区了我的数据?我在上一篇文章中因为没有生成最小可重现示例 (MRE) 而得到纠正,所以这是我尝试提供 MRE 代码的尝试:


#split data set into three groups, using "random" process in order to try to eliminate bias:
#currently an 80-10-10 split
#'data' in the code represents a data.frame with well over 100 data points

idx <- sample(seq(1, 3), size = nrow(data), replace = TRUE, prob = c(.8, .1, .1))
data_train <- data[idx == 1,] #training set
data_test <- data[idx == 2,] #test set
data_valid <- data[idx == 3,] #validation set

#Here is how I initialize my list to store the accuracy values for each k:

kknn_acc_list = list()

#Here is my for loop to test validation set:

for(i in 1:100){
  model_KNN <-kknn(V5~., data_train, data_valid, k = i, scale = TRUE)
  pred <- round(fitted(model_KNN)) == data_valid$V11  #predictions from the fitted function
  x = sum(pred) / nrow(data_valid) #accuracy measurement -- average number of predictions returned TRUE

  kknn_acc_list[[i]] = x
}

# validation set accuracy list:

kknn_acc_list

}

在将我的 unlist() 函数应用于列表以获得矩阵后,我使用 which() 和 max() 函数以最大精度确定 k 值。每次循环运行时,我都会得到各种不同的 k 值,每个值都与循环的前一次运行不同。当我为我的测试集(data_test)应用相同类型的循环时,我遇到了同样的问题。谁能帮我找到一个解决方案,以磨练特定或一组特定一致的 k 值?

4

1 回答 1

2

您需要设置一个种子以每次在同一位置开始“随机选择”,然后在循环内进行相同的计算。这很简单,就在拆分之前,set.seed(42)您可以在其中使用任何您想要的数字。

这应该使您的数据在多次运行代码时保持一致!

而且,您错误地使用了该等式。准确度不是预测为总数之一的数字......它是正确预测为 1 并且正确预测为 0 的观察次数超过观察次数。

true positive +true negatives / all observations

您可能会发现某些问题只是使用了错误的指标。但是,您现在应该习惯使用种子,它是可重复工作的必要组成部分!

于 2020-01-22T20:23:11.947 回答