在 R 中重新采样训练和测试数据

数据挖掘 机器学习 r 自举
2022-03-07 15:45:49

我需要尝试几种不同的机器学习方法(SVM、Logistic 回归等),预测一个值是真还是假,并写下它们的 AUC 和这些预测的准确性。我已经成功地做到了,现在我有两个矩阵,一个用于 AUC,一个用于准确度,它们填充了来自 SVM 和逻辑回归的数据(一行)。

现在我需要再为 SVM 和逻辑回归创建 10 次模型(我应该使用自举抽样),并且我应该有 10 行我的 AUC 和准确度数据。我已经阅读了多篇文章和指南/教程,但是我不知道如何实现这一点。我还找到并尝试了几个库(一个是 ROSE,另一个是引导),但没有一个对我有用。因为如果我正确理解了分配,我需要从我的数据集中获取 10 个不同的样本,然后将数据分离到训练集中和测试集中,这样我就可以比较模型 AUC 和准确性,看看这些模型实际上有多好。

就像我说的那样,我找到了多个来源,我想出的最好的事情是:

 for (i in 1:10){
      set.seed(123)
      ##########################
      ##########################
      boot.sample = sample(n, 1000, replace = TRUE)
      bootSample = dataset[boot.sample, ]
      bootSample
    
      split = sample.split(bootSample$blueWins, SplitRatio= 0.80)
      training = subset(bootSample, split == TRUE,  replace=TRUE)
      test = subset(bootSample, split == FALSE,  replace=TRUE)
      print(training)
}

但是通过这种方法,我认为 set.seed 会搞砸一切,因为它每次都使用相同的数据。但是我认为评估希望我为每个机器学习模型使用相同的种子。

我可能把整个事情复杂化了,我是 R 的新手。

希望有人能把这些事情弄清楚。谢谢

2个回答

尝试为每个循环使用不同的种子。你可以这样做。

my_seeds <- c(1:10) # These are 10 seeds, 1, 2, 3...10. Change to whatever.     
for (i in 1:10){
          set.seed(my_seeds[i])
          ##########################
          ##########################
          boot.sample = sample(n, 1000, replace = TRUE)
          bootSample = dataset[boot.sample, ]
          bootSample
        
          split = sample.split(bootSample$blueWins, SplitRatio= 0.80)
          training = subset(bootSample, split == TRUE,  replace=TRUE)
          test = subset(bootSample, split == FALSE,  replace=TRUE)
          print(training)
    }

您可以在循环外设置一次种子:

set.seed(123)
 for (i in 1:10){
      
      ##########################
      ##########################
      boot.sample = sample(n, 1000, replace = TRUE)
      bootSample = dataset[boot.sample, ]
      bootSample
    
      split = sample.split(bootSample$blueWins, SplitRatio= 0.80)
      training = subset(bootSample, split == TRUE,  replace=TRUE)
      test = subset(bootSample, split == FALSE,  replace=TRUE)
      print(training)
}