留一法 留一个样本
- 使用
groupKFold是否能保证每个样本所有重复在同一个 fold?groupKFold是 R 中caret包 和rsample,mlr3,tidymodels等框架下提供的一种分组交叉验证策略,其目的就是:
所有具有相同 group ID(如患者编号、样本ID) 的观测都分配到同一个 fold 中。
当你测量一个病人 A 3 次(重复测量),你会给这 3 行数据加上一个相同的 group_id(例如 "A")。groupKFold 只对 group_id 进行分组划分,不是对每一行数据划分。
📌 LOOCV 特点:
- 一共进行 n 次训练(n 是样本数);
- 每次训练使用 个样本;
- 验证集每次只包含 一个样本;
- 结果对数据划分不敏感(几乎无随机性);
- 但训练次数多,计算开销大;
- 不适合高方差模型(易过拟合)。
| 项目 | LOOCV | 2-Fold CV |
|---|---|---|
| 验证次数 | n 次 | 2 次 |
| 验证集大小 | 1 个样本 | 一半数据 |
| 方差 | 高 | 相对低 |
| 偏差 | 低 | 相对高 |
| 计算成本 | 高 | 低 |
fitControl <- trainControl(method = "repeatedcv", number = 10, repeats = 10) 是 caret 包中用于定义 模型训练控制参数 的代码,主要用于 交叉验证(Cross-Validation, CV) 的设置。以下是逐部分详细解释:
1. method = "repeatedcv"
- 作用:指定使用 “重复K折交叉验证”(Repeated K-Fold Cross-Validation)。
- 特点:
- 先进行标准的 K折交叉验证(K-Fold CV),然后重复多次(
repeats控制次数),以减少随机划分带来的方差。 - 适用于中小型数据集,比单次K折更稳定,但计算量更大。
- 先进行标准的 K折交叉验证(K-Fold CV),然后重复多次(
2. number = 10
- 作用:设定 K折交叉验证的折数(K值),这里
K = 10。 - 如何运行:
- 数据随机分成 10 份(folds)。
- 每次用 9 份训练,1 份验证,循环 10 次。
- 最终指标(如准确率)是 10 次验证的平均值。
- 常见选择:
number = 5或10(平衡计算成本和稳定性)。- 数据量极小时可用
LOOCV(留一法,method = "LOOCV")。
3. repeats = 10
- 作用:指定 重复整个K折交叉验证的次数,这里重复 10 次。
- 效果:
- 每次重复会重新随机划分 10 折,共进行
10(repeats) × 10(number) = 100次训练/验证。 - 最终指标是 100 次验证的平均值,显著降低随机性的影响。
- 每次重复会重新随机划分 10 折,共进行
- 适用场景:
- 数据分布不均匀时(如类别不平衡)。
- 需要更稳健的模型评估时。
完整流程
- 数据划分:
- 每次重复生成不同的 10 折划分(共 10 次重复 × 10 折 = 100 次迭代)。
- 模型训练与验证:
- 每个迭代中,用 9 折训练模型,1 折验证。
- 结果汇总:
- 计算所有 100 次验证的平均性能(如准确率、RMSE)。
与其他方法的对比
方法 (method) | 折数 (number) | 重复 (repeats) | 总迭代次数 | 适用场景 |
|---|---|---|---|---|
"cv" | 10 | 1(默认) | 10 | 标准K折,快速验证 |
"repeatedcv" | 10 | 10 | 100 | 高稳定性需求 |
"LOOCV" | n(样本量) | 1(不可重复) | n | 极小数据集 |
"boot" | - | 默认 25 | 25(Bootstrap) | 置信区间估计 |