模型堆叠算法

机器算法验证 r 模型选择 集成学习
2022-04-13 12:31:56

我正在尝试堆叠方法,看看它是否能改善我的结果,但在使用一些 R 包之前,我决定自己编写代码。这是我正在做的伪代码:

train.all = getTrain()

# separate 20% of data to test the stacked model
test.meta.idx = sample(nrow(train.all), floor(nrow(train.all)*0.2))
test.meta = train.all[test.meta.idx, ]

# remove these from train.all
train.all = train.all[-test.meta.idx, ]

# generate folds for cross-validation
k = 10
folds = generateFolds(k)

# dataset to store base learners predictions
train.meta = data.frame()

for (i in 1:k) {
   train.idx = folds[[1]]$train
   test.idx = folds[[i]]$test

   train = train.all[train.idx, ]
   test = train.all[test.idx, ]

   # train models
   model1 = fitmodel1(formula, train)
   model2 = fitmodel2(formula, train)
   model3 = fitmodel3(formula, train)

  # get model outputs
  y1 = predict(model1, test)
  y2 = predict(model2, test)
  y3 = predict(model3, test)

  y.obs = test$y

  # append to meta train.meta
  train.meta = rbind(train.meta, c(y.obs, y1, y2, y3))
}

现在我可以使用 train.meta 来拟合不同的模型,这将根据来自模型 1、模型 2 和模型 3 预测的输入给出最终结果。但是,我该如何测试呢?对于每个折叠适合不同的模型 1、模型 2 和模型 3,所以我将有 10 个不同的模型 1、模型 2 和模型 3。

  1. 我应该使用整个训练数据重新调整基础学习器吗?
  2. 可以使用拟合的基础学习器值来训练元模型吗?

感谢您的任何建议!

1个回答

如果我正确理解了您的伪代码,我看不到在交叉验证循环中测试堆叠模型的位置。我希望看到类似的东西

model4 = fitmodel4(model1, model2, model3, train)
y4 = predict(model4, test)

与使用交叉验证预测误差(例如神经网络的节点数、回归的自变量和潜在转换)调整基本模型的超参数类似,在交叉验证中也会调整堆叠模型的超参数环形

至于你的问题:

  1. 是的,最终的基础学习者使用整个训练数据进行拟合
  2. 是的。堆叠模型将使用最终基础学习器的输出。过度拟合与模型复杂性有关,而不是在更多数据上进行训练。