R语言实现决策树时如何按比例划分训练测试集?sample.split参数疑问
问题解答
1. sample.split函数SplitRatio参数作用
你之前的理解完全错误,caTools包中sample.split的SplitRatio参数指的是训练集样本数占你传入的数据集总样本数的比例,和决策树的预测准确率没有任何关系。这个函数默认采用分层抽样逻辑,会根据你传入的标签列(这里是study.Diagnosis)的类别分布做拆分,保证训练集、测试集的标签占比和原数据集一致,避免数据偏移。
2. 作业要求的正确操作
你的现有代码逻辑完全不符合要求:你先从全量数据中随机抽了50行作为拆分的母集,又把SplitRatio设为0.9,最终得到的是45条训练集、5条测试集,训练测试比为90:10,和要求的50:50完全不符。
作业要求的4种拆分比例,直接对应SplitRatio的参数值即可,不需要提前手动截取固定行数的数据集,对应关系如下:
- 训练集:测试集=50:50 →
SplitRatio = 0.5 - 训练集:测试集=75:25 →
SplitRatio = 0.75 - 训练集:测试集=25:75 →
SplitRatio = 0.25 - 训练集:测试集=85:15 →
SplitRatio = 0.85
3. 结果波动大的原因
你观测到的结果大幅变化是正常现象:
- 你提前截取50条数据作为母集时,样本量太小,数据波动本身就很大,模型训练结果不稳定
- 修改
SplitRatio会直接改变训练集的样本量,模型拟合的数据源发生变化,输出结果自然会有差异 - 用全量数据集时,样本量足够大,特征和标签的分布更接近真实情况,和小样本子集的训练结果存在差异属于正常情况
4. 正确代码示例(以50:50拆分为例)
#--------------------------------- # Ratio 50 Train : 50 Test #--------------------------------- set.seed(1) # 固定随机种子保证结果可复现 # 直接基于全量数据集拆分,不需要提前截取子集 spl = sample.split(cancerdata$study.Diagnosis, SplitRatio = 0.5) dataTrain = subset(cancerdata, spl==TRUE) dataTest = subset(cancerdata, spl==FALSE) # 模型训练 m5050 <- J48(as.factor(study.Diagnosis)~., dataTrain) summary(m5050) # 模型可视化 if(require("partykit", quietly = TRUE)) plot(m5050) # 测试集预测与混淆矩阵计算 dataTest.pred <- predict(m5050, newdata = dataTest) table(dataTest$study.Diagnosis, dataTest.pred)
其余三种比例只需要替换SplitRatio的参数值即可,其余代码逻辑不变。如果作业要求固定母集样本量,可以先统一从全量数据中抽固定行数的数据集作为母集,再按上述比例拆分即可。
内容的提问来源于stack exchange,提问作者cocoakrispies93
相关产品推荐
相关产品推荐

