我一直在使用caret::createDataPartition(),以分层的方式分割数据。现在我正在尝试另一种我在堆栈中找到的方法,那就是splitstackshape::stratified(),我之所以对它有兴趣,是因为它允许根据我手动选择的特性进行分层,非常方便。
我对数据的分割有问题:
library(splitstackshape)
set.seed(40)
Train = stratified(Data, c('age','gender','treatment_1','treatment_2','cancers'), 0.75)这就产生了火车,但是我如何得到测试集呢?我不明白。我厌倦了createDataPartition的方式:
INDEX = stratified(Data, c('age','gender','treatment_1','treatment_2','cancers'), 0.75)
Train = Data[INDEX , ]
Test = Data[-INDEX ,]但这是行不通的,因为stratified创建了一个实际的火车数据,而不是一个索引。
那么,如何使用此函数获取测试数据呢?谢谢!
发布于 2022-11-25 13:19:23
如果向数据添加唯一的顺序行标识符,则可以使用该标识符提取未为培训数据帧选择的行,如下所示。我们将使用mtcars作为一个可重复的示例。
library(splitstackshape)
set.seed(19108379) # for reproducibility
# add a unique sequential ID to track rows in the sample, using mtcars
mtcars$rowId <- 1:nrow(mtcars)
# take a stratified sample by cyl
train <- stratified(mtcars,"cyl",size = 0.6)
test <- mtcars[!(mtcars$rowId %in% train$rowId),]
nrow(train) + nrow(test) # should add to 32 ...and输出:
> nrow(train) + nrow(test) # should add to 32
[1] 32下一层细节..。
stratified()函数根据传递给该函数的by组提取一组行。通过添加一个rowId字段,我们可以跟踪训练数据中包含的观测结果。
> # list the rows included in the sample
> train$rowId
[1] 6 11 10 4 3 27 18 8 9 21 28 23 17 16 29 22 15 7 14
> nrow(train)
[1] 19然后使用提取操作符创建测试数据框架!接线员:
> # illustrate the selection criteria used to extract rows not in the training data
> !(mtcars$rowId %in% train$rowId)
[1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE
[15] FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE
[29] FALSE TRUE TRUE TRUE
> 最后,我们在给定选择标准的情况下,计算测试数据框架中包含的行数,这应该等于32-19或13:
> # count rows to be included in test data frame
> sum(!(mtcars$rowId %in% train$rowId)) # should add to 13
[1] 13与bothSets参数的比较
另一个答案是,stratified()函数包括一个参数bothSets,它生成一个包含采样数据和其余数据的列表。我们可以如下所示演示这两种方法的等价性。
# alternative answer: use the package's bothSets argument
set.seed(19108379)
sampleData <- stratified(mtcars,"cyl",size = 0.6,bothSets = TRUE)
# compare rowIds in test vs. SAMP2 data frames
sampleData$SAMP2$rowId
test$rowId...and输出:
> sampleData$SAMP2$rowId
[1] 1 2 5 12 13 19 20 24 25 26 30 31 32
> test$rowId
[1] 1 2 5 12 13 19 20 24 25 26 30 31 32
> 最后的评论
需要注意的是,caret::createDataPartition()根据因变量的值拆分数据,因此training和test分区在因变量的值之间具有相同的表示形式。
相反,stratified()根据一个或多个特征的组合(即自变量)进行分区。基于自变量的分区有可能在整个训练和测试分区中引入因变量值的分布的变异性。也就是说,在训练分区中,因变量值的分布可能与测试分区中的因变量分布有显着性差异。
发布于 2022-11-25 13:24:30
如果希望将其保存在包中,只需添加bothSets即可。
library(splitstackshape)
stratified(mtcars,"am",size=0.75,bothSets=T)返回两个示例的列表。
https://stackoverflow.com/questions/74573270
复制相似问题