3、数据规范总览:数据采集、清洗、标注、切分与存储的标准化流程

TinyML时序项目的交付质量,往往在数据阶段就已注定。模型架构、量化策略和板端优化固然重要,但若数据采集口径不一、标注标准模糊、切分方式存在信息泄漏,后续所有工程努力都会被数据缺陷所放大。本章围绕时序数据从物理世界到模型训练集的完整生命周期,建立一套可执行、可审计、可复现的标准化流程,覆盖采集、清洗、标注、切分与存储五个关键环节。

TinyML时序数据标准化流程总览 ① 数据采集 传感器/日志/边缘设备 ② 数据清洗 去噪/补缺/去重/对齐 ③ 数据标注 标签定义/边界对齐 ④ 数据切分 训练/验证/测试 ⑤ 数据存储 版本管理/元数据/归档 版本回溯与增量采集反馈 核心约束:时间一致性 | 采样率统一 | 标签可追溯 | 切分无泄漏 每个环节必须记录数据血缘(来源设备、采集时间、处理脚本版本、操作人) 质量门禁:每个阶段输出需通过校验规则方可进入下一阶段 采集→清洗:缺失率<5% | 清洗→标注:无重复时间戳 | 标注→切分:标签覆盖率100%

3.1 数据采集:从物理世界到数字信号的工程化约束

TinyML时序数据的采集不是简单地把传感器接上开发板然后开始记录。采集环节决定了数据质量的上限,后续清洗和标注只能修复有限的问题,无法凭空创造信息。采集规范需要覆盖三个维度:硬件配置(采样率、分辨率、量程)、环境控制(温度、振动、电磁干扰)、元数据记录(设备ID、固件版本、采集时间戳)。

对于加速度计、陀螺仪、麦克风、温湿度传感器等常见TinyML输入源,采样率的设定必须遵循奈奎斯特采样定理,同时考虑MCU的存储和功耗限制。例如,一个3轴加速度计以100Hz采样、16位分辨率,每秒产生600字节数据,若MCU仅有256KB RAM,则最多缓存约436秒数据,这直接决定了单次采集窗口的长度。

采集规范核心要素:
  • 采样率与分辨率:根据信号最高频率成分确定采样率,至少为信号最高频率的2倍(工程上建议5-10倍);ADC分辨率建议不低于12位,避免量化噪声淹没微弱特征。
  • 时间同步:多传感器场景下,各通道必须共享同一时间基准,允许的最大时间偏差不超过采样间隔的10%。
  • 采集批次与场景覆盖:每个工况至少采集3个独立批次,每批次包含完整的运行周期(如设备启停、稳态、瞬态)。
  • 原始数据保留:始终保存未经滤波的原始ADC值,预处理操作在独立副本上进行,确保可追溯。

采集过程中常见的工程陷阱是隐式滤波。某些传感器模块(如MPU6050的DMP)内部自带低通滤波,若未在文档中记录滤波截止频率,后续特征分析可能得出错误结论。因此,采集脚本必须同时记录传感器配置寄存器的值,并在元数据中明确标注是否启用了内部滤波。

3.2 数据清洗:时序数据特有的质量修复策略

与图像数据不同,时序数据的清洗必须严格保持时间顺序和采样间隔的一致性。常规的“删除异常行”操作在时序数据中可能导致时间轴断裂,破坏后续的窗口切分和特征提取。清洗流程应遵循“先检测、后修复、再验证”的原则。

异常类型 检测方法 修复策略 适用场景
缺失值 时间戳间隔检查(ΔT > 1.5×标称间隔) 线性插值(短缺失<10点);丢弃窗口(长缺失) 传感器瞬时断连、SD卡写入延迟
离群点 滑动窗口Z-score(|Z|>4)或中值偏差 中值滤波替换(窗口=5);保留并标记(若为真实事件) 电磁干扰、机械冲击、电源波动
重复时间戳 时间戳排序后检查相邻相等 保留第一条,删除后续重复;或按微秒级时间戳重新对齐 多线程采集竞争、缓冲区覆盖
量程饱和 连续N点等于ADC最大值/最小值 标记为饱和段,不插值;在标注中注明“饱和区间” 传感器过载、量程配置错误

清洗操作必须记录在数据血缘日志中,包括检测算法参数、修复规则和受影响的数据范围。一个实用的做法是生成清洗报告,包含各异常类型的数量、占比和处理方式,便于在模型效果异常时回溯数据质量。

关键风险:切勿对缺失段进行“全局均值填充”。时序数据往往具有局部相关性,全局填充会引入虚假的低频成分,严重破坏频域特征。若缺失段超过窗口长度的20%,建议直接丢弃该窗口,而不是强行插值。

3.3 数据标注:语义标签与时间边界的精确对齐

TinyML时序项目的标注工作比图像标注更具挑战性,因为标签不仅要回答“发生了什么”,还要回答“发生在什么时间范围”。标注规范需要定义标签体系(分类标签、事件标签、分段标签)和边界规则(事件起始/结束的判定标准)。

以工业设备振动监测为例,标注体系可能包含:正常运行(类别A)、轴承磨损(类别B)、不对中(类别C)、松动(类别D)。每个类别需要定义明确的物理判据——例如轴承磨损的特征频率范围、振动幅值阈值、持续时间要求。标注人员必须依据这些客观标准进行标注,而非主观判断。

  1. 标签粒度:确定最小标注单元(单点、固定窗口、可变长度片段)。对于异常检测任务,通常采用固定窗口(如256点)标注类别;对于事件检测,需要标注精确的起止时间戳。
  2. 边界规则:定义事件开始和结束的触发条件。例如,振动幅值连续超过阈值3个周期视为事件开始,低于阈值且持续5个周期视为事件结束。
  3. 多人一致性校验:至少2人独立标注同一批数据,计算Cohen's Kappa系数,要求≥0.8;不一致样本由专家仲裁。
  4. 标签版本管理:每次标注修订必须生成新版本,记录修改内容和原因,防止标注标准漂移。
实用建议:对于TinyML项目,建议采用“半自动标注+人工校验”模式。先利用简单的阈值规则或已有的规则引擎生成预标注,再由人工修正边界。这可将标注效率提升3-5倍,同时保证质量。例如,基于加速度幅值的阈值检测可自动标记候选事件段,标注人员只需确认或调整边界。

3.4 数据切分:防止信息泄漏的时序专属策略

时序数据的切分不能简单使用随机打乱,因为相邻样本之间存在强时间相关性。若训练集和验证集来自同一连续时间段,模型可能“记住”了时间上下文而非学习到真正的模式,导致验证指标虚高。标准做法是采用按时间顺序的块状切分。

切分策略 方法描述 适用场景 泄漏风险
留出法(时间顺序) 前70%训练,后15%验证,最后15%测试 数据量充足,分布稳定 低
K折交叉验证(时序版) 按时间顺序分K段,每次用前K-1段训练,最后1段验证 数据量中等,需要稳健评估 低(需保证验证段在训练段之后)
滚动窗口验证 固定训练窗口长度,逐步向后滑动 概念漂移场景,在线学习评估 极低
随机切分 随机打乱后按比例分配 仅适用于独立同分布数据(如非时序的传感器静态读数) 高(不推荐用于时序)

切分时还需注意窗口边界处理。若模型输入为固定长度窗口(如128点),切分时需确保训练集和验证集的窗口不重叠。一种做法是:先按时间顺序切分为连续的数据块,再从每个数据块内部提取窗口,且窗口之间保持至少50%的重叠率(用于数据增强)或完全不重叠(用于评估)。

切分操作流程:
  1. 将清洗后的完整时间序列按时间戳排序,检查连续性。
  2. 根据总数据量和目标窗口长度,确定切分比例(如70/15/15)。
  3. 按时间顺序切分为三个连续区间,区间之间保留至少1个窗口长度的间隔(防止边界效应)。
  4. 在每个区间内,按滑动窗口方式生成样本(步长=窗口长度×重叠率)。
  5. 记录每个样本的原始时间戳范围,确保可回溯。

3.5 数据存储:版本化、可复现与增量管理

TinyML项目的数据存储不仅是“把文件放在硬盘上”,而是需要建立一套支持版本追溯、增量更新和跨设备复用的存储体系。推荐采用“原始层-处理层-特征层”的三级存储架构。

  • 原始层(Raw):保存采集设备输出的原始二进制或CSV文件,文件名包含设备ID、采集日期、批次号。此层数据不可修改,仅追加。
  • 处理层(Processed):保存清洗、去噪、重采样后的数据,格式统一为Parquet或HDF5,包含完整的时间戳索引。每个处理版本对应一个处理脚本的Git提交哈希。
  • 特征层(Feature):保存提取好的特征向量和标签,直接用于模型训练。特征文件包含特征名称、提取参数、对应的处理层数据版本号。

对于MCU端部署,还需考虑量化校准数据的存储。校准数据应独立于训练集和测试集,通常从验证集中随机抽取100-1000个代表性样本,用于计算量化参数(如激活值的动态范围)。这部分数据需要单独标记,防止误用。

常见误区:很多团队将数据文件直接放在共享网盘中,文件名随意命名,版本靠“最终版_v3_真的最终版.csv”来区分。这种做法在项目迭代超过2轮后必然导致混乱。建议使用DVC(Data Version Control)或类似工具,将数据版本与代码版本绑定,确保任何一次模型训练都能精确复现所使用的数据。

3.6 实战案例:电机振动异常检测的数据规范落地

某工业物联网团队需要为一台离心泵电机部署TinyML振动异常检测模型,目标是在STM32L4系列MCU上实现实时推理。项目初期,团队直接使用现场采集的振动数据训练模型,验证准确率达到92%,但部署到板端后准确率骤降至71%。经过排查,问题根源在于数据规范缺失。

初始现象与目标:现场采集了3台同型号电机的振动数据,采样率4kHz,每台电机采集2小时。团队将数据合并后随机切分为训练集和测试集,模型在测试集上表现良好,但实际部署时误报频发。

关键输入数据与参数:原始数据包含3轴加速度计信号,ADC分辨率16位,量程±16g。采集时未记录电机负载状态(空载/半载/满载),也未记录环境温度。

分析判断过程:通过数据血缘审查发现:

  1. 3台电机的振动特征存在显著差异(轴承型号不同),随机切分导致同一台电机的数据同时出现在训练集和测试集,模型学到了“设备个体特征”而非“异常模式”。
  2. 采集时段跨越了不同负载工况,但标签仅标注了“正常”和“异常”,未区分负载状态,导致模型在不同负载下泛化能力差。
  3. 原始数据中有一段约30秒的传感器饱和记录(振动幅值超过量程),清洗时未标记,被当作正常数据参与训练。

实际操作步骤:

  1. 重新定义采集规范:每台电机在空载、半载、满载三种工况下各采集1小时,记录环境温度和电机表面温度。
  2. 清洗流程增加饱和段检测,将饱和区间标记为“无效”,不参与训练。
  3. 标注体系增加“负载状态”属性,标签变为“正常-空载”“正常-满载”“异常-半载”等组合。
  4. 切分策略改为按电机分组:2台电机数据用于训练,1台电机数据用于验证,另补采1台同型号电机数据用于测试。
  5. 存储架构采用DVC管理,每个数据版本对应采集脚本和清洗脚本的Git提交。

结果对比:重新训练后,模型在测试集(新电机)上的准确率为84%,虽然低于之前的92%,但部署到板端后实际准确率达到81%,与测试集表现基本一致。误报率从原来的每小时3.2次降至0.4次。

风险与代价:重新采集数据耗时2周,增加了项目成本。但避免了模型反复返工和现场调试的时间浪费。复盘经验表明:数据规范的核心价值不是让训练指标好看,而是让模型在真实部署环境中表现稳定。

总结复盘:数据规范的本质是建立“可追溯性”——每一个数据点都能回答“从哪来、经过什么处理、为什么这样标注、被谁使用过”。当模型出现问题时,数据血缘能帮助快速定位是数据问题、特征问题还是模型问题,避免盲目调参。