Scoring equipment health when nobody labeled the failures
The most common real-world condition in industrial analytics is also the one textbooks skip: you have years of sensor data and no failure labels. Nobody wrote down when the compressor died, or the log that exists says “replaced unit” with no date you can trust. I spent three years in HVAC product development at Rheem, so when I built a health-scoring system on 2.88 million hourly readings from 497 buildings, I refused the usual shortcut of pretending threshold breaches are labels. This entry is what you can honestly do instead.
Decision one: judge each unit against its own baseline
A raw anomaly score answers “is this reading strange for the fleet?” That is the wrong question. Some units always ran hot; some buildings always ran heavy loads. At Rheem you never judged a compressor against the fleet’s vibration baseline, only against its own commissioning signature.
So the score is normalized per unit: each building’s raw scores are mapped through that building’s own 5th and 95th percentiles, so health 20 means “bad for this unit,” not “different from other units.” The units with unusual but stable operating profiles stopped false-alarming the moment this landed.
Decision two: keep a second detector as witness
With no labels, there is no accuracy number, and anyone who quotes one should be asked where it came from. What you can do is triangulate. A Local Outlier Factor model, which defines anomaly by local density rather than isolation depth, scores the same readings independently. The two detectors agree on 91.3% of a 100,000-reading sample.
Agreement is not correctness. What it establishes is that the anomaly structure mostly does not depend on which definition of “strange” you pick, and the 8.7% where they disagree is exactly the set where the call is genuinely ambiguous. The contamination setting got the same treatment: run at 0.02, 0.05, and 0.10, and check that everything flagged at the strict setting stays flagged at the middle one. It does, which means the flagged population is not an artifact of one knob.
The finding I didn’t expect
The strongest SHAP contributor across the fleet is not COP level. It is the 24-hour rolling standard deviation of COP: volatility, not value. In hindsight it is obvious from the shop floor: a machine that is failing intermittently swings before it sags. A compressor short-cycling, a valve hunting, a sensor going flaky: they all show up as variance first. The model found the intermittent-fault signature on its own, and that, more than any metric, is what made me trust the anomaly structure.
What this can and cannot say
It cannot say “this unit will fail in N days”; that needs labels or run-to-failure history (my turbofan project is that problem, with NASA’s labels). It can rank 497 units by how far each has drifted from its own normal, with a second detector countersigning most calls, and that ranking is what a maintenance planner actually needs on Monday morning: which ten units get a technician this week.
The live fleet board at hvac.alvinalias.com shows the real scored units and prints the detector cross-check with every score. The repo, with the sensitivity checks and the normalization code, is at github.com/aalias01/hvac-equipment-health.
Citation
@online{alias2026,
author = {Alias, Alvin},
title = {Scoring Equipment Health When Nobody Labeled the Failures},
date = {2026-06-16},
url = {https://alvinalias.com/notes/posts/health-without-labels.html},
langid = {en}
}