2、数据质量评估:缺失值、异常值、噪声数据对预测的影响及诊断方法
做风机剩余寿命预测,说白了就是跟数据打交道。我见过太多团队,模型选得花里胡哨,调参调得废寝忘食,结果一上真实数据就崩了。为什么?数据质量没把好关。
你想想看,风机SCADA系统一天能产出几万条数据,但传感器漂移、通信中断、环境干扰……这些都会让数据变脏。脏数据喂进去,再牛的模型也白搭。今天我就跟你聊聊,怎么给数据做一次全面体检。
核心观点:数据质量评估不是预处理步骤,而是模型性能的基石。跳过这一步,后面所有工作都是在沙子上盖楼。
2.1 缺失值:数据链条上的断点
缺失值是最常见的问题。风机运行中,传感器偶尔掉线、通信模块重启、或者数据采集系统抽风,都会产生缺失值。我遇到过最夸张的一次,某风场连续3天的风速数据全是NaN,后来发现是网线被老鼠咬断了。
缺失值对预测的影响有多大?
- 时间序列断裂:剩余寿命预测依赖时序特征,缺失值会切断时间依赖关系。比如你算滑动平均,缺了几个点,结果就偏了。
- 特征工程失效:很多特征(如峰值、谷值、变化率)需要连续数据。缺失值一多,这些特征就废了。
- 模型训练偏差:如果缺失不是随机的(比如总是在高风速时缺失),模型会学到错误模式。
我的经验:别一上来就删掉缺失行。先看看缺失比例。低于5%的随机缺失,用前向填充或插值就行。超过20%?那得查查传感器是不是坏了。
诊断方法:
- 可视化检查:用热力图看缺失模式。我习惯用
missingno库,一目了然。 - 统计缺失率:每个特征算一下缺失比例,超过阈值就报警。
- 时序缺失检测:连续缺失超过N个点,标记为严重事件。
import pandas as pd
import missingno as msno
# 加载数据
df = pd.read_csv('wind_turbine_data.csv', parse_dates=['timestamp'])
# 可视化缺失模式
msno.matrix(df)
# 你会看到白色条纹——那就是缺失的位置
# 统计缺失率
missing_ratio = df.isnull().sum() / len(df)
print('缺失率超过10%的特征:')
print(missing_ratio[missing_ratio > 0.1])
2.2 异常值:藏在数据里的地雷
异常值比缺失值更隐蔽。一个传感器偶尔跳变到离谱的值,你很难发现。但模型会把它当真,然后学出奇怪的东西。
我记得有个项目,齿轮箱温度偶尔飙到200度,明显是传感器故障。但模型没识别出来,结果预测的剩余寿命忽长忽短,运维团队根本没法用。
异常值的影响:
- 拉偏统计量:均值、标准差全被带偏。你算的阈值、基线都不准了。
- 误导模型学习:异常点会被模型当成正常模式,尤其是LSTM这类对局部模式敏感的模型。
- 造成误报警:一个异常值可能触发故障预警,运维人员白跑一趟。
注意:不是所有异常值都是坏的。风机启停机、变桨动作、电网波动都会产生真实异常。别一刀切删掉,先搞清楚原因。
诊断方法:
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 3σ原则 | 正态分布数据 | 简单快速 | 对非正态分布不适用 |
| IQR方法 | 任意分布 | 鲁棒性强 | 对尾部数据不敏感 |
| 孤立森林 | 高维数据 | 无监督,效果好 | 计算量大 |
| 时序分解 | 有趋势/季节性的数据 | 能区分趋势异常和点异常 | 需要调参 |
# 用IQR方法检测异常值
def detect_outliers_iqr(data, column):
Q1 = data[column].quantile(0.25)
Q3 = data[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = data[(data[column] < lower_bound) | (data[column] > upper_bound)]
return outliers
# 检测风速异常
wind_outliers = detect_outliers_iqr(df, 'wind_speed')
print(f'发现 {len(wind_outliers)} 个风速异常点')
2.3 噪声数据:温水煮青蛙
噪声是最容易被忽视的问题。它不像缺失值那么明显,也不像异常值那么扎眼。但噪声会慢慢侵蚀模型的性能。
说白了,噪声就是信号里混入的无用波动。风机振动信号里,齿轮啮合频率、轴承通过频率、电磁干扰……全搅在一起。你提取的特征,可能一半是噪声。
噪声的影响:
- 降低信噪比:真实退化趋势被淹没,模型学不到有效特征。
- 增加过拟合风险:模型把噪声当成模式去拟合,泛化能力变差。
- 预测不稳定:今天预测剩100天,明天变成80天,后天又变回95天。运维没法排计划。
避坑指南:我曾经在一个项目中,用原始振动数据直接训练模型,结果验证集上表现很好,一上测试集就崩。后来发现是训练集和测试集的噪声水平不一样。从那以后,我养成了先做频谱分析的习惯。
诊断方法:
- 频谱分析:用FFT看频率成分。噪声通常表现为宽频带能量。
- 自相关函数:噪声的自相关在滞后非零时接近0,而真实信号有相关性。
- 滑动窗口统计:计算窗口内的方差变化。噪声大的区域方差波动剧烈。
import numpy as np
import matplotlib.pyplot as plt
# 对振动信号做频谱分析
fs = 100 # 采样频率100Hz
signal = df['vibration'].values
# FFT
n = len(signal)
freq = np.fft.fftfreq(n, 1/fs)
fft_vals = np.abs(np.fft.fft(signal))
# 只看正频率
positive_freq = freq[:n//2]
positive_fft = fft_vals[:n//2]
# 计算噪声基底(取后50%频率的平均幅值)
noise_floor = np.mean(positive_fft[len(positive_fft)//2:])
print(f'噪声基底水平:{noise_floor:.4f}')
# 如果噪声基底超过信号峰值的10%,说明噪声严重
if noise_floor > 0.1 * np.max(positive_fft):
print('⚠️ 噪声水平较高,建议进行滤波处理')
2.4 综合评估流程
在实际项目中,我不会单独处理某一种问题。我习惯按这个流程走:
- 第一步:全局扫描——用统计摘要+可视化快速过一遍数据。
- 第二步:逐项诊断——分别检查缺失、异常、噪声,记录问题清单。
- 第三步:影响评估——判断每种问题对预测任务的实际影响程度。
- 第四步:制定策略——哪些要修复,哪些可以容忍,哪些必须重采。
记住:数据质量评估不是一次性工作。模型上线后,要持续监控数据质量。我见过太多模型上线时好好的,运行半年后数据质量下降,预测精度也跟着跳水。
嗯,数据质量这块就聊到这儿。下一节我们会深入讲特征工程,但前提是你得先把数据洗干净。否则,再好的特征也白搭。