第3章:数据预处理基础
大家好,我是老张。在风电行业摸爬滚打了十几年,今天咱们聊聊数据预处理。说实话,很多人觉得这步就是“洗数据”,没啥技术含量。但我告诉你,预处理做不好,后面模型再花哨也是白搭。
3.1 缺失值处理
风电数据里,缺失值太常见了。传感器故障、通讯中断、维护停机……原因五花八门。我见过最夸张的一次,某风场SCADA系统连续三天没记录风速数据,运维人员愣是没发现。
处理缺失值,我一般分三步走:
- 先诊断:看看缺失比例。低于5%的,直接删掉问题不大。超过20%的,你得小心了,强行填充可能引入偏差。
- 再分类:是随机缺失还是系统缺失?比如风速传感器在低温下容易失效,这就是系统缺失,不能简单用均值填充。
- 后处理:根据情况选方法。
常用方法对比:
| 方法 | 适用场景 | 缺点 |
|---|---|---|
| 删除法 | 缺失比例<5%,随机缺失 | 浪费数据 |
| 均值/中位数填充 | 数值型,缺失比例低 | 降低方差 |
| 前向/后向填充 | 时间序列,短时间缺失 | 不适用于突变场景 |
| 插值法 | 连续变化的数据 | 计算量大 |
| 模型预测 | 缺失比例高,有相关特征 | 容易过拟合 |
我个人习惯用插值法处理风速、功率这类连续变量。举个例子,某风机的风速数据缺失了10分钟,用前后5分钟的数据做线性插值,效果就挺好。
# Python示例:线性插值
import pandas as pd
df['wind_speed'] = df['wind_speed'].interpolate(method='linear')
小技巧:处理缺失值时,建议先备份原始数据。我曾经手滑把一列数据全填充了,结果发现填充逻辑有问题……嗯,从那以后我养成了备份的习惯。
3.2 异常值检测
异常值在风电数据里特别“狡猾”。有时候是传感器跳变,有时候是真实的风切变事件。怎么区分?我一般用两种方法:3σ原则和IQR方法。
3.2.1 3σ原则
说白了,就是假设数据服从正态分布,超出均值±3倍标准差的值算异常。这个方法简单粗暴,但有个前提——数据得是正态分布。风电数据里,风速、功率通常偏态分布,直接用3σ容易误判。
我记得有一次,某风场功率数据频繁报警,用3σ一查,全是异常。后来发现是风速分布偏右,3σ把正常的高风速段也判成异常了。所以,用之前先检查分布。
# 3σ异常检测
import numpy as np
mean = np.mean(df['power'])
std = np.std(df['power'])
outliers = df[(df['power'] < mean - 3*std) | (df['power'] > mean + 3*std)]
3.2.2 IQR方法
IQR方法对分布要求没那么严格。它用四分位距来定义异常:低于Q1-1.5*IQR或高于Q3+1.5*IQR的算异常。你想想看,这个方法对偏态数据更友好。
我在项目中遇到过一件事:某风机振动数据用3σ检测,异常率高达15%。换成IQR后,异常率降到3%,再结合人工排查,发现确实是传感器松动导致的。所以,方法选对了,事半功倍。
# IQR异常检测
Q1 = df['vibration'].quantile(0.25)
Q3 = df['vibration'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['vibration'] < Q1 - 1.5*IQR) | (df['vibration'] > Q3 + 1.5*IQR)]
避坑指南:我曾经用IQR处理风速数据,发现异常点全是停机时段的风速。后来才意识到,停机时风速传感器还在工作,但数据本身是正常的。所以,异常值检测一定要结合业务场景,别光看统计指标。
3.3 数据标准化与归一化
标准化和归一化,说白了就是把数据“拉”到同一个尺度上。风电数据里,风速、功率、温度、振动……量纲都不一样,直接扔进模型,量级大的特征会主导结果。
3.3.1 标准化(Z-score)
标准化是把数据变成均值为0、标准差为1的分布。公式很简单:(x - μ) / σ。这个方法适合数据近似正态分布的情况。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df[['wind_speed', 'power']])
3.3.2 归一化(Min-Max)
归一化是把数据缩放到[0,1]区间。公式:(x - min) / (max - min)。这个方法对异常值敏感,如果数据里有极端值,归一化后大部分数据会被压缩到很小的区间。
我建议:如果后续用神经网络,归一化更合适;如果用线性模型或SVM,标准化更好。当然,这只是经验之谈,具体还得看数据。
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df_norm = scaler.fit_transform(df[['wind_speed', 'power']])
个人经验:标准化和归一化没有绝对的好坏。我一般会两种都试一下,看哪个让模型收敛更快。有时候,标准化后的数据在PCA降维时表现更好,归一化后的数据在聚类时更稳定。
3.4 知识体系总览
说了这么多,咱们用一张图把本章内容串起来。这张图是我自己画的,涵盖了数据预处理的三大核心模块:缺失值处理、异常值检测、数据缩放。
好了,数据预处理的基础就这些。说白了,就是让数据“干净”起来,为后续分析打好基础。下一章咱们聊聊特征工程,到时候会用到今天讲的内容。
公众号:蓝海资料掘金营,微信deep3321