3. 实验数据质量与预处理
实验数据从采集端进入处理链路时,往往同时带有三类质量问题:缺失、异常和噪声。它们看起来都表现为“数据不对”,但成因、识别方式和处理策略完全不同。缺失值是某个字段没有采集到或写入失败;异常值是数值明显偏离正常物理范围或统计分布;噪声则是数值在正常范围内但存在随机抖动。把三者混为一谈,会导致清洗规则互相覆盖,甚至把真实信号当作错误剔除。本节围绕这三类问题的识别与处理,进一步讨论批处理和流处理如何共用一套清洗规则,以及如何通过数据校验和血缘追踪保证清洗过程可解释、可回溯。
缺失值的识别与处理
缺失值在实验数据中通常有三种形态:空值(NULL)、占位符(如 -999、0、空字符串)和隐式缺失(该时间点根本没有记录)。前两种可以通过字段级检查发现,第三种需要结合时间序列的采样间隔判断。例如某传感器设定每 5 秒上报一次,若相邻两条记录时间差超过 15 秒,就应标记为“疑似丢点”。
处理缺失值前,先要区分缺失机制。如果缺失与数值本身无关(如网络抖动导致随机丢包),可以用插值或前值填充;如果缺失与数值相关(如超量程时设备主动不输出),则填充会引入偏差,应保留缺失标记并交给下游判断。常用策略包括:
- 删除:仅适用于缺失比例极低且随机的情况,删除整行或整段。
- 前向填充:用上一条有效值填充,适合变化缓慢的温度、压力等慢变量。
- 线性插值:在相邻有效点之间按时间比例插值,适合采样均匀的连续量。
- 均值/中位数填充:适合离线批处理中的统计补齐,但会压缩方差,需谨慎。
- 保留缺失标记:不填充,增加
is_missing标志位,让模型或规则自行处理。
在批流统一场景下,前向填充和线性插值都可以用同一套算子表达:流处理维护一个“最近有效值”状态,批处理按时间排序后做窗口计算,两者输出语义一致。
异常值与噪声的区分
异常值通常由设备故障、传输错误或实验操作失误造成,表现为超出物理量程、跳变过大或与关联字段矛盾。噪声则是测量系统固有的随机误差,表现为围绕真值的小幅波动。区分二者的关键是“是否可解释”:一个温度值突然从 25℃ 跳到 250℃,若量程上限是 150℃,它就是异常值;若在 25℃ 附近上下波动 ±0.3℃,则属于噪声。
异常值检测常用三类方法:
- 物理阈值:根据量程和工艺设定硬边界,如温度 ∈ [-40, 150]℃。
- 统计方法:3σ 准则、IQR 四分位距、Z-Score,适合近似正态分布的数据。
- 时序方法:一阶差分、滑动窗口均值偏差、变化率限制,适合捕捉跳变。
噪声处理则更多使用平滑滤波:滑动平均、中值滤波、Savitzky-Golay 滤波、低通滤波等。中值滤波对脉冲噪声效果好且能保留阶跃边缘;滑动平均实现简单但会削弱高频真实信号。选择滤波窗口时,窗口长度应小于真实信号的最短变化周期,否则会把有效变化也平滑掉。
批流统一清洗规则
批处理和流处理如果各写一套清洗逻辑,最容易出现“同一份数据离线清洗和实时清洗结果不一致”的问题。统一清洗规则的核心是把清洗逻辑抽象为与执行引擎无关的规则描述,再由批、流两种运行时分别解释执行。规则通常包含四部分:
- 作用对象:表名、字段名、设备类型或测点标识。
- 判断条件:缺失判断、阈值判断、差分判断、统计判断。
- 处理动作:填充、剔除、标记、截断、平滑。
- 优先级与顺序:先缺失、再异常、后噪声,避免规则互相干扰。
下面是一段规则配置示例,用 JSON 描述,批流两侧共用:
{
"rule_id": "clean_temp_001",
"target": {"table": "sensor_reading", "field": "temperature"},
"steps": [
{"type": "missing", "method": "forward_fill", "max_gap_sec": 30},
{"type": "range", "min": -40, "max": 150, "action": "mark_invalid"},
{"type": "diff", "max_delta": 20, "window_sec": 5, "action": "mark_outlier"},
{"type": "smooth", "method": "median", "window": 5}
]
}
流处理侧把 forward_fill 实现为状态算子,批处理侧按时间排序后用窗口函数实现;range 和 diff 在两侧都是逐行判断,语义天然一致;smooth 在流侧用滑动窗口,在批侧用窗口聚合,只要窗口定义相同,结果就相同。这样,同一份规则既能跑离线补数,也能跑实时链路。
数据校验与血缘追踪
清洗之后必须做校验,否则无法判断清洗是否“洗对了”。校验分三层:字段级校验(类型、范围、非空)、记录级校验(字段间约束,如“结束时间 ≥ 开始时间”)、批次级校验(行数、缺失率、异常率是否在预期区间)。校验结果应写入质量指标表,供监控和告警使用。
血缘追踪解决的是“这条数据从哪来、经过了哪些清洗、变成了什么”。在批流一体架构中,血缘至少应记录:源表/源主题、清洗规则 ID、处理时间、输出表/主题、以及关键字段的变换关系。当发现某批数据异常时,可以沿血缘反向定位到具体规则和源数据,判断是采集问题还是清洗规则误伤。
把上述链路串起来看,一次完整的清洗过程是:数据从源端进入,批流两条通道分别读取同一份规则,规则引擎按“缺失→异常→噪声”的顺序执行,输出结果经过三层校验后写入结果表,同时把规则 ID、处理时间和字段变换写入血缘记录。当校验指标超出预期时,可以沿血缘反向定位到具体规则和源数据,判断是采集故障、传输丢包还是规则参数设置不当。
最后需要强调,清洗不是“把数据改得好看”,而是在保留真实信号的前提下,把可识别的错误标记出来或修正掉。缺失值要区分机制,异常值要结合物理量程和统计分布,噪声处理要控制窗口长度;批流统一的关键是规则描述与执行引擎解耦;校验和血缘则是让整个清洗过程可观测、可回溯。这四件事做到位,后续的特征工程和模型训练才有可靠的数据基础。