如何按百分比拆分列表为三部分?文件集拆分代码正确性咨询
问题分析与修正方案
你这段代码确实存在两个关键问题,咱们拆解来看:
1. 验证集与测试集完全重复
你给验证集和测试集用了完全相同的切片逻辑:files[-int(len(files)*0.1):],这会导致两个集合包含的文件完全一致,根本无法起到“验证模型性能”和“测试最终效果”的独立作用。
2. 中间10%的切片逻辑错误
你原本想取文件列表的中间10%作为验证集,但files[-int(len(files)*0.1):]实际取的是列表的最后10%。结合训练集的files[:int(len(files)*0.8)](前80%),中间10%应该是从80%的位置到90%的位置,而不是直接取末尾。
修正后的代码方案
推荐方案(带数据打乱,更合理)
如果你的文件列表是有序的(比如按类别、文件名排序),直接切片会导致数据分布不均,强烈建议先打乱数据再分割:
import glob import random files = glob.glob("/dataset/%s/*" % emotion) random.shuffle(files) # 打乱文件顺序,避免数据分布偏差 total_files = len(files) train_size = int(total_files * 0.8) val_size = int(total_files * 0.1) training = files[:train_size] # 前80% validation = files[train_size:train_size + val_size] # 中间10%(80%~90%) testing = files[train_size + val_size:] # 最后10%(90%~100%)
不打乱数据的方案(仅保持原顺序分割)
如果你需要保留原文件顺序,只需要修正切片逻辑即可:
import glob files = glob.glob("/dataset/%s/*" % emotion) total_files = len(files) train_size = int(total_files * 0.8) val_size = int(total_files * 0.1) training = files[:train_size] validation = files[train_size:train_size + val_size] testing = files[train_size + val_size:]
额外说明
- 用
train_size + val_size作为测试集的起始索引,能避免因浮点数计算导致的长度误差(比如当文件总数不是10的倍数时,int(total_files*0.1)可能会少算一个,这种切片方式会自动把剩余的文件归入测试集,保证所有文件都被分配)。 - 数据打乱是机器学习数据集分割的常规操作,能有效避免模型学到数据中的顺序规律,提升泛化能力。
内容的提问来源于stack exchange,提问作者Oussama
相关产品推荐
相关产品推荐

