第3章:数据预处理基础

大家好,我是老张。在风电行业摸爬滚打了十几年,今天咱们聊聊数据预处理。说实话,很多人觉得这步就是“洗数据”,没啥技术含量。但我告诉你,预处理做不好,后面模型再花哨也是白搭。

3.1 缺失值处理

风电数据里,缺失值太常见了。传感器故障、通讯中断、维护停机……原因五花八门。我见过最夸张的一次,某风场SCADA系统连续三天没记录风速数据,运维人员愣是没发现。

处理缺失值,我一般分三步走:

  1. 先诊断:看看缺失比例。低于5%的,直接删掉问题不大。超过20%的,你得小心了,强行填充可能引入偏差。
  2. 再分类:是随机缺失还是系统缺失?比如风速传感器在低温下容易失效,这就是系统缺失,不能简单用均值填充。
  3. 后处理:根据情况选方法。

常用方法对比:

方法 适用场景 缺点
删除法 缺失比例<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 知识体系总览

说了这么多,咱们用一张图把本章内容串起来。这张图是我自己画的,涵盖了数据预处理的三大核心模块:缺失值处理、异常值检测、数据缩放。

数据预处理知识体系 缺失值处理 异常值检测 数据缩放 处理方法 • 删除法(缺失<5%) • 均值/中位数填充 • 前向/后向填充 • 插值法 / 模型预测 检测方法 • 3σ原则(正态分布) • IQR方法(偏态分布) • 业务规则校验 • 可视化排查 缩放方法 • 标准化(Z-score) • 归一化(Min-Max) • 鲁棒缩放(Robust) • 最大绝对值缩放 核心原则:先诊断,再处理,结合业务场景 没有万能方法,多尝试、多验证

好了,数据预处理的基础就这些。说白了,就是让数据“干净”起来,为后续分析打好基础。下一章咱们聊聊特征工程,到时候会用到今天讲的内容。


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