一、总体分类(一共 6 大种)
sklearn 交叉验证划分全部来自:
from sklearn.model_selection import *
1. KFold(最基础 K 折交叉验证)
- 用途:普通回归、分类任务
- 特点 :
- 均匀分成 K 份
- 轮流 1 份测试,K-1 份训练
- 不分层 → 类别不平衡时不推荐
python
kf = KFold(n_splits=5, shuffle=True, random_state=42)
2. StratifiedKFold(分层 K 折)⭐⭐⭐⭐⭐
- 用途 :分类任务、类别不平衡
- 特点 :
- 每折都保持类别比例
- 分类任务首选!
python
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
3. ShuffleSplit(随机打乱划分)
- 用途 :想自定义训练/测试比例
- 特点 :
- 不分成均等份
- test_size 自己定
- 不分层
python
ss = ShuffleSplit(n_splits=5, test_size=0.2, random_state=42)
4. StratifiedShuffleSplit(分层随机打乱)⭐⭐⭐⭐⭐
- 用途 :分类 + 想自定义 test 比例
- 你刚才用的就是这个!
- n_splits=1 等价 train_test_split(stratify=y)
python
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.2)
5. GroupKFold / LeaveOneGroupOut(按分组划分)
- 用途 :防止同一组数据出现在训练集和测试集
- 例如:
- 同一用户的数据
- 同一患者的数据
- 同一设备的数据
- 避免数据泄露
python
gkf = GroupKFold(n_splits=5)
6. TimeSeriesSplit(时间序列交叉验证)
- 用途 :时间数据、股票、天气、时序预测
- 不能打乱!
- 未来数据不能用来训练过去
python
tscv = TimeSeriesSplit(n_splits=5)
二、最实用的「选择指南」(背会这张表)
| 你的数据场景 | 应该用哪个划分? |
|---|---|
| 普通回归任务 | KFold |
| 分类任务(均衡/不均衡) | StratifiedKFold |
| 分类任务 + 自定义 test 比例 | StratifiedShuffleSplit |
| 防止同一用户/患者泄露 | GroupKFold |
| 时间序列 | TimeSeriesSplit |
| 只想简单切一次 train/test | train_test_split(stratify=y) |
三、最最重要的 3 个(工作 99% 用这三个)
- StratifiedKFold → 分类 K 折(最常用)
- StratifiedShuffleSplit → 分类随机切分(你正在用)
- GroupKFold → 防止分组数据泄露
四、一句话终极总结
- 回归 → KFold
- 分类 → StratifiedKFold / StratifiedShuffleSplit
- 分组数据 → GroupKFold
- 时间数据 → TimeSeriesSplit