老王在城南开了二十年面馆,最头疼的不是手艺,而是“明天到底准备多少”。备少了,客人排队等位,骂骂咧咧;备多了,十斤面剩下来,肉臊子不新鲜。十几年练下来,他养成习惯:打烊后看天气、翻日历、回忆上周客流,凭直觉拍脑袋定个数。偶尔准,更多时候差得离谱。 智能电网的调度员,其实和老王做着同一件事:预测明天的用电负荷。电网几乎不能储存大量电能,发电必须紧跟用电,而发电机组从启动到满负荷需要几十分钟甚至几小时。如果预测不准,电发多了是浪费,发少了就得拉闸限电。只不过,调度员面对的是一口“超级大锅”——千万用户的用电曲线。他们需要一个比“拍脑袋”可靠得多的“客流水晶球”。这篇文章,就来讲讲这个水晶球是怎么造出来的:收集数据、清洗数据、提炼特征、训练模型、量化误差,最后把预测变成调度台上的决策。
负荷预测是智能电网调度的“地基工程”,掌握它意味着你理解了能源 AI 最核心的一环——预测精度每提升 1%,都可能为电网节省巨额调节成本,这是 AI 从业者在能源行业最直接的价值体现。
目录
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
负荷预测意义:为什么老王要先估客流
老王打烊后必做一件事:盘算明天能来多少客人。这事干得好,面备得刚够,臊子新鲜,伙计不闲也不忙;干得差,不是客人在门口排队骂娘,就是晚上剩了半锅汤。他常说,这口锅就是他的“小电网”——不能多煮,也不能少煮。对电网来说,这个道理一模一样。
电网和面馆一样,电力这种商品几乎无法大规模储存,发多少就必须用多少,用多少就得发多少。而发电机组从接到调度指令到满负荷运转,快的要几十分钟,慢的要几个小时。所以调度员必须提前预测未来一段时间的用电负荷,就像老王必须提前备菜、排班、采购。
预测精度直接影响三个层面。调度基础上,预测是机组启停和检修安排的输入;运行效率上,预测偏差会造成频繁调峰,加剧设备磨损;经济成本上,预测低了要临时高价购电,预测高了则白白浪费燃料。衡量调度难度的一个关键指标是峰谷差:
理解了峰谷差,老王就明白了自己那口“锅”的道理:如果客流总是忽多忽少,他就必须准备更多灵活的人手和原料。负荷预测的意义,就是提前看见那条曲线的高低起伏,让调度从容不迫。
- P_max 与 P_min 的含义分别表示一天中负荷的最大值和最小值,例如上午十点的用电高峰与凌晨三点的用电低谷。
- 相减得到峰谷差最大值减最小值,用来衡量一天负荷波动的剧烈程度。
数据预处理:把糊掉的账本重新誊清
老王的账本记了十年,可他心里清楚:账本不能直接用。有时候墨水洇了,某天客流没记上;有时候他记岔了,把周日的人流量写到了周一;有时候隔壁老李来帮忙,记的单位是“碗数”,和他自己的“客人数”对不上。要预测,先得对账。
电网的数据中心也是一样。用电采集器可能断线、掉包、被电磁干扰,历史负荷数据里天然带着三种“脏”:缺失(某小时没采到)、异常(数值忽大忽小甚至为负)、量纲不统一(温度和负荷不是一个单位)。这些脏数据不处理,模型就会学进错误模式。
对应有三件事要做。缺失值填补用相邻时刻或历史同期的均值、插值补上空洞;异常值检测用阈值法或统计法(比如超过三倍标准差)找出并修正离谱的点;数据归一化让所有特征落到相近尺度,避免量纲差异主导梯度下降。此外还要做时间对齐,把不同来源的时间戳统一到同一个时钟上。最常用的归一化是 Z-score 标准化:
老王把账本重新誊了一遍:糊掉的日子用前后几天平均补上,记错的挪回正确位置,“碗数”统统换算成“客人数”。账本干净了,预测才有地基。
- 分子中心化原始值 x 减去均值 μ,让整个数据分布的对称中心移到 0 点。
- 分母缩放除以标准差 σ,把数据的离散程度压缩到统一的“单位尺度”。
特征工程:给模型配一副好眼镜
光有干净的历史账本还不够。老王发现,同样的客流,在雨天、周末、学校放暑假时完全不同。他会看明天的天气预报、翻日历,甚至留意隔壁商场有没有促销——这些“旁敲侧击”的信号,就是他的备菜依据。
对负荷预测来说,特征决定了模型的“视野”。常用特征分三类:时序特征(历史负荷的滞后值、滑动平均、当前时刻)、气象因素(温度、湿度、风速)、节假日效应(工作日、周末、节假日的标记,春节和国庆这类大节更是特例)。还有一个容易被忽略的:温度滞后——连续高温几天后,建筑物的热量不断累积,空调负荷会逐日爬升。温度对负荷的影响总是“慢半拍”的。
滞后特征是最直接的时序特征构造法:用过去若干时刻的负荷值作为当前时刻的输入。这样模型看到的不再是一个孤零零的数字,而是一小段“历史回放”。
老王把“明天天气、周几、有没有促销、上周同时段客流”写在便利贴上,贴在收银台。模型也一样:把所有相关信号装进特征向量,眼界越宽,预测越准。
- X_t 的含义第 t 时刻模型的输入特征向量,由过去 24 小时的负荷值拼接而成。
- 窗口长度选择24 小时覆盖“昨天同一时刻”的信息,让模型能捕捉到日周期性。
深度学习模型:招一个会记笔记的 AI 学徒
老王攒了一手好“直觉”,但他知道自己不可能记住三年每一天的客流细节。于是他想,能不能找个“AI 学徒”帮自己盯数据?这个学徒要有个本事:既能记住很久以前的规律(比如去年同期),又不会被上周某个异常的周一带偏。
这正是循环神经网络家族的本行。LSTM(长短期记忆网络)通过一种叫“门”的结构,决定记忆什么、忘记什么——本质上是一个会自己整理笔记的学徒。近年来,Transformer 和注意力机制也被引入负荷预测,让模型能直接“回看”任意距离的关键历史时刻,而残差连接则帮助网络在堆得更深时依旧稳定训练。
以 LSTM 的遗忘门为例,它决定了上一步的记忆要保留多少:
这个 AI 学徒刚来时只会在纸上画葫芦,但经过几千次“对账纠错”(训练),它慢慢学会了老王的节奏:知道早晨该上多少面,天冷了客人要多点热汤。深度模型,本质上是把经验内化成了参数。
- f_t 的含义第 t 步遗忘门的输出,数值在 0 到 1 之间,代表对旧记忆的保留比例。
- 输入拼接把上一步的隐状态 h_{t-1} 与当前输入 x_t 拼在一起,作为门的“素材”。
- 线性变换加偏置权重矩阵 W_f 和偏置 b_f 把拼接素材压缩成一个标量分数。
- 激活函数σ(sigmoid)把任意实数压到 0 到 1 区间,形成“保留比例”。
多尺度预测:三张便利贴,三种准备
老王的预测分三种:明天的客流决定备菜量;下周的客流决定要不要临时招工;下个月的客流决定要不要添置新灶台。同一个面馆,三个时间尺度的预测,用途完全不同。
电网也是一样。短期预测(未来几小时到一天)支撑日前调度与实时平衡;中期预测(未来几天到几周)安排机组检修和燃料采购;长期预测(未来数月到数年)指导电网规划与新能源并网。不同尺度对数据长度、刷新频率和模型复杂度要求各不相同。
一个常用做法是把负荷序列看作多个成分叠加:长期趋势、周期波动和随机残差。把它们拆开分别建模再合成,比直接硬拟合更容易抓住规律。
老王把三种预测写成三张便利贴:明天的贴在案板前,下周的贴在招工启事旁,下个月的贴在银行申请单上。多尺度预测不是选择题,而是三件套。
- T(t) 趋势项负荷随年份、经济增长缓慢变化的“大方向”。
- S(t) 周期项以天、周、年为周期的规律性波动,比如每日早晚双峰和周末低谷。
- R(t) 残差项剔除趋势和周期后剩余的随机波动,是预测中最难啃的部分。
不确定性量化:敢说“上下浮动”才是真本事
老王和客人闲聊时会说:“明天大概 80 桌,上下浮动 10 桌。”客人笑他啰嗦,但他心里清楚:报一个“80 桌”听起来干脆,却更容易误事。真正管用的,是那个“浮动”。
负荷预测也一样。出于天气突变、社会事件、设备故障等随机因素,单点预测注定会偏。与其假装精确,不如给出区间预测:例如“明天下午两点负荷为 9500 万千瓦,95% 置信区间为 9200 到 9800 万千瓦”。调度员按区间上沿安排备用,才敢睡个安稳觉。
实现区间预测的常用工具是分位回归。它不直接学“平均值”,而是学“某个分位数”(比如下 5% 分位和上 95% 分位),两个分位合起来就围成了一个区间。训练时用分位损失(Pinball Loss)来衡量偏差:
老王那句“上下浮动 10 桌”,其实就是他的 95% 分位区间。小本经营,宁可多备一点菜,也不能让客人干等。预测带有多宽,决定了面馆和电网的底气。
- u 表示偏差真实值减预测值。u 为正说明预测偏低,为负说明预测偏高。
- 不对称权重q 和 q-1 分别惩罚两种方向的误差,q 越大模型越倾向于高估。
- 取最大值max 保证两种惩罚中较大的那一项生效,构成一个凸的分段函数。
调度决策应用:预测落地变成明天的采购单
预测不是摆着好看的,最终要变成“明天怎么干”。老王对完账后,会写下明天的采购单和排班表:采购多少斤面,几点让伙计到岗。预测的价值,在第二天那锅面刚好够的那一刻才兑现。
电网调度员拿到负荷预测后,下达的是机组组合指令:明天哪些机组开、哪些机组停、各自带多少负荷,用最低的成本满足预测负荷。此外还有需求响应:预测到尖峰负荷时,提前向大用户发出“错峰用电”邀约,把峰值削下去;以及备用容量:预留一定比例的可调电力,用来应对预测偏差和突发故障。
机组组合本质上是一个优化问题:
老王看着预测单下单、排班,把浮动区间变成采购的余量。预测的真正价值,不在于图纸上的曲线,而在于第二天锅里的面刚好够、伙计刚好不闲不忙。
- 目标函数 c_i P_i第 i 台机组的单位发电成本乘以其出力,再对所有机组求和,得到总成本。
- 等式约束所有机组出力之和必须等于预测负荷,这是电网安全运行的红线。
- 预测值的枢纽作用P_forecast 是预测环节的输出,也是决策环节的输入,把两篇文章串成一个故事。
评估与优化:打烊后的那笔对账
打烊后,老王会拿出今天的实际客流,和昨天预测的数字对一对:差多少?总是高估还是低估?哪个环节出了问题?这一笔账,他记了一整本。没有对账,就没有进步。
对预测模型的“对账”同样重要。常用指标有 MAE(平均绝对误差)、RMSE(均方根误差,对大误差更敏感)和 MAPE(平均绝对百分比误差)。其中 MAPE 最直观,因为结果就是“百分之几”,管理层一看就懂。
评估之后是优化。误差分析找出模型在哪些时段系统性偏差(比如总是低估晚高峰),超参优化用网格搜索或贝叶斯优化调整窗口长度、层数、学习率,在线更新随着新数据不断微调模型,让它跟上季节和用户习惯的变化。老王发现自己的账本越记越准,因为每次对完账,他都会把经验升级。评估不是终点,而是下一次预测的起点。
- 单个样本的误差比真实值减预测值的绝对值,除以真实值,消除量纲影响。
- 求和取平均n 个样本的误差比加总后除以 n,得到平均偏离比例。
- 换算成百分比乘以 100%,变成直观的百分数,方便不同量级的负荷之间比较。
AI 应用场景
电网调度中心的日前机组组合
阶段:预测输出 → 决策优化
解决的问题:过去调度员靠经验口头预估次日负荷,缺乏量化误差概念,机组启停频繁、燃料成本高。AI 负荷预测模型给出次日 96 点负荷曲线与置信区间,优化引擎据此安排机组组合,降低煤耗。
具体案例:某省级调度中心使用 LSTM 加分位回归模型,次日负荷预测 MAPE 稳定在 2% 以内。调度台将预测曲线输入机组组合优化器,低谷时段关停两台机组,仅此一项全年节省燃料成本上千万元。
需求响应与错峰管理
阶段:预测预警 → 用户侧激励
解决的问题:尖峰负荷高企时,传统做法是直接拉闸限电。利用短期预测提前识别尖峰时段,向签约用户推送错峰补偿邀约,把部分负荷从尖峰“搬”到低谷。
具体案例:夏季连续高温日,预测模型提前三天报警“负荷将刷新纪录”,运营商向储能电站和工业用户发放需求响应邀约,顺利转移负荷 50 万千瓦,避免了一次大规模有序用电。
备用容量动态调整
阶段:区间预测 → 安全校核
解决的问题:单点预测无法回答“万一预测错了怎么办”。利用区间预测的置信上界确定备用容量,既不过度预留造成浪费,也不留太少导致风险。
具体案例:某地区风电占比高、负荷波动大,调度中心按 90% 置信区间的上沿动态预留旋转备用,使备用购买成本下降 15%,系统可靠性指标不降反升。
Python 演示
import numpy as np def make_load_data(days=30): # 生成 days 天的每小时负荷模拟数据 hours = days * 24 t = np.arange(hours) / 24.0 trend = 50 + 2 * np.sin(2 * np.pi * t / 7) daily = 15 * np.sin(2 * np.pi * t - np.pi / 2) noise = np.random.RandomState(42).normal(0, 2, hours) return trend + daily + noise def make_features(x, window=24): # 滑动窗口构造特征矩阵 X 和目标 y n = len(x) X = np.zeros((n - window, window)) y = np.zeros(n - window) for i in range(window, n): X[i - window] = x[i - window:i] y[i - window] = x[i] return X, y class MiniMLP: def __init__(self, d_in, d_hidden=16, seed=0): rng = np.random.RandomState(seed) self.w1 = rng.randn(d_in, d_hidden) * 0.1 self.b1 = np.zeros(d_hidden) self.w2 = rng.randn(d_hidden, 1) * 0.1 self.b2 = np.zeros(1) def train(self, X, y, epochs=200, lr=0.01): for _ in range(epochs): h = np.tanh(X @ self.w1 + self.b1) pred = h @ self.w2 + self.b2 loss = np.mean((pred - y) ** 2) d_pred = 2 * (pred - y) / len(y) self.b2 -= lr * np.sum(d_pred, axis=0) self.w2 -= lr * h.T @ d_pred d_h = d_pred @ self.w2.T * (1 - h ** 2) self.b1 -= lr * np.sum(d_h, axis=0) self.w1 -= lr * X.T @ d_h def predict(self, X): h = np.tanh(X @ self.w1 + self.b1) return (h @ self.w2 + self.b2).ravel() def main(): raw = make_load_data(days=60) mu, sigma = raw.mean(), raw.std() data = (raw - mu) / sigma X, y = make_features(data, window=24) split = int(len(X) * 0.8) X_tr, X_te = X[:split], X[split:] y_tr, y_te = y[:split], y[split:] model = MiniMLP(d_in=24) model.train(X_tr, y_tr, epochs=300) pred = model.predict(X_te) * sigma + mu true = y_te * sigma + mu mape = np.mean(np.abs((true - pred) / true)) * 100 print("测试集 MAPE: %.2f%%" % mape) for i in range(6): print("真实 %.1f | 预测 %.1f" % (true[i], pred[i])) if __name__ == "__main__": main()
data = (raw - mu) / sigmaZ-score 标准化,把负荷归一到同尺度,对应“清洁账本”的归一化环节。X[i - window] = x[i - window:i]滑动窗口特征,用过去 24 小时预测当前时刻,对应特征工程中的滞后值。split = int(len(X) * 0.8)按时间顺序 8:2 切分训练集和测试集,绝不随机打乱,防止未来信息泄露。h = np.tanh(X @ self.w1 + self.b1)隐藏层激活,相当于模型的“学徒笔记”。mape = np.mean(np.abs((true - pred) / true)) * 100计算 MAPE,对应老王打烊后的那笔对账。
常见误区
误区我一直以为负荷预测的目标是把误差做到 0,只要模型够复杂、数据够多,就能准确猜中每一小时的负荷。
正解负荷本身包含大量不可约的随机成分:天气突变、大型赛事、设备故障。预测的世界里没有“水晶球”,只有“更窄的区间”。与其追求误差归零,不如把不确定性量化出来并纳入调度决策。就像老王不会保证“正好 80 桌”,而是说“80 桌上下浮动 10 桌”。
为何常见:初学者容易把预测理解成“猜谜”,而忽略了负荷本质上是一个随机过程,任何预测都只能逼近其条件期望。
误区深度学习听起来更高级,所以负荷预测模型无脑选 LSTM 就对了,传统统计方法早就过时了。
正解模型选择取决于数据量、任务尺度和部署约束。当历史数据只有几个月、序列比较平稳时,ARIMA 这类线性模型不仅训练快,还可能更稳;LSTM 需要大量数据“喂”出非线性模式,数据不足时反而容易过拟合。多尺度预测中,不同尺度甚至应配不同模型,就像老王预测明天客流靠直觉,预测下个月客流反而要看日历和天气的统计规律。
为何常见:“越复杂越先进”的直觉,加上技术文章常以 SOTA 模型为卖点,让人忽略了泛化与稳定性的实际代价。
误区训练样本和测试样本之间没什么关系,随机打乱划分才能保证两边的分布一致。
正解时序数据有一个致命属性:未来信息不可见。随机打乱会把“明天的数据”泄露给“昨天的模型”,使评估结果虚高。正确做法是按时间顺序切分,训练集永远在测试集之前。可以类比老王对账:你不能先看了明天的客流量,再回头说是靠昨天的账本预测出来的。
为何常见:初学者把机器学习通用的随机划分习惯直接套到时序任务上,忽视了时间依赖是负荷预测的根基。
误区把能想到的特征全塞给模型:天气预报、温度、湿度、风速、日照、PM2.5……塞得越多,模型学到的东西越多。
正解特征越多,数据维度越高,模型越容易记住噪声而不是规律,这就是过拟合。特征工程的核心是“选对准信号”:对负荷而言,历史负荷滞后值、温度(含滞后效应)、节假日标记往往比几十个气象变量更有用。少而准的特征,配上足量的数据,才是实战中的制胜组合。老王只看天气、日历和上周客流,从不关心抖音热搜。
为何常见:“多多益善”的直觉,加上特征工程缺少即时反馈,让人难以看到维度诅咒的代价。
面试题
Q1. 智能电网负荷预测最核心的意义是?
- A.指导发电系统提前规划← 正确答案
- B.让电表读数变得更精确
- C.减少用户用电的费用
- D.增加电网设备的使用寿命
答案:A。负荷预测是调度决策的起点,就像老王开店前先估客流。B 是计量问题,C 是电价政策问题,D 是设备运维问题,都不是预测本身的核心意义。
Q2. 对缺失的历史负荷数据,下列哪种处理最合理?
- A.直接删除整条数据记录
- B.用相邻时刻均值填补← 正确答案
- C.用一个随机数填充
- D.把缺失值统一改成零
答案:B。相邻时刻均值属于插值法,能保住时序连续性。删除整条会丢掉相邻关系,随机数和无脑填零会注入假模式。就像老王把糊掉的账页直接撕掉或乱填,都会让账本失真。
Q3. 对输入特征做 Z-score 标准化的主要目的是?
- A.让不同量纲处于相近尺度← 正确答案
- B.减少训练样本的总数量
- C.把数据转换成文本格式
- D.消除数据中的缺失值
答案:A。温度(℃)和负荷(MW)量纲差异大,会让梯度更新失衡;标准化后各特征同尺度,模型收敛更快更稳。B、C、D 分别把标准化说成了采样、转格式和补缺失,都属于张冠李戴。
Q4. LSTM 网络中的“遗忘门”主要负责?
- A.抑制梯度消失问题的出现
- B.决定要丢弃哪些历史信息← 正确答案
- C.将输出结果映射到概率
- D.增加模型自身的参数总量
答案:B。遗忘门输出 0 到 1 的系数,决定旧记忆保留多少,像学徒判断上一条笔记还值不值得留。A 是整个 LSTM 的贡献之一但并非遗忘门的职责,C 是 softmax 的事,D 是误解。
Q5. 进行时序数据训练集测试集划分时,正确的做法是?
- A.随机洗牌后再划分两集
- B.按数据的时间顺序切分← 正确答案
- C.按负荷数值从大到小排
- D.把最大的一周放进测试
答案:B。按时间切分才能保证未来信息不泄露。随机洗牌会把未来的负荷泄给训练集,导致评估虚高,相当于先看了答案再做卷子。C 和 D 都破坏了时序的天然顺序。
Q6. 分位回归损失(Pinball Loss)常用于?
- A.训练区间预测模型← 正确答案
- B.提升模型训练的速度
- C.消除特征间的相关性
- D.压缩模型的存储大小
答案:A。分位损失不对称地惩罚高估和低估,通过设置不同分位 q 训练出一组分位模型,合起来就是区间预测,就像老王说“80 桌上下浮动 10 桌”。B、C、D 与区间预测无关。
Q7. 关于居民负荷曲线的“双峰”现象,下列说法正确?
- A.早晚用电高峰所致← 正确答案
- B.与居民作息规律相关← 正确答案
- C.属于数据采集异常
- D.只出现在节假日
答案:AB。双峰对应早、晚两个用电高峰,根源是居民作息规律——早起上班、下班做饭。这是正常负荷规律而非采集异常,也不是节假日专属(节假日双峰反而更平缓)。这提醒我们做特征工程时要加入时段和作息信息。
Q8. 关于温度滞后效应,下列说法正确?
- A.气温变化实时影响当前负荷
- B.连续高温会累积推高负荷← 正确答案
- C.温度与负荷完全线性关系
- D.低温对负荷没有任何影响
答案:B。建筑物有热惯性和热储存能力,连续高温使室内热量逐日累积,空调负荷随之爬升,所以温度对负荷的影响是“慢半拍”的。A 忽略了滞后,C 忽略了非线性,D 明显错误。建模时常构造 2 到 6 小时的温度滞后特征。
Q9. 以下哪些属于数据预处理步骤?
- A.缺失值用插值法填补← 正确答案
- B.检测并修正异常值← 正确答案
- C.对数据做标准化缩放← 正确答案
- D.将数据集部署到云端
答案:ABC。缺失填补、异常修正和标准化都属于预处理,目的是把“脏账本”誊成干净账本;部署到云端是工程环节,不是预处理。模型只对干净数据负责,预处理的质量直接决定预测上限。
Q10. 关于负荷预测的不确定性量化,下列说法正确?
- A.区间预测给出可能范围← 正确答案
- B.分位回归可构造置信区间← 正确答案
- C.不确定性来源包括随机波动← 正确答案
- D.预测误差可以完全消除
答案:ABC。区间预测给出可能范围,分位回归通过多个分位构造置信区间,随机波动(天气突变、社会事件)是不确定性的天然来源之一。D 错误——误差不可能完全消除,只能被度量并纳入调度决策。预测的目标不是“绝对准”,而是“知道有多不准”。