Heart-attack / app.py
mouneshpawar6388
Initial commit for Hugging Face Space
6396193
import gradio as gr
import numpy as np
import joblib
import pandas as pd
from tensorflow.keras.models import load_model
import json
import os
# ── Load Model & Scaler ───────────────────────────────────────────────
# In HF Spaces, files are in the root directory
try:
model = load_model("saved_model/heart_attack_model.keras")
scaler = joblib.load("saved_model/scaler.pkl")
with open("saved_model/metadata.json", "r") as f:
metadata = json.load(f)
print("✅ Model and Scaler loaded successfully!")
except Exception as e:
print(f"❌ Error loading model: {e}")
# Fallback/Mock for testing if files are missing in build
raise e
# ── Prediction Function ───────────────────────────────────────────────
def predict_heart_attack(age, sex, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, slope, ca, thal):
# Mapping for categorical inputs (if used as dropdowns)
# Ensure inputs match the training schema exactly
input_data = np.array([[
float(age),
float(sex),
float(cp),
float(trestbps),
float(chol),
float(fbs),
float(restecg),
float(thalach),
float(exang),
float(oldpeak),
float(slope),
float(ca),
float(thal)
]])
# Scale features
input_scaled = scaler.transform(input_data)
# Predict
prob = float(model.predict(input_scaled, verbose=0)[0][0])
label = "High Risk 🚨" if prob > 0.5 else "Low Risk ✅"
confidence = prob if prob > 0.5 else 1 - prob
return {
"Risk Assessment": label,
"Probability": f"{prob:.1%}",
"Confidence": f"{confidence:.1%}"
}
# ── Create Gradio UI ──────────────────────────────────────────────────
with gr.Blocks(title="Heart Attack Risk Predictor") as demo:
gr.Markdown("# ❤️ Heart Attack Risk Predictor")
gr.Markdown("Enter patient details below to estimate heart attack risk using a Neural Network.")
with gr.Row():
with gr.Column():
age = gr.Number(label="Age", value=63)
sex = gr.Radio(label="Sex", choices=[("Male", 1), ("Female", 0)], value=1)
cp = gr.Slider(label="Chest Pain Type (0-3)", minimum=0, maximum=3, step=1, value=3)
trestbps = gr.Number(label="Resting Blood Pressure (mm Hg)", value=145)
chol = gr.Number(label="Cholesterol (mg/dl)", value=233)
fbs = gr.Radio(label="Fasting Blood Sugar > 120 mg/dl", choices=[("True", 1), ("False", 0)], value=1)
restecg = gr.Slider(label="Resting ECG Results (0-2)", minimum=0, maximum=2, step=1, value=0)
with gr.Column():
thalach = gr.Number(label="Max Heart Rate Achieved", value=150)
exang = gr.Radio(label="Exercise Induced Angina", choices=[("Yes", 1), ("No", 0)], value=0)
oldpeak = gr.Number(label="ST Depression (Oldpeak)", value=2.3)
slope = gr.Slider(label="Slope of Peak Exercise ST (0-2)", minimum=0, maximum=2, step=1, value=0)
ca = gr.Slider(label="Number of Major Vessels (0-3)", minimum=0, maximum=3, step=1, value=0)
thal = gr.Slider(label="Thalassemia (0-3)", minimum=0, maximum=3, step=1, value=1)
btn = gr.Button("Predict Risk", variant="primary")
output = gr.JSON(label="Prediction Results")
btn.click(
predict_heart_attack,
inputs=[age, sex, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, slope, ca, thal],
outputs=output
)
gr.Markdown("---")
gr.Markdown("### Model Info")
gr.Markdown(f"- **Features:** {len(metadata['features'])}")
gr.Markdown(f"- **Accuracy (Test):** ~80%")
# ── Launch ────────────────────────────────────────────────────────────
if __name__ == "__main__":
demo.launch()