Spaces:
Paused
Paused
import streamlit as st | |
import pandas as pd | |
import joblib | |
# Load the model using joblib | |
model_path = "best_gb_model.joblib" # Change to .joblib extension | |
model = joblib.load(model_path) | |
st.title("Loan Default Prediction") | |
st.write(""" | |
This app predicts the likelihood of a loan default based on your input data. | |
Please fill out the fields below to get a prediction. | |
""") | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
member_id = st.number_input('Member ID (int):', min_value=1, help="Unique identifier for the borrower. (Not used in prediction)") | |
with col2: | |
total_payment = st.number_input('Total Payment (float):', min_value=0.0, help="Total amount paid by the borrower.") | |
with col3: | |
income_to_loan_ratio = st.number_input('Income-to-Loan Ratio (float):', min_value=0.0, help="Ratio of the borrower\'s income to the loan amount.") | |
col4, col5, col6 = st.columns(3) | |
with col4: | |
dti_revol_util = st.number_input('Debt-to-Income Ratio (float):', min_value=0.0, help="Debt-to-income ratio and revolving utilization.") | |
with col5: | |
total_recovery = st.number_input('Total Recovery (float):', min_value=0.0, help="Total amount recovered from the borrower.") | |
with col6: | |
balance_to_credit_ratio = st.number_input('Balance-to-Credit Ratio (float):', min_value=0.0, help="Ratio of the balance to the credit limit.") | |
col7, col8, col9 = st.columns(3) | |
with col7: | |
recoveries_to_balance_ratio = st.number_input('Recoveries to Balance Ratio (float):', min_value=0.0, help="Ratio of recoveries to balance.") | |
with col8: | |
batch_enrolled_to_total_rec_int = st.number_input('Batch Enrolled to Total Recovery Interest Ratio (float):', min_value=0.0, help="Ratio of batch enrolled to total recovery interest.") | |
with col9: | |
loan_amnt_total_rec_int_ratio = st.number_input('Loan Amount to Total Recovery Interest Ratio (float):', min_value=0.0, help="Ratio of loan amount to total recovery interest.") | |
emp_length_missing = st.number_input('Employment Length Missing (int, 0 or 1):', min_value=0, max_value=1, help="Indicates if the employment length is missing (0 or 1).") | |
input_data = pd.DataFrame({ | |
'total_payment': [total_payment], | |
'income_to_loan_ratio': [income_to_loan_ratio], | |
'dti_revol_util': [dti_revol_util], | |
'total_recovery': [total_recovery], | |
'balance_to_credit_ratio': [balance_to_credit_ratio], | |
'recoveries_to_balance_ratio': [recoveries_to_balance_ratio], | |
'batch_enrolled_to_total_rec_int': [batch_enrolled_to_total_rec_int], | |
'loan_amnt_total_rec_int_ratio': [loan_amnt_total_rec_int_ratio], | |
'emp_length_missing': [emp_length_missing] | |
}) | |
st.write('Selected input data (excluding Member ID):') | |
st.write(input_data) | |
if st.button('Predict'): | |
try: | |
prediction = model.predict(input_data) | |
prediction_proba = model.predict_proba(input_data)[:, 1] | |
st.write(f'The predicted loan default status is: {"Default" if prediction[0] == 1 else "No Default"}') | |
st.write(f'Probability of Default: {prediction_proba[0]:.2f}') | |
if prediction[0] == 1: | |
st.error('The model predicts that this loan is likely to default.') | |
else: | |
st.success('The model predicts that this loan is not likely to default.') | |
except Exception as e: | |
st.error(f"Error in prediction: {e}") | |