import streamlit as st import pandas as pd import numpy as np import joblib import ast # Set page title and favicon st.set_page_config(page_title='Heart Failure Prediction', page_icon=':heart:') # Load models and data with open('model_scaler.pkl', 'rb') as file_1: model_scaler = joblib.load(file_1) with open('rf_best_model.pkl', 'rb') as file_2: rf_random_best = joblib.load(file_2) with open('list_num_col.txt', 'r') as file_3: num_col = file_3.read() with open('list_cat_col.txt', 'r') as file_4: cat_col = file_4.read() with open('boxcox.pkl', 'rb') as file_5: box = joblib.load(file_5) num_col = ast.literal_eval(num_col) cat_col = ast.literal_eval(cat_col) # Set page header st.title('Heart Failure Prediction') # Add page description st.markdown('This web app predicts the likelihood of heart failure based on several factors. Fill in the form below and click the "Predict" button to get your results.') # Add form inputs time = st.slider('Follow-up period (days)', min_value=1, max_value=365, step=1) age = st.slider('Age', 30, 120, step=1) ejection_fraction = st.number_input('Ejection fraction', min_value=1, max_value=100, step=1) serum_creatinine = st.number_input('Serum creatinine', min_value=0.0, max_value=10.0, step=0.01) serum_sodium = st.number_input('Serum sodium', min_value=100, max_value=150, step=1) anaemia = st.radio('Anemia', ('Yes', 'No')) diabetes = st.radio('Diabetes', ('Yes', 'No')) smoking = st.radio('Smoking', ('Yes', 'No')) # Add prediction button if st.button('Predict'): # Process form inputs data_inf = pd.DataFrame({'time': time, 'ejection_fraction': ejection_fraction, 'age': age, 'serum_creatinine': serum_creatinine, 'serum_sodium': serum_sodium, 'anaemia': 1 if anaemia == 'Yes' else 0, 'diabetes': 1 if diabetes == 'Yes' else 0, 'smoking': 1 if smoking == 'Yes' else 0 }, index=[0]) data_inf_t = box.transform(data_inf) data_inf_num = data_inf_t[num_col] data_inf_cat = data_inf_t[cat_col] data_inf_num_scaled = data_inf_num.copy() data_inf_num_scaled[num_col] = model_scaler.transform(data_inf_num[num_col]) data_inf_cat_encoded = data_inf_cat.copy() data_inf_final = np.concatenate([data_inf_num_scaled, data_inf_cat_encoded], axis=1) result = rf_random_best.predict(data_inf_final)[0] # Display prediction result st.markdown('## Prediction result') if result == 1: st.markdown(':heart: **High risk of heart failure!** :heart:') else: st.markdown(':thumbsup: **Low risk of heart failure.** :thumbsup:')