第4章:风电数据预处理——数据清洗、标准化与降噪技术

各位同学,大家好。今天我们来聊聊风电数据预处理中最核心的一环——数据清洗、标准化与降噪。说实话,我在风电行业摸爬滚打这些年,见过太多因为数据预处理没做好,导致后续模型直接翻车的案例。你想想看,风机数据本身就很脏,传感器故障、通信中断、环境干扰……如果不把这些坑填平,后面再牛的算法也是白搭。

4.1 数据清洗:缺失值与异常值处理

数据清洗,说白了就是给数据“洗澡”。我个人的习惯是,拿到数据第一件事,先看看缺失值和异常值的情况。别急着建模,先摸清数据的底细。

4.1.1 缺失值处理

风机数据里,缺失值太常见了。比如风速传感器偶尔掉线,或者功率数据因为通信延迟没传上来。处理缺失值,我一般分三步走:

  1. 先诊断:看看缺失比例。如果某个特征缺失超过80%,我建议直接扔掉。我在项目中遇到过,一个温度传感器坏了半年,数据全是NaN,留着只会拖后腿。
  2. 再选择方法:缺失比例在5%以下,用均值或中位数填充就行。但注意,风速这种周期性强的数据,用前后时刻的线性插值效果更好。
  3. 最后验证:填充完一定要检查分布是否变了。我习惯画个核密度图对比一下,如果填充后分布出现尖峰,说明方法选错了。

核心原则:缺失值处理不是“填上就行”,而是要尽量保持数据的原始分布特征。

代码示例(Python):

import pandas as pd
import numpy as np

# 读取风电数据
df = pd.read_csv('wind_turbine_data.csv')

# 检查缺失比例
missing_ratio = df.isnull().mean()
print(missing_ratio)

# 线性插值填充风速缺失
df['wind_speed'] = df['wind_speed'].interpolate(method='linear')

# 均值填充功率缺失(缺失比例小于5%)
df['power'].fillna(df['power'].mean(), inplace=True)

4.1.2 异常值处理

异常值比缺失值更棘手。风机数据里,异常值往往来自传感器故障、叶片结冰、或者电网波动。我常用的方法是3σ原则和IQR(四分位距)法。

3σ原则:假设数据服从正态分布,超出均值±3倍标准差的值视为异常。但注意,风电功率数据往往不是正态分布,这时候IQR更靠谱。

IQR方法:计算Q1(25%分位数)和Q3(75%分位数),IQR = Q3 - Q1。超出[Q1 - 1.5*IQR, Q3 + 1.5*IQR]的值视为异常。

避坑指南:我曾经在处理一个风场数据时,直接用3σ原则把功率大于10MW的点全删了。后来才发现,那几台风机是新型号,额定功率就是12MW。嗯,从那以后我每次都会先看看业务背景。

代码示例:

# IQR方法检测异常值
Q1 = df['power'].quantile(0.25)
Q3 = df['power'].quantile(0.75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 标记异常值
df['is_outlier'] = (df['power'] < lower_bound) | (df['power'] > upper_bound)

# 处理方式:删除或替换为边界值
df.loc[df['is_outlier'], 'power'] = df['power'].clip(lower_bound, upper_bound)

4.2 数据标准化与归一化

标准化和归一化,这两个概念经常被搞混。我简单解释一下:

  • 归一化(Min-Max Scaling):把数据缩放到[0,1]区间。适合数据分布有明确边界的情况,比如风速0-30m/s。
  • 标准化(Z-score):把数据变成均值为0、标准差为1的分布。适合数据分布未知或存在异常值的情况。

我个人习惯是:如果后续要用神经网络或深度学习,优先用标准化。因为归一化对异常值太敏感,一个离群点就能把整个缩放搞偏。

代码示例:

from sklearn.preprocessing import MinMaxScaler, StandardScaler

# 归一化
scaler_minmax = MinMaxScaler()
df[['wind_speed', 'power']] = scaler_minmax.fit_transform(df[['wind_speed', 'power']])

# 标准化
scaler_std = StandardScaler()
df[['wind_speed', 'power']] = scaler_std.fit_transform(df[['wind_speed', 'power']])

小技巧:如果你不确定用哪个,可以两个都试试,然后对比模型效果。我在一个功率预测项目中,标准化比归一化提升了3%的准确率。

4.3 数据降噪技术

风机数据里的噪声,主要来自湍流、测量误差和电磁干扰。降噪不是把噪声全去掉,而是保留信号的主要特征。常用的方法有:

  • 移动平均滤波:简单有效,适合平滑短时波动。但窗口大小要调好,太大会丢失细节。
  • 小波变换:适合非平稳信号,能同时保留时域和频域信息。我在处理振动数据时经常用。
  • 卡尔曼滤波:适合实时数据流,能动态估计真实值。但实现起来稍微复杂点。

代码示例(移动平均):

# 移动平均降噪,窗口大小为5
df['power_smoothed'] = df['power'].rolling(window=5, center=True).mean()

# 小波变换降噪(使用pywt库)
import pywt

# 对风速信号进行小波分解
coeffs = pywt.wavedec(df['wind_speed'], 'db4', level=4)
# 将高频系数置零(去噪)
coeffs[1:] = [np.zeros_like(c) for c in coeffs[1:]]
# 重构信号
df['wind_speed_denoised'] = pywt.waverec(coeffs, 'db4')

4.4 知识体系总览

下面这张图,是我自己总结的数据预处理流程。你想想看,从原始数据到干净可用的数据,中间要经过多少道工序?

风电数据预处理流程 原始数据 数据清洗 缺失值+异常值 标准化/归一化 Min-Max / Z-score 数据降噪 滤波/小波变换 干净数据 关键注意事项 • 缺失值处理:先诊断缺失比例,再选方法 • 异常值处理:结合业务背景,别一刀切 • 标准化 vs 归一化:看数据分布和模型需求 • 降噪:保留信号特征,别把有用信息滤掉了

4.5 实战经验总结

最后,我分享几个实战中的小经验:

  • 先看数据,再动手:我每次都会先画个箱线图,看看数据分布。异常值往往一眼就能看出来。
  • 别过度清洗:有些噪声其实是风机的真实特性,比如湍流引起的功率波动。你把它滤掉了,模型反而学不到真实规律。
  • 保存原始数据:我习惯在预处理前先备份一份原始数据。万一处理错了,还能回滚。

一句话总结:数据预处理不是流水线作业,而是一个需要不断迭代、验证的过程。你花在清洗上的时间,会在模型效果上成倍回报。

专注资料整理