3. 数据预处理技术:数据清洗、归一化与异常检测
各位工程师朋友,大家好。今天我们来聊聊数据预处理。说实话,在轨道交通售货机这个领域,我踩过的坑有一半都跟数据质量有关。你想想看,售货机每天在站台上风吹日晒,传感器信号受干扰、通信偶尔丢包、数据采集时间戳漂移……这些问题太常见了。
数据预处理,说白了就是给原始数据「洗个澡」。不洗干净,后面的故障诊断模型就是空中楼阁。我个人习惯把预处理分成四大块:数据清洗、归一化、时间对齐、异常检测。咱们一个一个来。
3.1 数据清洗:去噪与去重
先讲数据清洗。这是最基础,也是最容易被忽视的一步。
去噪,就是去掉那些明显不合理的「毛刺」。比如售货机的温度传感器,正常范围是 -20°C 到 60°C。如果突然跳出一个 120°C,那肯定是传感器抽风了。我在项目中遇到过,某条线路的售货机频繁报「高温故障」,结果查了半天,是传感器接口进水了,数据全是噪声。
常用的去噪方法有:
- 限幅滤波:设定合理范围,超出就剔除或替换为前值。
- 中值滤波:对连续几个采样点取中值,能有效消除脉冲噪声。
- 滑动平均:适合平滑缓慢变化的信号,比如货道电机电流。
重要原则:去噪不是越狠越好。过度滤波会丢失真实故障特征。我建议先做可视化,看看噪声的分布规律,再选方法。
去重,这个更常见。售货机上报数据时,可能因为网络重传、MQTT消息重复订阅,导致同一时刻的数据出现多条。去重很简单,按时间戳和设备ID做唯一键,保留第一条或最后一条即可。
小技巧:去重时别忘了检查时间戳精度。有些老设备的时间戳只精确到秒,同一秒内多条数据可能是正常的。这时候需要结合序列号或自增ID来判断。
3.2 数据归一化:让不同量纲的数据「平起平坐」
归一化,我把它叫做「数据翻译官」。售货机的数据五花八门:温度是几十度,电流是几安培,故障码是整数,库存是百分比。这些数据直接扔进模型,量纲大的特征会主导结果,量纲小的特征就被淹没了。
常用的归一化方法有两种:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Min-Max 归一化 | x' = (x - min) / (max - min) | 数据分布较均匀,无极端离群点 |
| Z-score 标准化 | x' = (x - μ) / σ | 数据有离群点,或分布近似正态 |
我个人习惯:如果后续要用神经网络或距离相关的算法(如KNN),优先用Min-Max。如果数据有异常值,或者要用线性回归、SVM,那就用Z-score。嗯,这里要注意,归一化的参数(min、max、μ、σ)一定要从训练集计算,然后应用到验证集和测试集上,不能混在一起算。
避坑指南:我曾经犯过一个错——对故障码也做了归一化。结果模型把「故障码1」和「故障码2」当成了连续数值,认为它们之间有大小关系。其实故障码是类别变量,应该做独热编码,而不是归一化。切记!
3.3 时间序列对齐:让数据「对上表」
轨道交通售货机的数据来源很多:主控板每5秒上报一次状态,支付模块每10秒上报一次交易,温控模块每30秒上报一次温度。这些数据的时间戳往往不同步。你想想看,如果要对某个故障时刻做根因分析,时间对不上,那分析个啥?
时间序列对齐,就是把不同频率的数据统一到同一个时间轴上。常用的方法有:
- 降采样:以最慢的数据频率为基准,其他数据取均值或最近值。
- 升采样:以最快的数据频率为基准,慢数据用插值填充。
- 重采样:指定一个固定间隔(比如1秒),所有数据都重采样到这个间隔上。
我建议用重采样,因为它最灵活。比如统一到1秒间隔,温度数据用线性插值,故障码用前向填充(因为故障状态会持续)。
核心要点:对齐后的数据,一定要检查时间戳是否连续。如果中间有缺失,要么用插值补上,要么标记为缺失值。千万别跳过,否则模型会以为时间轴是连续的,导致时序关系错乱。
3.4 异常值检测:3σ原则与IQR方法
异常值检测,是故障诊断的前哨战。售货机的异常数据,可能是传感器故障、通信异常,也可能是真正的设备故障。怎么区分?先靠统计方法筛一遍。
3σ原则:假设数据服从正态分布,那么99.7%的数据会落在均值±3σ范围内。超出这个范围的,视为异常。这个方法简单粗暴,适合数据量大、分布对称的场景。
IQR方法:四分位距法。计算数据的Q1(25%分位数)和Q3(75%分位数),IQR = Q3 - Q1。正常范围是 [Q1 - 1.5*IQR, Q3 + 1.5*IQR]。超出这个范围的,视为异常。这个方法对偏态分布更鲁棒,不要求数据服从正态分布。
我个人的经验:
- 售货机的电机电流、温度等物理量,用3σ原则效果不错。
- 故障码出现频率、交易金额等分布偏态的数据,用IQR更靠谱。
- 两种方法可以结合使用:先用IQR筛出明显异常,再用3σ做精细检测。
实战技巧:我曾经处理过一批售货机的电流数据,用3σ原则检测出了几十个异常点。但仔细一看,这些异常点都发生在早晚高峰时段,其实是正常的大电流。后来我改用滑动窗口的3σ——只跟过去1小时的数据比,而不是跟全天比。效果好了很多。所以,异常检测也要考虑时间上下文。
好了,数据预处理这块就讲到这里。总结一下:
- 清洗:去噪别过度,去重要小心。
- 归一化:量纲统一,但别对类别变量下手。
- 时间对齐:频率统一,插值要合理。
- 异常检测:方法选对,上下文别忘。
下一章,我们会把这些预处理后的数据,喂给故障诊断模型。到时候你就知道,前面这些功夫没白花。