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

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. 结果波动大的原因

你观测到的结果大幅变化是正常现象:

  1. 你提前截取50条数据作为母集时,样本量太小,数据波动本身就很大,模型训练结果不稳定
  2. 修改SplitRatio会直接改变训练集的样本量,模型拟合的数据源发生变化,输出结果自然会有差异
  3. 用全量数据集时,样本量足够大,特征和标签的分布更接近真实情况,和小样本子集的训练结果存在差异属于正常情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:54:02