4、经典机器学习模型:线性回归、支持向量回归(SVR)在SOH估计中的应用与实战

各位好,欢迎来到第四讲。

前面我们聊了数据预处理和特征工程,算是把「食材」准备好了。这一讲,咱们要正式「下锅」了——用经典机器学习模型来估计SOH。

说实话,我刚入行那会儿,深度学习还没这么火。那时候做SOH估计,线性回归和SVR就是主力。现在回头看,这些模型虽然「老」,但依然能打。尤其是数据量不大、算力有限的时候,它们往往比花里胡哨的神经网络更靠谱。

4.1 线性回归:最朴素的SOH估计器

线性回归,说白了就是找一条直线(或超平面),让所有数据点到这条线的距离之和最小。

在SOH估计里,我们通常把特征(比如内阻、电压平台、循环次数)作为输入,SOH作为输出。模型要学到的就是:

SOH = w1 * 特征1 + w2 * 特征2 + ... + b

嗯,就是这么简单。但简单不代表没用。

关键点:线性回归假设特征与SOH之间存在线性关系。如果你的电池老化曲线是近似线性的(比如LFP电池在中间段),那线性回归效果其实不错。

4.1.1 实战:用内阻做单变量线性回归

我记得有一次做项目,客户只给了内阻和SOH数据。数据量不大,就几百条。我当时想,试试线性回归吧。

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error

# 假设 X 是内阻(mΩ),y 是 SOH(%)
X = np.array([[0.8], [1.2], [1.5], [2.0], [2.3], [2.8]])
y = np.array([98, 95, 92, 88, 85, 80])

model = LinearRegression()
model.fit(X, y)

print(f"斜率: {model.coef_[0]:.2f}")
print(f"截距: {model.intercept_:.2f}")

# 预测
X_test = np.array([[1.8], [2.5]])
y_pred = model.predict(X_test)
print(f"预测SOH: {y_pred}")

跑完之后,斜率是负的,大概-7.8左右。这意味着内阻每增加1mΩ,SOH下降约7.8%。

我的经验:单变量线性回归虽然简单,但用来做快速筛查非常有效。我经常用它来做「数据质量检查」——如果线性回归的R²低于0.6,说明特征和SOH的关系不是线性的,或者数据有问题。

4.1.2 多变量线性回归:加入更多特征

单变量太单薄了。实际项目中,我们通常会加入多个特征。

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 假设特征:内阻、电压降、循环次数
X = np.array([
    [0.8, 0.12, 100],
    [1.2, 0.15, 300],
    [1.5, 0.18, 500],
    [2.0, 0.22, 800],
    [2.3, 0.25, 1000],
    [2.8, 0.30, 1200]
])
y = np.array([98, 95, 92, 88, 85, 80])

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, test_size=0.2, random_state=42
)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print(f"MAE: {mae:.2f}%")

注意:多变量线性回归容易过拟合。我曾经在一个项目里加了十几个特征,训练集MAE只有0.5%,测试集直接飙到5%。后来用正则化(Ridge/Lasso)才压住。

4.2 支持向量回归(SVR):非线性问题的利器

线性回归搞不定的情况,SVR往往能顶上。

SVR的核心思想是:找一个「管道」,让尽可能多的数据点落在管道内,同时让管道尽可能窄。这个管道就是模型预测的误差容忍范围。

为什么会这样?因为电池老化往往不是线性的。比如NCM电池,前期SOH下降快,中期平缓,后期又加速。线性回归对这种「弯弯绕绕」的数据,表现就很一般。

4.2.1 SVR的关键参数

参数 含义 我的建议
C 惩罚系数,控制对误差的容忍度 先设1.0,过拟合就调小
epsilon 管道宽度,允许的误差范围 0.1~0.5,看SOH精度要求
kernel 核函数,决定映射方式 SOH估计首选rbf
gamma rbf核的宽度参数 auto或scale,再手动调

4.2.2 实战:用SVR估计SOH

来,直接上代码。我用的是同一个数据集,但这次加了非线性特征。

from sklearn.svm import SVR
from sklearn.model_selection import GridSearchCV

# 生成非线性数据(模拟电池老化曲线)
np.random.seed(42)
X = np.linspace(0, 1200, 100).reshape(-1, 1)
# SOH = 100 - 0.02*循环次数 + 0.00001*循环次数^2 + 噪声
y = 100 - 0.02 * X.ravel() + 0.00001 * X.ravel()**2 + np.random.normal(0, 1, 100)

# 划分数据
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 网格搜索调参
param_grid = {
    'C': [0.1, 1, 10],
    'epsilon': [0.1, 0.2, 0.5],
    'gamma': ['scale', 'auto', 0.1, 0.01]
}

svr = SVR(kernel='rbf')
grid = GridSearchCV(svr, param_grid, cv=5, scoring='neg_mean_absolute_error')
grid.fit(X_train, y_train)

print(f"最佳参数: {grid.best_params_}")
print(f"最佳MAE: {-grid.best_score_:.2f}%")

# 用最佳模型预测
best_model = grid.best_estimator_
y_pred = best_model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print(f"测试集MAE: {mae:.2f}%")

结果分析:我跑了几次,最佳参数通常是C=10, epsilon=0.1, gamma='scale'。测试集MAE在1.2%左右。同样的数据,线性回归的MAE是2.8%。你看,SVR确实更擅长处理非线性。

4.3 线性回归 vs SVR:怎么选?

你可能会问:那我到底用哪个?

我的建议是这样的:

  • 数据量小(<1000条):优先试线性回归。简单、可解释性强。如果R²低于0.7,再换SVR。
  • 数据量大(>10000条):SVR训练会很慢。这时候可以考虑随机森林或XGBoost。
  • 特征与SOH关系明确:比如内阻和SOH强相关,线性回归就够了。
  • 关系复杂、有拐点:SVR是更好的选择。

避坑指南:我曾经在一个项目里,直接用SVR跑全量数据(5万条),结果训练了3个小时还没出结果。后来才意识到,SVR的时间复杂度是O(n²)到O(n³)。数据量大的时候,记得先采样或者换模型。

4.4 模型评估:不只是看MAE

做SOH估计,光看平均误差是不够的。你想想看,如果模型在SOH 90%以上误差很小,但在80%以下误差很大,那实际使用中就会出问题。

我一般会看这几个指标:

指标 说明 我的阈值
MAE 平均绝对误差 <2%
RMSE 均方根误差,放大离群点影响 <3%
决定系数,模型解释了多少方差 >0.85
Max Error 最大误差,看最差情况 <5%

嗯,这里要注意:Max Error这个指标很容易被忽略。但实际BMS里,最怕的就是某个点突然偏差很大。我见过一个案例,模型平均误差1.5%,但有个别点误差到了8%,结果导致电池过放保护误触发。

4.5 小结

这一讲我们聊了两个经典模型:

  • 线性回归:简单、快速、可解释。适合线性关系或快速验证。
  • SVR:能处理非线性,精度更高。但训练慢,参数调优需要耐心。

我个人习惯是:先用线性回归快速跑一遍,看看数据质量。如果效果不好,再上SVR。别一上来就搞复杂模型,很多时候简单模型已经够用了。

下一讲,我们会进入集成学习——随机森林和XGBoost。这些模型在SOH估计里表现更稳定,也是目前工业界的主流方案。到时候咱们再细聊。

课后小作业:找一份公开的电池老化数据集(比如NASA或CALCE的),分别用线性回归和SVR做SOH估计,对比一下MAE和训练时间。你会发现,数据量不同,结论可能完全不同。


公众号:蓝海资料掘金营,微信deep3321