File size: 3,253 Bytes
042c24d
 
d1d7b91
042c24d
d1d7b91
6d4869a
d1d7b91
042c24d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d1d7b91
042c24d
 
 
 
 
 
 
 
 
 
 
d1d7b91
1f02dd4
042c24d
 
 
 
 
d1d7b91
042c24d
 
d1d7b91
 
042c24d
 
d1d7b91
042c24d
d1d7b91
042c24d
 
d1d7b91
042c24d
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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)