| import streamlit as st
|
| from tensorflow.keras.models import load_model
|
| import numpy as np
|
| import joblib
|
|
|
| def get_user_values():
|
|
|
| user_values = {}
|
|
|
|
|
| st.title("Heart Disease Detector")
|
|
|
|
|
| user_values["age"] = st.slider(label="What is your age?", min_value=0, max_value=100)
|
|
|
|
|
| user_values["sex"] = st.radio(label="What is your sex?", options=["Male", "Female"])
|
|
|
|
|
| user_values["cp"] = st.radio(label="Select a chest pain type:", options=["0 - Typical angina", "1 - Atypical angina", "2 - Non-anginal pain", "3 - Asymptomatic"])
|
|
|
|
|
| user_values["trestbps"] = st.number_input(label="What is your resting blood pressure?")
|
|
|
|
|
| user_values["chol"] = st.number_input(label="What is your total serum cholesterol (in mg/dl)?")
|
|
|
|
|
| user_values["fbs"] = st.radio(label="Is your fasting blood sugar greater than 120 mg/dl?", options=["Yes", "No"])
|
|
|
|
|
| user_values["restecg"] = st.radio(label="What is your resting electrocardiographic result?", options=["0 — Normal ECG", "1 — ST-T Wave Abnormality", "2 — Left Ventricular Hypertrophy (LVH) by Estes’ Criteria"])
|
|
|
|
|
| user_values["thalach"] = st.number_input(label="What is your maximum heart rate?")
|
|
|
|
|
| user_values["exang"] = st.radio(label="Do you have exercise induced angina?", options=["Yes", "No"])
|
|
|
|
|
| user_values["oldpeak"] = st.number_input(label="Type the ST depression induced by exercise relative to rest:")
|
|
|
|
|
| user_values["slope"] = st.number_input(label="Type the the slope of the peak exercise ST segment:")
|
|
|
|
|
| user_values["ca"] = st.radio(label="How many major blood vessels were colored by flourosopy?", options=["0", "1", "2", "3"])
|
|
|
|
|
| user_values["thal"] = st.radio(label="What is your thalassemia test result?", options=["1 - Normal", "2 - Fixed Defect", "3 - Reversible Defect"])
|
|
|
|
|
| return user_values
|
|
|
|
|
| def translate_user_values(user_values):
|
| translated = {}
|
|
|
|
|
| translated["age"] = int(user_values["age"])
|
|
|
|
|
| translated["sex"] = 1 if user_values["sex"] == "Male" else 0
|
|
|
|
|
|
|
| translated["cp"] = int(user_values["cp"].split(" ")[0])
|
|
|
|
|
| translated["trestbps"] = float(user_values["trestbps"])
|
|
|
|
|
| translated["chol"] = float(user_values["chol"])
|
|
|
|
|
| translated["fbs"] = 1 if user_values["fbs"] == "Yes" else 0
|
|
|
|
|
|
|
| translated["restecg"] = int(user_values["restecg"].split(" ")[0])
|
|
|
|
|
| translated["thalach"] = float(user_values["thalach"])
|
|
|
|
|
| translated["exang"] = 1 if user_values["exang"] == "Yes" else 0
|
|
|
|
|
| translated["oldpeak"] = float(user_values["oldpeak"])
|
|
|
|
|
| translated["slope"] = float(user_values["slope"])
|
|
|
|
|
| translated["ca"] = int(user_values["ca"])
|
|
|
|
|
| thal_raw = int(user_values["thal"].split(" ")[0])
|
| translated["thal"] = thal_raw
|
|
|
| return translated
|
|
|
|
|
| def report_heart_disease_verdict(tf_model, X, fitted_stand_scaler, fitted_rob_scaler):
|
|
|
| X = fitted_stand_scaler.transform(X)
|
| X = fitted_rob_scaler.transform(X)
|
|
|
|
|
| verdict = tf_model.predict(X)
|
|
|
|
|
| if verdict == 1:
|
| st.write("Verdict: You likely have a heart disease.")
|
| else:
|
| st.write("Verdict: You likely do not have a heart disease.")
|
|
|
|
|
| def main():
|
|
|
| tf_model = load_model(filepath="models/tf_mlp.keras")
|
|
|
|
|
|
|
|
|
| fitted_stand_scaler = joblib.load("models/standard_scaler.pkl")
|
| fitted_rob_scaler = joblib.load("models/robust_scaler.pkl")
|
|
|
|
|
| user_values = get_user_values()
|
|
|
|
|
| translated_values = translate_user_values(user_values)
|
|
|
|
|
| translated_values["age_squared"] = translated_values["age"] * translated_values["age"]
|
| translated_values["chol_times_trestbps"] = translated_values["chol"] * translated_values["trestbps"]
|
| translated_values["age_times_thalach"] = translated_values["age"] * translated_values["thalach"]
|
| translated_values["oldpeak_squared"] = translated_values["oldpeak"] * translated_values["oldpeak"]
|
|
|
|
|
| translated_values_array = np.array([list(translated_values.values())], dtype=float)
|
|
|
|
|
|
|
| want_prediction = st.radio(label="Predict?", options=["No", "Yes"])
|
| if want_prediction == "Yes":
|
| report_heart_disease_verdict(tf_model, translated_values_array, fitted_stand_scaler, fitted_rob_scaler)
|
|
|
|
|
| if __name__ == '__main__':
|
| main() |