← All posts

September 20, 2026

My First Battery-Life Model Failed to Beat a Coin Flip. Here's Why That Was the Right Result

Machine LearningBatteriesData Science

Lithium-ion battery manufacturers have a slow, expensive problem: the only fully reliable way to know how many charge cycles a cell will survive is to cycle it until it actually fails. For a fast-charging cell, that can take months. Every one of those months is a month of delayed product iteration and higher R&D cost.

The question behind this project was simple to state and hard to answer: can you predict a cell’s total cycle life using only its first ~100 cycles — a week or two of testing instead of months — well enough to act as a QA screening tool?

I used the MIT/Stanford battery degradation dataset (Severson et al., Nature Energy, 2019): 124 commercial LFP/graphite cells, cycled to failure under a range of fast-charging protocols. For this first pass I worked with Batch 1 — 46 cells, 44 after dropping two that hadn’t reached failure by the time data collection ended.

Starting with the obvious features

Before touching a model, I wrote a data card documenting what I was working with and where it could bite me: single chemistry (results might not generalize to NMC cells, which dominate EVs), three collection batches with known statistically different properties, a small sample, and those two censored cells I chose to drop rather than guess a value for.

That last point mattered, because published analysis on this exact dataset had already found something uncomfortable: a simple linear regression on a handful of hand-picked features can outperform more complex approaches, largely because of the batch effects. That’s a warning that your own baseline matters more than usual here — if a fancier model can’t beat something simple, that’s a real finding, not a failure of effort.

So I started simple. Four features, all things you’d reach for first if you were thinking about battery aging from first principles:

I tested linear regression and Ridge regression against each, with 5-fold cross-validation, benchmarked against the dumbest possible baseline: always predict the mean cycle life.

The results

Model Average MAE (cycles)
Dummy baseline (always predict the mean) 233.5
Linear Regression (all 4 features) 267.1
Ridge Regression (all 4 features) 233.6
Linear Regression (reduced, 3 features) 263.9

None of it worked. Ridge tied the dummy baseline almost exactly. Both linear regression variants did worse than just guessing the mean every time.

The part that actually surprised me

Digging into why, capacity fade between cycles 10 and 100 turned out to be weakly and inconsistently correlated with cycle life — its correlation dropped from -0.33 to 0.08 once I removed two extreme cells, meaning the “signal” was really just two outliers doing all the work.

But internal resistance is what stuck with me. Physically, rising internal resistance is a textbook sign of an aging cell — it impedes current flow, causes voltage drop under load, converts stored energy into heat, and should point toward shorter remaining life. I expected a negative correlation with cycle life. The data showed a weak positive one instead.

My first instinct was that I’d made an extraction error — reversed a sign somewhere, pulled the wrong column. I went back and checked. The extraction was correct. The sample was just small enough, and the signal weak enough, that a wrong-direction correlation was well within the range of plausible noise. Sitting with “the physics says one thing and this small sample says another,” and reporting that honestly instead of quietly correcting it in a chart, was the most useful habit this project taught me.

Why this isn’t a failed project

It’s tempting to treat “none of my models beat a coin-flip baseline” as something to bury. I don’t think that’s right here. This is a legitimate negative result: it demonstrates, with cross-validation and a documented baseline, that simple point-in-time features aren’t sufficient for this problem — a finding consistent with what the original dataset authors reported. Knowing what doesn’t carry signal is part of knowing what does, and it’s what justified the next move: stop tuning models on features already shown to be weak, and go build a better one grounded in the actual electrochemistry.

That’s where the curve-shape feature came in, and where the model finally started to work. More on that in the next post.


Full writeups, code, and the deployed model: battery-life-prediction on GitHub · Try the live model