超级学习器对样本外测试集的预测结果

3
在R中,SuperLearner包在交叉验证的每个折叠中使用SL.predict返回训练集中所有观测值的预测值,并返回加权不同基础算法以构成SuperLearner算法的系数(coef)。但我无法弄清如何使用该包来获取超出样本测试集的预测值。例如,下面是他们manual中的玩具示例。我唯一修改的是在末尾添加了一个保留测试集X2和Y2。如何根据训练集中的SuperLearner模型估计这个超出样本测试集的预测值?如何保存模型结果,以便我可以基于同一模型在未来估计预测值?
library(SuperLearner)


set.seed(23432)
## training set
n <- 500
p <- 50
X <- matrix(rnorm(n*p), nrow = n, ncol = p)
colnames(X) <- paste("X", 1:p, sep="")
X <- data.frame(X)
Y <- X[, 1] + sqrt(abs(X[, 2] * X[, 3])) + X[, 2] - X[, 3] + rnorm(n)
# build Library and run Super Learner
SL.library <- c("SL.glm", "SL.randomForest", "SL.gam", "SL.polymars", "SL.mean")
## Not run:
test <- CV.SuperLearner(Y = Y, X = X, V = 10, SL.library = SL.library,
  verbose = TRUE, method = "method.NNLS")
test
summary(test)
# Look at the coefficients across folds
coef(test)
## End(Not run)

###Added Test Set
X2 <- matrix(rnorm(n*p), nrow = n, ncol = p)
colnames(X2) <- paste("X", 1:p, sep="")
X2 <- data.frame(X2)
Y2 <- X2[, 1] + sqrt(abs(X2[, 2] * X2[, 3])) + X2[, 2] - X2[, 3] + rnorm(n)
2个回答

3

在使用SuperLearner对象时,您可以使用predict方法进行预测。不过在此之前需要将模型估算在全部数据上(而CV.SuperLearner会将模型估算在数据的多个子集上,而非整个数据集)。

r <- SuperLearner(Y = Y, X = X, SL.library = SL.library, verbose = TRUE, method = "method.NNLS")
plot( Y2 ~ predict(r, newdata=X2)$pred )

我对SuperLearner的优势的理解是,它基于训练集中v折交叉验证的外部样本表现来加权基础算法。如果您不使用CV.SuperLearner将训练集分成多个折,则无法实现该功能。 - Michael
2
当你调用“SuperLearner”时,交叉验证将自动完成:所有算法都在“V”折上运行,结果用于计算权重,然后所有算法都在整个数据集上运行,并相应地加权它们的预测。如果你想要衡量整个算法在你的数据上的表现,则“CV.SuperLearner”添加了另一层交叉验证。 - Vincent Zoonekynd
谢谢,重新阅读手册后我现在明白了SuperLearner函数的默认值是V = 10,在cvControl参数的默认值中指定。 - Michael

1

通过在CV.SuperLearner过程中使用保留样本,可以轻松实现。在此过程中,使用交叉验证方法对训练有素的SuperLearner进行评估。希望这能有所帮助。 -Remko-


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接