第一章 人工智能基础
第二部分:数据处理及可视化
第二节:数据集划分
内容:训练集、验证集与测试集的划分方法及其注意事项
一、为什么要划分数据集?
在训练人工智能模型的过程中,我们的目标并不仅是让模型“记住”已有数据,而是希望它能学到规律,准确预测未来的未知数据。为了做到这一点,我们需要将原始数据分成几个部分:
-
训练集(Training Set):用于让模型“学习”。
-
验证集(Validation Set):用于调试模型,例如选择参数、调整结构。
-
测试集(Test Set):用于最后检验模型是否真的“学会了”,评估它在新数据上的表现。
这种划分能帮助我们判断模型有没有“过拟合”(即在训练集上表现很好,但在新数据上很差)。
二、数据集的划分方法
1. 简单随机划分(Hold-Out法)
最基本的方法是:将原始数据随机按一定比例划分,例如:
-
训练集占 70%
-
验证集占 15%
-
测试集占 15%
这样模型就能在训练集上学习,在验证集上调参,在测试集上评估最终效果。
from sklearn.model_selection import train_test_split
# 第一次划分:训练集 vs 临时集
train_data, temp_data = train_test_split(data, test_size=0.3, random_state=42)
# 第二次划分:临时集分为验证集和测试集
val_data, test_data = train_test_split(temp_data, test_size=0.5, random_state=42)
注意:random_state 用于确保划分结果可复现。
2. K 折交叉验证(K-Fold Cross Validation)
【漫话机器学习系列】268. K 折交叉验证(K-Fold Cross-Validation)_k折交叉验证-优快云博客
当数据量不大时,为了充分利用每一条数据,我们可以使用 K 折交叉验证。
-
将数据平均分为 K 份(如 K=5),每次选其中 1 份作验证集,剩下的 4 份作训练集。
-
重复 K 次,最终取平均性能作为模型表现。
优点:稳定、数据利用率高。
缺点:计算量大,不适合大规模数据或深度学习模型。
from sklearn.model_selection import KFold
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for train_idx, val_idx in kf.split(X):
X_train, X_val = X[train_idx], X[val_idx]
3. 留一交叉验证(Leave-One-Out)
-
每次只留一个样本当验证集,其余都用于训练。
-
适合小样本数据集。
-
非常耗时,不适合大数据场景。
4. 时间序列划分
如果数据有时间顺序(如股票价格、传感器数据),就不能打乱顺序,而应按时间划分:
-
前 60% 作为训练集
-
中间 20% 为验证集
-
最后 20% 为测试集
目的是保证未来数据不会“泄漏”到过去。
三、划分数据时的注意事项
1. 保持类别比例一致(分类问题)
在分类任务中,某些类别的数据量可能很少。如果随机划分,可能导致某个子集完全没有某些类别。
应使用分层抽样(stratified sampling),保证每个子集中的各类别比例与原始数据相同。
train_data, test_data = train_test_split(data, test_size=0.2, stratify=data['label'])
2. 切勿泄漏测试数据
-
测试集必须是模型从未见过的数据。
-
不能在训练过程中使用测试集结果去调整模型或参数。
-
所有参数调节、模型选择必须只基于训练集和验证集完成。
3. 每个子集要覆盖代表性特征
如果数据有多个来源、场景或类型(例如多地采集的传感器数据),划分时要确保每个子集中都包含这些不同的特征,否则模型在某些场景下可能表现很差。
四、常见数据集划分比例
用途 | 占比(推荐) | 是否用于训练模型 | 是否用于调参 | 是否用于模型最终评估 |
---|---|---|---|---|
训练集 | 60%~80% | ✅ 是 | ✅ 是 | ❌ 否 |
验证集 | 10%~20% | ❌ 否 | ✅ 是 | ❌ 否 |
测试集 | 10%~20% | ❌ 否 | ❌ 否 | ✅ 是 |
五、总结图示
原始数据集
↓
-----------------------------
| 训练集(用于训练) |
|---------------------------|
| 验证集(调参用) |
|---------------------------|
| 测试集(最终评估) |
-----------------------------
六、小结要点
-
训练集是“教模型学习”的数据;
-
验证集是“帮模型变聪明”的工具;
-
测试集是“考验模型水平”的最终试卷;
-
划分要科学、合理、避免数据泄漏;
-
分类问题需注意类别比例;
-
时间序列数据不能打乱划分顺序。