3、风功率预测(统计与AI方法):时间序列分析(ARIMA)、机器学习回归(随机森林、XGBoost)、深度学习(LSTM、Transformer)在短期/超短期预测中的实战

风功率预测,说白了就是跟老天爷“猜拳”。你想想看,风这东西,上一秒温柔得像猫,下一秒就能掀翻屋顶。咱们做风电的,最怕的就是电网调度问:“下一小时你能发多少电?”你要是答不上来,或者答错了,轻则被罚款,重则影响电网稳定。

我个人习惯把风功率预测分成两派:统计派AI派。统计派的老祖宗是ARIMA,AI派的新贵是LSTM和Transformer。今天我就带大家把这几个家伙的底裤扒干净,看看它们到底谁更靠谱。

3.1 时间序列分析:ARIMA——老将出马,一个顶俩?

ARIMA,全称是自回归积分滑动平均模型。名字听着唬人,其实核心思想就一句话:用过去的数据预测未来的数据。它假设历史数据里藏着某种规律,比如周期性、趋势性,然后把这些规律提炼出来,外推到未来。

我在项目中遇到过这样一个场景:某个风电场刚投产,历史数据只有三个月。那时候深度学习模型根本跑不起来,数据量太小,一训练就过拟合。最后我硬着头皮上了ARIMA,结果你猜怎么着?预测精度居然比那些花里胡哨的模型还高。

ARIMA的核心三参数:
  • p(自回归阶数):用过去几个点的数据来预测当前点。比如p=3,就是用t-3、t-2、t-1的数据预测t时刻的值。
  • d(差分阶数):让非平稳数据变平稳。说白了就是把数据“拉直”,去掉趋势和季节性。
  • q(移动平均阶数):用过去几个预测误差来修正当前预测。

举个简单的例子,假设我们要预测未来15分钟的风功率,ARIMA的代码大概长这样:

from statsmodels.tsa.arima.model import ARIMA

# 假设data是过去7天的风功率数据,频率为15分钟
model = ARIMA(data, order=(3, 1, 2))  # p=3, d=1, q=2
model_fit = model.fit()
forecast = model_fit.forecast(steps=4)  # 预测未来1小时(4个15分钟点)
print(forecast)
避坑指南:我曾经在某个项目里直接用默认参数跑ARIMA,结果预测值全是直线。后来才发现,数据里有个明显的日周期性,但我没做季节性差分。记住:ARIMA对数据预处理要求极高,差分、平稳性检验、自相关图,一步都不能省。

3.2 机器学习回归:随机森林与XGBoost——用特征“拼凑”风功率

如果说ARIMA是“闭着眼睛猜”,那机器学习回归就是“睁着眼睛看”。它不光看历史功率,还看风速、风向、温度、气压、湿度……把所有能拿到的特征都塞进去,让模型自己学规律。

随机森林,说白了就是一群决策树投票。每棵树都学一点规律,最后综合起来。优点是抗过拟合能力强,缺点是预测值会“平均化”,很难捕捉极端风速。

XGBoost,则是梯度提升的升级版。它不像随机森林那样“民主投票”,而是“迭代纠错”——先建一棵树,算误差,然后建第二棵树专门纠正第一棵树的错误,以此类推。我在实际项目中对比过,XGBoost的预测精度通常比随机森林高5%-10%,但调参也更麻烦。

特征工程是关键:
  • 数值型特征:风速、风向(建议分解为sin和cos分量)、温度、湿度、气压。
  • 时间型特征:小时、星期几、是否节假日、季节。
  • 滞后特征:过去1小时、2小时、24小时的风功率值。
  • 滚动统计特征:过去1小时的平均风速、最大风速、风速标准差。

下面是一个XGBoost的实战代码片段:

import xgboost as xgb
from sklearn.model_selection import train_test_split

# 假设X是特征矩阵,y是目标变量(未来15分钟的风功率)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

model = xgb.XGBRegressor(
    n_estimators=200,
    max_depth=6,
    learning_rate=0.05,
    subsample=0.8,
    colsample_bytree=0.8
)
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)

# 预测
y_pred = model.predict(X_test)
注意:时间序列数据做训练集/测试集划分时,绝对不能随机打乱!必须按时间顺序划分。我曾经见过有人用shuffle=True,结果模型在测试集上精度高得离谱,一上线就崩——因为它“偷看”了未来的数据。

3.3 深度学习:LSTM与Transformer——让模型“记住”风的脾气

深度学习在风功率预测里的优势,说白了就是能处理长序列依赖。ARIMA只能看过去几个点,XGBoost需要人工构造滞后特征,但LSTM和Transformer可以自动学习“风在24小时前的状态对现在的影响”。

3.3.1 LSTM:长短期记忆网络

LSTM的核心是“门控机制”——输入门、遗忘门、输出门。它就像一个智能的记事本,知道哪些信息该记住,哪些该忘掉。我在做超短期预测(未来15分钟到4小时)时,LSTM的表现通常优于XGBoost,尤其是在风速剧烈变化的场景下。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

model = Sequential()
model.add(LSTM(units=64, return_sequences=True, input_shape=(lookback, n_features)))
model.add(LSTM(units=32, return_sequences=False))
model.add(Dense(units=1))  # 预测未来一个时间点

model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_val, y_val))
我的经验:LSTM对数据尺度非常敏感。我建议先把数据归一化到[0,1]区间,否则训练时loss会震荡得像过山车。另外,lookback(回溯窗口)不要设太大,一般取6-12个时间步长就够了,太长反而会引入噪声。

3.3.2 Transformer:注意力机制的革命

Transformer原本是NLP领域的明星,但这两年已经被成功“移植”到时间序列预测中。它的核心是自注意力机制——模型可以同时关注序列中所有位置的信息,而不是像LSTM那样一步步“递推”。

为什么Transformer适合风功率预测?因为风的变化往往不是线性的。比如,当前的风速可能跟12小时前的某个风速模式高度相关,但跟中间时刻的关系不大。LSTM很难捕捉这种“跳跃式”的依赖,但Transformer可以。

下面是一个简化版的Transformer时间序列预测代码:

import tensorflow as tf
from tensorflow.keras.layers import MultiHeadAttention, LayerNormalization, Dropout

def transformer_encoder(inputs, head_size, num_heads, ff_dim, dropout=0.1):
    # 自注意力层
    attention = MultiHeadAttention(key_dim=head_size, num_heads=num_heads)(inputs, inputs)
    attention = Dropout(dropout)(attention)
    attention = LayerNormalization(epsilon=1e-6)(inputs + attention)
    
    # 前馈网络
    ff = tf.keras.Sequential([
        Dense(ff_dim, activation="relu"),
        Dense(inputs.shape[-1])
    ])(attention)
    ff = Dropout(dropout)(ff)
    outputs = LayerNormalization(epsilon=1e-6)(attention + ff)
    return outputs

# 构建模型
inputs = tf.keras.Input(shape=(lookback, n_features))
x = transformer_encoder(inputs, head_size=64, num_heads=4, ff_dim=128)
x = tf.keras.layers.GlobalAveragePooling1D()(x)
outputs = Dense(1)(x)
model = tf.keras.Model(inputs, outputs)
注意:Transformer虽然强大,但非常吃数据。如果历史数据少于1年,我建议你还是老老实实用LSTM或XGBoost。另外,Transformer的训练时间通常是LSTM的3-5倍,部署时也要考虑推理延迟。

3.4 实战对比:到底该用哪个?

说了这么多,你肯定想问:到底哪个模型最好?我的答案是:没有最好的模型,只有最合适的场景

模型 适用场景 数据量要求 训练时间 预测精度 可解释性
ARIMA 短期预测(1-4小时),数据量小 低(3个月以上) 秒级 中等
随机森林 中期预测(4-24小时),特征丰富 中(6个月以上) 分钟级 中等偏高
XGBoost 中期预测,精度要求高 中(6个月以上) 分钟级 中等
LSTM 超短期预测(15分钟-4小时),时序依赖强 高(1年以上) 小时级
Transformer 超短期预测,长序列依赖,数据量大 很高(2年以上) 小时级 很高 极低
我的建议:
  • 如果数据量少(<6个月),优先用ARIMA或随机森林。
  • 如果数据量中等(6个月-1年),XGBoost是性价比最高的选择。
  • 如果数据量大(>1年),且对超短期预测精度要求极高,上LSTM或Transformer。
  • 别忘了做模型集成!我常用的套路是:XGBoost + LSTM 加权平均,精度通常比单一模型高2%-3%。

3.5 知识体系总览

下面这张图是我自己整理的,把本章的核心逻辑串起来了。你可以把它当作一个“决策地图”——拿到一个风功率预测任务时,按图索骥就行。

风功率预测方法全景图 历史风功率数据 统计方法 机器学习 深度学习 ARIMA SARIMA(季节性) 随机森林 XGBoost LSTM Transformer 短期/超短期风功率预测值 数据量越大、时序依赖越强,越推荐向右走(深度学习) 数据量小或需要可解释性,向左走(统计/机器学习)

嗯,以上就是风功率预测的核心内容。记住:模型只是工具,对业务的理解才是根本。下次电网调度再问你“下一小时能发多少电”,你至少知道该掏出哪个家伙来应付了。


公众号:蓝海数据掘金营,微信deep3321