如何根据中心划分训练/测试数据集?

时间:2018-12-19 19:06:42

标签: r machine-learning partitioning r-caret

我有一个包含3个预测变量(P1-P3)和1个响应变量作为结果(Response)的数据集。数据是从5个中心(200个ID)收集的。我将整个数据分为Train(70%)和Test(30%)。

  

样本数据:

ID  Centers   P1    P2  P3  Response
ID1 Center1   12    1   1   Class1
ID2 Center2   73    1   3   Class2
ID3 Center3   56    2   1   Class1
ID4 Center1   44    1   3   Class2
ID5 Center4   33    1   1   Class1
ID6 Center5   26    1   1   Class2
ID7 Center2   61    1   1   Class1
ID8 Center3   44    1   3   Class2
ID9 Center5   45    1   1   Class1

我想要对训练和测试数据集进行分区,并考虑结果变量的中心和类别,我可以写的是

library(caret)
set.seed(123)
train.index <- createDataPartition(data$Response, p = .7, list = FALSE)
train <- data[ train.index,]
test  <- data[-train.index,]

我该如何编写代码,使分区从所有中心选择数据?

1 个答案:

答案 0 :(得分:0)

也许这不是一个完美的答案,但是我遇到了类似的问题,我使用dplyr::group_bydplyr::sanple_n进行管理。我需要按组进行均衡的训练和测试,并需要一个test数据集,该数据集是我的数据的一个子集,该数据集不在train数据集中。

例如,使用著名的mtcars数据集:

library(dplyr)
mtcars %>%              # in your case your data
    group_by(cyl) %>%   # in your case Centers
    sample_n(2)         # here the numbers of the sample for each group

它变成:

train <- data %>% group_by(Centers) %>% sample_n(28)

这意味着,如果您有200行和5个中心,并且每个中心有相同数量的个人(我们称其为“平衡”),则每个组有200/5 = 40,因此{{1} }最多不超过40个。

如果每个组的数据平衡,如果我的数学没错,则可以设置为28(200/100 * 70/5),以使每个组的覆盖率达到70%。

如果组不平衡,可以不重复,可以将参数放到最小的组。

另一方面,您必须设置重复次数。

要设置测试,如果要让不在培训中的人员参加,可以执行以下操作:

sample_n

希望有帮助。