4. 单模型基石(上):线性回归与岭回归在风电预测中的应用

各位同学,欢迎来到第四讲。前面我们聊了风电数据的特性,也讲了怎么清洗和特征工程。今天开始,我们要正式进入建模环节了。

说实话,很多人一上来就搞深度学习、LSTM,觉得线性模型太简单。但我个人的经验是——线性模型是检验一切复杂模型的基准线。你连线性回归都跑不过,就别谈什么Transformer了。

这一讲,我们聚焦两个最基础的模型:普通线性回归岭回归。别看它们简单,在风电预测这个场景里,它们能帮你理解数据的内在规律,也能帮你发现很多坑。


4.1 线性回归:最朴素的预测器

线性回归的数学形式,大家应该都熟悉:

y = w₁x₁ + w₂x₂ + ... + wₙxₙ + b

说白了,就是给每个特征分配一个权重,然后加权求和。在风电预测里,x₁可能是风速,x₂可能是风向,x₃可能是温度……y就是未来15分钟的风电功率。

为什么线性回归在风电里还能用?

你想想看,风速和功率之间确实存在近似线性的关系——风速越大,功率越大,直到额定功率后饱和。在额定功率以下,这个关系基本是线性的。所以线性回归并不是瞎用。

核心要点:线性回归的预测值 = 特征加权和 + 偏置。它假设特征与目标之间存在线性关系。

4.2 最小二乘法:怎么找到最优的w和b?

模型有了,接下来就是怎么求解w和b。最经典的方法就是最小二乘法

它的目标很简单:让所有样本的预测误差平方和最小。

损失函数 J(w,b) = Σ(yᵢ - ŷᵢ)²

其中yᵢ是真实功率,ŷᵢ是预测功率。我们就是要找到一组w和b,让这个J最小。

求解方法有两种:

  • 解析解(正规方程法):直接通过矩阵运算求出w = (XᵀX)⁻¹Xᵀy。优点是精确,缺点是当特征维度很高时,矩阵求逆计算量巨大。
  • 梯度下降法:迭代更新w和b,逐步逼近最优解。适合大数据量和高维特征。

我的经验:在风电预测中,如果特征数少于1000,我习惯用正规方程法,一步到位。如果特征数上万,或者样本量特别大,就用梯度下降。我在一个项目中,特征维度到了5000多,正规方程直接内存溢出,换成小批量梯度下降才搞定。

4.3 代码实战:用线性回归预测风电功率

我们直接上代码。假设我们已经有了特征矩阵X和标签y。

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 创建并训练模型
lr = LinearRegression()
lr.fit(X_train, y_train)

# 预测
y_pred = lr.predict(X_test)

# 评估
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差(MSE): {mse:.4f}")
print(f"R²分数: {r2:.4f}")
print(f"模型系数: {lr.coef_[:5]}")  # 打印前5个特征的系数

跑完这段代码,你会得到MSE和R²。R²越接近1,说明模型拟合得越好。但注意,R²高不代表模型真的靠谱,尤其是在风电这种高波动数据上。

避坑指南:我曾经在一个风电项目里,R²跑到了0.95,高兴得不行。结果一检查,发现训练集和测试集有数据泄露——我把未来时刻的风速当特征用了。所以,一定要检查特征的时间顺序,不要用未来信息预测过去。

4.4 线性回归的局限:为什么需要岭回归?

线性回归虽然简单好用,但有两个致命问题:

  1. 过拟合:当特征很多时,模型会拼命拟合训练数据,导致泛化能力差。
  2. 多重共线性:特征之间高度相关时,系数估计会变得极不稳定。比如风速和风速的平方,这两个特征就高度相关。

在风电数据里,我们经常加入风速的平方、立方、甚至更高次项来捕捉非线性关系。这时候,特征之间很容易出现共线性。普通线性回归的系数会变得很大,正负交替,模型完全失控。

嗯,这时候就需要岭回归登场了。

4.5 岭回归:给系数加个“紧箍咒”

岭回归本质上就是在损失函数里加了一个L2正则化项

J(w) = Σ(yᵢ - ŷᵢ)² + λ * Σwⱼ²

多出来的这一项λ * Σwⱼ²,就是惩罚项。它会让模型倾向于选择较小的系数。λ越大,惩罚越重,系数越接近0(但不会等于0)。

这样做的好处是什么?

  • 防止过拟合:系数变小,模型对噪声不那么敏感
  • 处理共线性:即使特征高度相关,系数也能保持稳定

关键参数λ:λ控制正则化的强度。λ=0时,岭回归退化为普通线性回归。λ→∞时,所有系数趋近于0。实际应用中,我们需要通过交叉验证来选择合适的λ。

4.6 代码实战:岭回归在风电数据上的应用

我们继续用代码说话。这次我们用岭回归,并对比一下和普通线性回归的效果。

from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV

# 创建岭回归模型
ridge = Ridge()

# 用网格搜索找最佳λ
param_grid = {'alpha': [0.01, 0.1, 1, 10, 100]}
ridge_cv = GridSearchCV(ridge, param_grid, cv=5, scoring='neg_mean_squared_error')
ridge_cv.fit(X_train, y_train)

# 最佳参数
best_alpha = ridge_cv.best_params_['alpha']
print(f"最佳λ值: {best_alpha}")

# 用最佳参数重新训练
ridge_best = Ridge(alpha=best_alpha)
ridge_best.fit(X_train, y_train)

# 预测和评估
y_pred_ridge = ridge_best.predict(X_test)
mse_ridge = mean_squared_error(y_test, y_pred_ridge)
r2_ridge = r2_score(y_test, y_pred_ridge)

print(f"岭回归 - MSE: {mse_ridge:.4f}, R²: {r2_ridge:.4f}")
print(f"线性回归 - MSE: {mse:.4f}, R²: {r2:.4f}")

你会发现,在特征维度较高或者存在共线性时,岭回归的MSE通常会比普通线性回归低,R²也更稳定。

我的习惯:在风电预测中,只要特征数超过10个,我一般直接上岭回归。普通线性回归只作为基线对比。另外,α值我习惯从0.01到100按10倍递增去搜索,这样效率高。

4.7 知识体系总览

为了让大家更直观地理解本章的知识结构,我画了一张图:

单模型基石:线性回归与岭回归知识体系 风电功率预测 线性回归 岭回归 最小二乘法(正规方程/梯度下降) 问题:过拟合 & 多重共线性 L2正则化:λ * Σw² 优势:抗过拟合 & 处理共线性 关键:特征工程 + 交叉验证选参 线性回归是基线,岭回归是升级版,两者互为补充

4.8 本章小结

这一讲我们做了三件事:

  • 理解了线性回归的原理和最小二乘法的求解方式
  • 用代码实现了风电功率的线性回归预测
  • 发现了线性回归的局限,并引入了岭回归来解决过拟合和共线性问题

说实话,这两个模型虽然基础,但它们是所有复杂模型的起点。你后面学到的Lasso回归、弹性网络、甚至神经网络,很多思想都是从这儿延伸出来的。

下一讲,我们会继续深入单模型,聊聊Lasso回归和弹性网络。到时候你会看到,正则化这条路还能走得更远。


公众号:蓝海资料掘金营,微信deep3321