数据集划分
数据集划分
本文介绍深度学习中常用的数据集划分策略:训练集、验证集、测试集的概念与区别,以及如何使用 Python 实现自动划分。
1. 为什么要划分数据集?
机器学习模型必须通过数据学习,但如果把所有数据都用来训练,会出现:
- 模型在训练集表现很好
- 但在真实环境中效果很差
这就是 过拟合(Overfitting)。
因此需将数据拆分为:
| 数据集 | 作用 |
|---|---|
| 训练集 Train | 用来训练模型 |
| 验证集 Val | 选择超参数、判断是否过拟合 |
| 测试集 Test | 模型最终评估,不参与任何训练 |
2. 常见的划分比例
分类/回归任务(最常见)
训练集:70%
验证集:15%
测试集:15%
深度学习大数据集
训练集:80%
验证集:10%
测试集:10%
小样本任务(数据少)
训练集:60%
验证集:20%
测试集:20%
3. 使用 Python 自动划分数据集(适用 YOLO/BERT)
示例:划分图片数据
文件结构:
dataset/
images/
labels/
Python 脚本
import os
import shutil
import random
random.seed(42)
dataset_dir = "dataset/images"
label_dir = "dataset/labels"
train_dir = "data/train"
val_dir = "data/val"
test_dir = "data/test"
# 创建目录
for d in [train_dir, val_dir, test_dir]:
os.makedirs(f"{d}/images", exist_ok=True)
os.makedirs(f"{d}/labels", exist_ok=True)
files = os.listdir(dataset_dir)
random.shuffle(files)
n = len(files)
train_split = int(0.7 * n)
val_split = int(0.85 * n)
train_files = files[:train_split]
val_files = files[train_split:val_split]
test_files = files[val_split:]
def move_files(file_list, target):
for f in file_list:
shutil.copy(os.path.join(dataset_dir, f), f"{target}/images")
label = f.replace(".jpg", ".txt")
shutil.copy(os.path.join(label_dir, label), f"{target}/labels")
move_files(train_files, train_dir)
move_files(val_files, val_dir)
move_files(test_files, test_dir)
print("数据集划分完成!")
4. 总结
- 数据集划分是深度学习最基础的一步
- 不划分容易导致评估失真
- 必须保证测试集永远不参与训练
- 划分比例需按任务特点调整

浙公网安备 33010602011771号