↑ ↓ to move, Enter to open, Esc to close

    My product

    Moniguard

    A fraud scorer for pay-on-delivery and transfer payments. It gives each transaction a 0–1000 risk score and the reasons behind it.

    Working prototypeSynthetic dataDesigned, built and tested it end to end.
    Moniguard interface mock-up: transactions scored 0 to 1000 with block, review or approve, the reasons behind one score, and the precision–recall curve.
    Interface image. Treat on-screen figures as illustrative; only the results stated in the text are claims.

    What it is

    Moniguard scores each payment from 0 to 1000 for fraud risk and says why, so a person can approve, review or block it. It is my own open-source product. It is not a 3Consulting deliverable.

    The problem

    Fraud in Nigerian pay-on-delivery shops and mobile-money apps looks different from card-present fraud. Phone numbers get recycled, delivery addresses cluster, and an account is taken over on a new device just before a large order. A merchant needs a score for each transaction in real time, not a report a month later.

    What I built

    • A transaction generator that creates realistic Nigerian orders with six labelled fraud patterns.
    • One shared feature module with 73 features (velocity, amount changes, shared devices, phones and IPs). Training and live scoring use the same code, so they cannot drift apart.
    • An ensemble of a class-weighted XGBoost model and an Isolation Forest, calibrated so the score maps cleanly to risk bands.
    • A FastAPI service that returns the score and reason codes, plus Airflow and MLflow for retraining and tracking.

    How it’s checked

    The data is split by time, never shuffled. The model trains on the earliest 70% of the 180-day period and is tested on the latest 30%. I report PR-AUC and recall at a fixed review budget, with bootstrap confidence intervals, because plain accuracy would look excellent even for a model that flags nothing.

    What the results do and don’t tell you

    On synthetic data made by this repo’s own generator (60,000 transactions, about 2.8% fraud), the held-out test gives:

    • PR-AUC 0.959 (95% interval 0.942 to 0.972) and ROC-AUC 0.996 in batch evaluation
    • Recall 0.339 when analysts review the top 1% of traffic (the most any model could reach at that budget is 0.345), and 0.994 at a 5% review budget
    • PR-AUC 0.837 and recall 0.843 at a 5% budget when 3,000 test transactions are scored one at a time through the API, the way live scoring works. Live scoring sees only the transaction in front of it, not the customer’s history, so this is the number to expect in use today

    An audit on 1 November 2026 changed these figures. The calibration step had been fitted on the model’s own training predictions, and one feature (a vendor risk score) was built from the labels. Both are fixed, and a test now checks that the features come out the same with or without labels. The earlier 0.875 is retired.

    These numbers show the pipeline works end to end and that the method is sound. They do not show how it would perform on real transactions. The data was generated, and it was not tested on a public benchmark such as PaySim or IEEE-CIS. A real pilot would need real data and a fresh evaluation.

    My role

    I designed and built all of it. Moniguard’s generator, features, model code and API were written for this project. None of it is copied from my employer’s client-specific code or data.

    Stack

    Python, XGBoost, scikit-learn (Isolation Forest, calibration), FastAPI, MLflow, Airflow, Docker.

    Where these facts come from
    • /home/user/mlops-fraud-detection/README.md
    • /home/user/mlops-fraud-detection/reports/metrics.json
    • /home/user/ai-ml-data-engineering/products/moniguard/README.md