4. 机器学习基础回顾:监督学习与无监督学习、回归问题与分类问题、过拟合与欠拟合、训练集/验证集/测试集划分、交叉验证
各位同学,欢迎来到第四讲。在正式进入SOC估算的机器学习模型之前,我觉得有必要先停下来,把机器学习的一些核心概念捋一遍。你可能会说:“这些我都知道啊。” 嗯,我知道你知道,但咱们做BMS的,最怕的就是基础不牢。我见过太多人,模型跑得飞起,结果连过拟合都没处理好,最后SOC估算值飘得跟风筝似的。
所以,这一章咱们不急着写代码,先把地基打牢。我会结合我在电池数据上踩过的坑,把这些概念讲透。
4.1 监督学习 vs 无监督学习:你的数据有“答案”吗?
这是机器学习世界里最根本的一个分类。说白了,就是看你的训练数据有没有“标签”。
- 监督学习:数据既有特征(比如电压、电流、温度),又有标签(比如真实的SOC值)。模型的任务就是学习从特征到标签的映射关系。我们做SOC估算,绝大多数情况用的都是监督学习。因为你有标定的SOC真值嘛。
- 无监督学习:数据只有特征,没有标签。模型自己去找数据里的结构,比如聚类、降维。我在项目中用过无监督学习来做电池异常检测,把那些“行为怪异”的电芯自动挑出来,效果还不错。
我的经验: 别一上来就想着用无监督学习做SOC估算。没有真值,你拿什么去验证精度?老老实实用监督学习,把标签数据准备好,这才是正道。
4.2 回归问题 vs 分类问题:SOC是连续值还是离散值?
这个问题其实很简单。你想想看,SOC是一个连续变化的数值,从0%到100%,中间有无数个可能的值。所以,SOC估算本质上是一个回归问题。
- 回归问题:预测连续值。比如预测明天的气温、股票价格、电池的SOC。输出是一个实数。
- 分类问题:预测离散类别。比如判断一张图片是猫还是狗,或者判断电池是“健康”、“老化”还是“故障”。输出是一个类别标签。
当然,也有一种做法是把SOC离散化成几个区间,比如0-20%,20-40%...然后当成分类问题来做。但我个人不太推荐这种做法。为什么?因为你会丢失掉SOC的连续变化信息,精度上不去。我试过一次,效果远不如直接做回归。
小提示: 如果你非要用分类做SOC,记得把区间分得细一点,比如每1%一个类。但这样类别太多,模型训练难度会急剧上升。所以,还是老老实实回归吧。
4.3 过拟合与欠拟合:模型的两个极端
这两个概念,我估计你耳朵都听出茧子了。但我在BMS项目里,还是经常看到有人在这上面翻车。
- 欠拟合:模型太简单,连训练数据都没学好。表现在训练集和测试集上的误差都很大。说白了,就是模型“没学到东西”。
- 过拟合:模型太复杂,把训练数据里的噪声和异常点都记住了。表现在训练集上误差很小,但一到测试集上误差就爆炸。说白了,就是模型“学得太死”,没有泛化能力。
我曾经接手过一个项目,同事用了一个很深的神经网络来估算SOC。训练的时候,误差曲线漂亮得不得了,几乎贴着0。我当时就觉得不对劲。结果一上实车数据,SOC估算值直接跳变,完全没法用。这就是典型的过拟合——他把实验室里那些完美的充放电曲线背下来了,但一遇到真实世界的噪声,就彻底懵了。
避坑指南: 做SOC估算时,千万别只看训练集上的精度。一定要在验证集上反复验证。如果发现训练集误差远小于验证集误差,那基本就是过拟合了。赶紧加正则化、减少模型复杂度,或者增加数据量。
4.4 训练集 / 验证集 / 测试集划分:别让你的模型“作弊”
数据划分,是机器学习里最基础也最容易出错的一环。很多新手会把所有数据混在一起,然后随机划分。这在SOC估算里,可能会出大问题。
为什么?因为电池数据是时间序列。如果你随机划分,很可能训练集里包含了未来时间点的数据,而验证集里包含了过去时间点的数据。这相当于让模型“偷看”了未来的答案,评估出来的精度会虚高。
我个人的习惯是:按时间顺序划分。比如,用前70%的时间段数据做训练,中间15%做验证,最后15%做测试。这样能最大程度模拟模型在实际应用中的表现。
| 数据集 | 用途 | 划分比例(按时间) |
|---|---|---|
| 训练集 | 训练模型参数 | 70% |
| 验证集 | 调参、选择模型 | 15% |
| 测试集 | 最终评估模型性能 | 15% |
注意: 测试集只能使用一次!在你最终确定模型之前,绝对不要碰测试集。否则,你就是在“作弊”,评估出来的结果没有意义。
4.5 交叉验证:让模型评估更靠谱
交叉验证,说白了就是“多次划分,多次验证”。它能有效避免因为某一次数据划分的偶然性,导致对模型性能的误判。
最常用的是K折交叉验证。把数据分成K份,每次用其中K-1份做训练,剩下1份做验证。重复K次,最后取K次验证结果的平均值。
我在做SOC估算模型选型时,经常用5折交叉验证。比如,我在比较随机森林和XGBoost时,不会只看一次划分的结果,而是跑5折交叉验证,看哪个模型的平均误差更小、更稳定。这样选出来的模型,心里更有底。
小技巧: 对于时间序列数据,做交叉验证时要注意不能打乱时间顺序。可以使用“时间序列交叉验证”,每次用过去的数据训练,未来的数据验证。这样更符合实际应用场景。
好了,这一章的内容就到这里。这些概念虽然基础,但每一个都是你后续构建SOC估算模型的基石。下一章,我们就要开始动手,用Python搭建第一个简单的SOC估算模型了。到时候,你会发现,今天讲的这些概念,每一个都会用到。