4. 数据采集与预处理:传感器数据采集策略、数据清洗与时间戳对齐

各位好,我是老张。做了十几年设备可靠性,我最大的体会就是:模型再牛,也怕烂数据。今天这章,咱们就聊聊数据采集与预处理那些事儿。说白了,这是整个风险评分模型的「地基」。

我记得刚入行那会儿,接过一个项目,数据量巨大,但模型死活不准。后来一查,发现传感器采集策略就有问题——有的设备采样频率太高,有的又太低,时间戳还对不齐。那叫一个头疼。所以,咱们今天就把这些坑一个个填上。

4.1 传感器数据采集策略

采集策略,不是拍脑袋定的。你得想清楚几个问题:

  • 采什么? 振动、温度、压力、电流……每个信号对故障的敏感度不一样。
  • 怎么采? 连续采还是触发采?固定频率还是自适应?
  • 采多少? 采样率、分辨率、数据量,这些直接影响存储和计算成本。

我个人习惯,先做一轮「信号摸底」。拿振动信号举例,我会先看看设备正常运行时的频谱,确定主要频率成分。然后,根据奈奎斯特定理,采样率至少设成最高频率的2.5倍。别卡着2倍,留点余量。

我的经验: 对于旋转机械,建议同时采集振动加速度和速度信号。加速度对高频冲击敏感,速度对低频不平衡敏感。两者互补,诊断更准。

还有一种策略叫「事件驱动采集」。平时低频率采样,一旦检测到某个阈值被触发(比如温度突然升高),就立刻切换到高频率。这招能大幅降低数据存储量。我在一个风电项目里用过,效果不错。

采集策略 适用场景 优点 缺点
连续采集 关键设备、高速旋转机械 数据完整,不丢失瞬态信息 数据量大,存储成本高
周期采集 非关键设备、缓慢变化过程 数据量可控,简单易行 可能错过突发故障
事件驱动采集 间歇性故障、异常监测 存储效率高,聚焦异常 需要合理设置触发阈值

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

数据采回来,别急着建模。先看看有没有「脏数据」。我见过最离谱的一次,传感器掉线了三天,数据全是0,模型直接把它当成「完美运行状态」来学。你说这能准吗?

4.2.1 缺失值处理

缺失值,说白了就是数据里的「窟窿」。怎么补?看情况:

  • 删除法: 如果缺失比例很小(比如<5%),直接删掉那几行。简单粗暴,但有效。
  • 均值/中位数填充: 适用于平稳信号。比如温度,用前后几小时的平均值补上。
  • 前向/后向填充: 适用于缓慢变化的过程。比如液位,用上一个有效值填充。
  • 插值法: 线性插值、样条插值。适用于有一定趋势的数据。
  • 模型预测: 用其他相关变量预测缺失值。这招最复杂,但精度也最高。
注意: 千万别用全局均值填充振动信号!振动信号是非平稳的,均值填充会抹掉故障特征。我曾经见过有人这么干,结果模型把正常状态和故障状态全学成了一个样。

4.2.2 异常值处理

异常值,就是那些「离谱」的数据点。可能是传感器故障,也可能是真正的设备异常。怎么区分?

我常用的方法有几种:

  1. 3σ原则: 数据服从正态分布时,超过均值±3倍标准差的值,视为异常。
  2. 箱线图法: 超过四分位距(IQR)1.5倍的值,视为异常。这个方法对非正态分布更鲁棒。
  3. 移动窗口法: 计算滑动窗口内的均值和标准差,局部判断异常。适合处理趋势变化的数据。

举个例子,处理振动信号的尖峰脉冲:

import pandas as pd
import numpy as np

# 假设 vibration_data 是振动信号序列
window_size = 100
threshold = 3

# 计算移动均值和标准差
rolling_mean = vibration_data.rolling(window=window_size).mean()
rolling_std = vibration_data.rolling(window=window_size).std()

# 标记异常
anomaly_mask = np.abs(vibration_data - rolling_mean) > threshold * rolling_std

# 用移动中位数替换异常值
vibration_data_clean = vibration_data.copy()
vibration_data_clean[anomaly_mask] = vibration_data.rolling(window=window_size).median()

关键原则: 处理异常值时,先问自己一个问题:「这个异常是设备故障的征兆,还是传感器的噪声?」如果是前者,保留它;如果是后者,才处理它。我见过太多人一上来就把所有异常值全删了,结果把故障特征也删掉了。

4.3 时间戳对齐与重采样

不同传感器,采样频率不一样。有的每秒采1000次,有的每分钟采1次。时间戳还可能因为网络延迟、时钟漂移而对不齐。这时候,就需要对齐和重采样。

你想想看,如果振动信号和温度信号的时间戳差了几秒钟,你拿它们一起建模,那相关性分析就全乱了。

4.3.1 时间戳对齐

对齐的核心,是找到一个「基准时间轴」。我通常的做法是:

  1. 确定一个统一的起始时间和结束时间。
  2. 以最高频率的传感器为基准,生成一个等间隔的时间序列。
  3. 把其他传感器的数据,通过插值或最近邻匹配,映射到这个基准时间轴上。

4.3.2 重采样

重采样,就是把数据从一个频率转换到另一个频率。有两种情况:

  • 降采样: 从高频率降到低频率。比如把1000Hz的振动信号降到100Hz。常用方法:均值、最大值、RMS值。
  • 升采样: 从低频率升到高频率。比如把1Hz的温度信号升到10Hz。常用方法:线性插值、样条插值。

我个人建议,对于振动信号,降采样时用RMS值。因为RMS值能保留信号的能量信息,比均值更有物理意义。

避坑指南: 我曾经在一个项目里,把振动信号降采样后直接做FFT分析,结果发现频谱全变了。后来才意识到,降采样前必须先做低通滤波,否则会发生「频率混叠」。记住:降采样前,先滤波!

下面这张图,展示了整个数据采集与预处理的核心流程:

数据采集与预处理流程 数据采集与预处理核心流程 传感器数据采集 数据清洗 缺失值处理 异常值处理 时间戳对齐与重采样 输出干净数据 关键原则: 先理解数据物理意义,再决定清洗策略。保留故障特征,去除传感器噪声。

嗯,到这里,数据采集与预处理的核心内容就讲完了。记住一句话:数据质量,决定了模型的天花板。别急着调算法,先把数据搞干净。