【问题标题】:Get different test and training sets from the same sample从同一个样本中获取不同的测试和训练集
【发布时间】:2018-04-27 14:01:21
【问题描述】:

我有一些数据想要比较几个不同的线性模型。我可以使用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))
})

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

我想知道是否有更好的方法来做到这一点?

【问题讨论】:

  • 更好的方法是什么?多次拆分数据?比较系数?接近问题?我会说你很好,如果你对结果感到满意,那就继续吧!您可能对 k 折交叉验证感兴趣 - 它更常见并且具有相似的目标。您可以使用caret 自动完成。
  • 谢谢!我有兴趣有效地拆分数据(我的实际数据集非常大)。我也很想知道是否有以这种方式比较模型的标准方法 - 我会查找您提到的 k-fold 方法。遗憾的是,我的统计知识很差。

标签: r linear-regression


【解决方案1】:

我对有效拆分数据感兴趣(我的实际数据集非常大)

我是数据框列表的忠实拥护者,但在列表中复制数据是没有意义的 - 特别是如果它是大数据,您不需要 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 将其更改为 20 时都进行整个查找。将split_ratio = 0.75 拉出并放在顶部的自己的行中可能会很好,即使它只使用过一次。

【讨论】:

  • 好主意,我会保存索引!现在只是比较模型。
猜你喜欢
  • 2015-01-17
  • 2013-03-04
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2020-06-08
相关资源
最近更新 更多