16

我有一个大型数据集,并且喜欢为每个城市(我的数据中的列之一)拟合不同的逻辑回归。以下 70/30 拆分在不考虑城市组的情况下工作。

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 时尚,我将为每个城市运行逻辑回归(一旦我有了训练数据,我就知道该怎么做)

4

5 回答 5

42

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

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

它也可以用于分层 K 折叠,例如:

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

查看插入符号文档以获取更多详细信息

于 2015-05-12T03:44:19.163 回答
13

该包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)
于 2019-10-02T03:24:39.197 回答
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]], ]

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

于 2013-12-25T21:42:12.743 回答
0

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

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

然后在城市索引的向量上运行 sapply。

于 2013-12-26T04:38:23.053 回答
0

另一种可能的方式,类似于 IRTFM 的回答(例如,仅使用 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)、训练和测试都具有大致相同的类分布!

于 2021-03-04T09:41:33.707 回答