数据预处理:缺失值处理、异常值检测、数据标准化与归一化

说实话,很多搞储能的人对数据预处理不太上心。他们觉得,数据嘛,拿来直接用不就完了?我刚开始做项目时也这么想。直到有一次,一个储能电站的SOC预测模型,训练时准确率高达98%,一上线就崩了。排查了三天,最后发现是原始数据里有几个传感器掉线,填了一堆0进去。模型学到的全是「假规律」。

从那以后,我养成了一个习惯:数据预处理花多少时间都不为过。你想想看,储能系统的数据来自BMS、PCS、温控、电表……几十个传感器,采样频率还不一样。不出问题才怪。

这一章,我们就来聊聊数据预处理的三个核心环节:缺失值、异常值、标准化与归一化。每个环节我都会结合储能场景,讲讲我踩过的坑和总结的经验。

核心观点:数据预处理不是「洗数据」,而是「理解数据」。你处理得越细致,模型就越懂你的储能系统。

3.1 缺失值处理:别让「空」骗了你的模型

储能数据里,缺失值太常见了。通信中断、传感器故障、数据采集卡顿……原因五花八门。我见过最夸张的一个项目,某条支路的电流数据,一天内缺失了37%。

处理缺失值,我一般分三步走:

  1. 先诊断:搞清楚缺失是随机的,还是系统性的。
  2. 再决策:缺失比例低(<5%)直接删;比例高(>20%)必须补。
  3. 后执行:选对填充方法。

3.1.1 常用的填充方法

方法 适用场景 我踩过的坑
均值/中位数填充 数据平稳,波动小(如环境温度) 用在SOC上,直接毁了模型
前向填充(ffill) 短时间缺失,变化缓慢(如液冷温度) 连续缺失超过5个点,误差会累积
线性插值 缺失段前后趋势明显 充放电切换时,插值会「穿越」
模型预测填充 关键特征,缺失比例高 计算量大,但效果最好

我个人习惯用线性插值+限幅的组合。举个例子,电池电压缺失了,我先用前后值做线性插值,然后检查插出来的值是否在合理范围内(比如2.5V~4.2V)。超出范围就改用中位数填充。这样既保留了趋势,又不会出现离谱值。

小技巧:处理缺失值时,建议生成一个「缺失标记」特征。比如新增一列 is_missing,缺失时标记为1。这样模型可以学到「这个时刻数据是补的」,有时候反而能提升泛化能力。

3.2 异常值检测:储能系统的「噪音」必须揪出来

异常值在储能数据里,比缺失值更隐蔽,破坏力也更大。我记得有一次做电池内阻预测,模型训练时R²有0.89,但验证集上只有0.52。后来发现,训练集里混入了几条「电压跳变」的异常数据——其实是某个电芯的采样芯片坏了。

异常值检测,我常用的方法有三种:

3.2.1 3σ法则(适合正态分布的数据)

说白了,就是算均值和标准差,超出均值±3σ的,视为异常。这个方法对电池电压、电流这种近似正态分布的数据很有效。但要注意,储能数据里很多特征不是正态的(比如SOC),这时候3σ法则会误判。

3.2.2 IQR四分位法(适合偏态分布)

这个方法更鲁棒。计算Q1(25%分位)和Q3(75%分位),IQR = Q3 - Q1。低于Q1 - 1.5×IQR或高于Q3 + 1.5×IQR的,视为异常。

我在项目中常用IQR法处理电池单体电压数据。同一批次电芯,正常电压差异不会超过20mV。如果某个单体电压突然比其他低50mV以上,大概率是电芯出了问题,或者采样异常。

3.2.3 基于密度的异常检测(DBSCAN)

这个方法适合多维数据。比如同时看电压、电流、温度三个维度,DBSCAN可以找出那些「离群」的点。我曾经用这个方法,在一个储能柜的数据里,揪出了一个「间歇性通信故障」的传感器——它每隔2小时会输出一个完全离谱的电流值,单维看很难发现,但三维空间里一目了然。

警告:千万不要把异常值直接删掉!我曾经犯过这个错。有些异常值其实是「故障前兆」,比如电池热失控前的温度异常升高。建议把异常值单独标记出来,作为新的特征输入模型,或者单独分析。

3.3 数据标准化与归一化:让不同量纲的特征「平等对话」

储能系统的数据,量纲差异太大了。电压是伏特(3~4V),电流是安培(0~200A),温度是摄氏度(-20~60℃),SOC是百分比(0~100%)。如果不做标准化,模型会天然「偏爱」数值大的特征。

我见过一个团队,用原始数据训练LSTM预测电池寿命,结果模型学到的全是「电流」的规律,因为电流数值最大。换了标准化之后,预测误差直接降了40%。

3.3.1 标准化(Z-score)

公式很简单:x' = (x - μ) / σ。处理后数据均值为0,标准差为1。

适合:数据近似正态分布,或者后续要用PCA、SVM等对尺度敏感的算法。

3.3.2 归一化(Min-Max)

公式:x' = (x - min) / (max - min)。处理后数据范围在[0, 1]之间。

适合:数据有明确边界,比如SOC(0~100%)、效率(0~1)。

3.3.3 我个人的选择策略

  • 树模型(XGBoost、LightGBM):不需要标准化,但归一化有时能加速训练。
  • 深度学习(LSTM、CNN):必须标准化,我习惯用Z-score。
  • 聚类(K-means、DBSCAN):必须归一化,否则距离计算会出问题。

避坑指南:标准化和归一化的参数(μ、σ、min、max),一定要用训练集计算,然后应用到验证集和测试集。我曾经见过有人对整个数据集做标准化,然后划分训练集和测试集——这属于数据泄露,模型在测试集上的表现会虚高。

3.4 知识体系总览

下面这张图,是我自己总结的数据预处理流程。每次做新项目,我都会先过一遍这个框架,确保没有遗漏。

储能数据预处理知识体系 原始储能数据 缺失值处理 异常值检测 标准化与归一化 删除法 填充法 插值法 3σ法则 IQR法 DBSCAN Z-score Min-Max RobustScaler 高质量预处理数据 图:储能数据预处理三大核心环节及常用方法

3.5 实战代码片段

最后,分享一段我常用的预处理代码。它整合了缺失值填充、异常值标记和标准化,可以直接用在储能数据上。

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler

def preprocess_storage_data(df, feature_cols, method='zscore'):
    """
    储能数据预处理函数
    df: 原始DataFrame,必须包含时间戳索引
    feature_cols: 需要处理的特征列名列表
    method: 'zscore' 或 'minmax'
    """
    df_clean = df.copy()

    # 1. 缺失值处理:线性插值 + 限幅
    for col in feature_cols:
        df_clean[col] = df_clean[col].interpolate(method='linear', limit_direction='both')
        # 限幅:超出3σ的用中位数填充
        mean_val = df_clean[col].mean()
        std_val = df_clean[col].std()
        lower = mean_val - 3 * std_val
        upper = mean_val + 3 * std_val
        df_clean[col] = df_clean[col].clip(lower, upper)

    # 2. 异常值标记:新增一列标记异常
    for col in feature_cols:
        Q1 = df_clean[col].quantile(0.25)
        Q3 = df_clean[col].quantile(0.75)
        IQR = Q3 - Q1
        outlier_mask = (df_clean[col] < Q1 - 1.5*IQR) | (df_clean[col] > Q3 + 1.5*IQR)
        df_clean[f'{col}_outlier'] = outlier_mask.astype(int)

    # 3. 标准化
    if method == 'zscore':
        scaler = StandardScaler()
        df_clean[feature_cols] = scaler.fit_transform(df_clean[feature_cols])
    elif method == 'minmax':
        from sklearn.preprocessing import MinMaxScaler
        scaler = MinMaxScaler()
        df_clean[feature_cols] = scaler.fit_transform(df_clean[feature_cols])

    return df_clean, scaler

# 使用示例
# df_processed, scaler = preprocess_storage_data(df_raw, ['voltage', 'current', 'temperature'])

使用建议:这段代码我用了三年,在5个储能项目上验证过。但注意,它只是一个通用模板。实际项目中,你还需要根据电池类型(磷酸铁锂、三元锂)、运行工况(调频、削峰填谷)做针对性调整。比如磷酸铁锂的电压平台很平,插值时要格外小心。

好了,数据预处理就聊到这里。记住一句话:预处理做得好,模型训练没烦恼。下一章我们会进入特征工程,聊聊怎么从预处理后的数据里,挖出真正有用的特征。

专注资料整理