【发布时间】:2013-05-05 19:50:00
【问题描述】:
我编写了一个小函数来将我的数据集划分为训练集和测试集。但是,我在处理因子变量时遇到了麻烦。在我的代码的模型验证阶段,如果模型建立在一个没有来自每个因子级别的表示的数据集上,我会收到错误消息。如何修复此 partition() 函数以包含来自因子变量每个级别的至少一个观察值?
test.df <- data.frame(a = sample(c(0,1),100, rep = T),
b = factor(sample(letters, 100, rep = T)),
c = factor(sample(c("apple", "orange"), 100, rep = T)))
set.seed(123)
partition <- function(data, train.size = .7){
train <- data[sample(1:nrow(data), round(train.size*nrow(data)), rep= FALSE), ]
test <- data[-as.numeric(row.names(train)), ]
partitioned.data <- list(train = train, test = test)
return(partitioned.data)
}
part.data <- partition(test.df)
table(part.data$train[,'b'])
table(part.data$test[,'b'])
编辑 - 使用“caret”包和 createDataPartition() 的新函数:
partition <- function(data, factor=NULL, train.size = .7){
if (("package:caret" %in% search()) == FALSE){
stop("Install and Load 'caret' package")
}
if (is.null(factor)){
train.index <- createDataPartition(as.numeric(row.names(data)),
times = 1, p = train.size, list = FALSE)
train <- data[train.index, ]
test <- data[-train.index, ]
}
else{
train.index <- createDataPartition(factor,
times = 1, p = train.size, list = FALSE)
train <- data[train.index, ]
test <- data[-train.index, ]
}
partitioned.data <- list(train = train, test = test)
return(partitioned.data)
}
【问题讨论】:
-
我知道这并不能回答您的问题,但是以如此少量的观察值作为因子变量的条件甚至是一个好主意吗?这些估计肯定会非常不精确,并且可能会使您的样本外预测变得更糟而不是更好。
-
你说得对,这是一个坏主意。但是,在实践中,我永远不会在这么小的数据集上使用这个函数。我把它变小了,这样分区的 test.df 几乎可以保证有一些观察值为 0 的因素。
-
我有同样的问题,但似乎第二个
partition函数定义一次只适用于一个因素。我理解您的问题是关于在train数据集中有一个分区,其中包含输入列的所有级别的因素:b和c,但createDataPartition仅适用于一列,例如:partition(test.df, factor = test.df[, c("b", "c")])不工作。
标签: r statistics partitioning factors categorical-data