有没有办法将数据拆分成列车并进行测试,以便测试数据中的所有分类预测变量组合都出现在训练数据中?如果无法根据为测试和列车大小指定的比例拆分数据,那么这些级别不应包含在测试数据中。
说我有这样的数据:
SAMPLE_DF <- data.frame("FACTOR1" = c(rep(letters[1:2], 8), "g", "g", "h", "i"),
"FACTOR2" = c(rep(letters[3:5], 2,), rep("z", 3), "f"),
"response" = rnorm(10,10,1),
"node" = c(rep(c(1,2),5)))
> SAMPLE_DF
FACTOR1 FACTOR2 response node
1 a c 10.334690 1
2 b d 11.467605 2
3 a e 8.935463 1
4 b c 10.253852 2
5 a d 11.067347 1
6 b e 10.548887 2
7 a z 10.066082 1
8 b z 10.887074 2
9 a z 8.802410 1
10 b f 9.319187 2
11 a c 10.334690 1
12 b d 11.467605 2
13 a e 8.935463 1
14 b c 10.253852 2
15 a d 11.067347 1
16 b e 10.548887 2
17 g z 10.066082 1
18 g z 10.887074 2
19 h z 8.802410 1
20 i f 9.319187 2
在测试数据中,如果有a
c
的因子1和2的组合,那么这也将在列车数据中。所有其他可能的组合也是如此。
createDataPartition为一个级别执行此操作,但我希望它适用于所有级别。
答案 0 :(得分:2)
您可以尝试使用dplyr删除仅出现一次的组合,因此只会在训练或测试集中结束,然后使用CreateDataPartition
进行拆分:
数据强>
SAMPLE_DF <- data.frame("FACTOR1" = rep(letters[1:2], 10),
"FACTOR2" = c(rep(letters[3:5], 2,), rep("z", 4)),
"num_pred" = rnorm(10,10,1),
"response" = rnorm(10,10,1))
在下面使用dplyr
来计算factor1和factor2的组合数。如果其中任何一个为1,那么你将它们过滤掉:
library(dplyr)
mydf <-
SAMPLE_DF %>%
mutate(all = paste(FACTOR1,FACTOR2)) %>%
group_by(all) %>%
summarise(total=n()) %>%
filter(total>=2)
以上仅保留因子1和2的组合至少出现两次
您可以根据以上保留的组合从SAMPLE_DF
中删除行:
SAMPLE_DF2 <- SAMPLE_DF[paste(SAMPLE_DF$FACTOR1,SAMPLE_DF$FACTOR2) %in% mydf$all,]
最后你让createDataPartition
为你做分裂:
library(caret)
IND_TRAIN <- createDataPartition(paste(SAMPLE_DF2$FACTOR1,SAMPLE_DF2$FACTOR2))$Resample
#train set
A <- SAMPLE_DF2[ IND_TRAIN,]
#test set
B <- SAMPLE_DF2[-IND_TRAIN,]
>identical(sort(paste(A$FACTOR1,A$FACTOR2)) , sort(paste(B$FACTOR1,B$FACTOR2)))
[1] TRUE
正如您在同一行看到的那样,组合完全相同!