数据集划分不能随意切:手把手带你切分大众点评情感数据集
执行中文情感分类基线任务时,数据集拆分问题成为首要挑战。原本期望从魔搭加载现成的大众点评数据集后直接训练,然而使用 MsDataset.load 后发现所有数据均集中于训练集,缺乏预定义的验证集和测试集,只能手动进行处理。
先看看拿到手的数据集长啥样
最开始的加载代码相当简便,魔搭提供了专属的加载工具,一行代码即可完成数据拉取。

from modelscope.msdatasets import MsDataset# 加载大众点评情感分类数据集
full_ms_ds = MsDataset.load(
"DAMO_NLP/yf_dianping",
subset_name="default",
split="train"
)# 查看第一条数据内容
print(full_ms_ds[0])
输出的第一条数据呈现如下特征:每条记录包含三个字段,sentence 为用户实际评价原文,label 为情感二分类标签,dataset 标记数据来源,整体结构清晰,是典型的中文情感分析数据集。

当时快速浏览后便继续推进,认为如此大规模的数据集理应内置 train/val/test 拆分,只需修改 split 参数即可。问题随即出现,将 split="train" 改为 split="test" 后程序直接报错,提示找不到 test 拆分。查阅数据集主页后方才了解,上传时仅打包完整数据,所有样本均位于 train 中,拆分需要自行完成。该数据集由 DAMO_NLP 出品,总计 21.72MB,包含四万余条评论,非常适合情感分类入门,但未提供预划分,只能手动处理。
三份数据集到底分别干嘛的
进行切分之前,先梳理清楚逻辑,避免盲目操作。此前对这三个集合的概念较为模糊,虽能背诵定义,但实际操作时才意识到背后的逻辑其实非常朴素,可将模型类比为备考的学生。
训练集相当于课本和讲义。模型在此反复学习,从中提取字词规律与情感倾向,所有知识均源于此,对应学生上课学知识和刷例题,占比通常为 80% 左右。
验证集相当于课后作业。训练过程中每隔若干轮次运行验证集,观察分数变化及错误类型,据此调整学习率、网络结构与正则化参数,用于辅助调参,约占 10%。
测试集相当于期末密封卷。从切分完成的那一刻起,训练全程不得触碰,更不能用于调参。待模型训练彻底结束后,再运行测试集,此时的分数反映模型的真实泛化能力,即面对全新评论时的情感判断准确性,同样约占 10%。
比例并非固定,数据量较大时可适当减少测试集占比,数据量较小则需采用其他方法,后续会提及。
8:1:1 划分的正确姿势
理清逻辑后即可着手操作。魔搭的数据集原生不提供切分工具,但支持转换为 Hugging Face 的 Dataset 格式,该格式自带 train_test_split 方法,使用十分便捷。最初试图寻找一次性切三份的参数,查阅五分钟文档后发现该方法一次仅能切两份。要得到 train/val/test 三份,需执行两次切分。
from modelscope.msdatasets import MsDataset# 1. 加载完整数据集
full_ms_ds = MsDataset.load(
"DAMO_NLP/yf_dianping",
subset_name="default",
split="train"
)# 2. 转换为 Hugging Face 格式
full_hf_ds = full_ms_ds.to_hf_dataset()# 3. 第一刀:切取 10% 作为测试集,后续不再使用
split1 = full_hf_ds.train_test_split(test_size=0.1, seed=42)
train_temp_hf = split1["train"] # 90%
test_hf = split1["test"] # 10%# 4. 第二刀:剩余 90% 再切取 10% 作为验证集
split2 = train_temp_hf.train_test_split(test_size=0.1, seed=42)
train_hf = split2["train"] # 80%
val_hf = split2["test"] # 10%
seed=42 必须添加,以确保每次运行切分结果一致,否则不同次运行结果无法对比,纯属自找麻烦。运行结果如下:
训练集 train:36436
验证集 val:4049
测试集 test:4499
总数据约四万五千条,比例大致为 8:1:1,符合预期。随机抽取一条训练集查看,标签 0 为负面评价,内容涉及 KTV 设备陈旧与环境卫生问题,数据标注正确。

为啥非得切这么麻烦?
有人认为数据划分不必过于严谨,但实际情况并非如此。验证集在训练过程中被频繁使用,我们根据验证集准确率调整参数,如学习率与 dropout 设置,模型实际上已间接接触验证集数据,因此验证集分数通常偏乐观,无法代表真实水平。此时必须有一份完全独立、模型从未见过的测试集,才能衡量真正的泛化能力。若将测试集用于调参,相当于提前泄露考卷,分数虽高但面对真实数据时表现会大幅下滑,这便是数据泄露,属于实验大忌。此前在课程作业中曾误将测试集混入训练,准确率达到 98%,但答辩当场用新数据测试时分数骤降二十个点,教训深刻。
数据少的时候怎么办:交叉验证
8:1:1 划分并非万能。当数据集极小时,例如仅有几千条,硬性切出 10% 作为测试集不仅浪费数据,还会导致结果不稳定,不同样本划分产生的分数差异较大。此时通常采用 k 折交叉验证。具体思路为:将整个数据集平分为 k 份,每次选取 1 份作为测试集,剩余 k-1 份用于训练,循环 k 次,使每份数据均充当一次测试集,最终取 k 次结果的平均值。这种方法能提高数据利用率与评估稳定性,行业常用 k 值为 10,即十折交叉验证。此次大众点评数据集包含四万余条,数据量充足,固定划分即可满足需求,因此未采用交叉验证。若日后涉及小样本任务,则必须使用此方法。
再往深聊:数据才是大模型的地基
通过本次切分操作,同时查阅相关资料,对数据的认识更为深入。此前认为大模型强大主要得益于 Transformer 架构的设计,但实际接触数据后发现算法反而是门槛最低的部分,架构论文均为公开内容,真正拉开差距的在于数据。数据并非收集后直接输入模型,从采集、清洗、去重、标注,到训练过程中动态调整配比、淘汰劣质样本、检测数据污染,这一整套数据工程才是核心竞争力。当前大模型的数据管理已非静态,切分完毕后并非固定不变,训练中会持续评估,针对模型难以掌握的数据或有噪声的数据进行重新清洗采样,验证集也会动态更换以防止过拟合。此外还需控制知识覆盖率,兼顾中英文、各领域及不同模态,避免偏科。概括而言,在模型之上是算法艺术,在模型之下则是数据地基,地基不牢则架构再华丽也无用。
最后说几句
经过一下午的实践,从初始加载报错到逐步理清数据切分逻辑,整个过程比单纯背诵定义更加有效。实际收获有三点:首先,数据集划分并非形式化步骤,其本质是模拟学习、作业与考试的认知规律,核心目标是评估模型的真实能力而非刷取高分。其次,开源数据集需先了解结构、字段与内置拆分情况,不可凭假设直接操作。最后,应平衡模型结构与数据优化,清洗、去重、配比等数据侧调整往往能带来更大收益。数据集划分并非越复杂越好,在简单场景中 8:1:1 比例已足够,应避免为了炫技而增加不必要的复杂度,选择适合数据量与业务场景的方法才是关键。