asmaa1's picture
Update app.py
1f02dd4 verified
import gradio as gr
import pandas as pd
import pickle
# Load model RF using pickle
with open('random_forest_model.joblib', 'rb') as f:
best_rf_model = pickle.load(f)
def predict_heart_disease(Age, Sex, ChestPainType, RestingBP, Cholesterol, FastingBS, RestingECG, MaxHR, ExerciseAngina, Oldpeak, ST_Slope):
# Map categorical inputs to numeric values
sex_mapping = {"Female": 0, "Male": 1}
chest_pain_mapping = {"TA": 0, "ATA": 1, "NAP": 2, "ASY": 3}
fasting_bs_mapping = {"< 120 mg/dl": 0, "> 120 mg/dl": 1}
resting_ecg_mapping = {"Normal": 0, "ST": 1, "LVH": 2}
exercise_angina_mapping = {"No": 0, "Yes": 1}
st_slope_mapping = {"Up": 0, "Flat": 1, "Down": 2}
# Adapt input data to model format
input_data = {
'Age': int(Age),
'Sex': sex_mapping[Sex],
'ChestPainType': chest_pain_mapping[ChestPainType],
'RestingBP': int(RestingBP),
'Cholesterol': int(Cholesterol),
'FastingBS': fasting_bs_mapping[FastingBS],
'RestingECG': resting_ecg_mapping[RestingECG],
'MaxHR': int(MaxHR),
'ExerciseAngina': exercise_angina_mapping[ExerciseAngina],
'Oldpeak': float(Oldpeak),
'ST_Slope': st_slope_mapping[ST_Slope]
}
# Input data to input dataframe
input_df = pd.DataFrame([input_data])
# Run prediction
prediction = best_rf_model.predict(input_df)
# Return output with doctor's advice
prediction_message = (
"Based on your inputs, there is no evidence of heart disease. "
"It's important to maintain a healthy lifestyle and consider regular check-ups."
) if prediction[0] == 0 else (
"Based on your inputs, there may be possible evidence of heart disease. "
"Please consult a healthcare professional for a thorough evaluation and further guidance."
)
# Return both the prediction message and image
return prediction_message, image_url
# Image URL
image_url = "heart.png"
# Set input and outputs of interface
iface = gr.Interface(
fn=predict_heart_disease,
inputs=[
gr.Number(label="Age", value=40),
gr.Radio(label="Sex", choices=["Female", "Male"], type="value", value="Male"),
gr.Radio(label="Chest Pain Type", choices=["TA", "ATA", "NAP", "ASY"], type="value", value="ATA"),
gr.Number(label="Resting BP (Blood Pressure)", value=140),
gr.Number(label="Cholesterol", value=289),
gr.Radio(label="Fasting BS", choices=["< 120 mg/dl", "> 120 mg/dl"], type="value", value="< 120 mg/dl"),
gr.Radio(label="Resting ECG", choices=["Normal", "ST", "LVH"], type="value", value="ST"),
gr.Number(label="Max HR (Maximum Heart Rate)", value=172),
gr.Radio(label="Exercise Angina", choices=["No", "Yes"], type="value", value="No"),
gr.Number(label="Oldpeak: Numeric value measured in depression", value=0),
gr.Radio(label="ST Slope", choices=["Up", "Flat", "Down"], type="value", value="Down")
],
outputs=[gr.Text(label="Prediction"), gr.Image(value=image_url, label="Image", show_label=True)],
title="Heart Disease Prediction",
description="Please enter the following details:",
theme=gr.themes.Soft()
)
# Launch Gradio
iface.launch(debug=True)