SPB Git

spb/wp36_uqo

Public
1.8 KB · 40 lines python
1#!/usr/bin/env python2"""Step 08 — Model F: prediction and economic value (markdown / exit within 30 days,3Cox time-to-exit). Idempotent: every output under results/prediction/, the figure4fig10_prediction and paper/tables/tab08_prediction.tex are rebuilt from scratch on5each run (stale files from a previous run are removed first).67Usage: .venv/bin/python scripts/08_prediction.py [--n-boot 200]8"""9import argparse10import json11import shutil1213from ucml import config as C14from ucml import prediction1516ap = argparse.ArgumentParser()17ap.add_argument("--n-boot", type=int, default=prediction.N_BOOT, help="bootstrap resamples for the CIs (default 200)")18args = ap.parse_args()1920if prediction.OUT.exists():21    shutil.rmtree(prediction.OUT)22prediction.OUT.mkdir(parents=True, exist_ok=True)23for stem in ("fig10_prediction.pdf", "fig10_prediction.png"):24    (C.FIGURES / stem).unlink(missing_ok=True)25(C.ROOT / "paper" / "figures" / "fig10_prediction.pdf").unlink(missing_ok=True)26(C.TABLES / "tab08_prediction.tex").unlink(missing_ok=True)2728stats = C.PROCESSED / "cleaning_stats.json"29if stats.exists():30    s = json.loads(stats.read_text())31    print("cleaning_stats.json:", {k: v for k, v in s.items() if "S2" in k or "S1" in k}, flush=True)3233m = prediction.run_all(n_boot=args.n_boot)34for target in ("markdown30", "markdown30cr", "exit30"):35    for split in ("chronological", "dealer_holdout", "region_holdout"):36        r = m["targets"][target][split]37        print(f"{target:13s} {split:16s} n_test {r['n_test']:6d} base {r['models']['logistic']['base_rate']:.3f} | "38              + " | ".join(f"{k} logloss {r['models'][k]['log_loss']:.4f} brier {r['models'][k]['brier']:.4f} auc {r['models'][k]['auc']:.3f}" for k in ("logistic", "lightgbm")))39print("survival:", {k: m["survival"][k] for k in ("n_train", "n_test", "events_test", "c_index_train", "c_index_test", "dynamic_auc_30d")})40
Files · d0f6445591c09fe14b42fb37035f398825960706
Menu

Theme