首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的分层数据分裂

R中的分层数据分裂
EN

Stack Overflow用户
提问于 2022-11-25 13:05:17
回答 2查看 40关注 0票数 2

我一直在使用caret::createDataPartition(),以分层的方式分割数据。现在我正在尝试另一种我在堆栈中找到的方法,那就是splitstackshape::stratified(),我之所以对它有兴趣,是因为它允许根据我手动选择的特性进行分层,非常方便。

我对数据的分割有问题:

代码语言:javascript
复制
library(splitstackshape)

set.seed(40)
Train = stratified(Data, c('age','gender','treatment_1','treatment_2','cancers'), 0.75)

这就产生了火车,但是我如何得到测试集呢?我不明白。我厌倦了createDataPartition的方式:

代码语言:javascript
复制
INDEX = stratified(Data, c('age','gender','treatment_1','treatment_2','cancers'), 0.75)
Train = Data[INDEX , ]
Test = Data[-INDEX ,]

但这是行不通的,因为stratified创建了一个实际的火车数据,而不是一个索引。

那么,如何使用此函数获取测试数据呢?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2022-11-25 13:19:23

如果向数据添加唯一的顺序行标识符,则可以使用该标识符提取未为培训数据帧选择的行,如下所示。我们将使用mtcars作为一个可重复的示例。

代码语言:javascript
复制
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输出:

代码语言:javascript
复制
> nrow(train) + nrow(test) # should add to 32 
[1] 32

下一层细节..。

stratified()函数根据传递给该函数的by组提取一组行。通过添加一个rowId字段,我们可以跟踪训练数据中包含的观测结果。

代码语言:javascript
复制
> # 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

然后使用提取操作符创建测试数据框架!接线员:

代码语言:javascript
复制
> # 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:

代码语言:javascript
复制
> # count rows to be included in test data frame 
> sum(!(mtcars$rowId %in% train$rowId)) # should add to 13
[1] 13

与bothSets参数的比较

另一个答案是,stratified()函数包括一个参数bothSets,它生成一个包含采样数据和其余数据的列表。我们可以如下所示演示这两种方法的等价性。

代码语言:javascript
复制
# 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输出:

代码语言:javascript
复制
> 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()根据因变量的值拆分数据,因此trainingtest分区在因变量的值之间具有相同的表示形式。

相反,stratified()根据一个或多个特征的组合(即自变量)进行分区。基于自变量的分区有可能在整个训练和测试分区中引入因变量值的分布的变异性。也就是说,在训练分区中,因变量值的分布可能与测试分区中的因变量分布有显着性差异。

票数 2
EN

Stack Overflow用户

发布于 2022-11-25 13:24:30

如果希望将其保存在包中,只需添加bothSets即可。

代码语言:javascript
复制
library(splitstackshape)
stratified(mtcars,"am",size=0.75,bothSets=T)

返回两个示例的列表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74573270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档