2. 实验数据接入与统一表示
实验数据智能异常发现的第一步,不是算法,而是把分散在不同设备、不同格式、不同时间基准上的原始记录,整理成一张“可被程序统一理解”的数据表。如果接入环节没有做好,后续的异常检测会把时间错位、单位混乱、缺失填充误判成真实异常,导致大量假警报。本节围绕多源采集、时间戳对齐、缺失值处理、元数据建模与数据字典构建五个环节,说明如何把原始实验数据变成统一表示。
多源实验数据的采集方式
实验环境中的数据源通常分为三类。第一类是传感器与采集卡,例如温度、压力、振动、电压信号,通过 Modbus、串口或 DAQ 设备以固定采样率输出;第二类是仪器软件导出的文件,例如色谱、光谱、材料试验机生成的 CSV 或 Excel;第三类是人工记录与系统日志,例如实验批次、操作员、环境条件。三类数据的接入方式不同:传感器适合流式采集,文件适合批量导入,人工记录适合表单录入。
采集时最关键的是保留“原始值 + 采集时刻 + 来源标识”三要素。以一台采样周期为 100 ms 的振动采集卡为例,每条记录至少应包含 device_id、channel、raw_value、unit、ts_device 五个字段。若采集程序只保存数值而丢弃设备时间戳,后续就无法判断数据是何时产生的,也无法与其他设备对齐。
时间戳对齐:把不同时钟拉到同一基准
多源数据最典型的问题是时间基准不一致。设备 A 使用本地时钟,设备 B 使用采集卡内部时钟,文件数据只有“实验开始后第几秒”。对齐的目标是统一到同一时间轴,常用做法是选择一个主时钟(如 NTP 同步的服务器时间),把其他来源的时间戳映射过去。
对齐分两步。第一步是时区与格式统一,把所有时间转换为同一时区的 ISO 8601 格式,例如 2024-06-12T09:30:15.250+08:00。第二步是重采样与插值。若设备 A 每 100 ms 一条、设备 B 每 1 s 一条,需要先确定统一采样周期,例如 1 s,再对高频数据做降采样(取均值或中位数),对低频数据做保持或线性插值。下面是一个对齐前后的示意:
对齐时要注意:不同物理量的采样率差异很大,不能简单用“最近邻”匹配,否则高频信号会被错误地压缩。对于振动这类高频信号,通常先做特征提取(如 1 s 内的均方根、峰值),再与低频温度按秒对齐,而不是把原始波形直接塞进同一张表。
缺失值处理:先判断缺失类型,再决定策略
缺失值在实验数据中非常常见,来源包括传感器掉线、通信丢包、人工漏填、仪器量程溢出。处理前必须先区分缺失类型:完全随机缺失(如偶发丢包)、随机缺失(与某些条件相关)、非随机缺失(如超量程时被截断)。不同类型对应不同策略。
常用策略有三类。第一类是删除,仅适用于缺失比例很低且不影响整体趋势的情况,例如某通道缺失率低于 1%。第二类是填充,包括前向填充、线性插值、均值填充。对于温度这类缓变量,前向填充通常可接受;对于振动这类快变量,插值会平滑掉真实冲击,应谨慎。第三类是标记,把缺失位置单独标记为 is_missing=1,让异常检测算法自行决定是否忽略。下面给出一个缺失处理的判断顺序:
输入:某通道时间序列 values[]
1. 统计缺失率 r = 缺失点数 / 总点数
2. 若 r < 1% 且缺失分散 → 删除或前向填充
3. 若 1% ≤ r < 20% 且为缓变量 → 线性插值
4. 若为快变量或 r ≥ 20% → 保留缺失标记,不强行填充
5. 输出:values_filled[] 与 is_missing[] 两列
需要强调的是,填充值不能伪装成真实测量值。工程上建议同时保留原始列和填充列,例如 temp_raw 与 temp_filled,并在数据字典中注明填充方法,便于追溯。
元数据建模:让数据自带上下文
元数据是“描述数据的数据”。在实验场景中,元数据至少应覆盖四类信息:设备信息(设备编号、型号、量程、精度)、通道信息(通道名、单位、采样率)、实验信息(批次号、实验条件、操作员)、数据信息(采集起止时间、缺失率、版本)。没有元数据,同一列 value 在不同实验中可能代表完全不同的物理量,异常检测就失去了判断依据。
元数据建模的常见做法是采用“实验—设备—通道—数据文件”四层结构。一次实验对应一个 experiment_id,实验下挂多个设备,设备下挂多个通道,通道对应具体的数据列。这样在查询时可以通过 experiment_id + device_id + channel 唯一定位一列数据,避免歧义。
数据字典构建:统一字段与单位
数据字典是把元数据落成可执行规范的关键交付物。它规定每个字段的名称、类型、单位、取值范围、缺失标记和来源。下面给出一份可直接参考的示例数据字典,字段按实验数据接入的实际需要设计:
| 字段名 | 类型 | 单位 | 说明 | 示例 |
|---|---|---|---|---|
| experiment_id | string | — | 实验批次唯一标识 | EXP-20240612-01 |
| device_id | string | — | 设备编号 | DAQ-03 |
| channel | string | — | 通道名 | vib_x |
| ts | datetime | ISO 8601 | 统一时间戳 | 2024-06-12T09:30:15+08:00 |
| value | float | 按通道定义 | 测量值 | 0.372 |
| unit | string | — | 物理单位 | mm/s |
| is_missing | int | — | 缺失标记,0 正常 1 缺失 | 0 |
| source | string | — | 数据来源 | sensor / file / manual |
data_dictionary_v1.2.yaml),字段变更时同步更新版本号,避免不同环节对同一字段理解不一致。统一表示的落地检查
完成上述五步后,可以用一组检查项确认数据是否真正“统一”:每条记录是否有唯一时间戳;单位是否统一到字典定义;缺失值是否被显式标记而非静默填充;元数据是否能反查到设备和实验;同一 experiment_id + device_id + channel 是否只对应一列数据。若这些检查通过,后续的异常检测就可以直接在统一表上按时间窗口聚合、按通道计算统计量,而不必反复处理格式差异。
至此,原始实验数据已经变成结构一致、时间对齐、缺失可追溯、元数据完整、字段有字典可查的统一数据集。这是异常发现工程中最基础也最容易被低估的一步,它决定了后续算法能否把注意力放在真正的异常上,而不是消耗在数据清洗的反复返工中。