从同一样本中获取不同的测试和训练集

时间:2017-11-14 14:59:03

标签: r linear-regression

我有一些数据,我想比较一些不同的线性模型。我可以使用caTools::sample.split()来获得一个培训/测试集。

如果我使用同一样本中的不同训练/测试集,我想看看该模型将如何改变。如果我不使用set.seed(),每次拨打sample.split时,我都应该使用不同的设置。

我正在使用lapply来调用该函数一定次数:

library(data.table)
library(caTools)
dat <- as.data.table(iris)
dat_list <- lapply(1:20, function(z) {
  sample_indices <- sample.split(dat$Sepal.Length, SplitRatio = 3/4)
  inter <- dat
  inter$typ <- "test"
  inter$typ[sample_indices] <- "train"
  inter$set_no <- z
  return(as.data.table(inter))})

用于比较系数:

coefs <- sapply(1:20, function(z){
  m <- lm(Sepal.Length ~ Sepal.Width, data = dat_list[[z]][typ == "train"])
  return(unname(m$coefficients))
})

在预测测试集(typ=="test")中的值时,可以编辑最后几行以返回RMS错误。

我想知道是否有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

  

我有兴趣有效地分割数据(我的实际数据集非常大)

我是数据框列表的主要提倡者,但在列表中复制数据没有意义 - 特别是如果数据量很大,则不需要20个数据副本才能拥有20个列车 - 测试分裂。

相反,只需存储列车和测试集的索引,并为模型提供适当的子集。

n = 5
train_ind = replicate(n = n, sample(nrow(iris), size = 0.75 * nrow(iris)), simplify = FALSE)
test_ind = lapply(train_ind, function(x) setdiff(1:nrow(iris), x))

# then modify your loop to subset the right rows
coefs <- sapply(seq_len(n), function(z) {
  m <- lm(Sepal.Length ~ Sepal.Width, data = iris[train_ind[[z]], ])
  return(m$coefficients)
})

参数化多次使用的任何东西也很好。如果您想要更改为20个重复项,请设置代码,以便更改顶部的n = 20,并且不必在每次使用5将其更改为“{1}}时查看整个内容20。拔出split_ratio = 0.75并将它放在顶部的自己的行上可能会很好,即使它只使用过一次。