【发布时间】:2018-11-23 07:23:58
【问题描述】:
我见过很多方法可以通过单个变量对样本进行分层以用于交叉验证。 caret 包通过 createFolds() 函数很好地做到了这一点。默认情况下,caret 似乎会进行分区,使得每个折叠都具有大致相同的目标事件率。
我想做的是按目标速率和时间进行分层。我找到了一个可以部分执行此操作的函数,它是 splitstackshape 包并使用 stratified() 函数。该函数的问题在于它返回单个样本,它不会在给定条件下将数据分成 k 个组。
这里有一些要重现的虚拟数据。
set.seed(123)
time = rep(seq(1:10),100)
target = rbinom(n=100, size=1, prob=0.3)
data = as.data.frame(cbind(time,target))
table(data$time,data$target)
0 1
1 60 40
2 80 20
3 80 20
4 60 40
5 80 20
6 80 20
7 60 40
8 60 40
9 70 30
10 80 20
如您所见,目标事件发生率随时间变化。在时间 1 中为 40%,在时间 2 中为 20%,等等。我想在创建用于交叉验证的折叠时保留它。如果我理解正确,插入符号将按整体事件率进行划分。
table(data$target)
0 1
710 290
这个约 30% 的比率将总体上保留,但随着时间的推移目标事件率不会。
我们可以得到一个这样的样本:
library(splitstackshape)
train.index <- stratified(data,c("target","time"),size=.2)
我需要再重复 4 次以进行 5 倍交叉验证,并且需要这样做,以便一旦分配了一行,就不能再次分配它。我觉得应该已经为此设计了一个功能。有什么想法吗?
【问题讨论】:
标签: r partitioning cross-validation r-caret