第1章:数据采集与预处理

各位工程师朋友,咱们直接进入正题。在线监测系统里,报警阈值设定得准不准,七成功力都在数据预处理上。我见过太多项目,算法模型调得天花乱坠,结果因为原始数据没处理好,现场误报率居高不下。说白了,数据预处理就是给系统打好地基。

1.1 传感器数据特性

传感器数据,说白了就是物理世界到数字世界的映射。但这里有个坑——传感器本身不是完美的。我做过一个振动监测项目,现场装的是压电式加速度计,输出信号里混着工频干扰、温度漂移,还有安装共振。你想想看,如果直接拿这些数据去算阈值,那结果能靠谱吗?

常见的传感器数据特性包括:

  • 噪声特性:热噪声、量化噪声、环境耦合噪声。我记得有一次在钢厂做项目,电磁干扰直接把信号淹没了,后来加了屏蔽和差分传输才解决。
  • 漂移特性:零点漂移、温漂、时漂。特别是压阻式压力传感器,温度一变,基线就跟着跑。
  • 非线性:传感器输出与物理量之间不是完美的线性关系。比如热电偶的电压-温度曲线,得查表或者多项式拟合。
  • 响应延迟:传感器对输入变化的响应需要时间。这个在快速变化的工况下特别要命。

核心观点:理解传感器特性,是预处理的第一步。不要指望传感器给你完美数据,它给你的只是“带噪的近似值”。

1.2 数据清洗:去噪与去野点

数据清洗,我习惯把它分成两步走:去噪和去野点。这两件事看着像,其实处理逻辑完全不同。

1.2.1 去噪

噪声是随机的、高频的、小幅度的波动。比如振动信号里的白噪声,温度信号里的随机波动。去噪的方法,我推荐这几种:

  • 移动平均滤波:简单粗暴,适合慢变信号。窗口大小选3-5个点,效果就不错。
  • 中值滤波:对脉冲噪声特别有效。我在处理压力信号时常用,能去掉那些突然的尖峰。
  • 低通滤波:用数字滤波器(比如巴特沃斯、切比雪夫)把高频成分滤掉。适合有明确频率特征的信号。
// 移动平均滤波示例(C语言风格伪代码)
#define WINDOW_SIZE 5
float buffer[WINDOW_SIZE];
int index = 0;

float moving_average(float new_sample) {
    buffer[index] = new_sample;
    index = (index + 1) % WINDOW_SIZE;
    
    float sum = 0;
    for (int i = 0; i < WINDOW_SIZE; i++) {
        sum += buffer[i];
    }
    return sum / WINDOW_SIZE;
}

个人经验:我建议先做去噪,再做去野点。因为噪声可能会掩盖野点,先平滑一下,野点会更明显。

1.2.2 去野点

野点,就是那些明显偏离正常范围的数据点。可能是传感器瞬间故障、通信丢包、或者物理冲击造成的。去野点的方法:

  • 3σ原则:假设数据服从正态分布,超过均值±3倍标准差的数据视为野点。适合平稳工况。
  • 箱线图法:用四分位数间距(IQR)来判定。超过Q1-1.5*IQR或Q3+1.5*IQR的点就是野点。这个方法对非正态分布数据更鲁棒。
  • 局部异常因子(LOF):基于密度的异常检测。适合数据分布不均匀的场景。

避坑指南:我曾经在化工厂做过一个项目,现场压力数据经常出现-9999这样的值。一开始以为是野点,后来发现是通信协议里定义的“无效数据”。所以,去野点之前,一定要先搞清楚数据里的“特殊标记”。

1.3 数据归一化与标准化

归一化和标准化,这两个概念经常被混用。我简单说清楚:

  • 归一化:把数据映射到[0,1]或[-1,1]区间。公式是 (x - min) / (max - min)。适合数据有明确上下界的场景。
  • 标准化:把数据转换成均值为0、标准差为1的分布。公式是 (x - mean) / std。适合数据分布未知、或者需要消除量纲影响的场景。

为什么要做这一步?因为不同传感器的量纲不一样。比如温度是0-100℃,压力是0-10MPa,振动加速度是0-50m/s²。如果不做归一化,阈值设定时大数值的传感器就会主导结果。你想想看,这合理吗?

# Python示例:归一化与标准化
import numpy as np

def normalize(data):
    min_val = np.min(data)
    max_val = np.max(data)
    return (data - min_val) / (max_val - min_val)

def standardize(data):
    mean_val = np.mean(data)
    std_val = np.std(data)
    return (data - mean_val) / std_val

我的建议:如果后续要用机器学习模型(比如聚类、分类),标准化通常效果更好。如果只是简单的阈值比较,归一化就够了。

知识体系总览

下面这张图,是我自己画的数据预处理流程。你可以把它当作本章的思维导图:

数据采集与预处理知识体系 原始传感器数据 传感器数据特性 数据清洗 归一化与标准化 传感器数据特性 • 噪声特性(热噪声、量化噪声) • 漂移特性(零点漂移、温漂) • 非线性与响应延迟 数据清洗 • 去噪:移动平均、中值滤波 • 去野点:3σ、箱线图、LOF • 注意特殊标记值 归一化与标准化 • 归一化:[0,1]区间映射 • 标准化:均值为0,标准差1 • 消除量纲影响 预处理后的干净数据

嗯,这张图把本章的核心逻辑串起来了。从原始数据出发,经过特性分析、清洗、归一化/标准化,最终得到干净可用的数据。每一步都有它的意义,缺一不可。

最后说一句:数据预处理没有银弹。不同的传感器、不同的工况,处理策略都不一样。我的习惯是:先做一轮快速清洗,看看数据长什么样,再针对性地调整参数。别一上来就套模板,那会出问题的。


专注资料整理