在能碳项目的边缘数据清洗中,很多工程师第一反应是用3-Sigma(三倍标准差)法则。但在真实的能耗数据面前,3-Sigma往往会失效。
原因在于能耗数据是典型的非平稳数据:白天高负荷时段波动大,夜间低负荷时段波动小。
如果用全局数据计算标准差,白天的高波动会把标准差整体拉大,导致夜间真正的异常被漏检;反之,如果只用夜间数据算标准差,标准差又会很小,白天正常的负荷波动反而会被误判为异常(误杀)。
这就是为什么在能碳数据清洗中,MAD(中位数绝对偏差)算法比3-Sigma更实用。MAD基于中位数,对极端值不敏感,天然适合非平稳的能耗时序数据。
MAD的核心实现逻辑
MAD的核心思想是:先找到数据中心位置(中位数),然后计算每个点偏离中心的程度,再取这些偏离程度的中位数作为"典型偏离尺度"。
具体步骤如下:
- 取最近N个采样点作为滑动窗口;
- 计算窗口内数据的中位数 Median;
- 计算每个点与 Median 的绝对偏差,再取这些偏差的中位数,结果即为MAD值;
- 当前点与 Median 的差值超过 k × MAD 时,判定为异常点。
代码实现:
1def mad_outlier_detection(window, current_point, k=3.5):
2 # 1. 计算窗口中位数
3 median = np.median(window)
4
5 # 2. 计算绝对偏差的中位数
6 abs_deviation = np.abs(window - median)
7 mad = np.median(abs_deviation)
8
9 # 3. 判定当前点是否为异常
10 if mad == 0:
11 return False # 所有值相同,无异常
12
13 deviation = abs(current_point - median)
14 return deviation > k * mad
窗口大小怎么定
窗口大小是MAD算法最关键的参数之一,直接决定了算法的灵敏度和稳定性。
窗口太小(如3-5个点):对突发尖峰的判定过于敏感。设备启停瞬间的正常电流冲击,很容易被误判为异常并剔除,导致数据失真。
窗口太大(如30个点以上):对真实异常的响应变慢。如果传感器发生漂移,需要等窗口滑动很久才能检测到,清洗后的数据会有明显滞后。
推荐默认值:对于采样频率为1分钟一次的能碳数据,默认窗口大小设为10个采样点(即10分钟窗口)。这个长度既能覆盖设备启停的瞬态过程,又能保持对稳态异常的及时响应。不同设备可独立配置,比如电表用10个点,水表用15个点。
阈值k怎么调
k值决定了异常判定的严格程度。在实际工程中,不能用一个固定值打天下,需要根据数据积累阶段动态调整。
冷启动阶段(样本 < 10个):窗口刚填满时,统计基础薄弱,MAD值本身可能不稳定。此时应将阈值放宽到4.5-5.0,避免小样本误判把正常数据当异常杀掉。
稳态运行阶段(样本 > 30个):数据积累充足,MAD值趋于稳定。此时可收紧到3.0-3.5,这是工程实践中验证过的通用区间,能平衡误报和漏报。
不同设备的配置差异
桐盛在智慧公共空间场景中已将MAD清洗做成了标准交付能力,正在向公共机构能碳项目平移。
在能碳场景中,电表、水表、燃气表的工况完全不同,MAD窗口和阈值不能共用一套参数。
电表数据受设备启停影响大,瞬态尖峰多,窗口可以稍小(8-10个点),阈值取3.5;水表数据变化缓慢,偶发脉冲干扰,窗口可以稍大(15-20个点),阈值取3.0;燃气表数据通常比较平稳,但可能存在周期性波动,窗口和阈值需要根据实际工况现场标定。
核心原则是:参数配置必须跟着设备工况走,而不是跟着算法走。