我有一个大型数据集,并且喜欢为每个城市设置不同的逻辑回归,这是我数据中的一列。以下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时,我将对每个城市进行逻辑回归(我知道如果我有火车数据,该怎么做)
答案 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)、训练和测试都具有大致相同的类分布!