September 27, 2026
Finding the Signal: a 22-Cycle Improvement I'm Not Ready to Call Conclusive
In the previous post, four hand-picked features — capacity at cycle 10, capacity at cycle 100, capacity fade, internal resistance — failed to beat a dummy baseline for predicting lithium-ion cycle life from a cell’s first 100 cycles. That wasn’t a dead end, it was a signal to stop tuning models on weak inputs and go build a better feature.
What the failure pointed to
The original dataset authors (Severson et al., 2019) had already found that the strongest predictor wasn’t a point-in-time capacity or resistance value at all — it was the variance in discharge voltage curve shape between early and later cycles. That’s a more sophisticated feature than anything I’d tried in Phase 1: instead of asking “what is the capacity at cycle 100,” it asks “how much has the shape of the discharge curve changed between cycle 10 and cycle 100.”
Electrochemically, that shape change reflects things a single capacity number can’t capture — how degradation is distributing itself across the cell’s voltage range, not just how much total capacity has been lost.
Testing it
I engineered Qdlin_variance_10_100 — the variance in discharge capacity curve shape between cycles 10 and 100 — and checked its correlation with cycle life before building anything on top of it: -0.59 across all 44 cells, strengthening to -0.625 after removing the two most extreme cells.
That direction of movement matters. In Phase 1, removing outliers from the capacity-fade feature had collapsed its correlation (-0.33 down to 0.08) — a sign the “signal” was really just two points doing all the work. Here, removing the same kind of extreme cells made the correlation stronger. That’s the pattern you want: a relationship that holds across the normal range of the data, not one propped up by a couple of outliers.
The results
Using this single feature, 5-fold cross-validated:
- Model MAE: 211.3 cycles
- Baseline MAE: 233.5 cycles
- Improvement: ~22.2 cycles
For reference, I also tried combining this feature with the four weaker ones from Phase 1. That performed worse (233.6 MAE) — the weak features were actively degrading the model rather than sitting harmlessly alongside the good one. The single curve-shape feature, alone, was the best version.
Honest verdict: promising, not conclusive
I want to be direct about what this result does and doesn’t show. The 22-cycle improvement over baseline is real, but the fold-to-fold standard deviation was 58.4 cycles — more than double the improvement itself. That means the gain I measured could plausibly be due to which specific cells happened to land in which cross-validation fold, rather than a guaranteed effect I could reproduce on a fresh sample.
What gives me confidence there’s a genuine relationship here, rather than noise, is that the correlation is strong and it got stronger after removing outliers, rather than depending on them. But with only 44 cells, I don’t think it’s honest to call this settled. It needs more data — Batches 2 and 3 from the same dataset are the obvious next step — before I’d call it production-ready rather than “a promising early signal.”
What’s next
- Add Batches 2 and 3. More cells is the single highest-value next step — the current improvement is smaller than the fold-to-fold noise, and more data is the direct fix for that.
- Handle the censored cells properly. Two cells in Batch 1 never reached failure and were dropped outright. Survival analysis would use that information instead of discarding it.
- Test other curve-shape features. Variance was the first one worth trying because the source paper flagged it; the minimum and skew of the same difference curve are next.
- Wire the deployed app’s chart to real data. Right now the Streamlit app generates an illustrative curve from the entered variance value for clarity, rather than plotting a specific cell’s measured curve — worth fixing if this moves toward being a real tool rather than a demo.
The thing I’d take from this project isn’t the 22-cycle number. It’s the sequence: test the obvious features first, let a real negative result tell you where the signal isn’t, and only then build something grounded in the underlying physics. That order — rather than jumping straight to the “smart” feature — is what made the negative result in Phase 1 useful instead of just discouraging.
Full writeups, code, and the deployed model: battery-life-prediction on GitHub · Try the live model