☰
功率预测准确率最后几个点,是这么抠出来的——来自生产代码的实战内幕
2026/10/23 2:53:14 网站建设 项目流程

导语:同样是梯度提升树,为什么竞赛里能到 85 分,你上线的系统只有 80 分?本文按一条真实生产系统的流水线——数据清洗、特征工程、气象源融合、模型、升尺度、上线工程——逐环节拆解那些教科书不写、只有生产代码里才有的实战招数。写给正在做或准备做风光功率预测的同行,读完约 15 分钟。

一、先说结论:模型只值三成

很多人对功率预测的想象是这样的:找一份数据,选一个时髦的模型,调调参,准确率就上去了。竞赛代码确实长这样。但我把一套跑了很久、支撑多个场站每天实报的生产代码从头到尾读了一遍,发现它的模型部分出奇地朴素——就是梯度提升树的常规配置,深度学习模型写了七八种,基本处于闲置状态。

那准确率靠什么?靠模型之外的东西。粗略估算,这样的代码里模型本身的部分不到三成,剩下七成全是:怎么把脏数据洗干净、怎么把气象源喂对、怎么把系统性偏差一层层抹掉、怎么在限电和设备故障的干扰下守住考核、怎么让模型输出符合电网考核的物理约束。

这篇文章就按流水线顺序,把那七成里的招数一个个拆出来。

二、数据清洗:准确率是"洗"出来的

生产代码里第一个让我意外的,是清洗的力度之大。

第一刀:全天恒值日,整段剔除。有那么一些日子,功率曲线是一条水平线——不管风大风小、天晴天阴,功率纹丝不动。这多半是通信故障导致的死值,或者长时间人工限电。这种数据留在训练集里,等于告诉模型"输出一条水平线也是对的",污染极大。处理方式不是修补,而是整天扔掉。

第二刀:实发大面积为零的日子,剔除。全天功率大面积为零,可能是停机检修,也可能是数据断了。对风电来说夜间小风出零功率是正常的,但对光伏,白天大太阳底下出零功率就是明显的异常。判断标准因类型而异,但原则一致:无法解释的零,比无法解释的大值更危险,因为模型会学到"容易输出零"。

第三刀:已知的异常时段,黑名单过滤。系统里维护着一份异常时段清单——检修、改造、切机试验……这些时段的实发数据不反映天气与功率的物理关系,直接拉黑,训练和验证都不用。

第四刀:统计剔除加平滑。三倍标准差准则扫掉离群点,再用平滑滤波把功率曲线上的毛刺抹掉。毛刺的来源很多:瞬时波动、采样噪声、通信抖动。模型没必要去拟合噪声。

风电和光伏在这步的分工很清晰:风电的重点在"恒值日和异常时段",光伏的重点在"夜间数据"。光伏则干脆把每天十八点到次日六点的数据排除在训练之外——夜间光伏功率恒为零,这些样本没有信息量,反而稀释白天的学习信号。

这一步的道理说出来都很朴素,但执行的决心才是关键:宁可损失样本量,不带脏数据进模型。很多团队下不去手,总觉得每个点都是钱。但脏样本的破坏是双向的——它既让模型学错,也让评估失真,你永远不知道准确率损失里有多少是数据贡献的。

三、特征工程:把"已知规律"翻译给模型

清洗之后是特征。工程实践里的特征工程没有什么黑科技,但每一类都有明确的物理动机。

滞后与差分特征。把关键气象量往前和往后挪一步、挪三步,再算出差值。这组特征回答的问题是"气象量正在变大还是变小、变化有多快"。功率对气象的响应很大程度上取决于趋势而不是瞬时值——风速从五米每秒升到七米,和从七米降到五米,尽管均值一样,功率走向完全不同。

分组统计特征。按一年中的第几天加上一天中的第几个小时做分组,统计每个气象量在同一时刻的历史均值、标准差、极值。这相当于告诉模型"往年的这个时刻,这个气象量通常是什么水平、波动有多大"——季节性和日内规律被直接编码进了特征。还有滚动窗口统计:最近几步的均值和极值、往前挪几步再开窗的均值,把短时趋势的多尺度信息都铺开给模型。

平方项。风电有一条绕不开的物理:功率与风速的三次方成正比(在额定风速以下的线性段近似如此)。与其指望树模型自己从数据里凑出非线性关系,不如直接把风速的平方喂进去——三次方的近似分量。这是"能算的物理别指望模型学"的典型。

分箱特征。把风速、辐照这样的连续量按数值切成五档,再展开成"是否落在第几档"的开关特征。这等于提前替模型完成了一部分非线性切分:极端档的样本被显式标记出来,"辐照处在最高一档"这类强信号不再需要模型自己去连续切点上摸索。

光伏特有的晴空比。这是光伏特征里最漂亮的一招。先用物理模型算出当地当时"如果万里无云,辐射应该是多少"——理论上限,工程上叫晴空辐照。然后把实际观测或预报的辐射除以它,得到一个比值。这个比值一眼就能读出天空状况:接近 1,晴;明显小于 1,有云;而且它天然消除了太阳高度角的季节影响——冬天和夏天的晴空基准不同,比值一除就归一了。工程上还给它加了个保险:截断在 0.3 到 2.4 之间。下限防止夜间和传感器坏值产生无意义的极小比值,上限兜住云边效应造成的伪放大。给物理衍生特征加合理的取值包络,是工程实践里反复出现的习惯。

先换算,再进模型:水平辐照 → 板面辐照。光伏建模还有一个容易被忽略的前置环节:气象源给的辐照度预报,默认是水平面接收的辐照;但光伏板是斜着装的,真正决定发电的是落在板面上的辐照。两者差多少?斜面在冬季和早晚能比水平面多接一大截,正午和夏季又反过来——偏差随季节和时刻系统性变化,不换算就是白送的误差。工程上的做法是:用现成的开源物理工具链(如 pvlib),先把水平辐照分解成直射和散射两个分量,再按场站已知的倾角和朝向,逐项换算到板面上。整个过程是确定性的物理计算,不引入任何需要学的参数,转换后的板面辐照才是建模用的主特征。这一步不花模型一分力气,却消掉了一整类随太阳角度变化的系统偏差。这套换算还能反着用:场站的倾角、朝向档案缺失或存疑时,拿"按候选角度换算出的理论辐照曲线"去和实发功率曲线做相似度匹配(余弦、皮尔逊都行),再用优化器在零到九十度里搜出相似度最大的一组角度——安装参数就反推出来了。

这一步的总结论是:特征工程不是堆数量,是把领域里已知的规律——趋势、季节、立方律、天空状况——一条条翻译成模型读得懂的语言。翻译得越准,模型要自己"猜"的部分就越少。

四、气象源:先混合,再校正——全文最"土"也最有效的两招

功率预测的上游是数值天气预报。可选的气象源很多:欧洲、北美、英国、德国、法国、加拿大等地的主流确定性模式,再加上各种集合预报,市面上能拿到的加起来轻松上十套,实际业务里往往同时接上好几套。源多了各有脾气:有的系统性偏大风,有的对突变天气反应慢,有的在某个季节表现好换季就拉胯。

第一招:线性混合。不是把手头的源一股脑全塞给模型,而是按权重把它们两两组合成若干个"合成源",权重写在配置里,可以按场站调。单一源出错时,组合能对冲;而且组合后的特征数量可控,不给树模型制造选择负担——特征克制,本身就是防过拟合的一部分。

第二招:扫 k 校正——土到掉渣,但真的有效。做法:拿一个候选系数 k,乘到气象量上,和实发功率比一个绝对误差;把 k 从零点零一到三十六划出一千六百个候选值,全部试一遍,取误差最小的那个。风速上扫一遍,辐照度上扫一遍,最后连模型输出还要再扫一遍——三层校正。

第一眼看这是暴力枚举,毫无美感。但它解决了三个教科书方法不好解决的问题:

  1. 系统性偏差一次抹平。气象模式报的风速普遍有固定比例的偏差,线性回归、分位数映射这些"正规"方法需要假设分布、拟合参数,扫 k 不需要任何假设,直接在误差最小意义下找最优比例。
  2. 物理上说得通。风速偏了百分之十,对三次方的功率曲线就是偏了百分之三十多的功率,误差被放大得很厉害,所以一个精确的比例校正在功率端收益巨大。
  3. 防过拟合靠"排除一"。有个耐人寻味的细节:扫描时会刻意跳过 k 等于一。为什么?因为 k 等于一意味着"不用校正",如果训练数据里 k 等于一恰好误差最小,多半是巧合,直接排除,强制系统选一个真正做过修正的系数。

同一个扫描框架还兼任了特征选择:每套气象源组合都扫一遍 k,谁的最低误差小,就说明谁和实发的比例关系最干净,就选谁进模型。一个暴力扫描,同时干了偏差校正和特征筛选两件事。

这里有个值得反复强调的观念:生产系统不追求方法的优雅,追求的是每一处系统性偏差都有专门的修正机制,且修正机制简单到不会引入新的偏差。扫 k 就是这种"简单到不会错"的修正。

五、模型层:不追新,只求稳

到了真正的模型环节,反而没什么可说的了。

梯度提升树家族的两三个成员,五折交叉验证,目标函数直接用绝对误差——因为考核指标就是绝对误差,训练目标和对齐考核目标一致,这个细节很多人会忽略:用平方误差训练的模型,在绝对误差考核下天生吃亏,因为它会把火力集中在少数大误差点上,而考核罚的是每一天的累积偏差。

过拟合在这里有专门的形态:时间泄漏。功率预测的验证集划分有条铁律:必须沿时间轴切——用历史训练,用未来验证。随手把样本打乱再做交叉验证,离线分数会非常漂亮,一上线就掉:相邻时刻的天气和功率高度相关,随机切分等于让模型在训练时"偷看"了验证时刻的近邻,这不是预测,是背答案。工程上的做法是训练段和验证段在时间上严格分开,宁可验证窗口短一点,交叉验证的每一折也沿时间方向切。再配上树模型本身的克制——浅树、正则项、限制复杂度——和后面说的特征克制,共同构成防过拟合的几道闸。

深度学习模型——循环网络、时序卷积、注意力结构、图网络——在功率预测的论文里都是常客,工程上大多也认真试过一轮。结论基本一致:在绝大多数场站上,打不过调好的树模型。表格数据加有限样本量,本来就是树模型的主场,这在别处成立,在功率预测这里同样成立。

模型之后还有一层线性混合:两个模型的输出按七五、二五的比例加权,再和另外的混合结果加权一次。多个模型对同一段实发的误差方向不同,混合能削掉一部分方差。权重是拍出来的还是调出来的不重要,重要的是它便宜、稳定、可解释。权重的来源也可以更讲究:交给带约束的优化器去搜——比如用粒子群算法在"权重和为一、各自非负"的约束下找误差最小的组合,搜出来的结果天然物理合法。

最后是物理规则兜底,这是模型层和业务层之间的最后一道闸:

  • 输出小于零,一律置零——功率不能为负;
  • 对应气象条件显示出力为零时,预测强制置零——比如光伏的夜间,不管模型说什么;
  • 输出超过装机容量的上限包络,削到包络以内——上限不是死板的装机容量,而是留有余地的运行上限,同样写在配置里。

树模型的输出本来就不保证物理合法,这些规则看似简单,却是考核事故的直接防线。模型负责"猜得准",规则负责"错得不离谱"。

六、从单站到全网,以及限电这个老大难

前面所有环节都在单站尺度上。但电网关心的往往是全网断面——几十上百个场站加总之后的出力。

升尺度用的是容量加权。单站模型跑出预测,按各站装机容量占比加权汇总出全网预测。中间还有一个系数:用历史数据校准"单站加总"与"全网实发"之间的系统性差异——站与站之间的出力相关性不是一,同时率和错峰效应会让简单加总有固定偏差,一个加权系数把它修掉。

限电是另一个绕不开的坑。电网限电时,风机被压着发、逆变器被限着出,实发功率不再反映"天气决定出力"的物理关系——天气给八成,调度只让发五成,实发就是五成。拿这种数据评估预测,预测背了黑锅;拿它训练,模型学坏了。

工程上的解法,是把功率分成四种口径:实发之外,还有理论功率(按当前天气资源应该发多少)和可用功率(考虑设备可用状态能发多少),理论功率又有按样本机计算和按辐照推算两个版本。评估和训练时用哪个口径,取决于目的:考核预测偏差,看实发;评估模型本身的天气还原能力,看理论功率;剔除限电影响做训练,用可用功率。多口径功率不是冗余,是把"天气信息"和"调度干预"解耦的唯一手段。这也是超短期系统的一个核心:日内滚动预测时,先判断当前是不是限电状态,限电时段的实测不能直接当作"真实值"去修正模型。

七、超短期、中长期与概率预测:同一套思想的三个变体

短期(日前)、超短期(日内)、中长期(月度电量)、概率预测,四种业务形态在工程上是同一套思想的三个变体,核心差异就三点:时间尺度、信息来源、输出形态。

超短期:信息来源从"预报"换成"实测+滚动"。短期预测昨天做今天的,靠的是数值天气预报,误差大头在气象预报本身。超短期做未来四小时,最近的实测功率才是最强信号——它已经隐含了当前天气的真实状态。所以超短期的主线就是:拿最新实测做基准,叠加气象量的变化趋势做外推,同时接入上游的全网断面预测结果做参照修正。另一个容易被忽略的工程点:上游数据有加密和明文两种形态,还要处理"今天的文件没到就拿最近一天的、超过三天宁可只信场站实测也不信过期文件"的时效兜底——预测系统的健壮性,一大半体现在"数据没来怎么办"上。

中长期:思路从"逐站建模"换成"代表场站"。中长期做未来四十五天到十五个月的月度电量,几百个场站不可能逐个建模,历史样本对每个站也未必够。常见的打法:先按地理断面分组,组内用聚类按经纬度把场站分成若干簇——簇数不拍脑袋,用轮廓系数自动定——每个簇选一个代表场站建模,再把代表站的规律外推回全簇,最后按容量拼出总量。中长期预测的精度天花板本来就低(十五个月后的天气谁也说不准),所以它要的不是精细,而是规律层面的稳定:季节形态、年际趋势、大数定律下的总量。这决定了它的特征以月度和季节统计量为主,模型以简单结构为主。

概率预测:点预测的"期望"变成区间的"覆盖"。概率预测输出的不是一条线而是一个带状区间,考核指标也从偏差大小变成了覆盖率(实测落在区间内的比例)和区间宽度(越窄越好)的平衡。主流的打法是分位数回归:同一个输入,模型直接对不同分位点各拟合一条预测线——十几个点就是一条低分位线,九十几个点就是一条高分位线,中间夹出的就是给定置信水平下的区间。工程实现上会一次输出好几个档位的置信度,从很窄的区间到很宽的区间一应俱全,业务方按自己的风险偏好取用;最后再做一道上下限裁剪,把区间钳在物理合法的范围内。聚类选代表站的思路在这里同样适用。核心认知是:区间宽度应该随不确定性动态变化——天气预报明天的天气形势混乱,区间就该放宽;形势稳定,区间就该收窄。固定宽度的区间在考核下两头吃亏。

八、大模型呢?——它和这套流水线的关系

写到这里,肯定有读者要问:都这个年头了,大模型呢?

先把"大模型在新能源预测里"拆成三件不同的事,分开说。

第一件:气象大模型替换上游的数值天气预报。这几年用深度网络学历史气象数据、几秒钟出全球预报的 AI 天气预报进步极快,部分指标上已经追平甚至超过传统数值模式,算力成本还低几个量级。这对功率预测意味着什么?意味着上游会多出一类新的气象源。而回看第四节会发现一个顺理成章的结论:这类系统天然欢迎它——多源线性混合加扫 k 校正的框架,接一套 AI 气象源和接一套传统模式没有任何区别,权重照常混合,偏差照常校正。气象大模型大概率不是来推翻这套流水线的,而是作为"新的一套源"从正门走进来。真正要重做的只有一件事:AI 模式输出变量的统计特性和传统模式不同,历史偏差规律要重新积累。

第二件:时序预测基础模型直接做功率预测。就是那种在海量时间序列上预训练、号称拿来就能预测的模型。目前的现实和深度学习模型的结论同构:在"有领域特征、有干净数据、目标函数对齐考核"的定制树模型面前,通用预训练模型在绝大多数场站上还是打不过。道理不复杂:功率序列里最强的信号是气象驱动,而气象驱动已经被上游特征显式喂进去了,基础模型"从数据里自己学规律"的看家本领在这里施展不开。它更现实的位置是冷启动——新建场站没有历史数据时先顶一阵,攒够样本再切定制模型。

第三件:大模型做工程,而不是做预测。精度月报的自动解读、异常时段的排查笔记、配置变更的历史追溯、给运维人员的自然语言查询入口——这些脏活累活恰恰是大模型当下就能干的,而且不碰模型本体,风险可控。生产系统里最不适合大模型的恰恰是预测本身,最适合的反而是一直没人手干的工程周边。

所以我的判断是:不必急着把大模型塞进预测模型里,但要盯着上游——等气象大模型成熟到可以当一套源接进来那天,谁的多源混合框架准备得好,谁就白捡一波精度红利。这也呼应全文的结论:这套流水线的价值不在某个具体模型,而在"任何新模型进来,都能被混合、被校正、被兜底、被考核检验"的框架本身。

九、上线之后:模型只是半个系统

最后讲讲生产代码里模型之外的部分,这部分最不起眼,却决定了系统能不能活下来。

参数全部配置化。模型系数、气象源权重、分时段修正系数、上下限包络、平滑窗口……全部写在配置文件里,线上程序只读配置、只做推理,不训练。为什么分时段修正系数要单独存在?因为总有模型覆盖不了的情形:某条线路检修导致出力受限、某个季节的局部气候规律突变。运维人员不改模型、不改代码,改配置就能介入——给人工经验留一个不碰代码的入口,是预测系统和业务之间最重要的接口。

线上与线下彻底分离。训练、调参、评估都在线下做完,产出模型文件和配置;线上只做数据接入、推理、上报。线上代码里没有任何训练逻辑,避免了"线上跑着跑着自己学坏了"的一切可能。再进一步的做法,是让好几代算法版本在同一系统里并行注册、同时出数,新旧结果互相印证,出问题随时切回旧版——升级就不再是赌博。

精度报表自动化。每天跑完自动输出功率和精度两个表,按月汇总,每个模型的准确率逐日可查。这不是锦上添花——预测系统最大的风险是"悄悄变差":气象源升级、场站扩容、设备老化,都会让准确率无声下滑。没有自动化的逐日精度追踪,等你从考核通报里发现问题时,已经晚了。

可复现性。随机种子全局固定。听起来是常识,但真正做到的系统不多。功率预测的模型迭代是持续进行的,今天改一版特征,明天换一版参数,如果结果不可复现,你永远无法确认精度变化是改动带来的还是随机波动——迭代就失去了方向。

十、值得抄的清单

把全文收拢成一张清单,按流水线顺序:

环节招数一句话理由
清洗恒值日、异常零值日整段剔除脏样本双向破坏:学错+评歪
清洗光伏夜间样本不进训练无信息量,稀释白天信号
特征滞后差分 + 分组统计 + 滚动窗口把趋势和季节规律翻译给模型
特征风速平方项能算的物理别指望模型学
特征晴空比 + 取值截断物理归一 + 包络兜底
特征水平辐照 → 板面辐照物理换算板面才是决定发电的量
气象多源线性组合对冲单一源失灵
气象三层扫 k 校正,排除 k=1无假设抹平系统偏差,防巧合
模型目标函数对齐考核指标平方误差训练在 MAE 考核下吃亏
验证验证集沿时间轴切,禁止随机打乱防时间泄漏型过拟合
模型多模型线性混合削方差,便宜稳定
兜底负值置零、夜间置零、上限包络错也不离谱
尺度容量加权升尺度 + 校准系数修正同时率带来的加总偏差
口径理论/可用/实发多口径解耦天气信息与调度干预
上线配置化 + 线上线下分离人工经验有不碰代码的入口
上线逐日精度自动追踪防止"悄悄变差"

最后回答开头的问题:最后几个点是怎么抠出来的?不是靠一个更聪明的模型,而是靠每一处系统性偏差都有专门的、简单的修正机制——数据脏就洗,源有偏就校正,输出不物理就兜底,加总有偏差就校准。每一招都简单得不像"算法",但拼在一起,就是教科书方案和生产系统之间那几个点的全部差距。

这个领域没有银弹。把简单的方法做到极致,本身就是壁垒。


附一:四类预测业务速查表

维度短期(日前)超短期(日内)中长期(月度电量)概率预测
时间尺度次日 0 时起 24~72 小时未来 15 分钟~4 小时未来 45 天~15 个月随短期/超短期同步
核心信息源数值天气预报最新实测 + 气象趋势外推历史统计 + 气候规律点预测 + 误差分布
建模对象逐站建模逐站 + 全网断面参照聚类选代表场站代表场站 + 分位区间
精度天花板中高(近期实测最可信)低(远期天气不可知)取决于点预测
关键难点气象预报偏差的校正限电时段实测失真规律稳定性而非精细度区间宽度动态化
特有招数多源混合、三层扫 k上游断面修正、数据时效兜底轮廓系数自动定簇、容量拼接分位数回归、多档置信度、上下限裁剪

附二:常用开源工具箱速览

文中所有招数,落在 Python 开源生态里就是下面这几件工具。按流水线环节归位,装好即用:

环节库用它干什么
辐照与光伏物理pvlib直散分离、水平面→板面辐照换算、晴空模型、太阳位置计算
风电物理windpowerlib轮毂高度风速外推、空气密度修正、功率曲线换算
时序数据处理pandas / numpy多源数据对齐、分组统计、滚动窗口、滞后差分
树模型三件套lightgbm / catboost / xgboost主力预测模型:MAE 目标 + 五折交叉验证
调参optuna网格搜索的自动化替代,备而少用
概率预测statsmodels分位数回归,一次输出多档置信区间
信号处理scipySavitzky-Golay 平滑,滤功率曲线毛刺
聚类与评估scikit-learn3σ 准则、KMeans 选代表场站、各类误差指标

全是开源生态,没有任何门槛。但要补一句全文的结论:工具不决定准确率的上限,流水线才决定——库人人会装,把它们拼进"校正、兜底、考核检验"的框架里,才是那最后几个点的来源。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询