import gradio as gr import pandas as pd import numpy as np import joblib import os # Load the saved model pipeline model_path = 'credit_risk_assessment_model.pkl' if os.path.exists(model_path): model = joblib.load(model_path) print(f"✅ Model loaded successfully from {model_path}") else: print(f"⚠️ Model file not found at {model_path}. Upload it to this Space.") model = None # ---- HELPER FUNCTIONS ---- def get_age_group(age): if age < 30: return '20-30' elif age < 40: return '30-40' elif age < 50: return '40-50' elif age < 60: return '50-60' elif age < 70: return '60-70' else: return '70+' def get_credit_amount_group(amount): if amount < 2000: return 'Low' elif amount < 5000: return 'Medium' elif amount < 10000: return 'High' else: return 'Very High' def get_duration_group(duration): if duration <= 12: return 'Short' elif duration <= 36: return 'Medium' else: return 'Long' def get_employment_stability(emp): return { 'A71': 'Unstable', 'A72': 'Unstable', 'A73': 'Moderate', 'A74': 'Stable', 'A75': 'Very Stable' }.get(emp, 'Moderate') def get_savings_status(savings): return { 'A61': 'None/Low', 'A62': 'Moderate', 'A63': 'Moderate', 'A64': 'High', 'A65': 'None/Low' }.get(savings, 'None/Low') def get_credit_history_simple(history): return { 'A30': 'Poor', 'A31': 'Good', 'A32': 'Good', 'A33': 'Fair', 'A34': 'Poor' }.get(history, 'Fair') def calculate_risk_flags(age, credit_amount, duration, checking_account): return { 'young_high_credit_flag': int(age < 30 and credit_amount > 5000), 'high_exposure_flag': int(credit_amount > 7500 and duration > 24), 'critical_high_amount_flag': int(credit_amount > 10000), 'no_checking_high_credit_flag': int(checking_account == 'A14' and credit_amount > 5000), 'checking_risk': int(checking_account in ['A13', 'A14']) } def calculate_additional_risk_flags(credit_history, savings_account): history_risk = int(credit_history in ['A30', 'A34']) savings_risk = int(savings_account in ['A61', 'A65']) combined_account_risk = history_risk + savings_risk return { 'history_risk': history_risk, 'savings_risk': savings_risk, 'combined_account_risk': combined_account_risk } # ---- PREDICTION WRAPPER ---- def predict_credit_risk(checking_account, duration, credit_history, purpose, credit_amount, savings_account, employment_since, installment_rate, personal_status_sex, other_debtors, present_residence, property, age, other_installment_plans, housing, number_credits, job, people_liable, telephone, foreign_worker): # If model isn't loaded, show error if model is None: return """

Error: Model not loaded

The credit risk model has not been loaded. Please check the server logs.

""" try: # Calculate derived features age_group = get_age_group(age) credit_amount_group = get_credit_amount_group(credit_amount) duration_group = get_duration_group(duration) employment_stability = get_employment_stability(employment_since) savings_status = get_savings_status(savings_account) credit_history_simple = get_credit_history_simple(credit_history) credit_per_month = credit_amount / duration if duration > 0 else 0 age_to_credit_ratio = credit_amount / age if age > 0 else 0 debt_burden = credit_per_month * 100 / 2000 credit_to_duration_ratio = credit_amount / duration if duration > 0 else 0 # Calculate risk flags risk_flags = calculate_risk_flags(age, credit_amount, duration, checking_account) additional_flags = calculate_additional_risk_flags(credit_history, savings_account) # Create input data dictionary with all features input_data = { 'index': 0, # Add index column to fix the error 'checking_account': checking_account, 'duration': duration, 'credit_history': credit_history, 'purpose': purpose, 'credit_amount': credit_amount, 'savings_account': savings_account, 'employment_since': employment_since, 'installment_rate': installment_rate, 'personal_status_sex': personal_status_sex, 'other_debtors': other_debtors, 'present_residence': present_residence, 'property': property, 'age': age, 'other_installment_plans': other_installment_plans, 'housing': housing, 'number_credits': number_credits, 'job': job, 'people_liable': people_liable, 'telephone': telephone, 'foreign_worker': foreign_worker, 'age_group': age_group, 'credit_amount_group': credit_amount_group, 'duration_group': duration_group, 'credit_per_month': credit_per_month, 'employment_stability': employment_stability, 'savings_status': savings_status, 'credit_history_simple': credit_history_simple, 'age_to_credit_ratio': age_to_credit_ratio, 'debt_burden': debt_burden, 'credit_to_duration_ratio': credit_to_duration_ratio, 'duration_history_interaction': int(duration > 24 and credit_history in ['A30', 'A33', 'A34']), 'amount_checking_interaction': int(credit_amount > 5000 and checking_account in ['A13', 'A14']), **risk_flags, **additional_flags } # Convert to DataFrame for prediction df = pd.DataFrame([input_data]) # Make prediction using the pipeline try: # For debugging print(f"Input DataFrame shape: {df.shape}") print(f"Input DataFrame columns: {df.columns.tolist()}") y_proba = model.predict_proba(df)[0][1] # Determine risk level based on probability if y_proba > 0.7: risk = "High Risk" color = "#f44336" # Red approval = "Loan Rejected" icon = "❌" elif y_proba > 0.4: risk = "Medium Risk" color = "#ff9800" # Orange approval = "Further Review Required" icon = "⚠️" else: risk = "Low Risk" color = "#4caf50" # Green approval = "Loan Approved" icon = "✅" # Format a detailed response return f"""

{icon} {risk}: {approval}

Risk Score: {y_proba:.2%}


Key Risk Factors:

""" except Exception as inner_e: print(f"Prediction error: {inner_e}") print(f"DataFrame columns: {df.columns.tolist()}") return f"""

Error in Prediction

{str(inner_e)}

Please check the server logs for details.

""" except Exception as e: print(f"Error in processing: {e}") return f"""

Error Processing Request

{str(e)}

Please check the server logs for details.

"""