Baniloo Baniloo

June 17, 2026

The gap shrank from 13 points to 1.4, and that's the good news

Fixing an evaluation that was rigged in my own favor — a two-care-type held-out set, genuine multi-client clustering, and real MIMIC-IV access at last.

The audit two weeks ago left one uncomfortable thing unfixed. My headline result — Clustered FL beating FedAvg — came partly from an evaluation designed, however unconsciously, to make CFL win. Both held-out facilities were Independent Living. FedAvg was trained almost entirely on Memory Care and Skilled Nursing clients, so of course it fell apart on IL. I hadn’t discovered that CFL was better; I had built a test it couldn’t lose.

This session was about making the experiment honest enough that a smaller number would mean something.

A held-out set that tests generalization

The held-out facilities moved from [8, 9] — both IL — to [6, 9]: one SNF and one IL. Now the generalization claim is tested across two clinically distinct care types instead of one, and a global model no longer faces a population it was structurally guaranteed to fail on.

The IL cluster problem from the audit also got a real fix. Facility 8 moved into the IL training cluster, which finally gives that cluster two training clients. For the first time there is genuine two-client federated averaging happening inside the IL cluster — not the single-facility zero-shot transfer I’d had to disclose as a limitation last time. The contribution can now be described as what it actually does.

While I was in there I deleted clustered_fl.py entirely. It held a dead ClusteredFLServer aggregation path that no longer ran — the production aggregation lives in simulation.py. Two implementations of the core contribution, one of them dead, is exactly the kind of thing that produces a confident wrong answer six weeks later. It’s gone.

MIMIC-IV, for real this time

The PhysioNet credentialed access came through. Until now the fidelity validation had been running against a synthetic proxy with a note in the paper promising real data “pending access.” That note is deleted. mimic_preprocessor.py and mimic_analysis.py now pull the real MIMIC-IV elderly cohort, and fidelity.py anchors to it.

Figure 2 became a two-panel figure: KS-test distribution overlays on one side, and on the other a within-MIMIC-IV cohort calibration — 27.2% of the elderly cohort has a post-acute discharge disposition, which lands within 0.8 points of my 28% SNF mismatch target. That calibration is the strongest external evidence the synthetic dataset behaves like a real population, and it wasn’t something I could fabricate.

The number

Rerun end to end: CFL 0.9827 vs FedAvg 0.9685. A 1.42-point gap — SNF contributes +0.36, IL contributes +2.65.

That is a fraction of the 13.2 points I was quoting at midsem. It is also the first version of this result I would defend without a caveat in my throat. The gap shrank because the evaluation stopped flattering the method. A defensible 1.4 beats an inflated 13 in every way that matters for a dissertation someone is going to read closely.

Figures 3 through 5 regenerated, main.tex updated with every new number, validation passing, pushed to origin.


Next: the third contribution — the XAI Audit Scorecard, built on real SHAP instead of the placeholder scores that have been sitting in the repo since April.