Predictive maintenance
Declare when the machine fails.
The remaining useful life is then exact.
Most public predictive-maintenance data draws every row on its own. That is right for orders and payments and wrong for equipment, because a machine has a history. Misata inverts it: a unit draws a life, damage accumulates toward that exact moment, and every sensor follows the damage. Remaining useful life is solved for rather than annotated, which is what makes the label worth training on.
Try the declaration
Move a slider and the fleet changes. The YAML underneath is the real input, not a mock-up of one, and the maths matches the engine rather than approximating it.
one machine each, followed to failure
mean cycles before failure
0 makes every machine identical
how differently each machine responds
measurement error on every reading
degradations:
- table: readings
units: 8
life_mean: 220
life_std: 45
unit_variation: 0.10
responses:
- column: vibration_mm_s
baseline: 0.8
at_failure: 5.2
shape: exponential
noise: 0.08That is the whole input. Paste it into a schema and misata generate produces the fleet above, with rul_cycles exact on every row.
Now generate it for real
calls misata.degradation.generate() on the servermachines in the fleet
mean cycles before failure
Repairs damage part-way, logs an event, and shortens effective life a bit each imperfect repair.
What the existing datasets cannot give you
| AI4I 2020 | C-MAPSS | This | |
|---|---|---|---|
| A machine you can follow over time | |||
| A remaining-useful-life label | |||
| Wear that never goes backwards | |||
| Change the fleet size or failure mix | |||
| The latent damage state, for checking a model | |||
| Validated against real hardware |
The last row is the honest one. C-MAPSS and AI4I describe real machinery; this describes a declared one. Use it where you need ground truth that real data cannot give you, and cite the real sets where you need real physics.
What holds, measured on the published files
- RUL is exact on all 100 units. It decrements by exactly 1 each cycle and reaches 0 on the failure cycle. No smoothing, no clipping.
- Tool wear never decreases, on 100% of steps. Declare a cumulative quantity monotonic and it stops going backwards, however much noise you add.
- Wear correlates +0.849 with cycle. Something is genuinely progressing toward failure.
- Failure mode is learnable, not decorative. Units failing by tool wear reach a mean 357 minutes against 245 to 261 for the other modes, and heat-dissipation units reach 325.6 K against about 316 K.
- Sensors are correlated but not collinear: mean 0.62, max 0.83. Each unit draws its own susceptibility per sensor, so the fleet does not move as one body.
What it refuses to claim
A generator that claims everything is worth nothing, so these are stated here and on the dataset itself rather than buried.
- The physics is not validated. The damage law is a simplified lumped model, unchecked against XJTU-SY, PRONOSTIA/FEMTO or IMS.
- One damage process per unit. Real machines fail from several interacting mechanisms.
- No per-machine attributes beyond a control type. No location, no maintenance history, no operator.
- Not a drop-in replacement for C-MAPSS in published benchmarks.
Questions
What makes remaining useful life exact rather than estimated?
How is this different from AI4I 2020?
How is this different from NASA C-MAPSS?
Is the physics validated against real bearings?
Can I use it commercially?
Can I generate a fleet of my own size and failure mix?
Does this support motor current, acoustic emission, or a maintenance history?
Generate your own fleet
pip install misata misata generate --config schema.yaml --output-dir ./data
The schema.yaml that produced the published dataset ships inside it and runs unmodified. Change the fleet size, the mean life or the sensor response and regenerate. The countdown stays exact because it is solved, not labelled.

