|
|
import streamlit as st |
|
|
import joblib |
|
|
import numpy as np |
|
|
import pandas as pd |
|
|
|
|
|
|
|
|
try: |
|
|
model = joblib.load("src/best_stroke_model.pkl") |
|
|
x_num_scaler = joblib.load("src/x_num_scaler.pkl") |
|
|
x_cat_encoder = joblib.load("src/x_cat_encoder.pkl") |
|
|
x_cat_ordinal_encoder = joblib.load("src/x_cat_ordinal_encoder.pkl") |
|
|
except Exception as e: |
|
|
st.error(f"Failed to load model or encoders: {e}") |
|
|
st.stop() |
|
|
|
|
|
|
|
|
st.set_page_config(page_title="Stroke Prediction App", page_icon="🧠", layout="centered") |
|
|
st.title("🧠 Stroke Prediction App") |
|
|
st.write("Fill in the details below to check the risk of stroke.") |
|
|
|
|
|
|
|
|
gender = st.selectbox("Gender", ["Male", "Female", "Other"]) |
|
|
age = st.number_input("Age", min_value=1, max_value=120, value=30) |
|
|
hypertension = st.selectbox("Hypertension (0=No, 1=Yes)", [0, 1]) |
|
|
heart_disease = st.selectbox("Heart Disease (0=No, 1=Yes)", [0, 1]) |
|
|
work_type = st.selectbox("Work Type", ["Private", "Self-employed", "Govt_job", "children", "Never_worked"]) |
|
|
avg_glucose_level = st.number_input("Average Glucose Level", min_value=50.0, max_value=300.0, value=100.0) |
|
|
bmi = st.number_input("BMI", min_value=10.0, max_value=50.0, value=22.0) |
|
|
smoking_status = st.selectbox("Smoking Status", ["never smoked", "formerly smoked", "smokes", "Unknown"]) |
|
|
|
|
|
|
|
|
if st.button("Predict"): |
|
|
input_df = pd.DataFrame([[gender, age, hypertension, heart_disease, work_type, avg_glucose_level, bmi, smoking_status]], |
|
|
columns=["gender", "age", "hypertension", "heart_disease", "work_type", "avg_glucose_level", "bmi", "smoking_status"]) |
|
|
|
|
|
|
|
|
scaled_x_num = x_num_scaler.transform(input_df[["age", "avg_glucose_level", "bmi"]]) |
|
|
binary_x = input_df[["hypertension", "heart_disease"]].values |
|
|
encoded_x_cat = x_cat_encoder.transform(input_df[["work_type", "smoking_status"]]) |
|
|
ordinal_encoded_x_cat = x_cat_ordinal_encoder.transform(input_df[["gender"]]) |
|
|
|
|
|
final_x = np.hstack([scaled_x_num, binary_x, encoded_x_cat, ordinal_encoded_x_cat]) |
|
|
|
|
|
|
|
|
prediction = model.predict(final_x) |
|
|
result = "⚠️ High Risk of Stroke" if prediction[0] == 1 else "✅ Low Risk of Stroke" |
|
|
|
|
|
st.success(f"**Prediction:** {result}") |
|
|
st.info("This prediction is based on machine learning and should not replace professional medical advice.") |
|
|
|