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% |
| R² | 决定系数,模型解释了多少方差 | >0.85 |
| Max Error | 最大误差,看最差情况 | <5% |
嗯,这里要注意:Max Error这个指标很容易被忽略。但实际BMS里,最怕的就是某个点突然偏差很大。我见过一个案例,模型平均误差1.5%,但有个别点误差到了8%,结果导致电池过放保护误触发。
4.5 小结
这一讲我们聊了两个经典模型:
- 线性回归:简单、快速、可解释。适合线性关系或快速验证。
- SVR:能处理非线性,精度更高。但训练慢,参数调优需要耐心。
我个人习惯是:先用线性回归快速跑一遍,看看数据质量。如果效果不好,再上SVR。别一上来就搞复杂模型,很多时候简单模型已经够用了。
下一讲,我们会进入集成学习——随机森林和XGBoost。这些模型在SOH估计里表现更稳定,也是目前工业界的主流方案。到时候咱们再细聊。
课后小作业:找一份公开的电池老化数据集(比如NASA或CALCE的),分别用线性回归和SVR做SOH估计,对比一下MAE和训练时间。你会发现,数据量不同,结论可能完全不同。
公众号:蓝海资料掘金营,微信deep3321