
这个工具解决什么问题
做模型训练的人每隔几天就要划分一次数据集:把标注好的数据切成训练集、验证集、测试集。写一次脚本不难,难的是每次换数据集都要改路径、改比例、改字段名,改完还得担心分得对不对。最容易出问题的是类别不平衡的时候——比如正例只占百分之几,纯随机划分很可能让某个类别全部落进训练集,验证集里一条都没有,模型指标看着漂亮但根本不可信。想做个分层划分,又得再写一段按标签分组的代码。
- 原来的做法:打开编辑器写一段划分脚本,改路径改比例,跑完再手动检查各集合的类别分布是否合理,发现不均衡就调种子重跑。
- 用这个工具:把数据文件拖进窗口,填好比例,勾上「按标签列分层划分」,点一下,训练/验证/测试三个文件和一份划分报告就写好了;标签分布直接在界面上看得到。
- 省下来的:原来每次划分要写脚本、查分布、调种子,前后二十分钟;现在选文件点一下,十秒完成,而且类别分布一定有保证。
技术实现
C# + .NET Framework 4.8 写成 WinForms 单窗口程序,编译成单个 exe。数据划分是纯计算加文件读写,用系统自带的 .NET Framework 就够了,不需要 Python 环境,也不需要 pandas / scikit-learn 这类依赖——用户双击就能用,不用先配环境。
- 固定种子保证划分可复现:随机划分用 new Random(种子) 而不是系统时间或 Guid。同一个种子 + 同一份数据 = 同一个划分结果,实验才能被复现。界面上种子默认为 42,改种子就得到另一组划分。
- 分层划分单独实现:勾选分层后,先按标签列把数据分组,在每组内部按同一比例切分,再把各组结果合并,最后统一打乱。这样每个子集的标签分布与总体一致——类别不平衡时这一步是必须的,否则可能出现某个类别在验证集里一个样本都没有。小类别还会保底:样本数 ≥3 的类别,验证集至少分到 1 条。
- 手写 CSV 切分而不是简单 Split(','):用 Split(',') 处理 CSV 是经典陷阱:字段里含逗号或引号(比如文本列里写着「你好,世界」)就会把一列切成两列。这里实现了一个带引号状态机的 SplitCsv:双引号内的逗号不算分隔符,两个连续双引号表示一个转义引号。
- 标签列从表头自动识别:载入 CSV 后,用表头填充「标签列」下拉框,并优先选中名字是 label / target / class / y / 标签 / 类别 的那一列,找不到就默认选第 2 列(很多数据集第一列是 id)。不需要用户记「第几列」。
- 原始行原样写回,不做任何改写:划分只负责把行分到不同文件,不解析、不改写、不重新序列化每一行的内容。这样即使数据里有特殊的引号、编码或额外列,也不会在划分这一步被破坏。
- 输出到新目录 + 划分报告:结果写成 <源文件名>_train.csv / _val.csv / _test.csv,另加一份 _split_report.txt 记录比例、种子、是否分层、各集合条数。原文件完全不动。所有输出带 UTF-8 BOM,Excel 双击不乱码。
技术栈:C# 5.0、.NET Framework 4.8、WinForms 窗体
已知局限:只按行划分,不做数据增强、不做去重、不做按长度分桶;CSV 解析是轻量实现,不支持字段内的换行符(含换行的字段需要先用其它工具处理)。
操作教程
- 打开程序
双击 exe,窗口打开:上方是文件与参数区,中间左边是数据集概况,右边是数据预览,下方是「划分并导出」按钮。
预期结果:窗口正常显示,状态栏提示「先选择数据文件」。 - 载入数据
点「选择文件」选一个 .csv / .txt / .jsonl,或直接把文件拖进窗口。CSV 会自动识别表头并填充标签列下拉框。
预期结果:左侧显示样本总数、文件格式、表头与标签分布;右侧显示前 40 行原始内容。 - 设置划分比例
填训练 / 验证 / 测试三个百分比,默认 80 / 10 / 10,三个数加起来必须等于 100。
预期结果:比例不为 100 时点导出会提示并阻止,不会产生错误的划分。 - 选择是否分层
如果数据类别不平衡(比如正例很少),勾上「按标签列分层划分」,并在下拉框里确认标签列选对了。
预期结果:左侧标签分布随所选列变化;分层划分后各子集的类别比例与总体一致。 - 设置随机种子
默认种子 42。想换一组划分就改种子;想复现之前的划分就把种子填回去。
预期结果:相同种子 + 相同数据得到完全相同的划分结果。 - 划分并导出
点「划分并导出」,选一个输出目录。工具会写出三个数据文件加一份划分报告。
预期结果:弹窗显示各集合条数与输出目录;目录里出现 _train.csv / _val.csv / _test.csv / _split_report.txt。
整个过程在本地完成,数据不会上传到任何服务器。
常见问题
技术实现与后续维护
本工具由我们自行开发并持续维护,每次迭代都经过本地自测。划分算法(SplitPlain / SplitStratified)是纯内存计算,与界面和文件读写解耦;CSV 解析(SplitCsv / GetCsvField)是静态方法,可以直接拿字符串做单元测试。打包前还会用 exe 内置的无人值守自测入口(exe --selftest <数据文件> <输出目录>)跑一遍完整划分——它复用界面按钮同一条代码路径(SplitTo),确保交付的 exe 里算法真实可用。
技术构成:
src/MainForm.cs—— 唯一源码文件:CSV 切分 + 划分算法(普通/分层)+ 界面 + 导出与报告DOCS/开发文档.md—— 工程结构、分层算法说明、可复现性约定与扩展点
运行环境:
使用 .NET Framework 4.8 自带的 csc.exe 编译,无需 Visual Studio:
csc /target:winexe /out:AI训练集划分工具.exe /platform:anycpu /optimize+ /reference:System.Windows.Forms.dll /reference:System.Drawing.dll src\MainForm.cs
也可以在 Visual Studio 2019/2022 中新建「.NET Framework 4.8」Windows 窗体项目,把 src\MainForm.cs 加入后直接生成。
可扩展方向:
- 增加 jsonl 字段提取,支持对 jsonl 做分层划分
- 增加去重(文本指纹)避免训练/验证集泄漏
- 增加 K 折交叉验证的多组输出
- 增加按长度分桶,使各集合的文本长度分布一致
本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。
需要其它功能?可以定制
这个工具只做一件事:手写脚本划分训练/验证集,每次都要重写还怕划分不均。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。
常见的定制需求:
- 支持 jsonl 内部字段的标签提取,让 jsonl 也能分层划分
- 增加「按长度分桶」划分,让各集合的文本长度分布也一致
- 划分前自动去重(按文本指纹),避免同一条样本同时出现在训练集和验证集
- 生成 K 折交叉验证的多组划分文件
- 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
- 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
- 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护
使用说明与免责声明
- 本工具在本地运行,不联网、不上传任何数据到服务器。
- 涉及文件改写的功能,请在使用前备份原始文件。
- 软件完全免费,可自由使用与转发,请勿用于倒卖。
- 因误操作造成的数据问题请自行承担。

