Learn with Phoebe · Data Science

Learn Model Risk with Phoebe

Brackwater submitted a credit scorecard with a development AUC of 0.863 and a recommendation to deploy. The number was correct and it reproduced every time the query ran. One of its eleven features is logged after the outcome window opens; without it the model scores 0.772, and on the following year's applications it scores 0.682, six thousandths ahead of a benchmark built from three columns. Nothing in that story is a modelling error, and all of it is what the person who signs the approval is accountable for. Six leader sessions on challenge, materiality and sign-off, ten practitioner sessions on how a validation is actually run, and a bench where the truth is known by construction so your findings can be checked rather than argued about.

16sessions, two tracks
3components of validation
6000applications from a written model
7tests on the bench
45min per session

Leader track ⚖️ · six sessions, no code

For whoever signs the approval. What the risk actually is, why challenge fails in organisations that have all the right job titles, which models earn real review, how to read the report, and when refusing is the correct answer.

Practitioner track 🧪 · ten sessions, hands on

For the people who do the work. The inventory, the design review, the leak hunt, replication, challengers, outcomes analysis, out-of-time testing, monitoring, findings, and a capstone bench that scores your call against what is true.

🗃️ Practitioner session 1 · start here

The inventory and the tiering call

What a register has to hold to support an aggregate view, and how to score one model's materiality without adjectives.

▶ Start here
🧱 Practitioner session 2

Conceptual soundness

Reading the design before the numbers: purpose, assumptions, data selection, and the quality and extent of the developmental evidence.

🕳️ Practitioner session 3

The leak hunt

A field written after the outcome window scores 0.748 on its own. Why a noisy leak survives review, and how to find one.

🔁 Practitioner session 4

Replication

Reproducing the number in the document, and what a gap between the document and your re-run actually means.

⚔️ Practitioner session 5

Benchmarks and challengers

Three columns reach 0.676 against the champion's 0.682. The benchmark belongs early, because it reframes every other finding.

🎯 Practitioner session 6

Outcomes analysis

Predicted against actual, banded. The aggregate gap is 0.006 and the bands run to 0.142, in opposite directions.

📉 Practitioner session 7

Out of time and stability

A later vintage, a relationship that moved, and a book that drifted from 19.0 to 34.0 percent thin files.

📡 Practitioner session 8

Ongoing monitoring

Thresholds, triggers and what actually fires. Designing a monitoring pack that can fail for the right reason.

📝 Practitioner session 9

Writing findings

Severity, conditions, remediation and documentation, including what a model card does and does not settle.

🧪 Practitioner session 10

The validation bench

Seven tests against a model whose truth is known by construction. Run them, collect the findings, and make the call.

Foundations Working depth Advanced Hardest

The whole thing on one page

Every idea in the course and the session that owns it. Click any node to jump there.

Three ways through

Everyone starts at session 1 of their track. These are the shortest useful routes if you cannot take all sixteen.

I sign the approvals What the risk is→ Challenge→ Read the report→ Sign it off
I run validations Soundness→ Leak hunt→ Challengers→ Outcomes→ The bench
My model is already live Out of time→ Monitoring→ Findings→ Re-tier it

What is real here

Nothing on the bench is a simulation of a result.

The applications6,000 from a structural model written out in assets/mr-live.js, fixed seeds, every coefficient visible
Every modelA real logistic regression fitted in the page by iteratively reweighted least squares, on click
Every AUCA rank-based calculation over the scores those regressions produced. Nothing is hard-coded
The leakReal by construction: the collections field is generated from the outcome, so 0.748 alone is a fact about the data