federated-credit-scoring / webapp /streamlit_app.py
Transcendental-Programmer
feat: complete demo
135d1e4
raw
history blame
4.82 kB
import streamlit as st
import requests
import numpy as np
import time
st.set_page_config(page_title="Federated Credit Scoring Demo", layout="centered")
st.title("Federated Credit Scoring Demo (Federated Learning)")
# Sidebar configuration
st.sidebar.header("Configuration")
SERVER_URL = st.sidebar.text_input("Server URL", value="http://localhost:8080")
DEMO_MODE = st.sidebar.checkbox("Demo Mode (No Server Required)", value=True)
st.markdown("""
This demo shows how multiple banks can collaboratively train a credit scoring model using federated learning, without sharing raw data.
Enter customer features below to get a credit score prediction from the federated model.
""")
# --- Feature Input Form ---
st.header("Enter Customer Features")
with st.form("feature_form"):
features = []
cols = st.columns(4)
for i in range(32):
with cols[i % 4]:
val = st.number_input(f"Feature {i+1}", value=0.0, format="%.4f", key=f"f_{i}")
features.append(val)
submitted = st.form_submit_button("Predict Credit Score")
# --- Prediction ---
if submitted:
if DEMO_MODE:
# Demo mode - simulate prediction
with st.spinner("Processing prediction..."):
time.sleep(1) # Simulate processing time
# Simple demo prediction based on feature values
demo_prediction = sum(features) / len(features) * 100 + 500 # Scale to credit score range
st.success(f"Demo Prediction: Credit Score = {demo_prediction:.2f}")
st.info("πŸ’‘ This is a demo prediction. In a real federated system, this would come from the trained model.")
# Show what would happen in real mode
st.markdown("---")
st.markdown("**What happens in real federated learning:**")
st.markdown("1. Your features are sent to the federated server")
st.markdown("2. Server uses the global model (trained by multiple banks)")
st.markdown("3. Prediction is returned without exposing any bank's data")
else:
# Real mode - connect to server
try:
with st.spinner("Connecting to federated server..."):
resp = requests.post(f"{SERVER_URL}/predict", json={"features": features}, timeout=10)
if resp.status_code == 200:
prediction = resp.json().get("prediction")
st.success(f"Predicted Credit Score: {prediction:.2f}")
else:
st.error(f"Prediction failed: {resp.json().get('error', 'Unknown error')}")
except Exception as e:
st.error(f"Error connecting to server: {e}")
st.info("πŸ’‘ Try enabling Demo Mode to see the interface without a server.")
# --- Training Progress ---
st.header("Federated Training Progress")
if DEMO_MODE:
# Demo training progress
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric("Current Round", "3/10")
with col2:
st.metric("Active Clients", "3")
with col3:
st.metric("Model Accuracy", "85.2%")
with col4:
st.metric("Training Status", "Active")
st.info("πŸ’‘ Demo mode showing simulated training progress. In real federated learning, multiple banks would be training collaboratively.")
else:
# Real training progress
try:
status = requests.get(f"{SERVER_URL}/training_status", timeout=5)
if status.status_code == 200:
data = status.json()
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric("Current Round", f"{data.get('current_round', 0)}/{data.get('total_rounds', 10)}")
with col2:
st.metric("Active Clients", data.get('active_clients', 0))
with col3:
st.metric("Clients Ready", data.get('clients_ready', 0))
with col4:
st.metric("Training Status", "Active" if data.get('training_active', False) else "Inactive")
else:
st.warning("Could not fetch training status.")
except Exception as e:
st.warning(f"Could not connect to server for training status: {e}")
# --- How it works ---
st.header("How Federated Learning Works")
st.markdown("""
**Traditional ML:** All banks send their data to a central server β†’ Privacy risk ❌
**Federated Learning:**
1. Each bank keeps their data locally βœ…
2. Banks train models on their own data βœ…
3. Only model updates (not data) are shared βœ…
4. Server aggregates updates to create global model βœ…
5. Global model is distributed back to all banks βœ…
**Result:** Collaborative learning without data sharing! 🎯
""")
st.markdown("---")
st.markdown("""
*This is a demonstration of federated learning concepts. For full functionality, run the federated server and clients locally.*
""")