3. 特征工程基础:风速与功率的关系、风向、温度、气压等特征分析

各位同学,咱们今天聊聊特征工程。说白了,就是怎么从原始数据里挖出真正有用的东西。我做了这么多年风电预测,发现很多人一上来就堆模型,结果效果很差。为什么?因为特征没选对。你想想看,垃圾进垃圾出,模型再牛也白搭。

3.1 风速与功率:最核心的关系

风速和功率的关系,是风电预测里最基础、也最重要的特征。我刚开始做这个项目时,以为风速越大功率就越大,线性关系嘛。结果一看实际数据,完全不是那么回事。

实际上,风速和功率呈现典型的 S 型曲线。我习惯叫它“三段式”:

  • 切入风速以下:风速太低,风机不转,功率为零。一般在 3 m/s 左右。
  • 额定风速区间:风速从切入点到额定点,功率近似三次方增长。这是最敏感的区域。
  • 切出风速以上:为了保护风机,功率被限制,甚至停机。

嗯,这里要注意:不同型号的风机,这三个关键点不一样。我在项目中遇到过,同一个风场两种风机,切入风速差了 0.5 m/s,结果模型预测偏差很大。所以,一定要先看风机的功率曲线手册

核心要点:风速与功率不是线性关系,而是分段非线性。建模时,可以考虑对风速做分段处理,或者加入风速的平方项、立方项。

咱们来看一段代码,怎么提取风速特征:

import pandas as pd
import numpy as np

# 假设 df 包含 'wind_speed' 和 'power' 两列
df['ws_squared'] = df['wind_speed'] ** 2
df['ws_cubed'] = df['wind_speed'] ** 3

# 分段特征:判断风速处于哪个区间
def wind_zone(ws):
    if ws < 3:
        return 0  # 切入前
    elif ws < 12:
        return 1  # 上升段
    elif ws < 25:
        return 2  # 额定段
    else:
        return 3  # 切出段

df['wind_zone'] = df['wind_speed'].apply(wind_zone)

我的小技巧:除了风速本身,还可以计算过去 10 分钟的平均风速和风速变化率。风的变化趋势,往往比瞬时值更有预测价值。

3.2 风向:别小看这个角度

风向这个特征,很多人觉得不重要。我曾经也这么想,直到有一次模型在某个方向的风来时,预测误差突然变大。查了半天,才发现是风向的问题。

风向是 360 度的循环变量。0 度和 360 度其实是一个方向,但如果你直接拿数值去建模,模型会认为它们差 360 度,这就出问题了。

我建议的处理方式:

  • 拆成 sin 和 cos 分量:这是最常用的方法。风向 0° 对应 (sin=0, cos=1),90° 对应 (sin=1, cos=0),完美解决循环问题。
  • 考虑风向与主风向的偏差:每个风场都有主风向,比如西北风居多。计算当前风向与主风向的夹角,有时比原始风向更有用。

举个例子:

import numpy as np

# 风向角度转弧度
df['wind_dir_rad'] = np.radians(df['wind_direction'])
df['wind_dir_sin'] = np.sin(df['wind_dir_rad'])
df['wind_dir_cos'] = np.cos(df['wind_dir_rad'])

# 主风向(假设是 300 度)
main_dir = 300
df['dir_deviation'] = np.abs(df['wind_direction'] - main_dir)
# 处理循环:偏差不能超过 180
df['dir_deviation'] = df['dir_deviation'].apply(lambda x: min(x, 360 - x))

避坑指南:我曾经直接把风向角度作为特征输入模型,结果模型在 0° 和 360° 附近预测完全混乱。后来改用 sin/cos 编码,问题立刻解决了。记住,循环变量不能直接当数值用。

3.3 温度与气压:空气密度的幕后推手

温度和气压,这两个特征看起来跟功率没关系,其实影响很大。为什么?因为它们决定了 空气密度

功率公式里,空气密度 ρ 是直接乘在风速三次方前面的。温度高了,空气密度变小,同样的风速,功率会下降。气压低了,密度也变小。我见过一个案例,夏天高温时,功率比理论值低了 10% 以上。

我个人习惯,直接计算空气密度作为特征:

# 温度:摄氏度,气压:hPa
R = 287.058  # 气体常数
df['air_density'] = df['pressure'] * 100 / (R * (df['temperature'] + 273.15))

当然,你也可以直接用温度和气压的原始值。但要注意,温度和气压之间可能存在共线性。比如冷锋过境时,温度下降、气压上升,两者高度相关。这时候可以考虑只保留一个,或者用 PCA 降维。

特征 对功率的影响 建议处理方式
温度 温度↑ → 密度↓ → 功率↓ 直接使用,或计算空气密度
气压 气压↑ → 密度↑ → 功率↑ 直接使用,或计算空气密度
湿度 湿度↑ → 密度↓ → 功率↓ 可选,影响较小

一句话总结:风速是主角,风向是配角,温度和气压是幕后推手。三者结合,才能准确预测功率。

3.4 特征工程的整体流程

说了这么多,咱们来画个图,把整个特征工程的逻辑串起来。我习惯用一张图来理清思路:

风电功率预测特征工程流程 原始数据 风速特征 风向特征 温压特征 • 风速平方/立方 • 风速变化率 • 分段区间编码 • sin/cos 编码 • 主风向偏差 • 风向稳定性 • 空气密度计算 • 温度/气压原始值 • 共线性检查 最终特征集 → 模型训练

你看,整个流程就是从原始数据出发,分别处理风速、风向、温压三类特征,最后汇聚成最终特征集。每一步都有坑,但踩过之后,你就知道该怎么走了。

最后说一句:特征工程没有标准答案。每个风场、每台风机都有自己的脾气。我的建议是,先做基础特征,然后根据模型表现,逐步添加或删减特征。别一上来就搞几十个特征,容易过拟合。


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