gpt4 book ai didi

r - R中的分层数据拆分

转载 作者:行者123 更新时间:2023-12-05 03:16:40 25 4
gpt4 key购买 nike

我一直在使用 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 创建的是实际的列车数据,而不是索引。

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

最佳答案

如果您向数据添加一个唯一的连续行标识符,您可以使用它来提取未为训练数据框选择的行,如下所示。我们将使用 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

...和输出:

> nrow(train) + nrow(test) # should add to 32 
[1] 32

下一级细节...

stratified() 函数根据传递给该函数的分组提取一组行。通过添加 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

然后我们使用提取运算符通过 !运算符(operator):

> # 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

...和输出:

> 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() 根据因变量 的值拆分数据,因此训练test 分区在因变量的值之间具有相同的表示。

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

关于r - R中的分层数据拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74573270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com