You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按百分比拆分列表为三部分?文件集拆分代码正确性咨询

问题分析与修正方案

你这段代码确实存在两个关键问题,咱们拆解来看:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:55:52