2、数据质量评估:缺失值、异常值、噪声数据对预测的影响及诊断方法

做风机剩余寿命预测,说白了就是跟数据打交道。我见过太多团队,模型选得花里胡哨,调参调得废寝忘食,结果一上真实数据就崩了。为什么?数据质量没把好关。

你想想看,风机SCADA系统一天能产出几万条数据,但传感器漂移、通信中断、环境干扰……这些都会让数据变脏。脏数据喂进去,再牛的模型也白搭。今天我就跟你聊聊,怎么给数据做一次全面体检。

核心观点:数据质量评估不是预处理步骤,而是模型性能的基石。跳过这一步,后面所有工作都是在沙子上盖楼。
数据质量评估 缺失值 异常值 噪声数据 • 传感器断连 • 通信丢包 • 存储异常 • 传感器漂移 • 极端工况 • 人为误操作 • 电磁干扰 • 振动谐波 • 量化误差 直接影响:预测偏差 → 误报警 → 维护决策失误

2.1 缺失值:数据链条上的断点

缺失值是最常见的问题。风机运行中,传感器偶尔掉线、通信模块重启、或者数据采集系统抽风,都会产生缺失值。我遇到过最夸张的一次,某风场连续3天的风速数据全是NaN,后来发现是网线被老鼠咬断了。

缺失值对预测的影响有多大?

  • 时间序列断裂:剩余寿命预测依赖时序特征,缺失值会切断时间依赖关系。比如你算滑动平均,缺了几个点,结果就偏了。
  • 特征工程失效:很多特征(如峰值、谷值、变化率)需要连续数据。缺失值一多,这些特征就废了。
  • 模型训练偏差:如果缺失不是随机的(比如总是在高风速时缺失),模型会学到错误模式。
我的经验:别一上来就删掉缺失行。先看看缺失比例。低于5%的随机缺失,用前向填充或插值就行。超过20%?那得查查传感器是不是坏了。

诊断方法:

  1. 可视化检查:用热力图看缺失模式。我习惯用missingno库,一目了然。
  2. 统计缺失率:每个特征算一下缺失比例,超过阈值就报警。
  3. 时序缺失检测:连续缺失超过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天。运维没法排计划。
避坑指南:我曾经在一个项目中,用原始振动数据直接训练模型,结果验证集上表现很好,一上测试集就崩。后来发现是训练集和测试集的噪声水平不一样。从那以后,我养成了先做频谱分析的习惯。

诊断方法:

  1. 频谱分析:用FFT看频率成分。噪声通常表现为宽频带能量。
  2. 自相关函数:噪声的自相关在滞后非零时接近0,而真实信号有相关性。
  3. 滑动窗口统计:计算窗口内的方差变化。噪声大的区域方差波动剧烈。
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 综合评估流程

在实际项目中,我不会单独处理某一种问题。我习惯按这个流程走:

  1. 第一步:全局扫描——用统计摘要+可视化快速过一遍数据。
  2. 第二步:逐项诊断——分别检查缺失、异常、噪声,记录问题清单。
  3. 第三步:影响评估——判断每种问题对预测任务的实际影响程度。
  4. 第四步:制定策略——哪些要修复,哪些可以容忍,哪些必须重采。
记住:数据质量评估不是一次性工作。模型上线后,要持续监控数据质量。我见过太多模型上线时好好的,运行半年后数据质量下降,预测精度也跟着跳水。

嗯,数据质量这块就聊到这儿。下一节我们会深入讲特征工程,但前提是你得先把数据洗干净。否则,再好的特征也白搭。


专注资料整理