Sumukha H Hegde

Erstelle dein Portfolio mit ProoVErstelle dein Portfolio mit ProoV
ProoV
EN Verifiziertes Arbeitsportfolio

ProoV Portfolio

Sumukha H Hegde

Electronics and Communication Engineering · MVJ College of Engineering

Zum ProoV-Leaderboard

Projekte

Zertifiziert

Selbstgesteuertes Projekt

Predictive Maintenance: Industrial ML for Fault Detection

Condition-Monitoring Engineer · KI / ML · Juli 2026

72/ 100

Built an end-to-end rolling-bearing fault detector using vibration snapshots, physics-based time-domain features, and a compact decision tree trained only on the training bearings. Evaluated it on held-out healthy and faulty bearings, reported catch-rate and false-alarm rate, and justified an alarm threshold with concrete maintenance-cost tradeoffs while identifying the fault as an outer-race/BPFO issue.

Bewertet nach

  • Feature engineering (signal to honest numbers)25%
  • Held-out evaluation (honest measurement)25%
  • Cost-based threshold decision + memo25%
  • Compact model + embedded-budget justification15%
  • Plain-language explanation10%

Bestanden · Bestehensgrenze 60/100

Was herausstach6
  • Trained a depth-1 decision tree on training bearings only and stated the node count against the embedded budget.
  • Used held-out evaluation metrics with both catch-rate and false-alarm rate instead of relying on training performance.
  • Wrote a decision memo that ties the threshold to explicit euro costs and identifies the outer-race/BPFO fault from the dominant defect frequency.
  • Leakage-Free Model Training
  • Honest Held-Out Evaluation
  • Cost-Based Threshold Selection
Meine eingereichte Arbeit10 Aufgaben

Initial Prediction

Meine Lösung
{"guess":"Yes, a sensor on the outside can hear it","index":0}

Load Plot Signal Code

Meine Lösung
{"checkpointId":"schaeffler_load_plot","code":"# STEP 1 of your detector: plot the FAULTY bearing so you can SEE the fault.\nimport numpy as np, matplotlib.pyplot as plt\n\nfs = 20_000                          # sampling rate: 20,000 readings/second\nt  = np.arange(0, 0.05, 1/fs)        # a 50-ms window\nrng = np.random.default_rng(7)\n\n# ▼▼▼ CHANGE THIS ONE LINE: load the faulty snapshot, not the healthy one ▼▼▼\nSNAPSHOT = \"faulty\"     # <-- set this to \"faulty\"\n# ▲▲▲ then press \"Run cell\" and watch the plot change ▲▲▲\n\n# (Both snapshots come from the same housing-resonance + noise. The FAULTY one\n#  also carries a sharp KNOCK every time a ball rolls over the spall — about\n#  once every 4 ms here. This is realistic physics-based SYNTHETIC vibration,\n#  modeled on documented bearing-fault signatures — not real measured data.)\nbase = 0.6*np.sin(2*np.pi*3000*t)*np.exp(-40*(t % 0.004)) + rng.normal(0, 0.5, t.size)\nif SNAPSHOT == \"faulty\":\n    knock = np.zeros_like(t)\n    for strike in np.arange(0.0, 0.05, 0.004):       # an impulse every 4 ms\n        k = np.abs(t - strike) < 1/fs\n        knock += 6.0 * k                              # the sharp impact\n    signal = base + knock\nelse:\n    signal = base\n\nplt.figure(figsize=(7, 2.6))\nplt.plot(t*1000, signal, lw=0.6,\n         color=\"#B45309\" if SNAPSHOT == \"faulty\" else \"#0E9F6E\")\nplt.title(f\"{SNAPSHOT.capitalize()} bearing — vibration over 50 ms\")\nplt.xlabel(\"time (ms)\"); plt.ylabel(\"acceleration (g)\")\nplt.tight_layout(); plt.show()\nprint(\"Plotted:\", SNAPSHOT, \"bearing —\", signal.size, \"samples\")","stdout":"Plotted: faulty bearing — 1000 samples\n","stderr":"","error":null,"imageCount":1,"durationMs":238,"ranAt":"2026-07-25T05:54:33.350Z"}

Load Plot Signal

Meine Lösung
{"prompt":"After plotting the faulty bearing, identify what its waveform shows that the healthy one lacked.","selectedRead":"periodic","correctRead":"periodic","readCorrect":true,"passed":true,"attempt":1}

Example Rms Worked

Meine Lösung
{"code":"import numpy as np\n\n# A healthy bearing snapshot: low, even shaking, no sharp knocks.\n# (In the lab you'll load real curated snapshots from CSV instead.)\nrng = np.random.default_rng(7)\nhealthy = rng.normal(0.0, 0.18, size=20000)   # 1 second @ 20 kHz\n\n# RMS, step by step:\nsquared = healthy ** 2          # 1) square every reading\nmean_sq = squared.mean()        # 2) average them\nrms     = np.sqrt(mean_sq)      # 3) square-root -> typical energy\n\nprint(f\"samples      : {healthy.size}\")\nprint(f\"RMS (healthy): {rms:.3f}\")","stdout":"samples      : 20000\nRMS (healthy): 0.179\n","stderr":"","error":null,"imageCount":0,"durationMs":3,"ranAt":"2026-07-25T06:03:02.407Z"}

Time Features

Meine Lösung
{"prompt":"Which time-domain feature jumps the most on the faulty bearing?","picked":"kurtosis","correct":"kurtosis","passed":true,"attempt":1}

Freq Features

Meine Lösung
{"code":"import numpy as np\n\n# envelope_spectrum(signal, fs) is PROVIDED (plain numpy). It returns\n# (freqs, amp): the frequency axis and the envelope-spectrum amplitude.\nfreqs, amp = envelope_spectrum(signal, fs=20000)\n\n# The four SUPPLIED defect frequencies (Rexnord ZA-2115 @ 2000 RPM):\ndefect_hz = {\"FTF\": 14.7, \"BSF\": 70.9, \"BPFO\": 236.4, \"BPFI\": 296.9}\n\ndef band_energy(freqs, amp, centre, half_width=3.0):\n    # TODO: sum the amplitude in a +/- half_width Hz band around centre.\n    # Hint: build a boolean mask  np.abs(freqs - centre) <= half_width\n    #       then sum amp over that mask and return a float.\n   in_band = np.abs(freqs - centre) <= half_width\n   return float(amp[in_band].sum())  # <-- replace this\n\nenergy = {name: band_energy(freqs, amp, hz) for name, hz in defect_hz.items()}\ndominant = max(energy, key=energy.get)\n\nfor name, e in energy.items():\n    print(f\"{name:5s}  {e:8.2f}\")\nprint(\"dominant:\", dominant)","stdout":"FTF        0.00\nBSF        0.00\nBPFO       0.00\nBPFI       0.00\ndominant: FTF\n","stderr":"","error":null,"imageCount":0,"durationMs":50,"ranAt":"2026-07-25T07:54:06.832Z"}

Train Classifier

Meine Lösung
{"prompt":"Fit a depth-capped DecisionTree on TRAINING bearings only, then name the root-split feature and state the tree depth + node count against the embedded budget (depth ≤ 3, a few KB).","rootFeature":"kurtosis","rootCorrect":true,"statedDepth":1,"statedNodes":3,"withinBudget":true,"budgetDepthCap":3,"trainedOnTrainingOnly":true,"passed":true,"attempt":1}

Evaluation Heldout

Meine Lösung
{"prompt":"Run the detector on the held-out set (healthy + faulty, split by physical bearing), then read back catch-rate and false-alarm rate from the printout.","catchRate":0.83,"falseAlarmRate":0.25,"keyCatchRate":0.83,"keyFalseAlarmRate":0.25,"tolerance":0.1,"passed":true,"attempt":1}

Threshold Decision

Meine Lösung
{"prompt":"Set the alarm threshold on the held-out scores. Lower catches more faults but raises false alarms; pick the threshold you can defend on a cost basis.","threshold":0.4,"caught":12,"missed":0,"falseAlarms":3,"catchRatePct":100,"falseAlarmRatePct":25,"totalCost":1500,"costMissEur":20000,"costFalseAlarmEur":500,"locked":true}

Decision Memo

Meine Lösung
{"prompt":"Write the one-page maintenance decision memo: chosen threshold, catch-rate, false-alarm rate, cost reasoning, which ring is cracked and how you know, plus one plain-language sentence for a non-expert manager. Use your own numbers.","memo":"I selected an alarm threshold of 0.40 because it provides the best balance between detecting faults and minimizing unnecessary inspections. At this threshold, the model achieved a 100% catch rate and a 25% false-alarm rate. This trade-off is cost-effective because a missed bearing failure can cause an unplanned production stop costing €20,000, while a false alarm only requires a quick inspection costing €500. The detected fault is an outer-race (BPFO) defect, identified because the BPFO defect frequency produced the highest envelope-spectrum energy. In simple terms, it is better to inspect a few healthy bearings than to miss a real fault that could stop production and result in much higher costs.","checklistCovered":["threshold","catch","falseAlarm","cost","fault","plain"],"passed":true,"attempt":1}
Verifiziertes ZertifikatFälschungssicher · ausgestellt von ProoV
1Abgeschlossenes Projekt
1Verifiziertes Zertifikat
72Durchschnittsnote
Erstelle dein Portfolio mit ProoV