import streamlit as st import pandas as pd import joblib from PIL import Image # Custom styling for the app st.markdown( """ """, unsafe_allow_html=True, ) # Load the model @st.cache_resource def load_model(): return joblib.load("best_model.pkl") model = load_model() # Sidebar customization with st.sidebar: st.image("MAT_primary-logo@2x.jpg", use_container_width=True) st.header("Retention Predictor") st.write("Enter the required details below to predict retention probability.") # Main app title st.markdown('
Analyze patient retention using advanced ML models.
', unsafe_allow_html=True) # Input fields for features st.sidebar.subheader("Patient Episode Details") previous_bup_episodes = st.sidebar.number_input( "Number of Previous Buprenorphine Episodes", min_value=0, value=20, step=1 ) previous_failed_bup_episodes = st.sidebar.number_input( "Number of Previous Failed Buprenorphine Episodes", min_value=0, value=20, step=1 ) st.sidebar.subheader("Duration Details") days_covered = st.sidebar.number_input( "Days Covered in Current Episode", min_value=0, value=30, step=1 ) days_since_start = st.sidebar.number_input( "Days Since Start of the Episode", min_value=1, value=90, step=1 ) st.sidebar.subheader("Other Features") prior_BUP_days_supply = st.sidebar.number_input( "Prior BUP Days Supply", min_value=0, value=30, step=1 ) YearOfInitiation = st.sidebar.number_input( "Year of Initiation", min_value=1900, max_value=2100, value=2023, step=1 ) Previous_Meth_Episodes = st.sidebar.radio( "Previous Methadone Episodes (Yes/No)", options=[0, 1], format_func=lambda x: "Yes" if x == 1 else "No", ) # Calculate derived features and predict if st.sidebar.button("🔍 Predict Retention Probability"): # Calculate derived features if previous_bup_episodes > 0: Failed_Bup_Rate = previous_failed_bup_episodes / previous_bup_episodes else: Failed_Bup_Rate = 0.0 if days_since_start > 0: proportionofDaysCovered = days_covered / days_since_start else: proportionofDaysCovered = 0.0 # Prepare input data input_data = pd.DataFrame( { "proportionofDaysCovered": [proportionofDaysCovered], "Failed_Bup_Rate": [Failed_Bup_Rate], "prior_BUP_days_supply": [prior_BUP_days_supply], "YearOfInitiation": [YearOfInitiation], "Previous_Meth_Episodes": [Previous_Meth_Episodes], } ) # Make prediction proba_output = model.predict_proba(input_data) print("Predict_proba output shape:", proba_output.shape) # Handle both 1D and 2D outputs retention_probability = ( proba_output[:, 1][0] if proba_output.ndim == 2 else proba_output[0] ) # Display the prediction result in a styled card st.markdown( f"""The predicted retention probability is:
{retention_probability:.2f}