2、基础知识:回顾机器学习中训练集、验证集、测试集的标准划分方法,以及随机划分在传统ML中的适用性与局限性

在进入 TinyML 数据防泄漏的专题讨论之前,我们必须先回到机器学习最基础的环节——数据划分。无论是云端的大模型还是单片机上的微型神经网络,训练集、验证集、测试集的划分逻辑都是模型评估的基石。然而,TinyML 的数据采集场景(设备端、边缘端)与传统 ML 的数据集构建方式存在本质差异,这导致“随机划分”这一经典方法在 TinyML 场景下可能失效,甚至引发严重的评估乐观偏差。本节将系统梳理标准划分方法,并剖析随机划分的适用边界。

传统ML随机划分 vs TinyML场景化划分 传统ML:随机划分(IID假设) 全部样本池(假设独立同分布) 样本之间无关联,可交换 训练集 约70-80% 验证集 约10-15% 测试集 约10-15% 适用前提:样本间无时间/设备/用户关联 评估指标:准确率、F1、AUC等 风险:若存在隐藏关联,评估结果偏乐观 TinyML:场景化划分(防泄漏) 设备维度 按设备ID分组 场景维度 按环境/时段分组 用户维度 按用户身份分组 按组划分:训练/验证/测试集互不重叠 同一设备/场景/用户的数据只能出现在一个子集中 评估目标:泛化到新设备/新场景/新用户的能力 关键指标:跨设备准确率、跨场景鲁棒性 风险:若随机划分,同设备数据跨集导致泄漏

2.1 标准划分方法:训练集、验证集、测试集的角色与比例

在监督学习任务中,数据集被划分为三个互斥的子集,各自承担不同的职责。训练集用于拟合模型参数(权重和偏置),验证集用于模型选择与超参数调优(如学习率、网络层数、正则化系数),测试集则用于最终评估模型的泛化能力。三者之间必须严格隔离,任何来自验证集或测试集的信息都不能参与训练过程,否则会导致评估结果失真。

子集典型比例核心用途使用频率常见误区
训练集70% - 80%梯度下降更新参数每个epoch多次数据量不足导致欠拟合
验证集10% - 15%超参数调优、早停、模型选择每个epoch结束后用验证集做最终评估
测试集10% - 15%最终泛化能力评估仅一次(或极少次)反复使用测试集调参

在传统机器学习中,随机划分(如 sklearn.model_selection.train_test_split)是最常用的方法。其核心假设是:所有样本独立同分布(IID, Independent and Identically Distributed),即样本之间不存在任何关联结构。当数据满足这一假设时,随机划分能够保证三个子集的分布与总体分布一致,从而获得无偏的评估结果。

核心原理:随机划分的本质是“可交换性”——如果打乱样本顺序后,联合概率分布不变,那么任何子集的统计特性都能代表总体。这在处理静态、去标识化的数据集(如UCI成人收入数据集、MNIST手写数字)时是成立的。

2.2 随机划分的适用条件与操作流程

随机划分并非万能,它仅在满足以下三个条件时才能保证评估有效性:(1)样本独立性——样本之间没有时间序列、空间位置、设备来源等关联;(2)分布一致性——训练集、验证集、测试集的数据分布与真实部署环境一致;(3)无信息泄漏——数据预处理(如归一化、特征选择)只基于训练集统计量,而非全量数据。

标准操作流程通常包括以下步骤:

  1. 数据清洗与去重:移除重复样本,处理缺失值,确保样本唯一性。
  2. 确定划分比例:根据数据总量和任务复杂度,选择70/15/15或80/10/10等比例。
  3. 执行随机划分:设置固定随机种子(如 random_state=42),保证结果可复现。
  4. 分层采样(可选):对于分类任务,按类别比例进行分层划分,避免某一类在子集中缺失。
  5. 验证分布一致性:检查各子集的均值、方差、类别分布是否接近。
# 传统随机划分示例(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中的局限性:隐藏关联与泄漏风险

尽管随机划分在教科书场景中表现良好,但在实际工程中,数据往往存在隐式结构。例如:医疗数据中同一患者多次就诊记录、工业传感器中同一设备连续采集的时间序列、推荐系统中同一用户的多次交互行为。如果直接随机划分,同一患者/设备/用户的数据可能同时出现在训练集和测试集中,导致模型“记住”了个体特征而非学习到通用规律,测试集评估结果虚高。

风险提示:这种泄漏被称为“分组泄漏”(Group Leakage)或“个体泄漏”。在TinyML场景中,由于数据采集天然带有设备ID、时间戳、用户标识等元信息,随机划分几乎必然导致泄漏。例如,一个用于关键词唤醒的模型,如果同一说话人的语音片段被随机分到训练集和测试集,模型会通过声纹特征“作弊”,在测试集上准确率可能超过95%,但部署到新用户设备上时准确率骤降至70%以下。

此外,随机划分还面临时间泄漏问题。在时间序列数据中,如果训练集包含未来时间点的数据,测试集包含过去时间点的数据,模型会“偷看”未来信息。这在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,导致验证集/测试集信息间接参与训练。
  • 误区四:分组键选择不当——仅按设备分组而忽略用户维度,或反之,都可能遗漏泄漏路径。
经验总结:判断一个划分方法是否合理,可以问三个问题:1)测试集中的样本是否与训练集中的样本来自同一个“数据生成源”(设备/用户/场景)?2)如果模型在测试集上表现好,能否保证在新数据源上同样好?3)数据预处理是否只使用了训练集的信息?如果任一答案为“否”,则划分方法需要调整。