File size: 4,368 Bytes
4a54a97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler
import streamlit as st
import joblib
import os

# Load dataset
df = pd.read_csv('heart.csv')

# Load trained model safely
model_path = 'classification_model.pkl'
if os.path.exists(model_path):
    model = joblib.load(model_path)
else:
    st.error("Error: Model file not found. Please check 'classification_model.pkl'.")
    model = None

# Validate model
if model is None:
    raise ValueError("The loaded model is None. Check the file path or format.")

# Define preprocessing
preprocessor = ColumnTransformer(
    transformers=[ 
        ('num', StandardScaler(), ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach',
                                   'exang', 'oldpeak', 'slope', 'ca', 'thal'])
    ]
)

# Create a pipeline with the classifier
pipeline = Pipeline(steps=[('preprocessor', preprocessor), ('classifier', model)])

# Fit the pipeline only if the model is valid
X = df[['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal']]
y = df['target']
try:
    pipeline.fit(X, y)
except Exception as e:
    st.error(f"Pipeline fitting error: {e}")

# Prediction function
def predict_heart_disease(age, sex, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, slope, ca, thal):
    input_data = pd.DataFrame({
        'age': [age], 'sex': [sex], 'cp': [cp], 'trestbps': [trestbps], 'chol': [chol],
        'fbs': [fbs], 'restecg': [restecg], 'thalach': [thalach], 'exang': [exang],
        'oldpeak': [oldpeak], 'slope': [slope], 'ca': [ca], 'thal': [thal]
    })
    prediction = pipeline.predict(input_data)[0]
    return "\U0001F534 High Risk: Heart Disease Detected" if prediction == 1 else "\U0001F7E2 Low Risk: No Heart Disease"

# Streamlit App
def main():
    st.markdown("""
        <h1 style='text-align: center; color: #FF4B4B;'>❤️ Heart Disease Prediction ❤️</h1>
        <p style='text-align: center;'>Enter your health details in the sidebar to check your risk level.</p>
    """, unsafe_allow_html=True)

    # Sidebar for user inputs
    st.sidebar.header("🔍 Enter Your Health Details")
    age = st.sidebar.number_input('Age', min_value=0, max_value=120, step=1)
    sex = st.sidebar.selectbox('Sex', ["Female (0)", "Male (1)"])
    cp = st.sidebar.selectbox('Chest Pain Type', ["0 - Typical Angina", "1 - Atypical Angina", "2 - Non-Anginal", "3 - Asymptomatic"])
    trestbps = st.sidebar.number_input('Resting Blood Pressure (mm Hg)', min_value=80, max_value=200, step=1)
    chol = st.sidebar.number_input('Serum Cholesterol (mg/dl)', min_value=100, max_value=600, step=1)
    fbs = st.sidebar.selectbox('Fasting Blood Sugar > 120 mg/dl', ["No (0)", "Yes (1)"])
    restecg = st.sidebar.selectbox('Resting ECG', ["0 - Normal", "1 - ST-T Wave Abnormality", "2 - LV Hypertrophy"])
    thalach = st.sidebar.number_input('Max Heart Rate Achieved', min_value=60, max_value=220, step=1)
    exang = st.sidebar.selectbox('Exercise-Induced Angina', ["No (0)", "Yes (1)"])
    oldpeak = st.sidebar.number_input('ST Depression Induced by Exercise', min_value=0.0, max_value=6.2, step=0.1)
    slope = st.sidebar.selectbox('Slope of Peak Exercise ST', ["0 - Upsloping", "1 - Flat", "2 - Downsloping"])
    ca = st.sidebar.selectbox('Major Vessels Colored by Fluoroscopy', [0, 1, 2, 3, 4])
    thal = st.sidebar.selectbox('Thalassemia', ["1 - Normal", "2 - Fixed defect", "3 - Reversible defect"])
    
    # Convert categorical inputs to numeric
    sex = 1 if sex == "Male (1)" else 0
    cp = int(cp[0])
    fbs = 1 if fbs == "Yes (1)" else 0
    restecg = int(restecg[0])
    exang = 1 if exang == "Yes (1)" else 0
    slope = int(slope[0])
    thal = int(thal[0])

    if st.sidebar.button('🔎 Predict'):
        prediction = predict_heart_disease(age, sex, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, slope, ca, thal)
        st.markdown(f"""
            <div style='text-align: center; font-size: 24px; font-weight: bold; padding: 15px; 
                border-radius: 10px; color: white; background-color: {'#FF4B4B' if 'High' in prediction else '#4CAF50'};'>
                {prediction}
            </div>
        """, unsafe_allow_html=True)

if __name__ == '__main__':
    main()