【发布时间】:2018-06-21 02:15:11
【问题描述】:
我的问题与在 caret: combine createResample and groupKFold
唯一的区别:我需要在分组后创建分层折叠(也重复 10 次),而不是自举重采样(据我所知没有分层),以便与插入符号的 trainControl 一起使用。
以下代码使用 10 倍重复的 CV,但我无法包含基于“ID”(df$ID)的数据分组。
# creating indices
cv.10.folds <- createMultiFolds(rf_label, k = 10, times = 10)
# creating folds
ctrl.10fold <- trainControl(method = "repeatedcv", number = 10, repeats = 10, index = cv.10.folds)
# train
rf.ctrl10 <- train(rf_train, y = rf_label, method = "rf", tuneLength = 6,
ntree = 1000, trControl = ctrl.10fold, importance = TRUE)
这是我的实际问题:我的数据包含许多组,每个组由 20 个实例组成,具有相同的“ID”。因此,当使用重复 10 次的 10 倍 CV 时,我在训练中得到了一个组的一些实例,而在验证集中得到了一些实例。我想避免这种情况,但总的来说,我需要对预测值进行分层分区 (df$Label)。 (具有相同“ID”的所有实例也具有相同的预测/标签值。)
在上面链接中提供和接受的答案中(请参阅下面的部分),我想我必须修改 folds2 行以包含分层的 10 倍 CV 而不是引导
folds <- groupKFold(x)
folds2 <- lapply(folds, function(x) lapply(1:10, function(i) sample(x, size = length(x), replace = TRUE)))
但不幸的是,我无法弄清楚到底是怎么回事。你能帮我解决这个问题吗?
【问题讨论】:
-
如果我理解正确,您需要带阻塞的分层 k 折 CV?你能提供一个玩具标签的例子吗?
-
是的,完全正确。我的标签是数字(浮点数) - 我在回归模式下使用随机森林。
-
带阻塞的分层重复k-fold CV(优先兼容插入符号的
train函数) -
我在提供同时包含分层和阻塞的解决方案时遇到了麻烦。可以使用百分位数对数字变量进行分层,但是当涉及到阻塞时,我能想到的最好的方法是使用阻塞组的一些汇总统计数据并据此进行分层。这样可以吗?
-
是的,那太好了! (到目前为止,我一直在使用内置的百分位数功能。)在我的情况下,分层不需要 100% 准确,一个粗略的分层就很适合。
标签: r cross-validation r-caret