第二讲:误差来源分析——数据、模型与外部因素的“三重门”

各位好,我是老张。今天咱们聊聊误差到底从哪来的。

做负荷预测这些年,我最大的体会就是:误差不是凭空冒出来的。它就像个“三头怪”——一头扎在数据里,一头藏在模型里,还有一头飘在外部环境里。你不管哪一头,它都会给你颜色看。

我记得刚入行那会儿,有个项目预测偏差特别大。我查了三天三夜,最后发现是数据采集器坏了三天,补进去的全是垃圾值。从那以后,我养成了一个习惯:先看数据,再看模型,最后看天气。顺序不能乱。

核心观点:误差来源可归纳为三大类——数据质量问题、模型局限性、外部因素干扰。这三者往往叠加出现,但根源必须逐一排查。

误差来源分析 数据质量问题 模型局限性 外部因素 缺失值 异常值 噪声干扰 欠拟合 过拟合 假设偏差 天气 节假日 经济 三者叠加 → 预测误差放大 → 需要针对性补偿

一、数据质量问题——最容易被忽视的“隐形杀手”

说实话,数据问题是我见过最多的误差来源。你模型再牛,喂进去的是垃圾,出来的只能是垃圾。这是铁律。

1. 缺失值

数据缺失的原因五花八门:采集器断电、通信中断、存储故障……我见过最离谱的一次,是有人误删了数据库表。嗯,手动删除的。

缺失值带来的问题很直接:时间序列不连续,模型学不到完整规律。比如你缺了中午12点的数据,那模型就不知道这个时段负荷到底怎么走。

我的经验:缺失率低于5%时,用线性插值或前向填充基本够用。超过10%就要小心了——补出来的数据可能带偏模型。我曾经在一个项目中,缺失率到了15%,补完数据后预测误差反而更大了。后来我干脆把那段时间的数据全删了,重新训练,效果反而好了。

2. 异常值

异常值比缺失值更隐蔽。它看起来有数据,但数据是错的。

举个例子:某天凌晨3点的负荷突然飙到正常值的3倍。你以为是设备故障?不,可能是采集器被雷劈了。这种异常值如果不处理,模型会以为“哦,原来凌晨也能这么高”,然后预测就偏了。

怎么识别?我习惯用3σ原则箱线图。简单粗暴,但有效。

# 一个简单的异常值检测示例
import numpy as np

def detect_outliers(data, threshold=3):
    mean = np.mean(data)
    std = np.std(data)
    outliers = []
    for i, val in enumerate(data):
        if abs(val - mean) > threshold * std:
            outliers.append(i)
    return outliers

# 使用
data = [100, 102, 98, 101, 300, 99, 103]  # 300是异常值
outlier_indices = detect_outliers(data)
print(f"异常值索引: {outlier_indices}")

注意:异常值不一定是“坏”的。比如春节期间的负荷突增,那是真实事件,不是异常。你要区分“数据错误”和“真实事件”。我吃过这个亏——有一次把春节数据当异常删了,结果模型预测春节负荷时严重偏低。

3. 噪声干扰

噪声是数据里那些随机的小波动。它不像异常值那么显眼,但长期累积下来,误差也不小。

噪声的来源很多:传感器精度不够、电磁干扰、量化误差……说白了,就是测量系统本身不完美。

对付噪声,我常用的方法是滑动平均小波去噪。但要注意:去噪太狠会把真实信号也抹掉。你想想看,如果负荷本身就有个快速波动,你把它平滑掉了,那预测还有什么意义?

二、模型局限性——没有“万能钥匙”

做预测这么多年,我越来越觉得:没有完美的模型,只有合适的模型。每个模型都有自己的“脾气”。

1. 欠拟合

欠拟合就是模型太简单,学不到数据里的规律。比如你用线性模型去拟合非线性数据,那结果肯定惨不忍睹。

我记得有个项目,同事用ARIMA模型预测负荷,效果一直不好。我一看数据,负荷有明显的周期性波动,ARIMA根本抓不住。后来换成SARIMA,加了季节项,效果立竿见影。

欠拟合的典型表现:训练误差和测试误差都很大,而且两者差不多。这时候别犹豫,换更复杂的模型,或者加特征。

2. 过拟合

过拟合是另一个极端——模型太复杂,把噪声也学进去了。训练时表现很好,一上测试数据就崩。

怎么判断?看训练误差和测试误差的差距。如果训练误差很小,测试误差很大,那八成是过拟合了。

我常用的防过拟合手段:

  • 正则化(L1/L2)——给模型加点“约束”
  • 早停法——训练到一定程度就停,别让它学过头
  • 交叉验证——别只在一份数据上评估

我的建议:别一上来就用深度学习。先试试简单模型,比如线性回归、决策树。如果效果还行,再逐步加复杂度。我见过太多人一上来就上LSTM,结果调参调得怀疑人生。

3. 假设偏差

每个模型都有假设。线性回归假设数据是线性的,ARIMA假设数据是平稳的,神经网络假设数据有足够的样本量……

如果数据不满足这些假设,模型就会出问题。比如你用ARIMA预测非平稳数据,那误差会大得离谱。

怎么办?先做数据检验。平稳性检验、正态性检验、相关性检验……别嫌麻烦。我每次拿到新数据,第一件事就是画图、做检验。花10分钟做这些,能省后面10小时的调参时间。

三、外部因素——你控制不了,但必须考虑

这部分最让人头疼。数据问题可以修,模型问题可以调,但外部因素……你改变不了天气,也改变不了节假日。

1. 天气因素

天气对负荷的影响,说白了就是温度、湿度、光照、风速这几样。夏天热了开空调,冬天冷了开暖气,负荷自然就上去了。

我做过一个统计:在南方城市,温度每升高1℃,负荷平均增加2%-3%。这个数字在不同地区差别很大,但趋势是一致的。

怎么处理?把天气数据作为特征输入模型。但要注意:天气预报本身也有误差。你用的预报温度是明天的,但明天实际温度可能差好几度。这就会引入额外的误差。

一个小技巧:如果天气预报不准,可以考虑用“历史同期天气”作为参考。比如预测明天负荷,用去年同一天、同样天气条件下的负荷数据做修正。我试过,效果还不错。

2. 节假日因素

节假日对负荷的影响非常明显。春节、国庆、五一……这些长假期间,工业负荷大幅下降,居民负荷可能上升(比如大家都在家看电视)。

但节假日的影响不是固定的。比如2020年疫情,春节后复工推迟,负荷恢复得特别慢。如果你用往年的规律去预测,那误差就大了。

我的做法是:建立节假日标签。把每个日期标记为“工作日”、“周末”、“法定节假日”、“调休日”等。然后让模型自己去学不同标签下的负荷规律。

日期类型 负荷特征 典型误差来源
工作日 双峰(上午、下午高峰) 临时会议、设备检修
周末 单峰(中午高峰) 天气变化、外出活动
法定节假日 低谷(工业负荷消失) 假期长度、调休安排
特殊日期 不确定 突发事件、政策变化

3. 经济因素

经济因素影响的是长期趋势。GDP增长、产业结构调整、电价变化……这些不会一天之内改变负荷,但会慢慢改变负荷的“基线”。

我记得2015年有个项目,我们用的模型预测未来一年的负荷。结果那年当地引进了一个大型工业园,负荷一下子涨了20%。模型完全没预料到,因为训练数据里没有这个信息。

怎么应对?定期更新模型。别指望一个模型用三年。我建议每季度重新训练一次,加入最新的经济数据。如果遇到重大经济事件(比如新工厂投产、大型企业搬迁),要手动调整预测结果。

重要提醒:经济因素的影响是滞后的。今天的经济政策,可能半年后才体现在负荷上。所以做预测时,要关注经济指标的“先行指数”,比如PMI、用电报装容量等。这些指标能提前反映负荷变化。

小结

好了,今天的内容就到这里。总结一下:

  • 数据问题——先修数据,再谈模型。缺失、异常、噪声,一个一个排查。
  • 模型问题——没有万能模型。欠拟合就加复杂度,过拟合就加约束。
  • 外部因素——天气、节假日、经济,一个都不能少。把它们作为特征输入模型,或者做后处理修正。

最后说一句:误差分析不是一次性工作。它应该贯穿整个预测流程。每次预测完,都要回头看看误差从哪来。时间长了,你自然就有了“直觉”——看到数据就知道问题在哪。

这就是经验的价值。


专注资料整理