| import os |
| import joblib |
| import pandas as pd |
| import streamlit as st |
| from huggingface_hub import hf_hub_download |
|
|
| HF_MODEL_REPO_ID = os.getenv("HF_MODEL_REPO_ID", "premswan/engine-predictive-maintenance-model") |
| MODEL_FILENAME = "best_engine_maintenance_model.joblib" |
| FEATURE_COLUMNS = ["Engine_RPM", "Lub_Oil_Pressure", "Fuel_Pressure", "Coolant_Pressure", "Lub_Oil_Temperature", "Coolant_Temperature"] |
|
|
| LABEL_MAP = { |
| 0: "Normal / Healthy", |
| 1: "Maintenance Required / Faulty" |
| } |
|
|
|
|
| @st.cache_resource |
| def load_model(): |
| token = os.getenv("HF_TOKEN") |
| model_path = hf_hub_download( |
| repo_id=HF_MODEL_REPO_ID, |
| filename=MODEL_FILENAME, |
| token=token |
| ) |
| return joblib.load(model_path) |
|
|
|
|
| MODEL = load_model() |
|
|
| st.set_page_config( |
| page_title="Engine Predictive Maintenance", |
| page_icon="🔧", |
| layout="wide" |
| ) |
|
|
| st.title("Engine Predictive Maintenance Classifier") |
| st.write( |
| "Enter engine sensor readings. The app loads the registered model from " |
| "Hugging Face Model Hub and predicts whether maintenance is required." |
| ) |
|
|
| with st.form("prediction_form"): |
| st.subheader("Sensor Inputs") |
| sensor_values = {} |
| cols = st.columns(2) |
| for idx, feature in enumerate(FEATURE_COLUMNS): |
| with cols[idx % 2]: |
| sensor_values[feature] = st.number_input( |
| label=feature, |
| value=0.0, |
| format="%.6f" |
| ) |
|
|
| submitted = st.form_submit_button("Predict Engine Condition") |
|
|
| if submitted: |
| input_df = pd.DataFrame([sensor_values], columns=FEATURE_COLUMNS) |
| prediction = int(MODEL.predict(input_df)[0]) |
|
|
| if hasattr(MODEL, "predict_proba"): |
| probability_maintenance = float(MODEL.predict_proba(input_df)[0, 1]) |
| else: |
| probability_maintenance = None |
|
|
| prediction_label = LABEL_MAP.get(prediction, str(prediction)) |
|
|
| st.subheader("Prediction Output") |
| st.metric("Predicted Engine Condition", prediction_label) |
|
|
| if probability_maintenance is not None: |
| st.metric("Probability of Maintenance/Faulty Class", "%.4f" % probability_maintenance) |
|
|
| if prediction == 1: |
| st.error("Recommended action: Schedule inspection or preventive maintenance before continued operation.") |
| else: |
| st.success("Recommended action: Continue normal operation and keep monitoring sensor readings.") |
|
|
| st.subheader("Input DataFrame Used for Inference") |
| st.dataframe(input_df, use_container_width=True) |
|
|