我正在尝试在80/20中拆分数据集 - 培训和测试集。我试图按位置进行拆分,这是一个有4个级别的因素,但是每个级别都没有被平均采样。在1892个样本中 -
位置1:172
地点2:615
位置3:603
位置4:502
我正在尝试拆分整个数据集80/20,如上所述,但我还希望将每个位置拆分为80/20,以便从训练和测试集中的每个位置获得均匀的比例。我使用stratified
包中的splitstackshape
函数看过一篇关于此内容的帖子,但它似乎并不想将我的因素分开。
这是一个简化的可重现的例子 -
x <- c(1, 2, 3, 4, 1, 3, 7, 4, 5, 7, 8, 9, 4, 6, 7, 9, 7, 1, 5, 6)
xx <- c("A", "A", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D")
df <- data.frame(x, xx)
validIndex <- stratified(df, "xx", size=16/nrow(df))
valid <- df[-validIndex,]
train <- df[validIndex,]
其中A
,B
,C
,D
对应于实际数据集的近似比例因子(~10,32,32和26%) ,分别)
答案 0 :(得分:1)
使用bothSets
应该返回一个列表,其中包含原始数据框的划分为验证和训练集(其联合应该是原始数据框):
splt <- stratified(df, "xx", size=16/nrow(df), replace=FALSE, bothSets=TRUE)
valid <- splt[[1]]
train <- splt[[2]]
## check
df2 <- as.data.frame(do.call("rbind",splt))
all.equal(df[with(df, order(xx, x)), ],
df2[with(df2, order(xx, x)), ],
check.names=FALSE)