使用python划分数据集

Posted LJ的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python划分数据集相关的知识,希望对你有一定的参考价值。

无论是训练机器学习或是深度学习,第一步当然是先划分数据集啦,今天小白整理了一些划分数据集的方法,希望大佬们多多指教啊,嘻嘻~

首先看一下数据集的样子,flower_data文件夹下有四个文件夹,每个文件夹表示一种花的类别

   

 

划分数据集的主要步骤:

1. 定义一个空字典,用来存放各个类别的训练集、测试集和验证集,字典的key是类别,value也是一个字典,存放该类别的训练集、测试集和验证集;

2.使用python获取所有的类别文件夹;

3.对每个类别划分训练集、测试集和验证集:(1)把该类别的所有有效图片放入一个列表中;(2)设置一个随机数对列表进行划分。

具体的代码实现如下所示

import glob
import os.path
import random
import numpy as np
# 图片数据文件夹
INPUT_DATA = \'./flower_data\'
# 这个函数从数据文件夹中读取所有的图片列表并按训练、验证、测试数据分开
# testing_percentage和validation_percentage指定了测试数据集和验证数据集的大小
def create_image_lists(testing_percentage,validation_percentage):
    # 得到的所有图片都存在result这个字典里,key为类别的名称,value值也是一个字典,存放的是该类别的
    # 文件名、训练集、测试集和验证集
    result = {}
    # 获取当前目录下所有的子目录,这里x 是一个三元组(root,dirs,files),第一个元素表示INPUT_DATA当前目录,
    # 第二个元素表示当前目录下的所有子目录,第三个元素表示当前目录下的所有的文件
    sub_dirs = [x[0] for x in os.walk(INPUT_DATA)]
    # sub_dirs = [\'./flower_data\',\'./flower_data\\\\daisy\',\'./flower_data\\\\dandelion\',
    #             \'./flower_data\\\\roses\',\'./flower_data\\\\sunflowers\',\'./flower_data\\\\tulips\']
    # 每个子目录表示一类花,现在对每类花划分训练集、测试集和验证集
    # sub_dirs[0]表示当前文件夹本身的地址,不予考虑,只考虑他的子目录(各个类别的花)
    for sub_dir in sub_dirs[1:]:
        # 获取当前目录下所有的有效图片文件
        extensions = [\'jpg\',\'jpeg\']
        # 把图片存放在file_list列表里
        file_list = []
        # os.path.basename(sub_dir)返回sub_sir最后的文件名
        # 如os.path.basename(\'./flower_data/daisy\')返回daisy
        dir_name = os.path.basename(sub_dir)
        for extension in extensions:
            file_glob = os.path.join(INPUT_DATA,dir_name,\'*.\'+extension)
            # glob.glob(file_glob)获取指定目录下的所有图片,存放在file_list中
            file_list.extend(glob.glob(file_glob))
        if not file_list: continue
        # 通过目录名获取类别的名称,返回将字符串中所有大写字符转换为小写后生成的字符串
        label_name = dir_name.lower()
        # 初始化当前类别的训练数据集、测试数据集和验证数据集
        training_images = []
        testing_images = []
        validation_images = []
        for file_name in file_list:
            base_name = os.path.basename(file_name)
            # 随机将数据分到训练数据集、测试数据集和验证数据集
            # 产生一个随机数,最大值为100
            chance = np.random.randint(100)
            if chance < validation_percentage:
                validation_images.append(base_name)
            elif chance < (testing_percentage+validation_percentage):
                testing_images.append(base_name)
            else:
                training_images.append(base_name)
        # 将当前类别是数据放入结果字典
        result[label_name]={\'dir\':dir_name,
                            \'training\':training_images,
                            \'testing\':testing_images,
                            \'validation\':validation_images}
    # 返回整理好的所有数据
    return result
result = create_image_lists(10,30)
print(result)

运行结果:

可以看出字典result中有五个key,表示五个类别。

下图是各个类别的划分情况:

 

以上是关于使用python划分数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何快将数据集划分为trainval(Python3代码模板)

如何快将数据集划分为trainval(Python3代码模板)

python尝试不同的随机数进行数据划分使用卡方检验依次计算不同随机数划分下训练接和测试集所有分类特征的卡方检验的p值,如果所有p值都大于0.05则训练集和测试集都具有统计显著性数据划分合理

如何利用python将txt文件划分训练集和测试集

实验三:CART回归决策树python实现(两个测试集)|机器学习

python数据集