One Weather, Six Weathers
Imagine training a self-driving car only on a single sunny day in California. It will be a beautiful driver — until you ship it to Norway in December. The model never had a chance to learn that the world has regimes: weather, terrain, traffic density. Drop it into a regime it has never seen and behaviour collapses.
That same regime structure is the central difficulty of multi-condition prognostics. A jet engine's sensors at 35,000 ft cruising at Mach 0.84 produce values that have nothing to do with the same engine sitting at sea-level idle. If you mix readings from both regimes into a single normalisation pipeline, the “degradation signal” you actually learn is mostly the regime label, not the real wear.
The 2x2 Difficulty Matrix
The four C-MAPSS sub-datasets exhaust the cross product of two binary axes: operating conditions (1 vs 6) and fault modes (1 vs 2). The matrix below is what makes them a small but well-chosen benchmark suite.
| 1 fault mode (HPC degradation) | 2 fault modes (HPC + Fan) | |
|---|---|---|
| 1 condition (sea level) | FD001 - the 'easy' subset | FD003 - same regime, two failure modes |
| 6 conditions (full envelope) | FD002 - the 'multi-condition' challenge | FD004 - hardest: 6 conditions x 2 faults |
Every paper that claims a result on C-MAPSS quotes per-subset RMSE; the delta between FD001 and FD002 measures how robust the model is to operating regimes; the delta between FD002 and FD004 measures robustness to multiple failure modes. Most published methods do well on FD001/FD003 and badly on FD002/FD004 — which is exactly the regime where the GABA / GRACE benefit is largest in the paper's Table II.
What an Operating Condition Looks Like
An operating condition is a single point in the joint distribution of altitude, Mach number, and throttle resolver angle — the three operational-setting columns we met in Section 2.1. C-MAPSS's six canonical conditions are the centroids reported by the original NASA documentation:
| Cond. | Altitude (k ft) | Mach | Throttle (TRA, %) | Plain English |
|---|---|---|---|---|
| 0 | 0 | 0.00 | 100 | Sea-level idle |
| 1 | 10 | 0.25 | 100 | Low-altitude takeoff |
| 2 | 20 | 0.70 | 100 | Mid-cruise full throttle |
| 3 | 25 | 0.62 | 60 | Mid-cruise descent |
| 4 | 35 | 0.84 | 100 | High-altitude cruise |
| 5 | 42 | 0.84 | 100 | Top-of-climb |
The key fact: cycle-by-cycle, an engine in FD002 jumps between these six regimes. There is no smooth transition. A row labelled cycle 5 might be at sea-level idle; cycle 6 might be at 35,000 ft. Sensors respond to both regime change AND degradation — and unless we factor out the regime first, the degradation signal stays buried under it.
Interactive: The Conditions Space
Click between the four cards. FD001 / FD003 collapse to a single point in the (altitude, Mach) plane; FD002 / FD004 fan out into six visually distinct clusters. Marker size encodes throttle — you can see condition 3 (descent) sit slightly south of condition 2 because of the lower TRA.
Two seconds of slider-clicking communicates what fifty pages of prose cannot: FD002 and FD004 are not slightly harder than FD001; they live in a qualitatively different geometry.
Python: Discover Conditions With k-Means
We never get the condition labels for free in real-world data — they have to be re-discovered from the op_set columns. k-means with k=6 nails it on C-MAPSS because the canonical centroids are well-separated. Total cluster sizes are nearly balanced (8869-9115 rows per condition).
How robust is k-means here?
Very. The op_set centroids are separated by altitudes ranging from 0 to 42 kft — an order of magnitude larger than the noise inside any cluster. Misclassification rate against the synthetic ground truth is below 0.1% for n_init ≥ 5. Robust convergence is the reason every C-MAPSS preprocessing pipeline uses k-means rather than a more involved Gaussian-mixture model.
PyTorch: A Condition-Aware Dataset
Extend Section 2.1's CMAPSSDataset with the condition column. __getitem__ now returns a three-tuple — sensor window, condition sequence, RUL target.
Multi-Condition Problems Outside RUL
The structural pattern “features are dominated by regime, not by the signal of interest” appears all over machine learning. Every row of the table below has been solved with the same per-condition normalisation idea we apply in Chapter 6.
| Domain | Regimes | Signal of interest | Common fix |
|---|---|---|---|
| Turbofan RUL (this book) | Flight envelopes | Component degradation | Per-condition Z-score |
| Speech recognition | Speakers, microphones, rooms | Phoneme content | Speaker / channel normalisation |
| Medical imaging | Scanner vendors | Pathology | Site-level harmonisation, ComBat |
| Recommender systems | Geo / device / time-of-day | User preference | Contextual bandit features |
| Autonomous driving | Weather / city / time | Lane lines, agents | Domain-randomisation, batch norm per regime |
| Wearables / ECG | Resting / exercise / sleep | Cardiac state | Activity-conditional models |
| Industrial vision | Lighting, camera angle | Defect signature | Reference-image normalisation |
The book's machinery — cluster, normalise per cluster, train on the residual signal — transfers to all of these without a single domain-specific change.
The Mixing Trap
Section 6.2 walks through exactly how this fails empirically and shows the per-condition fix. For now the mental rule is: normalise inside a regime, not across regimes.
Why this whole chapter exists. Multi-condition data is the regime where every method discussed in this book differentiates itself. On FD001 / FD003 most methods bunch together; on FD002 / FD004 the gradient-aware objectives pull ahead by 28-76% on NASA score and 18-40% on RMSE.
Takeaway
- Four sub-datasets, two binary axes. 1 vs 6 operating conditions, 1 vs 2 fault modes. FD002 and FD004 are where the research benefit lives.
- An operating condition is a point in (altitude, Mach, TRA). Six canonical centroids span the realistic flight envelope from idle to top-of-climb.
- k-means with k=6 recovers the conditions in one line. n_init=10, random_state=0, .fit on the op_set columns. Misclassification below 0.1%.
- The condition label belongs in the dataset, not the model.
CMAPSSDatasetByConditionemits a per-cycle condition sequence alongside every input window. - The mixing trap is real. Single mean / std across regimes turns the “model” into a regime classifier in disguise.