3. 数据采集与预处理:传感器网络、数据清洗、异常值检测、缺失值填充
各位同行,咱们直接进入正题。
做智慧能源平台,最头疼的往往不是算法多难,而是数据本身有多「脏」。我见过太多项目,模型跑得飞起,结果一上线就崩——原因无他,数据采集阶段就埋了雷。今天这一章,咱们就把数据从采集到清洗的流程捋一遍。说白了,就是教你怎么把一堆乱七八糟的传感器读数,变成能喂给模型的好数据。
核心观点:数据预处理占整个能效优化项目工作量的 60% 以上。别不信,我踩过的坑比你们见过的代码都多。
3.1 传感器网络:数据的「第一道防线」
传感器网络,说白了就是平台的「眼睛」和「耳朵」。但眼睛会花,耳朵会聋。我做过一个工厂项目,装了 200 多个温度传感器,结果有 30 个读数永远恒定在 25°C——后来发现是安装位置离空调出风口太近。你说这数据能用吗?
我个人习惯,在部署传感器网络时,会重点关注三个维度:
- 覆盖度:每个关键设备、每个管道节点,至少要有 2 个传感器互为备份。别省这个钱,一个传感器坏了,整个数据链就断了。
- 采样频率:能效数据变化快,建议 1 秒到 10 秒一次。太慢了抓不住瞬态波动,太快了存储扛不住。我一般取 5 秒为基准。
- 通信协议:Modbus、MQTT、OPC UA 都行,但一定要统一。我见过一个项目,同时用了三种协议,结果数据解析代码写了 2000 行——纯粹自找麻烦。
嗯,这里要注意:传感器本身也会产生噪声。比如振动传感器,安装不牢固的话,读数里全是机械振动的伪影。所以,数据采集的第一步,其实是物理层面的「清洁」。
3.2 数据清洗:把「脏东西」筛出去
数据清洗,听起来高大上,其实就三件事:去重、去噪、去异常。
去重:同一个传感器在 1 秒内上报了 3 条相同数据?大概率是网络重传。直接保留第一条,后面两条扔掉。我习惯用时间戳 + 传感器 ID 做唯一键,简单粗暴。
去噪:传感器读数偶尔会跳变,比如温度从 30°C 突然跳到 300°C,然后又回来。这种毛刺,用滑动平均滤波就能搞定。代码很简单:
def moving_average(data, window_size=5):
return [sum(data[i:i+window_size])/window_size
for i in range(len(data)-window_size+1)]
我曾经用这个函数,把一个工厂的蒸汽流量数据从「过山车」变成了「平滑曲线」。效果立竿见影。
小技巧:滑动窗口大小别设太大。我一般取 5-10 个点。太大反而会把真实波动抹掉,得不偿失。
3.3 异常值检测:揪出「害群之马」
异常值检测,是数据预处理里最考验经验的一环。为什么?因为「异常」的定义,完全取决于业务场景。
举个例子:一个电机的电流正常范围是 10-50A。某天突然飙到 200A,这肯定是异常——可能是电机堵转了。但如果是 55A 呢?算不算异常?
我个人习惯用两种方法结合:
- 3σ 原则:数据超出均值 ±3 倍标准差,标记为异常。简单,但容易误判。
- IQR 方法:四分位距法。数据超出 Q1-1.5*IQR 或 Q3+1.5*IQR,标记为异常。更稳健,适合非正态分布的数据。
我建议先用 IQR 方法粗筛,再用 3σ 精筛。这样既能抓住明显的异常,又不会漏掉那些「擦边球」。
避坑指南:我曾经在一个光伏项目中,用 3σ 方法把所有的阴天数据都标记成了异常——因为阴天发电量确实低,但那是正常现象。所以,一定要结合业务规则做二次判断。别让算法替你决定一切。
3.4 缺失值填充:别让数据「断片」
传感器网络再稳定,也难免有数据丢失的时候。网络波动、设备重启、人为误操作……原因千奇百怪。但模型训练需要连续数据,怎么办?
填充方法有很多,我按推荐程度排个序:
| 方法 | 适用场景 | 我的评价 |
|---|---|---|
| 前向填充 | 缺失时间短(< 5 个采样点) | 简单好用,我 80% 的场景都用它 |
| 线性插值 | 数据趋势明显,如温度、压力 | 比前向填充更平滑,但计算量稍大 |
| 多项式插值 | 非线性变化,如负荷曲线 | 慎用!容易过拟合,我一般不用 |
| 模型预测填充 | 缺失时间长(> 10 个点) | 效果好,但成本高。大项目才用 |
你想想看,如果缺失值只有一两个点,用前向填充就够了。何必杀鸡用牛刀?
代码实现也很简单:
import pandas as pd
# 前向填充
df.fillna(method='ffill', inplace=True)
# 线性插值
df.interpolate(method='linear', inplace=True)
嗯,这里要提醒一句:填充之前,一定要先记录缺失率。如果某个传感器缺失率超过 20%,别填充了——直接扔掉这个传感器。强行填充只会引入噪声,得不偿失。
3.5 知识体系总览
说了这么多,咱们用一张图把整个流程串起来。这是我做项目时必画的框架图,每次都能帮团队对齐思路。
这张图我每次做项目都会贴在白板上。从左到右,从上到下,每一步都有明确的输入和输出。你照着这个流程走,数据质量至少能提升一个档次。
我的经验:数据预处理没有银弹。每个项目的数据特点都不一样。我建议你拿到数据后,先花一天时间做探索性分析(EDA),看看分布、看看缺失模式、看看异常形态。然后再决定用什么方法。别一上来就套模板,那是新手才干的事。
好了,数据采集与预处理就聊到这儿。记住一句话:垃圾进,垃圾出。数据质量决定了模型的天花板。下一章咱们聊聊特征工程——怎么从这些「干净」数据里,挖出真正有价值的特征。
公众号:蓝海资料掘金营,微信deep3321