数据集划分

数据集划分

本文介绍深度学习中常用的数据集划分策略:训练集、验证集、测试集的概念与区别,以及如何使用 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. 总结

  • 数据集划分是深度学习最基础的一步
  • 不划分容易导致评估失真
  • 必须保证测试集永远不参与训练
  • 划分比例需按任务特点调整

posted @ 2025-11-01 21:28  元始天尊123  阅读(1)  评论(0)    收藏  举报