分层分割数据

时间:2013-12-25 21:24:18

标签: r split logistic-regression

我有一个大型数据集,并且喜欢为每个城市设置不同的逻辑回归,这是我数据中的一列。以下70/30拆分工作未考虑City组。

indexes <- sample(1:nrow(data), size = 0.7*nrow(data))

train <- data[indexes,]
test <- data[-indexes,]

但这并不能保证每个城市的70/30分割。

假设我有城市A和城市B,城市A有100行,城市B有900行,共1000行。用上面的代码拆分数据将给我700列火车和300行测试数据,但它不能保证我在城市A有70行,在列车数据中有城市B有630行。我该怎么做?

一旦我将每个城市的训练数据拆分为70/30时,我将对每个城市进行逻辑回归(我知道如果我有火车数据,该怎么做)

5 个答案:

答案 0 :(得分:26)

createDataPartition包中试用caret。其文档指出:默认情况下,createDataPartition会对数据进行分层随机拆分。

library(caret)
train.index <- createDataPartition(Data$Class, p = .7, list = FALSE)
train <- Data[ train.index,]
test  <- Data[-train.index,]

它也可以用于分层K-fold,如:

ctrl <- trainControl(method = "repeatedcv",
                     repeats = 3,
                     ...)
# when calling train, pass this train control
train(...,
      trControl = ctrl,
      ...)

查看caret文档了解更多详情

答案 1 :(得分:3)

软件包splitstackshape有一个不错的功能stratified,它也可以做到这一点,但这比createDataPartition好一点,因为它可以同时使用多个列进行分层。它可以与一列一起使用,例如:

library(splitstackshape)
set.seed(42)  # good idea to set the random seed for reproducibility
stratified(data, c('City'), 0.7)

或具有多列:

stratified(data, c('City', 'column2'), 0.7)

答案 2 :(得分:1)

典型的方法是使用split

lapply( split(dfrm, dfrm$City), function(dd){
            indexes= sample(1:nrow(dd), size = 0.7*nrow(dd))
            train= dd[indexes, ]    # Notice that you may want all columns
            test= dd[-indexes, ]
            # analysis goes here
            }

如果你按照上面的尝试分步进行,那就是这样的:

cities <- split(data,data$city)

idxs <- lapply(cities, function (d) {
    indexes <- sample(1:nrow(d), size=0.7*nrow(d))
})

train <- data[ idxs[[1]], ]  # for the first city
test <-  data[ -idxs[[1]], ]

我碰巧认为这是一种笨拙的方式,但也许将其分解成小步骤可以让你检查中间值。

答案 3 :(得分:0)

你的代码工作正常,如果City是一列,只需将训练数据作为训练[,2]运行。您可以使用lambda函数轻松地为每个人执行此操作

logReg<-function(ind) {
    reg<-glm(train[,ind]~WHATEVER)
    ....
    return(val) }

然后在城市指数的矢量上运行。

答案 4 :(得分:0)

另一种可能的方法,类似于 IRTFMs 答案(例如,仅使用 base-r)是使用以下内容。请注意,此答案返回一个分层指数,可以像问题中计算的指数一样使用。

p <- 0.7
strats <- your_data$the_stratify_variable

rr <- split(1:length(strats), strats)
idx <- sort(as.numeric(unlist(sapply(rr, function(x) sample(x, length(x) * p)))))

train <- your_data[idx, ]
test <- your_data[-idx, ]

示例:

p <- 0.7
strats <- mtcars$cyl

rr <- split(1:length(strats), strats)
idx <- sort(as.numeric(unlist(sapply(rr, function(x) sample(x, length(x) * p)))))

train <- mtcars[idx, ]
test <- mtcars[-idx, ]

table(mtcars$cyl) / nrow(mtcars)
#>       4       6       8
#> 0.34375 0.21875 0.43750 

table(train$cyl) / nrow(train)
#>    4    6    8
#> 0.35 0.20 0.45 

table(test$cyl) / nrow(test)
#>         4         6         8 
#> 0.3333333 0.2500000 0.4166667 

我们看到所有数据集(mtcars)、训练和测试都具有大致相同的类分布!