【发布时间】:2016-08-10 01:04:42
【问题描述】:
我正在尝试将数据集拆分为 80/20 - 训练和测试集。我正在尝试按位置拆分,这是一个有 4 个级别的因素,但是每个级别都没有被平均采样。在 1892 个样本中 -
位置 1:172
位置2:615
位置3:603
位置4:502
如上所述,我正在尝试将整个数据集拆分为 80/20,但我也希望将每个位置拆分为 80/20,以便我从训练和测试集中的每个位置获得均匀的比例。我已经看到一篇关于使用 splitstackshape 包中的 stratified 函数的帖子,但它似乎不想将我的因素分开。
这是一个简化的可重现示例 -
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%)
【问题讨论】:
-
也许我遗漏了一些东西,但如果您的初始数据集是随机拆分 80/20,那么您希望每个位置都拆分为 80/20。只是因为你以随机的方式去做。
-
caret包还有一些拆分数据的功能:topepo.github.io/caret/splitting.html -
@AntoniosK 即使数据集的比例不均匀?我认为如果不考虑比例,它会随机取 80% - 也许我错了
-
这就是随机化的重点。随机样本应反映(近似)总体模式。您可能遇到的唯一问题是一个非常小的比例没有被选中的因素。想象一个有 8 个男孩和 2 个女孩(10 名学生)的班级,随机挑选 5 个。有机会不选择任何女孩。分层将确保您选择 1 个女孩和 4 个男孩。