描述
本文想解决的是在神经网络训练中,需要随机划分训练集和测试集,使得训练集可以更好的覆盖测试集的均值和方差范围。
其中,
(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,