上一篇AI锂电·寿命预测01:迟到的作业,带你硬核跑通全流程
今天第一个课题就是找一个开源数据库。一个好的数据集就等于成功了一半。我还算有点经验,知道一般ML相关的数据库在kaggle、Github上面比较多。我想起来自己有个注册好几年的kaggle账号,于是我去上面搜了一下。
我的目标就是,数据要全,大小不能太大,我不想浪费时间进行数据清洗。想偷个懒,但后来发现坑还挺多的。
第一个数据集(失败)
官方说明:夏威夷自然能源研究所对14节标称容量为2.8安时的NMC-LCO 18650电池进行了测试。这些电池在25℃下以C/2的恒流-恒压充电速率和1.5C的放电速率循环充放电超过1000次。
https://www.kaggle.com/datasets/ignaciovinuales/battery-remaining-useful-life-rul

才1.14MB,很好,csv格式的,很好。结果下下来一看,不行。

这张表里的列名(比如Decrement 3.6-3.4V,即电压从3.6降到3.4的时间),其实是别人已经替你提取好的特征。他们认为“电压下降时间”可能跟寿命有关,所以只保留了这个数字,把原始的电压曲线扔掉了。
但我其实不信任这种简单的特征。我要的是最原始的物理特征,比如dQ/dV。所以这个数据集虽然小,但是并不满足我的要求。
第二个数据集(失败)
官方说明:以NASA预测中心的锂离子电池退化数据集为原型。模拟了锂离子电池在多个循环中的充放电行为及老化过程,捕捉了电池健康状况随时间推移的真实变化趋势。该数据集包含三个虚拟电池单体:B0005(B5)、B0006(B6)和B0007(B7),并提供了各关键参数的每循环平均值。

犯了和之前同样的毛病,只给了一圈的平均值。
第三个数据集(失败)
看来那种带全量特征的数据集,小不了。于是我找了一个200MB的数据集,但格式是mat的,不是csv的。
https://www.kaggle.com/code/patrickfleith/nasa-battery-life-prediction-dataset-cleaning/input
没办法,我只好用python把mat格式转成csv了。(代码见星球“读取mat文件”)
我以为这回稳了,结果稍微用Excel看一下,这没有明显跳水点啊。

虽然前100cyc和200cyc~300cyc其实斜率是不一样的,但是总体趋势差不多是一条直线,对于这种电芯,只要有前300的数据,用Excel都能预测个八九不离十,上AI简直是杀鸡用牛刀。当然NASA数据集如果想要在100cyc内进行预测600cyc还是有难度的,但这不是我想要的。
另外我发现,这个数据集有很严重的“容量再生”效应:电池静置后,内部的极化效应消除,离子扩散恢复,容量会短暂地“跳”回去一点,但马上又会掉下来。虽然这是ORT最常见的特征,但这种容量再生的现象对数据清洗非常不利。
到这里,我承认我轻敌了。
我想到肯定有人会说,随便上GitHub找一个成熟案例不行嘛?非要自己找数据集?
其实经常上Github的人知道,上面很容易搜出一堆“本科生期末作业”。
- 名字叫 Battery-RUL-Prediction,点进去只有一个 .ipynb 文件
- 代码里全是硬编码的路径 C:/Users/Wang/Desktop/Data…
- 说明文档只有一句话:“This is code for my paper”
- 大部分只用了 NASA 数据集,而且跑出来的图弯弯曲曲很难看
GitHub 上的科研代码 90% 都是这种“一次性代码”。我们想找点能落地的东西。
当然,Github上面也有写得很好的。比如,谭瑞锋的项目,基本上所有数据集的预测方法都写了一遍。
https://github.com/Ruifeng-Tan/BatteryLife/tree/main?tab=readme-ov-file

问题是,他也没有告诉我,哪个数据集才是我最想要的。
好在,项目下面给了所有数据集的下载地址:


经过研究,我发现,寿命预测最经典的三大数据集分别来自:NASA、CALCE、MIT&Stanford。(并称为“御三家”)

NASA 这个主要是钴酸锂(LCO)体系,特性就是线性衰减。而我要找的是磷酸铁锂(LFP),因为 LFP 才有那种‘平时不动声色,突然猝死’的特性,这才是 AI 预测的难点和价值所在。CALCE和MIT看起来更合适。
第四个数据集(失败)
我跑去CALCE的官方数据集看了一圈(18650,方形,软包)都没发现跳水跳的厉害的,我推测原因可能在于数据只跑了800cyc,没有真正跑到跳水点就结束了。(其实我后来才知道,当时我只看示意图,其实CS-2的跳水还是挺厉害的)
https://calce.umd.edu/battery-data

我想的是MIT的数据可是跑了2000cyc,不跳水是不可能的。而且用的电芯是2019年生产的具有“快充能力”的LFP电芯,而CALCE的2011年电芯平台已经过时了。LFP本身就是适合做长寿命的储能电芯,还是未来电动汽车的主要平台。124个电芯,做深度学习都够了。
最重要的一点:LFP 的电压曲线非常平坦,中间段电压几乎不变,这使得提取特征特别难(相比于三元锂电池)。我选择这个数据集,就是要挑战高难度。
第五个数据集(成功)
我找到MIT、斯坦福大学和丰田研究院 (TRI) 合作的那篇发表在 《Nature Energy》 上的神级论文的官方代码库。
作者是Richard D. Braatz 教授。他是 MIT 化学工程系的泰斗级人物,也是这篇论文的通讯作者之一。
绕了一大圈,这回妥了吧?
我吃了那么多次亏,这回我得耐着心子看看注释了:


还好看了注释:作者自爆了!原始 CSV 文件里有 Bug(时间会重置归零),叫我别去下csv,而他们发布的这个 Struct 文件是经过修复的、干净的版本。这个文件是整理好的“容器”,查每一圈的数据非常方便。相比之下,CSV 是散乱的原始文件。
真贴心啊!
下面3个文件,加起来8Gb,全下太慢了,现在起步阶段我先拿第一个试试吧。2.8Gb,数据集源文件已上传星球。

大家家里网速快的可以自己去源地址下载:
https://data.matr.io/1/projects/5c48dd2bc625d700019f3204/batches/5c86c0b5fa2ede00015ddf67

下载好以后,是一个mat文件。

如何来看这个文件呢?我们根据作者的提示:通过 h5py 读取

核心代码(整体代码已上传星球“读取2.8G的代码”):
with h5py.File(file_path, ‘r’) as f
最后提取出了一张总表和一张细节表。

总表包括了:b1c0这个电池,1189次循环的放电容量/充电容量…


细节表包括了:b1c0这个电池,在第100cyc这个时间段,测试机每隔几秒钟采样一次的原始数据。


我只能提取部分数据,如果全提取会很大,也没有必要。
很多人对mat格式不太了解(包括我自己)。这边进行一个说明:
mat是matlab的文件。它是基于 MATLAB v7.3 格式存储的复杂结构体(Struct)。如果把它比作一个巨大的数字仓库,它的存储逻辑是这样的:
不是“平铺”,而是“引用”: 在这个仓库里,并没有直接把所有数据堆在门口。主索引(Batch)里存放的其实是一张张“提货单”(Object References)。 比如,当你读取“循环寿命(cycle_life)”这一列时,你拿到的不是数字 1190,而是一个内存地址指针。你必须拿着这个指针,去仓库深处的某个货架上,才能找到真正的数值。所以假如你用pandas读取会报错。
“抽屉式”分类: 每个电池的数据被分门别类地装进了不同的“抽屉”(HDF5 Groups)。
Summary 抽屉:存放每次循环结束后的统计值(容量、内阻等)。
Cycles 抽屉:存放每一秒的电压、电流原始数据。
看了一下电流电压等数据,都很干净,这下可以放心了。

至此,我们的数据集算是准备好了。总共花了我半天时间,但是情节都够我写一个短篇小说了。
【写在最后】
也就是找个数据而已,为什么我要花这么大篇幅,甚至不惜把前面 4 次“失败”的弯路全部摊开来讲?像别人一样直接给一个下载链接,不省事嘛?
因为在AI工程中,数据比算法更重要。
如果不懂LFP物理特性,你可能会选错 LCO 的线性数据;
如果贪图方便用了 Kaggle 上被“阉割”过的特征数据,就失去了研究深层物理规律的机会。
失败的路我帮你们走了,希望大家都能从我的“失败”中吸取教训。下一篇,我们把这些数据丢进 Python/JMP 里,看看能不能画出‘寿命预测曲线’。

彩蛋
其实国内的阿里云也有托管的数据集,比如CALCE的是CSV的:
https://tianchi.aliyun.com/dataset/150822

但我看评论只有1条,还是有问题的,就不去试了。并且没找到MIT版本。
