导语同样是梯度提升树为什么竞赛里能到 85 分你上线的系统只有 80 分本文按一条真实生产系统的流水线——数据清洗、特征工程、气象源融合、模型、升尺度、上线工程——逐环节拆解那些教科书不写、只有生产代码里才有的实战招数。写给正在做或准备做风光功率预测的同行读完约 15 分钟。一、先说结论模型只值三成很多人对功率预测的想象是这样的找一份数据选一个时髦的模型调调参准确率就上去了。竞赛代码确实长这样。但我把一套跑了很久、支撑多个场站每天实报的生产代码从头到尾读了一遍发现它的模型部分出奇地朴素——就是梯度提升树的常规配置深度学习模型写了七八种基本处于闲置状态。那准确率靠什么靠模型之外的东西。粗略估算这样的代码里模型本身的部分不到三成剩下七成全是怎么把脏数据洗干净、怎么把气象源喂对、怎么把系统性偏差一层层抹掉、怎么在限电和设备故障的干扰下守住考核、怎么让模型输出符合电网考核的物理约束。这篇文章就按流水线顺序把那七成里的招数一个个拆出来。二、数据清洗准确率是洗出来的生产代码里第一个让我意外的是清洗的力度之大。第一刀全天恒值日整段剔除。有那么一些日子功率曲线是一条水平线——不管风大风小、天晴天阴功率纹丝不动。这多半是通信故障导致的死值或者长时间人工限电。这种数据留在训练集里等于告诉模型输出一条水平线也是对的污染极大。处理方式不是修补而是整天扔掉。第二刀实发大面积为零的日子剔除。全天功率大面积为零可能是停机检修也可能是数据断了。对风电来说夜间小风出零功率是正常的但对光伏白天大太阳底下出零功率就是明显的异常。判断标准因类型而异但原则一致无法解释的零比无法解释的大值更危险因为模型会学到容易输出零。第三刀已知的异常时段黑名单过滤。系统里维护着一份异常时段清单——检修、改造、切机试验……这些时段的实发数据不反映天气与功率的物理关系直接拉黑训练和验证都不用。第四刀统计剔除加平滑。三倍标准差准则扫掉离群点再用平滑滤波把功率曲线上的毛刺抹掉。毛刺的来源很多瞬时波动、采样噪声、通信抖动。模型没必要去拟合噪声。风电和光伏在这步的分工很清晰风电的重点在恒值日和异常时段光伏的重点在夜间数据。光伏则干脆把每天十八点到次日六点的数据排除在训练之外——夜间光伏功率恒为零这些样本没有信息量反而稀释白天的学习信号。这一步的道理说出来都很朴素但执行的决心才是关键宁可损失样本量不带脏数据进模型。很多团队下不去手总觉得每个点都是钱。但脏样本的破坏是双向的——它既让模型学错也让评估失真你永远不知道准确率损失里有多少是数据贡献的。三、特征工程把已知规律翻译给模型清洗之后是特征。工程实践里的特征工程没有什么黑科技但每一类都有明确的物理动机。滞后与差分特征。把关键气象量往前和往后挪一步、挪三步再算出差值。这组特征回答的问题是气象量正在变大还是变小、变化有多快。功率对气象的响应很大程度上取决于趋势而不是瞬时值——风速从五米每秒升到七米和从七米降到五米尽管均值一样功率走向完全不同。分组统计特征。按一年中的第几天加上一天中的第几个小时做分组统计每个气象量在同一时刻的历史均值、标准差、极值。这相当于告诉模型往年的这个时刻这个气象量通常是什么水平、波动有多大——季节性和日内规律被直接编码进了特征。还有滚动窗口统计最近几步的均值和极值、往前挪几步再开窗的均值把短时趋势的多尺度信息都铺开给模型。平方项。风电有一条绕不开的物理功率与风速的三次方成正比在额定风速以下的线性段近似如此。与其指望树模型自己从数据里凑出非线性关系不如直接把风速的平方喂进去——三次方的近似分量。这是能算的物理别指望模型学的典型。分箱特征。把风速、辐照这样的连续量按数值切成五档再展开成是否落在第几档的开关特征。这等于提前替模型完成了一部分非线性切分极端档的样本被显式标记出来辐照处在最高一档这类强信号不再需要模型自己去连续切点上摸索。光伏特有的晴空比。这是光伏特征里最漂亮的一招。先用物理模型算出当地当时如果万里无云辐射应该是多少——理论上限工程上叫晴空辐照。然后把实际观测或预报的辐射除以它得到一个比值。这个比值一眼就能读出天空状况接近 1晴明显小于 1有云而且它天然消除了太阳高度角的季节影响——冬天和夏天的晴空基准不同比值一除就归一了。工程上还给它加了个保险截断在 0.3 到 2.4 之间。下限防止夜间和传感器坏值产生无意义的极小比值上限兜住云边效应造成的伪放大。给物理衍生特征加合理的取值包络是工程实践里反复出现的习惯。先换算再进模型水平辐照 → 板面辐照。光伏建模还有一个容易被忽略的前置环节气象源给的辐照度预报默认是水平面接收的辐照但光伏板是斜着装的真正决定发电的是落在板面上的辐照。两者差多少斜面在冬季和早晚能比水平面多接一大截正午和夏季又反过来——偏差随季节和时刻系统性变化不换算就是白送的误差。工程上的做法是用现成的开源物理工具链如 pvlib先把水平辐照分解成直射和散射两个分量再按场站已知的倾角和朝向逐项换算到板面上。整个过程是确定性的物理计算不引入任何需要学的参数转换后的板面辐照才是建模用的主特征。这一步不花模型一分力气却消掉了一整类随太阳角度变化的系统偏差。这套换算还能反着用场站的倾角、朝向档案缺失或存疑时拿按候选角度换算出的理论辐照曲线去和实发功率曲线做相似度匹配余弦、皮尔逊都行再用优化器在零到九十度里搜出相似度最大的一组角度——安装参数就反推出来了。这一步的总结论是特征工程不是堆数量是把领域里已知的规律——趋势、季节、立方律、天空状况——一条条翻译成模型读得懂的语言。翻译得越准模型要自己猜的部分就越少。四、气象源先混合再校正——全文最土也最有效的两招功率预测的上游是数值天气预报。可选的气象源很多欧洲、北美、英国、德国、法国、加拿大等地的主流确定性模式再加上各种集合预报市面上能拿到的加起来轻松上十套实际业务里往往同时接上好几套。源多了各有脾气有的系统性偏大风有的对突变天气反应慢有的在某个季节表现好换季就拉胯。第一招线性混合。不是把手头的源一股脑全塞给模型而是按权重把它们两两组合成若干个合成源权重写在配置里可以按场站调。单一源出错时组合能对冲而且组合后的特征数量可控不给树模型制造选择负担——特征克制本身就是防过拟合的一部分。第二招扫 k 校正——土到掉渣但真的有效。做法拿一个候选系数 k乘到气象量上和实发功率比一个绝对误差把 k 从零点零一到三十六划出一千六百个候选值全部试一遍取误差最小的那个。风速上扫一遍辐照度上扫一遍最后连模型输出还要再扫一遍——三层校正。第一眼看这是暴力枚举毫无美感。但它解决了三个教科书方法不好解决的问题系统性偏差一次抹平。气象模式报的风速普遍有固定比例的偏差线性回归、分位数映射这些正规方法需要假设分布、拟合参数扫 k 不需要任何假设直接在误差最小意义下找最优比例。物理上说得通。风速偏了百分之十对三次方的功率曲线就是偏了百分之三十多的功率误差被放大得很厉害所以一个精确的比例校正在功率端收益巨大。防过拟合靠排除一。有个耐人寻味的细节扫描时会刻意跳过 k 等于一。为什么因为 k 等于一意味着不用校正如果训练数据里 k 等于一恰好误差最小多半是巧合直接排除强制系统选一个真正做过修正的系数。同一个扫描框架还兼任了特征选择每套气象源组合都扫一遍 k谁的最低误差小就说明谁和实发的比例关系最干净就选谁进模型。一个暴力扫描同时干了偏差校正和特征筛选两件事。这里有个值得反复强调的观念生产系统不追求方法的优雅追求的是每一处系统性偏差都有专门的修正机制且修正机制简单到不会引入新的偏差。扫 k 就是这种简单到不会错的修正。五、模型层不追新只求稳到了真正的模型环节反而没什么可说的了。梯度提升树家族的两三个成员五折交叉验证目标函数直接用绝对误差——因为考核指标就是绝对误差训练目标和对齐考核目标一致这个细节很多人会忽略用平方误差训练的模型在绝对误差考核下天生吃亏因为它会把火力集中在少数大误差点上而考核罚的是每一天的累积偏差。过拟合在这里有专门的形态时间泄漏。功率预测的验证集划分有条铁律必须沿时间轴切——用历史训练用未来验证。随手把样本打乱再做交叉验证离线分数会非常漂亮一上线就掉相邻时刻的天气和功率高度相关随机切分等于让模型在训练时偷看了验证时刻的近邻这不是预测是背答案。工程上的做法是训练段和验证段在时间上严格分开宁可验证窗口短一点交叉验证的每一折也沿时间方向切。再配上树模型本身的克制——浅树、正则项、限制复杂度——和后面说的特征克制共同构成防过拟合的几道闸。深度学习模型——循环网络、时序卷积、注意力结构、图网络——在功率预测的论文里都是常客工程上大多也认真试过一轮。结论基本一致在绝大多数场站上打不过调好的树模型。表格数据加有限样本量本来就是树模型的主场这在别处成立在功率预测这里同样成立。模型之后还有一层线性混合两个模型的输出按七五、二五的比例加权再和另外的混合结果加权一次。多个模型对同一段实发的误差方向不同混合能削掉一部分方差。权重是拍出来的还是调出来的不重要重要的是它便宜、稳定、可解释。权重的来源也可以更讲究交给带约束的优化器去搜——比如用粒子群算法在权重和为一、各自非负的约束下找误差最小的组合搜出来的结果天然物理合法。最后是物理规则兜底这是模型层和业务层之间的最后一道闸输出小于零一律置零——功率不能为负对应气象条件显示出力为零时预测强制置零——比如光伏的夜间不管模型说什么输出超过装机容量的上限包络削到包络以内——上限不是死板的装机容量而是留有余地的运行上限同样写在配置里。树模型的输出本来就不保证物理合法这些规则看似简单却是考核事故的直接防线。模型负责猜得准规则负责错得不离谱。六、从单站到全网以及限电这个老大难前面所有环节都在单站尺度上。但电网关心的往往是全网断面——几十上百个场站加总之后的出力。升尺度用的是容量加权。单站模型跑出预测按各站装机容量占比加权汇总出全网预测。中间还有一个系数用历史数据校准单站加总与全网实发之间的系统性差异——站与站之间的出力相关性不是一同时率和错峰效应会让简单加总有固定偏差一个加权系数把它修掉。限电是另一个绕不开的坑。电网限电时风机被压着发、逆变器被限着出实发功率不再反映天气决定出力的物理关系——天气给八成调度只让发五成实发就是五成。拿这种数据评估预测预测背了黑锅拿它训练模型学坏了。工程上的解法是把功率分成四种口径实发之外还有理论功率按当前天气资源应该发多少和可用功率考虑设备可用状态能发多少理论功率又有按样本机计算和按辐照推算两个版本。评估和训练时用哪个口径取决于目的考核预测偏差看实发评估模型本身的天气还原能力看理论功率剔除限电影响做训练用可用功率。多口径功率不是冗余是把天气信息和调度干预解耦的唯一手段。这也是超短期系统的一个核心日内滚动预测时先判断当前是不是限电状态限电时段的实测不能直接当作真实值去修正模型。七、超短期、中长期与概率预测同一套思想的三个变体短期日前、超短期日内、中长期月度电量、概率预测四种业务形态在工程上是同一套思想的三个变体核心差异就三点时间尺度、信息来源、输出形态。超短期信息来源从预报换成实测滚动。短期预测昨天做今天的靠的是数值天气预报误差大头在气象预报本身。超短期做未来四小时最近的实测功率才是最强信号——它已经隐含了当前天气的真实状态。所以超短期的主线就是拿最新实测做基准叠加气象量的变化趋势做外推同时接入上游的全网断面预测结果做参照修正。另一个容易被忽略的工程点上游数据有加密和明文两种形态还要处理今天的文件没到就拿最近一天的、超过三天宁可只信场站实测也不信过期文件的时效兜底——预测系统的健壮性一大半体现在数据没来怎么办上。中长期思路从逐站建模换成代表场站。中长期做未来四十五天到十五个月的月度电量几百个场站不可能逐个建模历史样本对每个站也未必够。常见的打法先按地理断面分组组内用聚类按经纬度把场站分成若干簇——簇数不拍脑袋用轮廓系数自动定——每个簇选一个代表场站建模再把代表站的规律外推回全簇最后按容量拼出总量。中长期预测的精度天花板本来就低十五个月后的天气谁也说不准所以它要的不是精细而是规律层面的稳定季节形态、年际趋势、大数定律下的总量。这决定了它的特征以月度和季节统计量为主模型以简单结构为主。概率预测点预测的期望变成区间的覆盖。概率预测输出的不是一条线而是一个带状区间考核指标也从偏差大小变成了覆盖率实测落在区间内的比例和区间宽度越窄越好的平衡。主流的打法是分位数回归同一个输入模型直接对不同分位点各拟合一条预测线——十几个点就是一条低分位线九十几个点就是一条高分位线中间夹出的就是给定置信水平下的区间。工程实现上会一次输出好几个档位的置信度从很窄的区间到很宽的区间一应俱全业务方按自己的风险偏好取用最后再做一道上下限裁剪把区间钳在物理合法的范围内。聚类选代表站的思路在这里同样适用。核心认知是区间宽度应该随不确定性动态变化——天气预报明天的天气形势混乱区间就该放宽形势稳定区间就该收窄。固定宽度的区间在考核下两头吃亏。八、大模型呢——它和这套流水线的关系写到这里肯定有读者要问都这个年头了大模型呢先把大模型在新能源预测里拆成三件不同的事分开说。第一件气象大模型替换上游的数值天气预报。这几年用深度网络学历史气象数据、几秒钟出全球预报的 AI 天气预报进步极快部分指标上已经追平甚至超过传统数值模式算力成本还低几个量级。这对功率预测意味着什么意味着上游会多出一类新的气象源。而回看第四节会发现一个顺理成章的结论这类系统天然欢迎它——多源线性混合加扫 k 校正的框架接一套 AI 气象源和接一套传统模式没有任何区别权重照常混合偏差照常校正。气象大模型大概率不是来推翻这套流水线的而是作为新的一套源从正门走进来。真正要重做的只有一件事AI 模式输出变量的统计特性和传统模式不同历史偏差规律要重新积累。第二件时序预测基础模型直接做功率预测。就是那种在海量时间序列上预训练、号称拿来就能预测的模型。目前的现实和深度学习模型的结论同构在有领域特征、有干净数据、目标函数对齐考核的定制树模型面前通用预训练模型在绝大多数场站上还是打不过。道理不复杂功率序列里最强的信号是气象驱动而气象驱动已经被上游特征显式喂进去了基础模型从数据里自己学规律的看家本领在这里施展不开。它更现实的位置是冷启动——新建场站没有历史数据时先顶一阵攒够样本再切定制模型。第三件大模型做工程而不是做预测。精度月报的自动解读、异常时段的排查笔记、配置变更的历史追溯、给运维人员的自然语言查询入口——这些脏活累活恰恰是大模型当下就能干的而且不碰模型本体风险可控。生产系统里最不适合大模型的恰恰是预测本身最适合的反而是一直没人手干的工程周边。所以我的判断是不必急着把大模型塞进预测模型里但要盯着上游——等气象大模型成熟到可以当一套源接进来那天谁的多源混合框架准备得好谁就白捡一波精度红利。这也呼应全文的结论这套流水线的价值不在某个具体模型而在任何新模型进来都能被混合、被校正、被兜底、被考核检验的框架本身。九、上线之后模型只是半个系统最后讲讲生产代码里模型之外的部分这部分最不起眼却决定了系统能不能活下来。参数全部配置化。模型系数、气象源权重、分时段修正系数、上下限包络、平滑窗口……全部写在配置文件里线上程序只读配置、只做推理不训练。为什么分时段修正系数要单独存在因为总有模型覆盖不了的情形某条线路检修导致出力受限、某个季节的局部气候规律突变。运维人员不改模型、不改代码改配置就能介入——给人工经验留一个不碰代码的入口是预测系统和业务之间最重要的接口。线上与线下彻底分离。训练、调参、评估都在线下做完产出模型文件和配置线上只做数据接入、推理、上报。线上代码里没有任何训练逻辑避免了线上跑着跑着自己学坏了的一切可能。再进一步的做法是让好几代算法版本在同一系统里并行注册、同时出数新旧结果互相印证出问题随时切回旧版——升级就不再是赌博。精度报表自动化。每天跑完自动输出功率和精度两个表按月汇总每个模型的准确率逐日可查。这不是锦上添花——预测系统最大的风险是悄悄变差气象源升级、场站扩容、设备老化都会让准确率无声下滑。没有自动化的逐日精度追踪等你从考核通报里发现问题时已经晚了。可复现性。随机种子全局固定。听起来是常识但真正做到的系统不多。功率预测的模型迭代是持续进行的今天改一版特征明天换一版参数如果结果不可复现你永远无法确认精度变化是改动带来的还是随机波动——迭代就失去了方向。十、值得抄的清单把全文收拢成一张清单按流水线顺序环节招数一句话理由清洗恒值日、异常零值日整段剔除脏样本双向破坏学错评歪清洗光伏夜间样本不进训练无信息量稀释白天信号特征滞后差分 分组统计 滚动窗口把趋势和季节规律翻译给模型特征风速平方项能算的物理别指望模型学特征晴空比 取值截断物理归一 包络兜底特征水平辐照 → 板面辐照物理换算板面才是决定发电的量气象多源线性组合对冲单一源失灵气象三层扫 k 校正排除 k1无假设抹平系统偏差防巧合模型目标函数对齐考核指标平方误差训练在 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 选代表场站、各类误差指标全是开源生态没有任何门槛。但要补一句全文的结论工具不决定准确率的上限流水线才决定——库人人会装把它们拼进校正、兜底、考核检验的框架里才是那最后几个点的来源。