无法使用 R 中的 createDataPartition 创建完全相等的数据分区 - 分别获得 1396 和 1398 个观察值,但需要 1397 个

Unable to create exactly equal data partitions using createDataPartition in R- getting 1396 and 1398 observations each but need 1397

我对 R 非常熟悉,但从来没有这种要求,我需要在 R 中使用 createDataPartition 随机创建完全相等的数据分区。

index = createDataPartition(final_ts$SAR,p=0.5, list = F)
final_test_data = final_ts[index,]
final_validation_data = final_ts[-index,]

此代码创建两个数据集,大小分别为 1396 和 1398 个观测值。

我很惊讶为什么 p=0.5 没有做它应该做的事情。它与默认情况下没有奇数个观测值的结果数据集有关吗? 提前致谢!

这与响应变量的案例数有关(final_ts$SAR在你的案例中)。

例如:

y <- rep(c(0,1), 10)
table(y)
y
0  1 
10 10 
# even number of cases

现在我们分开:

train <- y[caret::createDataPartition(y, p=0.5,list=F)]
table(train) # we have 10 obs 
train
0 1 
5 5 

test <- y[-caret::createDataPartition(y, p=0.5,list=F)]
table(test) # we have 10 obs.
test
0 1 
5 5 

如果我们用奇数个案例代替构建和示例:

y <- rep(c(0,1), 11)
table(y)
y
0  1 
11 11 

我们有:

train <- y[caret::createDataPartition(y, p=0.5,list=F)]
table(train) # we have 12 obs.
train
0 1 
6 6 

test <- y[-caret::createDataPartition(y, p=0.5,list=F)]
table(test) # we have 10 obs.
test
0 1 
5 5 

更多信息here

这是另一个线程,它解释了为什么从 createDataPartition 编辑的数字 return 对我们来说可能看起来是 "off" 但不是根据此函数试图做的事情。 因此,这取决于您在 final_ts$SAR 中拥有的内容以及数据的传播。 如果它是分类值,例如:T 和 F,如果您总共有 100 个,55 个是 T,45 个是 F。当您在代码中调用方法时,它将 return 你 51 因为: 55*0.5=27.5, 45*0.5=22.5, 四舍五入, 28+23=51.

当你想拆分的值是数字时,你可以参考下面的线程,它对此有很好的解释。

R - caret createDataPartition returns more samples than expected