2、基础知识:回顾机器学习中训练集、验证集、测试集的标准划分方法,以及随机划分在传统ML中的适用性与局限性
在进入 TinyML 数据防泄漏的专题讨论之前,我们必须先回到机器学习最基础的环节——数据划分。无论是云端的大模型还是单片机上的微型神经网络,训练集、验证集、测试集的划分逻辑都是模型评估的基石。然而,TinyML 的数据采集场景(设备端、边缘端)与传统 ML 的数据集构建方式存在本质差异,这导致“随机划分”这一经典方法在 TinyML 场景下可能失效,甚至引发严重的评估乐观偏差。本节将系统梳理标准划分方法,并剖析随机划分的适用边界。
2.1 标准划分方法:训练集、验证集、测试集的角色与比例
在监督学习任务中,数据集被划分为三个互斥的子集,各自承担不同的职责。训练集用于拟合模型参数(权重和偏置),验证集用于模型选择与超参数调优(如学习率、网络层数、正则化系数),测试集则用于最终评估模型的泛化能力。三者之间必须严格隔离,任何来自验证集或测试集的信息都不能参与训练过程,否则会导致评估结果失真。
| 子集 | 典型比例 | 核心用途 | 使用频率 | 常见误区 |
|---|---|---|---|---|
| 训练集 | 70% - 80% | 梯度下降更新参数 | 每个epoch多次 | 数据量不足导致欠拟合 |
| 验证集 | 10% - 15% | 超参数调优、早停、模型选择 | 每个epoch结束后 | 用验证集做最终评估 |
| 测试集 | 10% - 15% | 最终泛化能力评估 | 仅一次(或极少次) | 反复使用测试集调参 |
在传统机器学习中,随机划分(如 sklearn.model_selection.train_test_split)是最常用的方法。其核心假设是:所有样本独立同分布(IID, Independent and Identically Distributed),即样本之间不存在任何关联结构。当数据满足这一假设时,随机划分能够保证三个子集的分布与总体分布一致,从而获得无偏的评估结果。
2.2 随机划分的适用条件与操作流程
随机划分并非万能,它仅在满足以下三个条件时才能保证评估有效性:(1)样本独立性——样本之间没有时间序列、空间位置、设备来源等关联;(2)分布一致性——训练集、验证集、测试集的数据分布与真实部署环境一致;(3)无信息泄漏——数据预处理(如归一化、特征选择)只基于训练集统计量,而非全量数据。
标准操作流程通常包括以下步骤:
- 数据清洗与去重:移除重复样本,处理缺失值,确保样本唯一性。
- 确定划分比例:根据数据总量和任务复杂度,选择70/15/15或80/10/10等比例。
- 执行随机划分:设置固定随机种子(如
random_state=42),保证结果可复现。 - 分层采样(可选):对于分类任务,按类别比例进行分层划分,避免某一类在子集中缺失。
- 验证分布一致性:检查各子集的均值、方差、类别分布是否接近。
# 传统随机划分示例(Python)
from sklearn.model_selection import train_test_split
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42, stratify=y_temp)
2.3 随机划分在传统ML中的局限性:隐藏关联与泄漏风险
尽管随机划分在教科书场景中表现良好,但在实际工程中,数据往往存在隐式结构。例如:医疗数据中同一患者多次就诊记录、工业传感器中同一设备连续采集的时间序列、推荐系统中同一用户的多次交互行为。如果直接随机划分,同一患者/设备/用户的数据可能同时出现在训练集和测试集中,导致模型“记住”了个体特征而非学习到通用规律,测试集评估结果虚高。
此外,随机划分还面临时间泄漏问题。在时间序列数据中,如果训练集包含未来时间点的数据,测试集包含过去时间点的数据,模型会“偷看”未来信息。这在TinyML的预测性维护、异常检测等任务中尤为致命。
2.4 案例拆解:智能家居传感器的人体活动识别
我们以一个典型的TinyML场景——基于加速度计的人体活动识别(HAR)为例,说明随机划分的失效过程。假设我们采集了10名受试者、每人佩戴5台不同型号的智能手表,在3种场景(居家、办公、户外)下进行6种活动(走路、跑步、上楼、下楼、坐下、站立)的数据,总计约50万条样本。
初始现象:使用随机划分训练一个轻量级CNN模型,测试集准确率达到94%。但部署到新用户的设备上后,实际准确率仅为78%,且不同设备型号间差异显著(手表A为82%,手表B为73%)。
分析判断过程:我们检查了数据划分的代码,发现train_test_split直接作用于所有样本,没有考虑user_id和device_id字段。进一步分析发现,同一受试者的数据在训练集和测试集中均有出现,模型实际上学习了受试者的个体运动模式(如步频、摆臂幅度),而非普适的活动特征。
关键数据指标:
| 划分方式 | 测试集准确率 | 新用户准确率 | 跨设备准确率 |
|---|---|---|---|
| 随机划分(泄漏) | 94.2% | 78.5% | 76.1% |
| 按用户分组划分 | 86.7% | 85.9% | 84.3% |
| 按用户+设备分组划分 | 84.1% | 84.0% | 83.8% |
实际操作步骤:我们将数据按user_id进行分组,使用GroupShuffleSplit将10名用户划分为训练用户(6人)、验证用户(2人)、测试用户(2人)。同时,在预处理阶段,归一化参数仅从训练用户的数据中计算。
结果对比:分组划分后,测试集准确率降至86.7%,但新用户准确率提升至85.9%,跨设备准确率提升至84.3%。虽然测试集数字下降了,但模型的真实泛化能力显著增强。
风险与代价:分组划分导致训练数据量减少(从50万降至30万),模型需要更强的正则化或数据增强来弥补。此外,如果用户数量过少(如只有3人),分组划分会导致训练集与测试集分布差异过大,评估方差增大。
复盘经验:在TinyML项目启动时,必须首先明确数据的“分组键”(Group Key),即哪些字段标识了数据采集的独立单元。通常,设备ID和用户ID是最重要的分组维度。任何数据划分操作都应基于分组键进行,而非逐样本随机。
2.5 常见误区与总结复盘
在传统ML向TinyML迁移的过程中,工程师常犯以下错误:
- 误区一:盲目追求测试集准确率——高测试集分数可能只是泄漏的假象,应关注跨设备、跨用户的泛化指标。
- 误区二:忽略时间顺序——对于流式数据,应使用时间序列划分(前70%训练,后30%测试),而非随机打乱。
- 误区三:预处理泄漏——在划分前就对全量数据做归一化或PCA,导致验证集/测试集信息间接参与训练。
- 误区四:分组键选择不当——仅按设备分组而忽略用户维度,或反之,都可能遗漏泄漏路径。