用python程序按比例划分数据集(训练集+测试集)

该博客介绍了如何将一个零售商品图片的数据集按一定比例划分为训练集和测试集。通过建立新目录并使用Python的os和shutil库,随机抽取源数据集中图片,将其移动到新目录,从而实现数据集的划分。代码中包含了关键函数的解释,强调了shutil.move操作的风险,并提醒在调试时谨慎使用。
摘要由CSDN通过智能技术生成

现有一个零售商品图片的数据集goods,没有做任何划分。goods目录下,子目录的名称为图片的类别,每个类别下有多张图片,文件结构如图1。现在,我们需要按一定的比例把它拆分为训练集和测试集。

数据集划分示意
图1. 数据集划分示意

实现该功能的思路是建立一个新的相同结构的目录树,并在原目录树中的每个类别中随机按比例地挑选部分图片,将它们移动到新目录树中相应的类别下。完整代码如下:

import os
import random
import shutil

#源数据集路径和目标数据集路径
path_source = './goods'
path_target = './goods_test'

#参数:源路径、目标路径和测试集所占比例
def seperate(path_source, path_target, percent):
    #生成包含path_source下所有目录名的列表
    categories = os.listdir(path_source)
    for name in categories:
        #在path_target下建立相同名称的子目录
        os.makedirs(os.path.join(path_target, name))
        #生成包含子目录下所有图片的列表
        nums = os.listdir(os.path.join(path_source, name))
        #随机按比例抽取一部分图片
        nums_target = random.sample(nums, int(len(nums)*percent))
        #把图片剪切到目标路径
        for pic in nums_target:
            shutil.move(os.path.join(path_source, name, pic), os.path.join(path_target, name, pic))

#执行完成后,path_source为训练集,path_target为测试集。
seperate(path_source, path_target, 0.3)

如果数据集是其他结构,在此基础上稍作改动即可。

其中的关键函数:

os.listdir(path):列出path下所有项目的名称(包括目录和文件)

os.makedirs(path):递归地创建path路径上的目录,目录已经存在的话会报错

os.makedir(path)可以用于仅创建一个目录的情况

random.sample(list, num):从list中随机抽取num个元素组成新的列表

shutil.move(source, target):将source文件移动到target文件

注意shutil.move是个很危险的操作,建议在调试代码时注释掉,确保代码无误后再执行。

如果你不想使用scikit-learn库中的`train_test_split`函数来按比例划分数据集,你可以手动编写一些简单的Python代码来实现。这里是一个基本的步骤: 1. **导入必要的库**: ``` import numpy as np ``` 2. **生成随机索引**: - 首先,你需要确定数据集中每个部分的样本数。比如你想将数据集分为70%训练集和30%测试集,可以设置训练集大小为原始数据长度的70%,测试集大小为剩余的30%。 ```python data_length = len(your_data) # 假设your_data是你数据的数组 train_size = int(0.7 * data_length) test_size = data_length - train_size train_indices = np.random.choice(data_length, size=train_size, replace=False) test_indices = np.array(list(set(range(data_length)) - set(train_indices))) ``` 3. **创建切片并保存数据**: 使用这些随机索引来获取训练集测试集的数据部分。 ```python train_set = (your_data[train_indices], your_labels[train_indices]) if labels is not None else your_data[train_indices] test_set = (your_data[test_indices], your_labels[test_indices]) if labels is not None else your_data[test_indices] ``` 4. **验证分割结果**: 可以检查一下是否确实按照预期的比例划分了数据。 ```python print(f"Training set size: {len(train_set[0])}/{data_length}") print(f"Testing set size: {len(test_set[0])}/{data_length}") ``` 记得根据你的实际情况调整上述代码,并确保数据`your_data`和标签`your_labels`已经准备好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

diqiudq

人过留名,雁过留声。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值