在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
相关产品推荐
相关产品推荐

