【问题标题】:Caret - creating stratified data sets based on several variablesCaret - 基于多个变量创建分层数据集
【发布时间】:2019-07-01 03:53:11
【问题描述】:

在 R 包 caret 中,我们能否使用函数 createDataPartition()(或用于交叉验证的 createFolds())基于多个变量创建分层训练和测试集?

这是一个变量的示例:

#2/3rds for training
library(caret)
inTrain = createDataPartition(df$yourFactor, p = 2/3, list = FALSE)
dfTrain=df[inTrain,]
dfTest=df[-inTrain,]

在上面的代码中,训练集和测试集按“df$yourFactor”分层。但是是否可以使用多个变量(例如“df$yourFactor”和“df$yourFactor2”)进行分层?以下代码似乎可以工作,但我不知道它是否正确:

inTrain = createDataPartition(df$yourFactor, df$yourFactor2, p = 2/3, list = FALSE)

【问题讨论】:

  • 创建这些“分层数据集”的目标是沿结果变量拆分数据。除非您试图获得两个变量的结果,否则我不知道这是否是个好主意。
  • 你签入MLR包了吗?
  • @NelsonGon,这并不总是目标。人们可能还想对其他事情进行分层。例如,我不希望我的测试集与我的训练集根本不同,例如所有非常年轻的人,而我的训练集具有均匀分布的年龄,包括年轻人。

标签: r r-caret


【解决方案1】:

如果您使用tidyverse,这相当简单。

例如:

df <- df %>%
  mutate(n = row_number()) %>% #create row number if you dont have one
  select(n, everything()) # put 'n' at the front of the dataset
train <- df %>%
  group_by(var1, var2) %>% #any number of variables you wish to partition by proportionally
  sample_frac(.7) # '.7' is the proportion of the original df you wish to sample
test <- anti_join(df, train) # creates test dataframe with those observations not in 'train.'

【讨论】:

  • 太棒了!这正是我一直在寻找的!
  • 很实用很整洁;)
  • 有没有办法用这种方法做类似设置种子的事情?
【解决方案2】:

有更好的方法来做到这一点。

set.seed(1)
n <- 1e4
d <- data.frame(yourFactor = sample(1:5,n,TRUE), 
                yourFactor2 = rbinom(n,1,.5),
                yourFactor3 = rbinom(n,1,.7))

分层指标

d$group <- interaction(d[, c('yourFactor', 'yourFactor2')])

样本选择

indices <- tapply(1:nrow(d), d$group, sample, 30 )

获取子样本

subsampd <- d[unlist(indices, use.names = FALSE), ]

这样做是在yourFactoryourFactor2 的每个组合上生成一个大小为 30 的随机分层样本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多