【问题标题】:Random stratified sampling with different proportions不同比例的随机分层抽样
【发布时间】: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,]

其中ABCD 对应于与实际数据集大致比例的因子(分别约为 10%、32%、32% 和 26%)

【问题讨论】:

  • 也许我遗漏了一些东西,但如果您的初始数据集是随机拆分 80/20,那么您希望每个位置都拆分为 80/20。只是因为你以随机的方式去做。
  • caret 包还有一些拆分数据的功能:topepo.github.io/caret/splitting.html
  • @AntoniosK 即使数据集的比例不均匀?我认为如果不考虑比例,它会随机取 80% - 也许我错了
  • 这就是随机化的重点。随机样本应反映(近似)总体模式。您可能遇到的唯一问题是一个非常小的比例没有被选中的因素。想象一个有 8 个男孩和 2 个女孩(10 名学生)的班级,随机挑选 5 个。有机会不选择任何女孩。分层将确保您选择 1 个女孩和 4 个男孩。

标签: r random


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多