What I Built
Built a production-grade ML system that combines tabular credit features with graph-derived contagion metrics to score borrowers and simulate systemic risk cascades across a real-world P2P lending network (89,171 nodes, 3.4M edges). The system uses XGBoost with 29 features (12 tabular + 10 graph + 7 interaction), delivers per-request SHAP explainability in under 10ms, and simulates BFS-based domino cascades showing how a single default propagates through co-borrower, guarantor, and employer relationships. All 9 services (FastAPI, Streamlit, MLflow, Airflow, Neo4j, PostgreSQL, ClickHouse, Prometheus, Grafana) start with a single docker compose up.
What I Learned
Graph features are first-class citizens, not afterthoughts. Traditional credit models treat applicants as independent — but a borrower whose three co-borrowers just defaulted is categorically different from one whose network is healthy, even with identical income and credit score. Hand-crafted graph features (neighbor default fractions, 2-hop contagion, PageRank) outperformed learned embeddings (Spectral, Node2Vec, GraphSAGE) on this dense, high-degree graph. GraphSAGE hit AUC 0.50 due to oversmoothing on avg-degree-76 nodes, validating findings from Shchur et al. (2019). Five of the top 10 SHAP features are graph-derived — the network structure carries material signal.
Key Results
| Metric | Result |
|---|---|
| ROC-AUC | 0.829 |
| Scoring latency (p50 / p95 / p99) | 2.2 ms / 5.6 ms / 7.8 ms |
| Graph scale | 89,171 nodes · 3.4M edges |
| Features | 29 (12 tabular + 10 graph + 7 interactions) |
| Throughput | ~450 req/s (cached) |
| Infrastructure | 9 Docker containers, single command startup |
| Tests | 61 passed across 7 modules |
| CI | GitHub Actions (lint → test → dbt → Docker build) |
Project
Tech Stack: XGBoost, SHAP, Neo4j + GDS, FastAPI, Airflow 3.1, MLflow 3.10, dbt, PostgreSQL, ClickHouse, Streamlit, Prometheus, Grafana, Evidently, Docker Compose | Data: Prosper P2P lending network (KONECT)
Citation
@online{prasanna_koppolu,
author = {Prasanna Koppolu, Bhanu},
title = {Billy — {Credit} {Domino}},
url = {https://bhanuprasanna2001.github.io/projects/billy.html},
langid = {en}
}