Python实现五折交叉验证:训练、验证、测试集划分
创作时间:
2025-01-22 06:26:13
作者:
@小白创作中心
Python实现五折交叉验证:训练、验证、测试集划分
假定在某一个项目中,没有现成的数据集划分,你需要手动将该数据集划分为训练、验证和测试集,一般比例取60%:20%:20%。 但是仅仅通过随机选取某一个数据集划分可能是不全面的,因而我们应该使用五折交叉验证,使得每个子集都有可能成为测试集,从而取五折测试集的平均性能作为整体算法的性能,即如下图所示。
那么如何用代码实现呢?
假定我们有一个图像文件夹img_path,希望通过遍历该图像文件夹来获取五折划分对应的训练-验证-测试子集。
这里我们首先考虑一个简单的非图像数据,我们直接给出相应的代码:
import numpy as np
# 定义数据集,假设有4222个样本
Num=4222
data = np.arange(Num)
# 定义 5 折交叉验证的 k 值
k = 5
# 计算每个折的大小
fold_size = int(len(data) / k)
# 设置随机种子,以确保无论运行多少次,打乱后的结果都会相同
np.random.seed(42)
# 随机打乱数据集
np.random.shuffle(data)
# 划分训练集、测试集和验证集
for i in range(k):
# 计算当前折的起始位置和结束位置
start = i * fold_size
end = (i + 1) * fold_size
if Num-end < fold_size: # 防止末尾有剩余
end = Num
# 将当前折作为测试集,其余折作为训练集
test_set = data[start:end]
#邻近测试集的下一个折作为验证集
val_start = end%Num
val_end = val_start + fold_size
if Num-val_end < fold_size: # 防止末尾有剩余
val_end = Num
val_set = data[val_start:val_end]
test_val_set = np.concatenate([test_set, val_set])
# 其余为训练集,第一种算法,优选
train_set = np.array([x for x in data if x not in test_val_set])
# 计算两个集合的差集,第二种算法
train_set2 = np.array(list(set(data) - set(test_val_set)))
# 输出当前折的数据情况
print(f"Fold {i + 1}:")
print(f"Train set size: {len(train_set)}")
print(f"Validation set size: {len(val_set)}")
print(f"Test set size: {len(test_set)}")
print("=====================")
在此基础上,我们给出图像数据的代码:
import numpy as np
from os.path import join, splitext, split, isfile
import os, sys, argparse
import time
# 定义数据集,假设有4222个样本
img_path = 'H:/dataset/CVBL/IrisImage-single/'
imgs = [i for i in os.listdir(img_path)]
Num = len(imgs)
data = np.arange(Num)
# 定义 5 折交叉验证的 k 值
k = 5
# 计算每个折的大小
fold_size = int(len(data) / k)
# 设置随机种子,以确保无论运行多少次,打乱后的结果都会相同
np.random.seed(42)
# 随机打乱数据集
np.random.shuffle(data)
# 划分训练集、测试集和验证集
for i in range(k):
# 计算当前折的起始位置和结束位置
start = i * fold_size
end = (i + 1) * fold_size
if Num-end < fold_size: # 防止末尾有剩余
end = Num
# 将当前折作为测试集,其余折作为训练集
test_set = data[start:end]
test_img_set = [imgs[index] for index in test_set]
#邻近测试集的下一个折作为验证集
val_start = end%Num
val_end = val_start + fold_size
if Num-val_end < fold_size: # 防止末尾有剩余
val_end = Num
val_set = data[val_start:val_end]
val_img_set = [imgs[index] for index in val_set]
test_val_set = np.concatenate([test_set, val_set])
# 其余为训练集,第一种算法,优选
train_set = np.array([x for x in data if x not in test_val_set])
# 计算两个集合的差集,第二种算法
train_set2 = np.array(list(set(data) - set(test_val_set)))
train_img_set = [imgs[index] for index in train_set]
# 输出当前折的数据情况
print(f"Fold {i + 1}:")
print(f"Train set size: {len(train_set)}")
print(f"Validation set size: {len(val_set)}")
print(f"Test set size: {len(test_set)}")
print("=====================")
本文原文来自CSDN
热门推荐
做人,一忍再忍就是蠢!
户外自然+全龄互动:三胎政策下亲子乐园发展新方向
2025年八省联考英语读后续写攻略
洗碗机工作原理及日常维护保养技巧
减肥有了国家版指南,7种饮食方法哪个适合你?
一到冬天:又冷又累又胖了……趁着周末动一动也能当健康达人
翁建平教授团队研究证实:早期胰岛素治疗可显著降低糖尿病患者心血管并发症风险
腾讯数字化工具助力低卫生资源地区“两癌”防控
航海王游戏:娜美技能全解析,控制与输出兼备
ToDesk提醒:警惕陌生人远控手机诈骗
深圳建成420公里远足径体系,深港山友共享“山海盛宴”
细胞生物学中的GTP是什么?
深圳贯通420公里远足径体系,打造城市版“麦理浩径”
电动车套牌违法!一文详解电动车上牌流程
小米卸载快应用服务框架方法,adb调试卸载,不需要root
湖南桂阳宝山:全国首个工矿旅游地,展现两千年矿冶文化
知行合一的心学智慧:500年传承,启迪现代人生活与管理之道
科学家揭示人类首次发现恐龙的历史时刻!
超级小行星撞地球致恐龙灭绝:地球生态与生命未来何去何从?
宸凰珠宝手镯:传统工艺遇上现代设计
和田玉翡翠手镯收藏指南:四大指标辨真伪,最新行情与选购技巧
玉手镯时尚指南:5种方式让传统饰品融入日常
专家解读隔夜菜:亚硝酸盐含量远低于中毒剂量,这样处理可放心食用
警惕碎牛肉大肠杆菌风险,专家建议烹饪至160华氏度
姜汁、绿豆汤等四食材,科学证实可缓解食物中毒
女子食用隔夜红烧肉中毒住院,医生提醒:这些隔夜食物不能吃
热水器E2故障不用怕,2分钟轻松解决!
便通胶囊:助力排便,但需警惕副作用
节能环保:如何采取行动,创造绿色生活
Angelababy社交账号恢复正常,积极互动展现阳光形象