我有一些数据,我想比较一些不同的线性模型。我可以使用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错误。
我想知道是否有更好的方法吗?
答案 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
并将它放在顶部的自己的行上可能会很好,即使它只使用过一次。