风速预测(二)特征工程与模型输入构建

张开发
2026/4/17 17:54:40 15 分钟阅读

分享文章

风速预测(二)特征工程与模型输入构建
1. 特征工程的核心思路风速预测本质上是一个时间序列预测问题但单纯使用原始风速数据往往难以获得理想的预测效果。这就好比做菜时直接使用生肉和蔬菜虽然能吃但味道欠佳。特征工程就像烹饪前的食材处理工序——切块、腌制、调味让食材更容易被消化吸收。我在实际项目中发现好的特征工程能让模型性能提升30%以上。举个真实案例某风电场使用原始风速数据训练LSTM模型72小时预测误差为15%加入统计特征和频域特征后误差降至9.8%。下面我们就来拆解这些调味技巧。2. 基础特征构造方法2.1 统计特征提取统计特征是最容易上手也最实用的特征类型。就像体检报告里的各项指标它们能多维度描述风速的状态。常用的统计特征包括滑动窗口统计量计算窗口内的均值、方差、最大值、最小值等。例如用24小时窗口计算日均风速波动幅度# 计算24小时滑动窗口统计特征 df[rolling_mean] df[wind_speed].rolling(24).mean() df[rolling_std] df[wind_speed].rolling(24).std() df[rolling_max] df[wind_speed].rolling(24).max()差分特征消除非平稳性。一阶差分可以消除趋势二阶差分可以消除季节性# 一阶差分 df[diff_1] df[wind_speed].diff(1) # 季节性差分24小时周期 df[diff_seasonal] df[wind_speed].diff(24)分位数特征比均值更能反映分布特点。我常用0.25、0.5、0.75三个分位数# 计算分位数 df[quantile_25] df[wind_speed].rolling(24).quantile(0.25) df[quantile_50] df[wind_speed].rolling(24).quantile(0.5)2.2 时间特征编码时间本身包含丰富信息但需要合理编码才能被模型理解。这里分享几个实用技巧周期性编码将小时、星期等转换为正弦/余弦值。比如处理小时特征# 周期性编码小时特征 df[hour_sin] np.sin(2 * np.pi * df[hour]/24) df[hour_cos] np.cos(2 * np.pi * df[hour]/24)时间标志位标识特殊时间段。例如夜间风力通常较小# 创建夜间标志 df[is_night] ((df[hour] 22) | (df[hour] 6)).astype(int)时间差特征计算距离上次大风的时间间隔。这个特征在我项目中效果显著# 计算距离上次大风(10m/s)的时间 df[time_since_high_wind] df.index.to_series().diff().where(df[wind_speed] 10).fillna(0)3. 高级特征工程技巧3.1 频域特征提取风速数据具有明显的周期性傅里叶变换能有效提取这些隐藏模式。实际操作时我常用以下方法快速傅里叶变换(FFT)获取主要频率成分。注意要先标准化数据from scipy.fft import fft # 标准化数据 normalized (df[wind_speed] - df[wind_speed].mean()) / df[wind_speed].std() # 计算FFT fft_result fft(normalized.values) freq np.fft.fftfreq(len(normalized)) # 取前5个主要频率 top_freqs freq[np.argsort(np.abs(fft_result))[::-1]][:5]小波变换比FFT更适合非平稳信号。使用pywt库实现import pywt # 进行小波分解 coeffs pywt.wavedec(df[wind_speed], db4, level5) # 提取各层能量特征 energy_features [np.sum(np.square(c)) for c in coeffs]3.2 空间特征融合如果有多个测风塔数据可以构造空间特征空间相关性计算邻近站点的风速相关性。例如# 计算两个站点的6小时滚动相关性 df[spatial_corr] df[wind_speed].rolling(6).corr(df[neighbor_wind_speed])空间梯度反映风速变化趋势# 计算空间梯度假设有x,y坐标 df[wind_gradient] np.gradient(df[wind_speed], df[distance])4. 特征选择与优化4.1 特征重要性评估不是所有特征都有用我常用三种评估方法树模型特征重要性快速筛选重要特征from sklearn.ensemble import RandomForestRegressor # 训练随机森林 model RandomForestRegressor() model.fit(X_train, y_train) # 获取特征重要性 importances model.feature_importances_互信息法适合非线性关系评估from sklearn.feature_selection import mutual_info_regression # 计算互信息 mi mutual_info_regression(X_train, y_train)递归特征消除(RFE)自动化特征选择from sklearn.feature_selection import RFE from sklearn.linear_model import LinearRegression # 使用线性回归作为基模型 selector RFE(LinearRegression(), n_features_to_select20) selector.fit(X_train, y_train)4.2 特征组合优化好的特征组合能产生112的效果交互特征相乘或相除创造新特征。例如# 创建温度与风速的交互特征 df[temp_wind_interaction] df[temperature] * df[wind_speed]多项式特征捕捉非线性关系from sklearn.preprocessing import PolynomialFeatures # 生成二次多项式特征 poly PolynomialFeatures(degree2) X_poly poly.fit_transform(X[[wind_speed, temperature]])5. 模型输入构建实战5.1 时间序列样本生成滑动窗口是最常用的方法但有几个关键点需要注意窗口大小选择根据数据特性决定。我的经验法则是短期预测(1-6小时)窗口4-12小时中期预测(6-24小时)窗口24-72小时长期预测(24小时)窗口7-30天步长设置通常取预测步长的1/2到1/4。例如预测6小时风速步长取1-3小时。完整实现代码def create_dataset(data, window_size, horizon): X, y [], [] for i in range(len(data)-window_size-horizon): X.append(data[i:iwindow_size]) y.append(data[iwindow_size:iwindow_sizehorizon]) return np.array(X), np.array(y) # 示例使用72小时窗口预测6小时风速 X, y create_dataset(df[wind_speed].values, window_size72, horizon6)5.2 样本增强技巧小数据集时这些技巧很管用时间扭曲轻微扰动时间轴增加多样性def time_warp(series, factor0.1): warp np.random.normal(1, factor, sizelen(series)) return series * warp # 应用时间扭曲 augmented time_warp(X[0])随机遮挡模拟数据缺失情况def random_mask(series, p0.1): mask np.random.random(sizelen(series)) p return np.where(mask, np.nan, series) # 应用随机遮挡 augmented random_mask(X[0])6. 特征工程实战建议在实际项目中我发现这些经验特别有用特征重要性监控训练完成后定期检查特征重要性变化。有次我发现温度特征重要性突然下降原来是传感器故障导致数据异常。特征版本控制每次特征修改都保存为单独版本。有次新特征导致模型性能下降快速回滚到上一版本。特征可视化用t-SNE或PCA可视化特征空间。曾通过可视化发现两个高度线性相关的特征去除后模型更稳定。业务知识融合与气象专家交流后我们加入了大气压力变化率特征模型误差降低了2.3%。线上特征一致性确保训练和推理时的特征计算完全一致。曾因滑动窗口实现不一致导致线上效果大幅下降。

更多文章