Skip to content

shaqa3/predictive-maintenance

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

Predictive Maintenance — Turbofan RUL

Predicts the Remaining Useful Life (RUL) of jet engines from live sensor telemetry, using a real ML.NET model trained on NASA's C-MAPSS turbofan degradation dataset. Held-out engines are replayed cycle-by-cycle and scored in real time, streamed to the dashboard over SignalR.

Stack: .NET 10 + ML.NET + SignalR + React 19 + Recharts.

What it demonstrates

  • A genuine supervised ML pipeline (not a heuristic): FastTree regression on 14 informative sensors, with piecewise-linear RUL labels (clipped at 125 cycles, the standard C-MAPSS practice).
  • Honest evaluation on the held-out test set against ground-truth RUL: RMSE ≈ 18.7 cycles, MAE ≈ 14.1, R² ≈ 0.80 — competitive for classic ML on FD001.
  • Live inference: test engines stream one cycle at a time through the model; the dashboard shows predicted RUL vs the actual remaining life side by side.
  • Anomaly detection: ML.NET SSA spike detection over a degradation-sensitive sensor, surfaced as per-engine alerts.
  • Fleet health view (healthy / warning / critical), per-engine detail charts, and a predicted-vs-actual scatter of the whole test set.

Why the live "actual" line is legitimate

C-MAPSS test engines are truncated before failure, but the ground-truth RUL at the truncation point is provided. Since failure occurs at lastCycle + trueRUL, the actual remaining life at every earlier cycle is recoverable as failureCycle − cycle. So the stream carries both the model's prediction and the real remaining life — an honest live comparison, not a circular one (the model never sees these engines during training).

Architecture

backend/   .NET 10
  Cmapss.cs           dataset parsing, feature selection, RUL labelling
  RulModel.cs         ML.NET FastTree train / evaluate / persist / predict
  AnomalyDetector.cs  SSA spike detection (z-score fallback)
  Fleet.cs            replays held-out engines through the model each tick
  TelemetryHub.cs     SignalR: modelInfo scorecard + per-tick fleet batch
  ReplayService.cs    1.5 s cadence background broadcaster
  Program.cs          trains at startup, caches rul-model.zip, REST + hub

frontend/  Vite + React 19 + TypeScript
  hooks/useTelemetry  SignalR connection + per-engine history accumulation
  components/         Scorecard, FleetGrid, EngineDetail (RUL + sensors),
                     ScatterPanel (predicted vs actual)

Contract

Hub /hubs/telemetry → client:

  • modelInfo (once on connect): RMSE/MAE/R², train/test counts, the full predicted-vs-actual scatter, chart sensor names, fleet size, RUL cap
  • fleet (per tick): array of engine states (cycle, predicted RUL, true RUL, health, status, anomaly, key sensor readings)

REST: GET /api/health, GET /api/model, GET /api/fleet.

Running locally

Backend (http://localhost:5299; trains the model on first start, ~1 s):

cd backend
dotnet run

Front end (http://localhost:5173):

cd frontend
npm install
npm run dev

Open http://localhost:5173. Override the backend URL with VITE_API_BASE.

Data & credit

NASA C-MAPSS Turbofan Engine Degradation Simulation Data Set (FD001), from the NASA Prognostics Center of Excellence — US Government work, public domain. The backend/Data/*.txt files are included so the app runs without a download step.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages