AI-assisted fraud risk scoring for bank account opening applications.
FraudShield adalah proyek portofolio end-to-end machine learning yang memperkirakan risiko fraud pada pengajuan pembukaan rekening bank. Sistem menghasilkan probabilitas terkalibrasi, menjelaskan faktor lokal yang memengaruhi skor, dan menyusun antrean pemeriksaan berdasarkan kapasitas tim fraud operations.
Important
FraudShield merupakan sistem pendukung keputusan. Skor model adalah indikasi risiko, bukan bukti fraud, keputusan kelayakan kredit, atau dasar untuk menerima maupun menolak pengajuan secara otomatis.
- Gambaran umum
- Fitur utama
- Hasil model
- Arsitektur
- Dataset dan pembagian waktu
- Quick start
- Menjalankan workflow ML
- Inference API
- Web UI
- Pengujian
- Struktur proyek
- Batas penggunaan
- Dokumentasi
- Lisensi
FraudShield dibangun untuk mendemonstrasikan lifecycle sistem machine learning yang dapat diaudit, mulai dari validasi data hingga penyajian prediksi melalui API dan web UI.
Proyek ini secara khusus menangani application fraud pada proses onboarding rekening, bukan fraud pada transaksi yang sudah terjadi. Data yang digunakan bersifat sintetis sehingga tidak memuat data pribadi nasabah sebenarnya.
Prinsip utama proyek:
- Pembagian data secara temporal untuk mendekati kondisi deployment.
- Preprocessing, training, calibration, dan evaluasi yang leakage-safe.
- Probabilitas terkalibrasi, bukan hanya label biner.
- Pemilihan review berdasarkan kapasitas operasional 5%.
- Penjelasan lokal menggunakan TreeSHAP.
- Keputusan akhir tetap berada pada analyst manusia.
- Evaluasi test hanya dilakukan sekali setelah model dan kebijakan dikunci.
- Baseline dummy classifier dan logistic regression berbobot kelas.
- Perbandingan kandidat XGBoost dengan konfigurasi yang telah ditentukan.
- Temporal validation dan deterministic model selection.
- Probability calibration menggunakan sigmoid dan isotonic regression.
- Risk band dan exact-capacity review policy.
- Final evaluation pada untouched test period.
- Bootstrap confidence interval, slice metrics, dan error analysis.
- TreeSHAP reason codes untuk setiap prediksi.
- Kontribusi one-hot dan missing indicator digabungkan kembali ke 27 field kontrak.
- Tindakan lanjutan yang membantu analyst melakukan pemeriksaan.
- Penjelasan bersifat lokal dan nonkausal serta tidak menampilkan nilai input sensitif.
- FastAPI inference service dengan startup validation yang fail-closed.
- Versioned production prediction contract.
- Flask web UI sebagai antarmuka utama.
- Single application simulation dan batch review queue.
- Drag-and-drop JSON, validasi client-side, filter, serta ekspor CSV.
- Telemetri agregat tanpa mencatat payload input.
Model final menggunakan xgboost_strong_regularization dengan kalibrasi sigmoid. Evaluasi final dilakukan satu kali pada test month 7 setelah model, calibrator, dan review policy dikunci.
| Metrik | Validation month 6 | Test month 7 |
|---|---|---|
| Average precision | 0.176706 | 0.213467 |
| ROC-AUC | 0.891986 | 0.895401 |
| Brier score | 0.012023* | 0.012859 |
| Expected calibration error | 0.000955* | 0.002036 |
*Nilai validation setelah sigmoid calibration.
Kinerja exact-capacity pada test month 7:
| Metrik operasional | Nilai |
|---|---|
| Jumlah pengajuan | 96.843 |
| Fraud prevalence | 1,4746% |
| Kapasitas review | 5% |
| Pengajuan yang direview | 4.843 |
| Fraud yang tertangkap | 747 |
| Precision at capacity | 15,4243% |
| Recall at capacity | 52,3109% |
Hasil tersebut menggambarkan performa pada dataset sintetis dan tidak otomatis mewakili performa pada sistem bank nyata.
flowchart LR
A[BAF Base dataset] --> B[Temporal split]
B --> C[Preprocessing pipeline]
C --> D[XGBoost model]
D --> E[Sigmoid calibration]
E --> F[Risk band dan review policy]
D --> G[TreeSHAP reason codes]
F --> H[FastAPI inference service]
G --> H
H --> I[Flask web UI]
H --> J[External clients]
I --> K[Human analyst]
Saat serving, sistem hanya memuat artifact yang telah dikunci. API tidak melakukan fitting, recalibration, threshold reselection, atau evaluasi ulang.
Proyek menggunakan Base dataset dari Bank Account Fraud Dataset Suite.
Dataset berisi 1.000.000 baris, 32 kolom, dan periode month 0–7. Data mentah tidak disimpan dalam repository. Letakkan file pada:
data/raw/Base.csv
Identitas file, checksum, distribusi target, dan aturan semantic missing tersedia di data/manifest.json.
| Tujuan | Periode |
|---|---|
| Training | Month 0–4 |
| Calibration | Month 5 |
| Validation dan model selection | Month 6 |
| Final untouched test | Month 7 |
Field yang dikecualikan dari model:
fraud_boolmonthdevice_fraud_countdays_since_requestcredit_risk_score
Pengecualian dilakukan untuk mencegah target leakage dan menjaga prediction-time contract.
- Python 3.12
- Git
- Dataset
Base.csvuntuk menjalankan workflow training - Artifact Fase 5 dan 6 untuk menjalankan inference service
git clone https://github.com/SYFDNNN/fraudshield.git
cd fraudshield
py -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -e ".[dev,serve,flask]"Jika PowerShell memblokir aktivasi virtual environment, jalankan proses menggunakan interpreter secara langsung:
.\.venv\Scripts\python.exe -m pip install -e ".[dev,serve,flask]"Jalankan setiap fase secara berurutan dari root repository.
python -m fraudshield.train --config configs/base.yamlNotebook alternatif: notebooks/03_model_experiments.ipynb.
Fase ini membandingkan dummy classifier, class-weighted logistic regression, dan logistic-regression ablation. Seluruh transformer berada di dalam pipeline dan hanya di-fit pada train month 0–4.
python -m fraudshield.model_selection --config configs/base.yamlNotebook alternatif: notebooks/04_xgboost_model_selection.ipynb.
Kandidat dipilih pada validation month 6 menggunakan average precision, recall at 5% capacity, Brier score, waktu training, dan deterministic tie-breaker. scale_pos_weight dihitung hanya dari label training.
python -m fraudshield.calibrate --config configs/base.yamlNotebook alternatif: notebooks/05_calibration_threshold.ipynb.
Sigmoid dan isotonic di-fit pada month 5, kemudian dipilih pada month 6 berdasarkan Brier score dengan average-precision guardrail. Fase ini juga membentuk:
- Exact-capacity review policy 5%.
- Risk band
sangat_tinggi,tinggi,menengah, danrendah. - Deterministic tie-breaking pada batas kapasitas.
python -m fraudshield.final_evaluate --config configs/base.yamlNotebook alternatif: notebooks/06_final_evaluation.ipynb.
Workflow memverifikasi hash seluruh artifact sebelum membuka month 7. Setelah evaluasi selesai, completion artifact mencegah test evaluation kedua. Tidak tersedia opsi force untuk menimpa hasil final.
Artifact workflow ML disimpan di artifacts/ dan tidak dilacak oleh Git.
Inference membutuhkan artifact berikut:
artifacts/phase5/calibrated_review_model.joblib
artifacts/phase5/phase5_metadata.json
artifacts/phase6/phase6_metadata.json
artifacts/phase6/final_evaluation_completion.json
Jalankan API:
python -m uvicorn app.api:app --host 127.0.0.1 --port 8000Dokumentasi interaktif tersedia di:
http://127.0.0.1:8000/docs
API hanya berstatus ready apabila hash model, calibrator, locked policy, completion evidence, capacity rate, dan fitted feature order cocok.
| Method | Endpoint | Fungsi |
|---|---|---|
GET |
/health/live |
Liveness check |
GET |
/health/ready |
Readiness dan artifact verification |
GET |
/v1/contract |
Kontrak input dan kebijakan aktif |
POST |
/v1/predict |
Prediksi satu pengajuan |
POST |
/v1/predict/batch |
Prediksi dan exact-capacity batch ranking |
GET |
/v1/metrics |
Telemetri agregat proses inference |
Contoh single request dari PowerShell:
$body = Get-Content .\examples\single_request.json -Raw
Invoke-RestMethod `
-Method Post `
-Uri "http://127.0.0.1:8000/v1/predict" `
-ContentType "application/json" `
-Body $bodySingle endpoint mengembalikan exact_capacity_review: null karena kapasitas hanya bermakna apabila seluruh decision window diproses sebagai satu batch.
Biarkan FastAPI berjalan pada terminal pertama. Pada terminal kedua, jalankan:
python -m flask --app app.flask_app run --port 5000Buka:
http://127.0.0.1:5000
Untuk development dengan auto-reload:
$env:FLASK_DEBUG = "true"
python -m flask --app app.flask_app run --port 5000Workspace Flask terdiri dari:
- Overview — status sistem, kontrak aktif, guardrail, serta aktivitas sesi terakhir.
- Simulation Playground — simulasi satu pengajuan dengan preset risiko rendah, menengah, dan tinggi.
- Review Queue — upload complete decision window, validasi, exact-capacity ranking, filter, dan ekspor CSV.
- Model & System — identitas model, field wajib dan terlarang, missing semantics, serta contoh API request.
Sembilan belas sinyal yang biasanya berasal dari sistem bank dibuat read-only secara default. Pengubahan hanya tersedia melalui mode eksperimen untuk kebutuhan demo.
docker compose up --buildKonfigurasi container memasang folder artifacts/ secara read-only pada API. Periksa docker-compose.yml untuk service dan port yang aktif pada versi repository Anda.
python -m pytest -q -p no:cacheprovider
python -m ruff check --no-cache src app tests
python -m pip checkfraudshield/
├── app/ # FastAPI, Flask, templates, dan static assets
├── artifacts/ # Model dan evaluation artifacts lokal; diabaikan Git
├── configs/ # Konfigurasi eksperimen dan serving
├── data/ # Dataset lokal dan manifest
├── docs/ # Kontrak, arsitektur, dan panduan teknis
├── examples/ # Contoh single dan batch request
├── notebooks/ # Audit, eksperimen, calibration, dan evaluasi
├── reports/ # Data card, model card, serta laporan tiap fase
├── src/fraudshield/ # Package utama machine learning
├── tests/ # Unit dan integration tests
├── docker-compose.yml
├── Dockerfile
└── pyproject.toml
FraudShield tidak:
- Memastikan seseorang melakukan fraud.
- Memverifikasi KTP, wajah, kepemilikan email, atau kepemilikan nomor telepon.
- Menganalisis transaksi rekening setelah onboarding.
- Melakukan credit scoring.
- Menghasilkan penolakan otomatis.
- Menggantikan investigasi dan keputusan analyst manusia.
Nilai finansial menggunakan unit dataset sintetis, bukan IDR atau USD. Kode kategori seperti AA, BA, dan CA dianonimkan oleh dataset, sehingga proyek tidak menebak arti bisnis yang tidak didokumentasikan.
- Jangan memasukkan NIK, nomor rekening, nama, email, nomor telepon, atau data pribadi nyata ke demo publik.
- Perlakukan probabilitas dan reason codes sebagai sinyal prioritas pemeriksaan.
- Lakukan validasi data, fairness assessment, security review, dan monitoring sebelum mempertimbangkan deployment nyata.
- Pastikan keputusan yang berdampak pada nasabah selalu memiliki human oversight dan jalur banding yang sesuai.
docs/project_charter.mddocs/prediction_time_contract.mddocs/production_prediction_contract.mddocs/architecture.mddocs/flask_ui_guide.mdreports/data_card.mdreports/model_card.mdreports/phase4_model_selection.mdreports/phase5_calibration_threshold.mdreports/phase6_final_evaluation.mdreports/phase7_inference_serving.mdreports/phase8_explainability.md
Source code FraudShield menggunakan lisensi MIT. Dataset tetap mengikuti ketentuan penyedia dan tidak termasuk dalam lisensi repository ini.
Built as an end-to-end machine learning portfolio project for fraud risk decision support.