第二讲:误差来源分析——数据、模型与外部因素的“三重门”
各位好,我是老张。今天咱们聊聊误差到底从哪来的。
做负荷预测这些年,我最大的体会就是:误差不是凭空冒出来的。它就像个“三头怪”——一头扎在数据里,一头藏在模型里,还有一头飘在外部环境里。你不管哪一头,它都会给你颜色看。
我记得刚入行那会儿,有个项目预测偏差特别大。我查了三天三夜,最后发现是数据采集器坏了三天,补进去的全是垃圾值。从那以后,我养成了一个习惯:先看数据,再看模型,最后看天气。顺序不能乱。
核心观点:误差来源可归纳为三大类——数据质量问题、模型局限性、外部因素干扰。这三者往往叠加出现,但根源必须逐一排查。
一、数据质量问题——最容易被忽视的“隐形杀手”
说实话,数据问题是我见过最多的误差来源。你模型再牛,喂进去的是垃圾,出来的只能是垃圾。这是铁律。
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、用电报装容量等。这些指标能提前反映负荷变化。
小结
好了,今天的内容就到这里。总结一下:
- 数据问题——先修数据,再谈模型。缺失、异常、噪声,一个一个排查。
- 模型问题——没有万能模型。欠拟合就加复杂度,过拟合就加约束。
- 外部因素——天气、节假日、经济,一个都不能少。把它们作为特征输入模型,或者做后处理修正。
最后说一句:误差分析不是一次性工作。它应该贯穿整个预测流程。每次预测完,都要回头看看误差从哪来。时间长了,你自然就有了“直觉”——看到数据就知道问题在哪。
这就是经验的价值。