如何分成列车和测试数据,确保在列车和测试中都存在相同的因素组合?

时间:2015-03-22 20:46:13

标签: r cross-validation

有没有办法将数据拆分成列车并进行测试,以便测试数据中的所有分类预测变量组合都出现在训练数据中?如果无法根据为测试和列车大小指定的比例拆分数据,那么这些级别不应包含在测试数据中。

说我有这样的数据:

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为一个级别执行此操作,但我希望它适用于所有级别。

1 个答案:

答案 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

正如您在同一行看到的那样,组合完全相同!