Home Fitran Profile
Top
Bottom
Refresh

Hybrid Machine Learning-Weibull for Remaining Useful Life Prediction

Bridging Statistical Reliability Models and Edge-Cloud Telemetry for Dynamic Remaining Useful Life (RUL) Estimation.

GitHub Go to GitHub Repository

Technologies & Tools

Python C++ XGBoost LightGBM lifelines scikit-learn SciPy Pandas NumPy ESP32-S3 Arduino IDE OBD-II Interface TPMS Sensors GPS Integration C-MAPSS Dataset

Skills & Competencies

Survival Analysis Reliability Engineering Machine Learning Regression Custom Loss Functions Embedded IoT Systems Time-Series Data Engineering Mathematical Optimization Exploratory Data Analysis ETL

The Problem Statement

Traditional Predictive Maintenance (PdM) systems rely heavily on static, historical averages for survival modeling. These rigid, time-invariant parameters fail to account for dynamic, real-time operational stressors like varying payloads, sudden throttle adjustments, and erratic environmental temperatures, leading to suboptimal or inaccurate Remaining Useful Life (RUL) predictions.

The Core Innovation

This framework transforms the Weibull scale parameter (\(\lambda\)) from a static characteristic lifetime into a dynamic, covariate-driven target for machine learning regression models. By coupling statistical reliability theory directly with advanced regressors, the system produces a percentage-based failure probability curve that adapts continuously to telemetry stressors.

Mathematical Foundation & Interactive Explorer

The Weibull distribution is parameterized by two essential parameters that define failure mechanics:

  • Shape Parameter (\(k\)): Defines the failure nature over time.
    • \(k < 1\): Infant mortality (decreasing failure rate).
    • \(k = 1\): Random failures (constant failure rate; reduces to Exponential Distribution).
    • \(k > 1\): Wear-out phase (increasing failure rate; typical in mechanical structures).
  • Scale Parameter (\(\lambda\)): Denotes the characteristic life. It represents the point in time at which approximately 63.2% of all test components are expected to fail, regardless of the shape parameter \(k\).

The Probability Density Function (PDF) and Cumulative Distribution Function (CDF) are represented as:

PDF: \[f(t; k, \lambda) = \frac{k}{\lambda} \left( \frac{t}{\lambda} \right)^{k-1} e^{-\left(\frac{t}{\lambda}\right)^k}\]

CDF: \[F(t; k, \lambda) = 1 - e^{-\left(\frac{t}{\lambda}\right)^k}\]

Interactive Weibull Parameter Widget

1.0 (CDF) 0.5 0.0 0 150 300 450 600 (t) λ (Scale) 63.2% failure point
PDF f(t)
CDF F(t)

The Novelty: Custom Weibull Error Metrics

Traditional metrics (like RMSE and MAE) evaluate prediction error based on absolute distance between point targets. This is insufficient for survivability profiles where we want to evaluate the matching of the probability density curves. Thus, custom Weibull error metrics were developed to isolate the mathematical alignment of estimated curves.

These metrics calculate the area between the continuous predicted Weibull Cumulative Distribution Function (CDF) and the actual step function of the failure event (which transitions from 0 to 1 at the actual failure time \(t_{act}\)).

Mean Weibull Error (MWE)

Mean Weibull Error evaluates the cumulative distance of the predicted scale parameter \(\lambda\) from the actual failure point, effectively mapping standard deviation equivalents over survival profiles.

\[WE(t_{act}, \lambda, k) = \int_0^{t_{act}} F(x) dx + \int_{t_{act}}^{\infty} (1 - F(x)) dx\] \[= t_{act} + \frac{2\lambda}{k} \Gamma\left(\frac{1}{k}, \left(\frac{t_{act}}{\lambda}\right)^k\right) - \frac{\lambda}{k} \Gamma\left(\frac{1}{k}\right)\]
def weibull_error_dataset(x_test, x_pred, k):
    sum_error = 0
    for x, lmbda in zip(x_test, x_pred):
        sum_error += weibull_error(x, lmbda, k)
    return sum_error / len(x_test)

Mean Quadratic Weibull Error (MQWE)

MQWE enforces high quadratic penalties for extreme anomalies, evaluating the general reliability curve deviations on outliers. It is critical for safety-critical hardware where catastrophic failures must be avoided.

\[QWE(t_{act}, \lambda, k) = \int_0^{t_{act}} F(x)^2 dx + \int_{t_{act}}^{\infty} (1 - F(x))^2 dx\] \[= t_{act} + \frac{2\lambda}{k} \Gamma\left(\frac{1}{k}, \left(\frac{t_{act}}{\lambda}\right)^k\right) - \frac{2\lambda}{k} \Gamma\left(\frac{1}{k}\right) + \frac{\lambda}{k 2^{1/k}} \Gamma\left(\frac{1}{k}\right)\]
def quadratic_weibull_error_dataset(x_test, x_pred, k):
    sum_error = 0
    for x, lmbda in zip(x_test, x_pred):
        sum_error += weibull_error(x, lmbda, k) ** 2
    return sum_error / len(x_test)

Mean Directional Errors (MRWE & MLWE)

Mean Left Weibull Error (MLWE) and Mean Right Weibull Error (MRWE) are used to isolate whether a model is aggressively over-predicting or under-predicting the failure threshold.

Mean Left Weibull Error (MLWE) - Early Failure Penalty: \[LWE(t_{act}, \lambda, k) = \int_0^{t_{act}} F(x) dx = t_{act} + \frac{\lambda}{k} \Gamma\left(\frac{1}{k}, \left(\frac{t_{act}}{\lambda}\right)^k\right) - \frac{\lambda}{k} \Gamma\left(\frac{1}{k}\right)\]
Mean Right Weibull Error (MRWE) - Late Failure Penalty: \[RWE(t_{act}, \lambda, k) = \int_{t_{act}}^{\infty} (1 - F(x)) dx = \frac{\lambda}{k} \Gamma\left(\frac{1}{k}, \left(\frac{t_{act}}{\lambda}\right)^k\right)\]
def left_weibull_error(x, lmbda, k):
    lmbda = lmbda if lmbda > 0 else 1e-12
    s = 1.0 / k
    z = (x / lmbda) ** k
    gamma_s = gamma(s)
    l_gamma = gammaincc(s, z) * gamma_s
    l_gamma_0 = gammaincc(s, 0) * gamma_s
    return x + (lmbda * l_gamma / k) - (lmbda * l_gamma_0 / k)
 
def right_weibull_error(x, lmbda, k):
    lmbda = lmbda if lmbda > 0 else 1e-12
    s = 1.0 / k
    z = (x / lmbda) ** k
    gamma_s = gamma(s)
    l_gamma = gammaincc(s, z) * gamma_s
    return lmbda * l_gamma / k

Scipy Integration & Core Math

Calculations use Scipy's special incomplete gamma functions to evaluate the probability densities dynamically on every telemetry step.

from scipy.special import gamma, gammaincc
 
def weibull_error(x, lmbda, k):
    lmbda = lmbda if lmbda > 0 else 1e-12
    s = 1.0 / k
    z = (x / lmbda) ** k
    gamma_s = gamma(s)
    l_gamma = gammaincc(s, z) * gamma_s
    l_gamma_0 = gammaincc(s, 0) * gamma_s
    return x + (2 * lmbda * l_gamma / k) - (lmbda * l_gamma_0 / k)

Interactive Weibull Error Explorer

Adjust the telemetry failure target and the model's predicted parameters to see how errors are distributed.

LWE: 0.00
RWE: 0.00
WE: 0.00
QWE: 0.00
1.0 (CDF) 0.5 0.0 0 150 300 450 600 (t)
Pred CDF
Actual Failure
LWE (Early)
RWE (Late)

Applied Project I: Edge-Cloud Tire Degradation System

This project maps real-time telemetry captured via a custom gateway board on a moving vehicle into predictive tyre failure curves. The workflow follows a clean vertical architecture:

IoT Edge Gateway & Telemetry

Data is captured on the vehicle using an ESP32-S3 microcontroller acting as an edge gateway. Live sensor packages collect TPMS data (tyre pressures and temperatures), OBD-II diagnostics (engine load and current speeds), and spatial GPS logs to track high-accuracy mileage.

ESP32-S3 Gateway Architecture

Real-World Data Engineering & Preprocessing

Real-world telemetry gathered from IoT microcontrollers is highly asynchronous, noisy, and prone to packet drops. A comprehensive mathematical and data preprocessing pipeline was engineered to clean, smooth, and transform the raw sensor data:

  • 1. Spatial Outlier Detection (IQR Bounds): Erratic coordinate jumps due to temporary GPS signal loss or multipath propagation are detected and filtered using the Interquartile Range (IQR) method:
    \[IQR = Q_3 - Q_1 \quad \implies \quad \text{Valid Range} = [Q_1 - 1.5 \times IQR, \; Q_3 + 1.5 \times IQR]\]
    def delete_outlier_gps(df):
        df_copy = df.copy()
        for col_name in ['latitude', 'longitude']:
            Q1 = df.loc[:, col_name].quantile(0.25)
            Q3 = df.loc[:, col_name].quantile(0.75)
            IQR = Q3 - Q1
            lower_bound = Q1 - 1.5 * IQR
            upper_bound = Q3 + 1.5 * IQR
            df_copy = df_copy[(df_copy[col_name] >= lower_bound) & (df_copy[col_name] <= upper_bound)]
            df_copy.reset_index(drop=True, inplace=True)
        return df_copy
  • 2. Geodesic Distance Tracking (Haversine Formula): Spherical distance (meters) between consecutive spatial coordinates is computed using the Haversine formula (Earth's radius \(R \approx 6,371,000\text{ m}\)):
    \[a = \sin^2\left(\frac{\Delta\phi}{2}\right) + \cos(\phi_1)\cos(\phi_2)\sin^2\left(\frac{\Delta\theta}{2}\right)\] \[d = 2R \cdot \operatorname{arctan2}\left(\sqrt{a}, \sqrt{1-a}\right)\]
    Packets with anomalous jumps (\(d_i > 1000\text{ m}\)) are discarded. The cumulative distance traveled is calculated using a rolling prefix sum (\(\sum d_i\)).
    def change_to_distance(df):
        df_copy = df.copy()
        df_copy.reset_index(drop=True, inplace=True)
        for i in range(1, len(df_copy)):
            lat1, lon1 = df_copy.loc[i-1, 'latitude'], df_copy.loc[i-1, 'longitude']
            lat2, lon2 = df_copy.loc[i, 'latitude'], df_copy.loc[i, 'longitude']
            distance_km = haversine((lat1, lon1), (lat2, lon2), unit=Unit.METERS)
            df_copy.loc[i, 'distance_traveled_m'] = distance_km
        df_copy.at[0, 'distance_traveled_m'] = 0
        df_copy['sum_distance_traveled_m'] = df_copy['distance_traveled_m'].cumsum()
        return df_copy
  • 3. Telemetry Smearing & Packet Drop Compensation: Loss of sensor telemetry packets (which register as 0 values in TPMS outputs) are converted to NaN and then filled sequentially. We apply a backward fill (bfill) to resolve initial zero readings, followed by a forward fill (ffill) to propagate the last known telemetry:
    \[\mathbf{x}_{\text{smeared}} = \operatorname{ffill}\Big(\operatorname{bfill}\big(\{x_i \mid x_i \neq 0, \text{ else } \text{NaN}\}\big)\Big)\]
    def smear_temp_pressure(df):
        df_copy = df.copy()
        for col_prefix in ['fl', 'fr', 'rl', 'rr']:
            for suffix in ['temp', 'pressure']:
                col_name = f'{col_prefix}_{suffix}'
                df_copy.loc[df_copy[col_name] == 0, col_name] = np.nan
                df_copy[col_name] = df_copy[col_name].bfill().ffill()
        return df_copy
  • 4. Vertical Load Stressor (Elevation Delta): Vertical elevation adjustments between snapshots are computed to capture grade changes and additional mechanical loading on tires:
    \[\Delta E_i = H_i - H_{i-1} \quad (H = \text{altitude in meters})\]
    def change_to_elevation(df):
        df_copy = df.copy()
        df_copy.reset_index(drop=True, inplace=True)
        for i in range(1, len(df_copy)):
            alt_1 = df_copy.loc[i-1, 'altitude']
            alt_2 = df_copy.loc[i, 'altitude']
            df_copy.loc[i, 'elevation_traveled_m'] = alt_2 - alt_1
        df_copy.at[0, 'elevation_traveled_m'] = 0
        return df_copy

Model Optimization & Deployment

Models are trained to predict the dynamic \(\lambda\) parameter. LightGBM achieved a Mean Absolute Percentage Error (MAPE) of 0.0025 and Mean Absolute Scaled Error (MASE) of 0.2168. Models are then serialized for cloud server deployment.

from sklearn.model_selection import GridSearchCV
import lightgbm as lgb
import pickle

lightgbm_hyperparam = {
    'num_leaves': [20, 31, 50, 80],
    'min_child_samples': [20, 50, 100],
    'max_depth': [-1, 5, 8],
    'force_col_wise': [True]
}
lightgbm_grid = GridSearchCV(estimator=lgb.LGBMRegressor(), param_grid=lightgbm_hyperparam, cv=3)
lightgbm_grid.fit(X_train, y_train)
with open('lightgbm_grid.pkl', 'wb') as f:
    pickle.dump(lightgbm_grid.best_estimator_, f)

System Demonstration Video

Watch the real-time telemetry streaming from the ESP32-S3 edge gateway to the cloud dashboard and dynamic predictive degradation curve updates in action:

Model Evaluation & Performance Metrics

The models were rigorously evaluated on the tire telemetry dataset using standard regression metrics along with the custom Weibull-specific metrics to measure survival curve alignment:

Model MAPE SMAPE MASE MWE MQWE MLWE MRWE
LightGBM (Iterative) 0.0025 (0.25%) 0.0018 (0.18%) 0.2169 23,603.94 7.57e+08 13,909.91 9,694.03
XGBoost (Iterative) 0.0038 (0.38%) 0.0031 (0.31%) 0.3112 23,609.09 7.57e+08 13,901.89 9,707.20
AFT OLS (Iterative) 0.1426 (14.26%) 0.1419 (14.19%) 18.8291 24,918.84 9.06e+08 13,762.53 11,156.32
No Covariate (Baseline) 0.7508 (75.08%) 0.5557 (55.57%) 67.0644 31,147.55 1.09e+09 18,227.45 12,920.10

Conclusions & Key Insights

Traditional reliability schedules (represented by the No Covariate baseline) perform poorly under real-world variables, exhibiting a high MAPE of 75.08%. Modeling the scale parameter using Accelerating Failure Time (AFT) OLS improves estimates to a MAPE of 14.26%, but is limited by the linear assumptions of traditional regression. The machine learning regressors (XGBoost and LightGBM) yield a dramatic increase in performance by successfully learning non-linear stress patterns. LightGBM delivers the most accurate survival prediction, achieving a MAPE of 0.25% and a MASE of 0.2169, which confirms that data-driven machine learning models can dynamically adjust Weibull parameters to reflect real-time operational wear.

Applied Project II: Aircraft Engine Simulation (C-MAPSS)

This benchmark study evaluates the NASA Turbofan Engine Degradation Simulation Dataset (C-MAPSS) to predict the Remaining Useful Life of high-pressure turbine units. Handling 21 disparate sensor measurements over multi-fault conditions (FD003 dataset) reveals critical data-handling findings:

Preprocessing Pipelines

Comparative analysis shows preprocessing design dictates accuracy more than the final regressor choice. A grid of 12 preprocessing combinations (Moving Average, EWMA, Wavelet x Scalers) was instantiated.

from sklearn.preprocessing import StandardScaler, MinMaxScaler
denoising = ['ma', 'ewma', 'wavelet', 'none']
scalers = [StandardScaler(), MinMaxScaler()]

Wavelet Denoising Failure

Wavelet thresholding severely degraded model performance. Denoising stripped critical high-frequency transient signals representing early blade cracking.

import pywt
def wavelet_denoise(signal):
    coeffs = pywt.wavedec(signal, 'db4', level=1)
    uthresh = np.std(coeffs[-1]) * np.sqrt(2 * np.log(len(signal)))
    coeffs[1:] = [pywt.threshold(c, value=uthresh) for c in coeffs[1:]]
    return pywt.waverec(coeffs, 'db4')

Simple Moving Average

Simple Moving Average (SMA) or No Denoising yielded the optimal baselines. These preserved the wear-out trends without flattening the operational stressors.

def apply_sma(df, sensor_cols, window=5):
    for unit_id in df['unit_number'].unique():
        for col in sensor_cols:
            mask = df['unit_number'] == unit_id
            df.loc(mask, col) = df[mask][col].rolling(window).mean()
    return df

XGBoost Robustness

XGBoost proved to be the most robust architecture against the complex multi-fault dataset, resisting overfitting on transient sensor failures.

import xgboost as xgb
xgb_regressor = xgb.XGBRegressor(
    n_estimators=500,
    max_depth=5,
    learning_rate=0.05
)
xgb_regressor.fit(X_train_fd003, y_train_fd003)

The Mathematical Hazard Bridge

The hazard function establishes the dynamic wear-out baseline by calculating failure rate at time x given shape (k) and scale (lambda) parameters:

# Dynamic wear-out hazard function that bridges statistical theory and ML predictions
def hazard(x, k=4.359886822599401, lamb=236.76593258114204):
    return (k / lamb) * ((x / lamb) ** (k - 1))

Model Evaluation & Performance Metrics

The performance of various models evaluated on the turbofan engine dataset (FD001) under multiple preprocessing configurations highlights the strength of the hybrid framework:

Model MAE RMSE R² Score MWE (Weibull Error) MQWE MLWE MRWE
LightGBM (Linear Time) 25.44 34.21 0.3222 27.16 1,058.44 9.07 18.09
XGBoost (Linear Time) 26.59 35.08 0.2875 27.86 1,100.96 9.03 18.83
Random Forest (Linear Time) 26.62 34.83 0.2976 28.20 1,107.17 9.78 18.43
SVM (Linear Time) 29.74 36.85 0.2136 30.56 1,256.38 11.90 18.67
Linear Regression 35.43 41.31 0.0118 34.37 1,448.33 9.56 24.82
AFT OLS (Baseline) 36.17 48.64 0.9726 44.09 2,427.67 10.68 33.40
No Covariate (Baseline) 38.50 50.53 0.9704 43.18 2,279.94 10.83 32.35

Conclusions & Key Insights

As detailed in the ETASR and ICICyTA papers, the study proves that a covariate-driven Weibull scale parameter regression outperforms static modeling. Simple linear regression and traditional survival modeling fail to capture the degradation kinetics under multi-fault flying environments. LightGBM, when combined with optimized preprocessing (Min-Max Scaling and Simple Moving Average), yielded the lowest MAE of 25.44 cycles and the lowest Mean Weibull Error of 27.16, representing a substantial performance leap. The results indicate that data-driven machine learning models successfully estimate aircraft engine Remaining Useful Life (RUL) while statistical hazard bridges translate predictions into reliable survival probability distributions.

Publications, Datasets & Reproducibility

PDF
Machine Learning for Covariate-Driven Changes in Weibull Scale Parameter
Engineering, Technology & Applied Science Research (ETASR), 2026. DOI: 10.48084/etasr.15186
Download PDF
PDF
Hybrid ML-Weibull Predictive Maintenance System for Dynamic Tire Remaining Useful Life Estimation
International Journal of Information Technology (IJIT), 2026.
Download PDF
PDF
A Comparative Analysis of Machine Learning Models for Aircraft Engine Remaining Useful Life Prediction
International Conference on Intelligent Computing and Cybersecurity (ICICyTA), 2025. DOI: 10.1109/ICICyTA68677.2025.11362466
Download PDF

Dataset Previews & Explorer

Download and explore the structured telemetry and simulation datasets used in these predictive maintenance studies:

IoT Vehicle Tire Logs

Download ZIP (266 KB)

This dataset maps real-time telemetry captured via a custom ESP32-S3 microcontroller gateway on a moving passenger vehicle. It records environmental stressors alongside tire wear profiles.

File Structure:
  • vehicle_logs: Raw, unfiltered asynchronous sensor telemetry from TPMS, OBD-II, and GPS.
  • vehicle_logs_tread_14_1: Preprocessed, cleaned, and synchronized time-series data from the first run. The suffix 14_1 denotes the first part of the dataset gathered on the 14th day of telemetry capture.
  • vehicle_map_14_1: High-resolution route map of the test vehicle's trip for gathering telemetry.
vehicle_logs (Raw Data - First 5 Rows Preview):
id timestamp vehicle_id latitude longitude altitude speed rpm engine_temp throttle_pos engine_load fuel_level fl_press fl_temp fl_bat fr_press fr_temp fr_bat rl_press rl_temp rl_bat rr_press rr_temp rr_bat
44 2025-11-07 04:15:27+00 4d106730... -6.972864 107.6471638 698.3 0 699 84 15.68627 29.80392                          
45 2025-11-07 04:15:36+00 4d106730... -6.972861 107.6471588 698.9 0 698 84 15.29412 29.80392                          
46 2025-11-07 04:15:41+00 4d106730... -6.972859 107.6471562 699.0 0 711 85 15.29412 29.01961                          
47 2025-11-07 04:15:46+00 4d106730... -6.972858 107.6471558 699.4 0 709 85 15.68627 29.01961                          
48 2025-11-07 04:15:51+00 4d106730... -6.972857833 107.6471568 699.6 0 711 85 15.68627 28.62745                          
vehicle_logs_tread_14_1 (Preprocessed Data - First 5 Rows Preview):
timestamp latitude longitude altitude speed engine_load fl_pressure fl_temp fr_pressure fr_temp rl_pressure rl_temp rr_pressure rr_temp dist_m sum_dist_m elev_m tr_fl tr_fr tr_rl tr_rr
2025-11-14 05:33:57+00 -6.908889667 107.6577782 717.2 3 60.0 27.41117 35.0 28.86149 35.0 29.58666 35.0 24.22045 34.0 1.5482 1.5482 0.1000 5.97e-07 1.53e-06 2.15e-06 1.44e-06
2025-11-14 05:34:02+00 -6.908884667 107.6578010 717.5 1 81.56863 27.41117 35.0 28.86149 35.0 29.58666 35.0 24.22045 34.0 2.5775 4.1257 0.3000 5.97e-07 1.53e-06 2.15e-06 1.44e-06
2025-11-14 05:34:07+00 -6.908887000 107.6578203 718.2 1 62.35294 27.41117 35.0 28.86149 35.0 29.58666 35.0 24.22045 34.0 2.1462 6.2719 0.7000 5.97e-07 1.53e-06 2.15e-06 1.44e-06
2025-11-14 05:34:12+00 -6.908886833 107.6578295 719.1 1 59.60784 27.41117 35.0 28.86149 35.0 29.58666 35.0 24.22045 34.0 1.0157 7.2877 0.9000 5.97e-07 1.53e-06 2.15e-06 1.44e-06
2025-11-14 05:34:17+00 -6.908890833 107.6578455 719.5 1 84.70588 27.41117 35.0 28.86149 35.0 29.58666 35.0 24.22045 34.0 1.8213 9.1090 0.4000 5.97e-07 1.53e-06 2.15e-06 1.44e-06
Telemetry Route Map (14_1 Run): Telemetry Route Map

NASA C-MAPSS Dataset

Download ZIP (12.4 MB)

This benchmark dataset contains simulated run-to-failure trajectories of aircraft turbofan engines generated using NASA's Commercial Modular Aero-Propulsion System Simulation (C-MAPSS) tool. It is widely used to evaluate Remaining Useful Life (RUL) predictions.

File Structure (Converted to CSV):
  • train_FD001.csv: Run-to-failure sensor histories for 100 engines (operating under sea-level conditions with high-pressure compressor degradation).
  • test_FD001.csv: Operational histories for 100 test engines where recording is truncated prior to failure.
  • RUL_FD001.csv: Ground-truth Remaining Useful Life (remaining cycles) for the 100 test engines.
NASA Damage Propagation Context:

As detailed in the accompanying "Damage Propagation Modeling.pdf" and "readme.txt", each turbofan simulation begins with normal operations and develops varying degrees of initial wear and manufacturing deviations (unknown to the model). Over operational cycles, component faults propagate (such as High-Pressure Compressor blade erosion and Fan blade wear) until critical failure. The data is contaminated with sensor noise and consists of 26 columns: Engine ID, cycles, 3 operational settings, and 21 distinct thermo-mechanical sensors.

train_FD001.csv (Simulated Run-to-Failure - First 5 Rows Preview):
unit_number time_in_cycles op_setting_1 op_setting_2 op_setting_3 sensor_1 sensor_2 sensor_3 sensor_4 sensor_5 sensor_6 sensor_7 sensor_8 sensor_9 sensor_10 sensor_11 sensor_12 sensor_13 sensor_14 sensor_15 sensor_16 sensor_17 sensor_18 sensor_19 sensor_20 sensor_21
1 1 -0.0007 -0.0004 100.0 518.67 641.82 1589.70 1400.60 14.62 21.61 554.36 2388.06 9046.19 1.30 47.47 521.66 2388.02 8138.62 8.4195 0.03 392 2388 100.00 39.06 23.4190
1 2 0.0019 -0.0003 100.0 518.67 642.15 1591.82 1403.14 14.62 21.61 553.75 2388.04 9044.07 1.30 47.49 522.28 2388.07 8131.49 8.4318 0.03 392 2388 100.00 39.00 23.4236
1 3 -0.0043 0.0003 100.0 518.67 642.35 1587.99 1404.20 14.62 21.61 554.26 2388.08 9052.94 1.30 47.27 522.42 2388.03 8133.23 8.4178 0.03 390 2388 100.00 38.95 23.3442
1 4 0.0007 0.0000 100.0 518.67 642.35 1582.79 1401.87 14.62 21.61 554.45 2388.11 9049.48 1.30 47.13 522.86 2388.08 8133.83 8.3682 0.03 392 2388 100.00 38.88 23.3739
1 5 -0.0019 -0.0002 100.0 518.67 642.37 1582.85 1406.22 14.62 21.61 554.00 2388.06 9055.15 1.30 47.28 522.19 2388.04 8133.80 8.4294 0.03 393 2388 100.00 38.90 23.4044
Simulated Engine Degradation Visualization: Simulated C-MAPSS Engine Degradation

Reproducibility Note

All code notebooks were developed on Google Colab linked to Google Drive storage. To run them locally, ensure you install dependencies using `pip install -r requirements.txt` (including `lifelines`, `xgboost`, and `lightgbm`), adjust G-Drive mounting lines, and re-map CSV paths relative to your local root directory.

Explore the Codebase

Access the complete machine learning models, lifelines survival analysis regressions, ESP32-S3 microcontroller firmware, and turbofan/tire telemetry preparation pipelines on GitHub.

GitHub Go to GitHub Repository