You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R的caret包中使用createDataPartition如何正确划分训练测试集?

问题分析与解决办法

首先,你遇到的核心问题是用错了函数+参数传递错误,才导致不管怎么调p值,训练集都固定是前2行。咱们一步步拆解:

1. 为什么会出现这个问题?

你调用createDataPartition(a1, p = .75, ...)的时候犯了两个关键错误:

  • 第一,a1这个变量根本没在代码里定义!你应该传入的是你要用来分层的列(比如test$Spalte1),但就算传对了,还有第二个问题;
  • 第二,createDataPartition是分类任务的分层抽样工具——它的作用是保证每个类别都按p的比例进入训练集。你的数据是1到10的连续数值,要是把每个数值当类别,每个类别只有1条数据,函数会触发警告里的逻辑:单样本的类别会被直接选入训练集。但你的情况是只选前2条,说明你大概率误把a1设成了一个只有两类的变量(比如前2行是一类,剩下的是另一类),这时候小类别的样本会被全部选中,导致训练集固定不变。

2. 正确的解决方式

场景1:只需要简单随机划分训练/测试集

这时候别用createDataPartition,直接用sample()函数,这才是做随机抽样的正确工具:

# 设置随机种子(可选,但能保证每次划分结果一致,方便调试)
set.seed(123)
# 抽取50%的行作为训练集,你可以把0.5改成0.75或者其他你需要的比例
inTraining <- sample(nrow(test), size = floor(nrow(test) * 0.5))
training <- test[inTraining, ]
testing <- test[-inTraining, ]

场景2:确实需要分层抽样(比如有分类变量)

那你要确保传入的是正确的分类列,比如假设你的数据里有一个叫group的分类列,就这么写:

inTraining <- createDataPartition(test$group, p = 0.5, list = FALSE)
training <- test[inTraining, ]
testing <- test[-inTraining, ]

这样每个分类组都会按p的比例抽取样本,不会再出现固定选前几行的问题。

内容的提问来源于stack exchange,提问作者Kai Schröder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:34:11