File size: 2,386 Bytes
254fd25
 
04f1246
 
 
9e90817
c9c35d1
8621979
 
 
 
195b407
8d4e7c2
c9c35d1
 
9e90817
254fd25
 
 
 
9e90817
254fd25
 
 
 
 
 
 
 
 
9e90817
254fd25
 
 
 
8d4e7c2
254fd25
 
 
 
 
 
 
8d4e7c2
254fd25
 
 
 
 
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
import streamlit as st
import joblib
import numpy as np
import pandas as pd

# Load model and encoders
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()

# Streamlit layout
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.")

# Input fields
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"])

# Prediction button
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"])

    # Preprocessing
    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])

    # Predict
    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.")