PYTHON 随机分类自建训练集和测试集,以及对应的标签label

这篇博客介绍了如何使用Python从CSV文件中随机分割训练集和测试集,同时处理相应的标签。通过随机数生成,将数据按8:2比例分配,利用os、csv和shutil库操作文件,并创建新的CSV文件保存训练集和测试集的标签。
摘要由CSDN通过智能技术生成

描述

本文想解决的是在神经网络训练中,需要随机划分训练集和测试集,使得训练集可以更好的覆盖测试集的均值和方差范围。
其中,
(1)数据是存放在csv文件中,因为网络的输入是二维的point cloud
(2)标签同样是放在一个csv文件中,csv文件共四列, 第一列是csv数据文件的名字,第二,第三和第四列是需要预测的数值。

导入包

在这篇文章中,我们需要用到
os库 创建文件夹,定位标签文件的path
csv库 用来处理csv文件
csv文件批量处理可以参考这一篇博客
random 用来产生随机数
shutil 用来复制csv文件到训练集文件夹和测试集文件夹

import csv
import matplotlib.pyplot as plt
import numpy as np
import random
import os
import shutil

Note:本文没有注重效率问题,如果要兼顾效率的可能不适合

分割训练集和测试集

1. 创建训练集和测试集文件夹 train_path & test_path

    '''
    create filename, the one is train_path and the other is test_path
    '''
    if not os.path.exists(train_path):
        os.mkdir(train_path)

    if not os.path.exists(test_path):
        os.mkdir(test_path)

2. 获取整个数据集的长度,用来得到需要得到的训练集和测试集的个数

    " obtain the length of total data number"
    with open(label_path, 'rt', encoding='utf-8') as file:
        label = csv.reader(file)
        label_length = [row[0] for row in label]
        label_length = list(label_length)

    print(len(label_length))

(这里写的可能稍微冗余)

3. 获取随机数,从label标签的第一列对应的数据集中随机抽取个数(文章中是8:2)

    '''
     creating randomly training data-set
    '''
    # 获取随机数的数量
    train_number = len(label_length)* train_scale
    random_number = random.sample(range(1, len(label_length)), int(train_number))

    random_number.sort()

    train_data =[]
    print(len(random_number))
    # print(test_data)
采用random函数,从1~len(label——length)随机抽取0.8倍,(不重复)

4. 获取训练数据的文件名(label第一列)

    # 获取训练数据的文件名
    with open(label_path, 'rt', encoding='utf-8') as file:
        label = csv.reader(file)
        label_csv = [row[0] for row in label]
        label_csv = list(label_csv)
        for i in random_number:
            train_data.append(label_csv[i])
    # print(label_data)

5. 将数据copy到指定的文件夹中

    # 将数据copy到指定的训练集文件夹
    for line in train_data:

        filepath = os.path.join(source_path, line)
        shutil.copy(filepath, train_path)

train_data中存放的是文件名,
采用os.path.join将源文件夹和文件名拼接在一起
采用shutil.copy将文件copy到train_path

6.获取测试集的文件名的随机数(训练集没有用到的数据)

    '''
    creating randomly test data-set
    '''
    test_data =[]
    test_number =[]
    for i in range(1, len(label_length)):
        if i not in random_number:
            test_number.append(i)

这里没有想到更好的方法,只是将不是train number的提取出来,采用for循环和比较来实现

7. 和4 5步骤类似,获取测试集的文件名并copy到测试集文件夹中

    # 获取测试数据的文件名
    with open(label_path, 'rt', encoding='utf-8') as file:
        label = csv.reader(file)
        test_csv = [row[0] for row in label]
        test_csv = list(test_csv)
        for i in test_number:
            test_data.append(test_csv[i])

    # 将数据copy到指定的测试集文件夹
    for test_line in test_data:

        test_filepath = os.path.join(source_path,
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值