3. 数据采集与预处理:传感器选型、数据清洗、缺失值处理

各位工程师朋友,咱们接着聊。上一章我们把储能系统的故障模式梳理清楚了,也确定了要监控哪些关键参数。那下一步是什么?说白了,就是怎么把这些参数“抓”到手,并且让它们变成干净、可用的数据。

这一章,我重点讲三个环节:传感器选型数据清洗缺失值处理。这三个环节,任何一个出问题,后面的模型都是白搭。我见过太多项目,算法调得天花乱坠,结果一查,传感器数据本身就是错的。嗯,咱们得从源头把好关。

3.1 传感器选型:别让“眼睛”骗了你

传感器就是模型的“眼睛”。眼睛花了,模型再聪明也白搭。我个人习惯,选型时主要看三个维度:精度量程响应时间

举个例子,测电池表面温度。你想想看,热失控前那几分钟,温度上升速率非常快。如果你选了个响应时间5秒的传感器,等它反应过来,火都烧起来了。我建议,对于温度突变场景,响应时间最好控制在1秒以内。

核心原则: 传感器的精度等级,至少要高于故障预警阈值的1个数量级。比如,你设定的过温预警阈值是±2℃,那传感器精度至少得是±0.2℃。

下面这张表,是我在项目中常用的传感器选型参考,你可以直接拿来用:

监测参数 推荐传感器类型 精度要求 采样频率 避坑指南
单体电压 高精度ADC + 隔离运放 ±1mV ≥10Hz 注意共模电压干扰,我曾经遇到过因为地线没处理好,导致所有电压数据整体偏移了20mV
充放电电流 霍尔电流传感器 ±0.5% FS ≥100Hz 霍尔传感器有温漂,夏天和冬天数据差异很大,需要做温度补偿
表面温度 NTC热敏电阻 / PT100 ±0.1℃ ≥1Hz NTC是非线性的,必须查表或做多项式拟合,别直接用ADC读数
内阻 交流注入法 (EIS) ±1% 按需触发 在线测量干扰大,建议在静置状态下触发测量
我的小技巧: 选型时,别忘了留20%的余量。比如电池最高电压4.2V,那传感器量程最好选到5V以上。别问我为什么,这是用烧坏的传感器换来的经验。

3.2 数据清洗:把“垃圾”筛出去

数据采集上来,第一件事不是建模,而是清洗。为什么?因为工业现场太脏了。电磁干扰、通信丢包、传感器偶发故障,都会产生“脏数据”。

我一般把清洗分为三步:去重去噪去异常

3.2.1 去重

有时候通信协议设计不好,或者数据缓存机制有问题,会导致同一时间戳出现多条重复记录。这个简单,直接按时间戳去重,保留第一条或最后一条即可。

3.2.2 去噪

去噪我常用两种方法:滑动平均滤波中值滤波

  • 滑动平均滤波:适合去除高频噪声,比如电流采样上的毛刺。但缺点是会引入延迟,窗口越大延迟越大。
  • 中值滤波:对付“椒盐噪声”特别有效。比如电压数据突然跳变到0V然后又恢复,用中值滤波一滤就没了。

给你看段代码,这是我常用的滑动平均滤波实现:

def moving_average(data, window_size=5):
    """
    滑动平均滤波
    :param data: 原始数据列表
    :param window_size: 窗口大小,建议奇数
    :return: 滤波后的数据
    """
    filtered = []
    for i in range(len(data)):
        if i < window_size - 1:
            # 窗口未满时,取当前可用数据的均值
            filtered.append(sum(data[:i+1]) / (i+1))
        else:
            # 窗口满后,取窗口内数据的均值
            window = data[i - window_size + 1 : i + 1]
            filtered.append(sum(window) / window_size)
    return filtered

# 使用示例
raw_voltage = [3.51, 3.52, 3.50, 3.51, 3.53, 3.49, 3.52]
clean_voltage = moving_average(raw_voltage, window_size=3)
print(clean_voltage)
注意: 滤波窗口大小不是越大越好。窗口太大,会把真实的故障特征也给平滑掉。我一般从3开始试,逐步增大,直到噪声被抑制,同时故障特征依然明显为止。

3.2.3 去异常

去异常,就是剔除那些明显不符合物理规律的数据。比如,电压突然变成-5V,或者温度瞬间跳到200℃。这些数据,直接删掉就好,别犹豫。

我常用的方法是3σ原则箱线图法。对于正态分布的数据,3σ原则很好用。对于非正态分布,箱线图法更稳健。

3.3 缺失值处理:别让“空洞”毁了模型

数据清洗完了,你会发现有些时间戳上数据是空的。原因很多:传感器离线、通信中断、数据被当成异常删掉了。怎么办?填上。

但怎么填,有讲究。我总结了几种常见方法:

  • 前向填充:用上一个有效值填充。适合电压、温度这种变化缓慢的参数。简单,但会引入滞后。
  • 线性插值:用缺失值前后两个有效值,拉一条直线,取中间点。适合电流这种线性变化的参数。
  • 多项式插值:用多个点拟合一条曲线。适合SOC这种非线性变化的参数。但注意,过拟合风险高。
  • 模型预测填充:用其他相关参数(如电压、电流)来预测缺失的温度值。精度高,但计算量大。

我个人习惯,对于连续缺失不超过5个点的情况,用线性插值就够了。如果缺失超过10个点,我会直接丢弃这段数据,因为插值出来的数据可信度太低。

下面这张图,展示了整个数据采集与预处理的流程,你可以对照着看:

数据采集与预处理流程 1. 传感器选型 2. 数据采集 3. 数据清洗 选型要点 • 精度:高于阈值1个数量级 • 量程:留20%余量 • 响应时间:≤1秒(温度突变) • 注意温漂和共模干扰 清洗三步走 • 去重:按时间戳去重 • 去噪:滑动平均/中值滤波 • 去异常:3σ/箱线图法 • 窗口大小从3开始试 4. 缺失值处理 处理方法 • 前向填充(变化缓慢) • 线性插值(连续缺失≤5点) • 缺失>10点,直接丢弃 干净数据集
避坑指南: 我曾经接手过一个项目,前同事把所有缺失值都用0填充了。结果模型训练出来,预测结果一塌糊涂。为什么?因为0这个值在电池数据里是有物理意义的(比如电压为0表示断路),模型把“缺失”和“断路”混为一谈了。所以,千万别乱填0!

好了,数据采集和预处理就聊到这儿。记住一句话:垃圾进,垃圾出。数据质量不过关,后面所有工作都是白费。下一章,咱们聊聊特征工程,看看怎么从这些干净数据里,挖出真正能预测故障的“金矿”。


蓝海数据掘金营,专注资料整理