Files
DRL_PROJ/presentation_inputs/classifier/notebooks/03_phase1_analysis.ipynb
T
2026-05-14 16:20:33 +01:00

858 lines
167 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "85a8cd6d",
"metadata": {},
"source": [
"# 03 - Controlled Baseline Tests\n",
"<!-- storyline-enrichment -->\n",
"\n",
"This notebook is the first training-result chapter. It asks a deliberately narrow question: under the same split, preprocessing, optimizer, and stopping rules, does pretrained ResNet18 improve over a small custom SimpleCNN?\n",
"\n",
"This is a controlled baseline, not a search for the final model. Phase 1 fixes the protocol so that later Phase 2 changes can be interpreted as ablations rather than confounded improvements.\n",
"\n",
"Roadmap link: `01_eda` identified leakage and shortcut risks; `02_preprocessing` defined the input path; this notebook establishes the model baseline before `04_phase2_analysis` changes one design choice at a time.\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "41f41f36",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Project root: c:\\Users\\diogo\\Documents\\MIA_UP\\2_Semestre\\DRL\\DRL_2\\DRL_PROJ\n",
"Classifier root: c:\\Users\\diogo\\Documents\\MIA_UP\\2_Semestre\\DRL\\DRL_2\\DRL_PROJ\\classifier\n"
]
}
],
"source": [
"from __future__ import annotations\n",
"\n",
"import json\n",
"import random\n",
"import sys\n",
"from collections import Counter, defaultdict\n",
"from pathlib import Path\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"\n",
"def find_project_root(start: Path | None = None) -> Path:\n",
" \"\"\"Find DRL_PROJ whether the notebook runs from repo root or classifier/notebooks.\"\"\"\n",
" start = Path.cwd() if start is None else Path(start)\n",
" for candidate in [start, *start.parents]:\n",
" if (candidate / \"classifier\").is_dir() and (candidate / \"docs\" / \"DRL_Project.md\").exists():\n",
" return candidate\n",
" raise RuntimeError(\"Could not find DRL_PROJ root. Run this notebook from inside the repository.\")\n",
"\n",
"\n",
"PROJECT_ROOT = find_project_root()\n",
"CLASSIFIER_ROOT = PROJECT_ROOT / \"classifier\"\n",
"if str(CLASSIFIER_ROOT) not in sys.path:\n",
" sys.path.insert(0, str(CLASSIFIER_ROOT))\n",
"\n",
"DATA_DIR = PROJECT_ROOT / \"data\"\n",
"CROPPED_DIR = PROJECT_ROOT / \"cropped\" / \"classifier\"\n",
"LEGACY_CROPPED_DIR = PROJECT_ROOT / \"data_cropped\"\n",
"OUTPUTS_DIR = CLASSIFIER_ROOT / \"outputs\"\n",
"LOGS_DIR = OUTPUTS_DIR / \"logs\"\n",
"CONFIGS_DIR = CLASSIFIER_ROOT / \"configs\"\n",
"FIGURES_DIR = OUTPUTS_DIR / \"figures\"\n",
"ANALYSIS_DIR = OUTPUTS_DIR / \"analysis\"\n",
"FIGURES_DIR.mkdir(parents=True, exist_ok=True)\n",
"ANALYSIS_DIR.mkdir(parents=True, exist_ok=True)\n",
"\n",
"SEED = 42\n",
"random.seed(SEED)\n",
"np.random.seed(SEED)\n",
"\n",
"print(f\"Project root: {PROJECT_ROOT}\")\n",
"print(f\"Classifier root: {CLASSIFIER_ROOT}\")\n",
"\n",
"from src.utils import load_config\n",
"\n",
"def load_run(run_name: str) -> dict | None:\n",
" path = LOGS_DIR / f\"{run_name}.json\"\n",
" if not path.exists():\n",
" print(f\"Missing log: {path.relative_to(PROJECT_ROOT)}\")\n",
" return None\n",
" with path.open() as f:\n",
" return json.load(f)\n",
"\n",
"\n",
"def scalar_metric(results: dict | None, metric: str, field: str = \"mean\") -> float:\n",
" if not results:\n",
" return np.nan\n",
" return results.get(\"aggregated_metrics\", {}).get(metric, {}).get(field, np.nan)\n",
"\n",
"\n",
"def metric_values(results: dict | None, metric: str) -> np.ndarray:\n",
" if not results:\n",
" return np.array([], dtype=float)\n",
" values = results.get(\"aggregated_metrics\", {}).get(metric, {}).get(\"values\", [])\n",
" return np.array(values, dtype=float)\n",
"\n",
"\n",
"def pairwise_auc(results: dict | None, pair_key: str, field: str = \"mean\") -> float:\n",
" if not results:\n",
" return np.nan\n",
" return results.get(\"aggregated_pairwise\", {}).get(pair_key, {}).get(\"auc_roc\", {}).get(field, np.nan)\n",
"\n",
"\n",
"def best_gap_values(results: dict | None) -> np.ndarray:\n",
" \"\"\"Train AUC - validation AUC at each fold's best validation epoch.\"\"\"\n",
" gaps = []\n",
" if not results:\n",
" return np.array(gaps, dtype=float)\n",
" for fold in results.get(\"fold_results\", []):\n",
" hist = fold.get(\"history\") or {}\n",
" val = np.array(hist.get(\"val_auc\", []), dtype=float)\n",
" train = np.array(hist.get(\"train_auc\", []), dtype=float)\n",
" if len(val) and len(train):\n",
" best_idx = int(np.nanargmax(val))\n",
" gaps.append(float(train[best_idx] - val[best_idx]))\n",
" return np.array(gaps, dtype=float)\n",
"\n",
"\n",
"def summarize_run(run_name: str, label: str | None = None) -> dict:\n",
" results = load_run(run_name)\n",
" cfg = (results or {}).get(\"config\", {})\n",
" return {\n",
" \"run\": run_name,\n",
" \"label\": label or run_name,\n",
" \"backbone\": cfg.get(\"backbone\"),\n",
" \"image_size\": cfg.get(\"image_size\"),\n",
" \"data_dir\": cfg.get(\"data_dir\"),\n",
" \"augment\": bool(cfg.get(\"augment\")) if cfg.get(\"augment\") is not None else False,\n",
" \"normalization\": cfg.get(\"normalization\", \"imagenet/default\"),\n",
" \"auc\": scalar_metric(results, \"auc_roc\"),\n",
" \"auc_std\": scalar_metric(results, \"auc_roc\", \"std\"),\n",
" \"auc_ci95\": scalar_metric(results, \"auc_roc\", \"ci_95\"),\n",
" \"accuracy\": scalar_metric(results, \"accuracy\"),\n",
" \"f1\": scalar_metric(results, \"f1\"),\n",
" \"best_gap\": np.nanmean(best_gap_values(results)) if results else np.nan,\n",
" }\n",
"\n",
"\n",
"def paired_delta(before: str, after: str, metric: str = \"auc_roc\") -> dict:\n",
" b = load_run(before)\n",
" a = load_run(after)\n",
" b_vals = metric_values(b, metric)\n",
" a_vals = metric_values(a, metric)\n",
" n = min(len(b_vals), len(a_vals))\n",
" b_vals = b_vals[:n]\n",
" a_vals = a_vals[:n]\n",
" delta = a_vals - b_vals\n",
" out = {\n",
" \"before\": before,\n",
" \"after\": after,\n",
" \"metric\": metric,\n",
" \"n_folds\": n,\n",
" \"before_mean\": float(np.nanmean(b_vals)) if n else np.nan,\n",
" \"after_mean\": float(np.nanmean(a_vals)) if n else np.nan,\n",
" \"delta_mean\": float(np.nanmean(delta)) if n else np.nan,\n",
" \"delta_ci95\": float(1.96 * np.nanstd(delta, ddof=1) / np.sqrt(n)) if n > 1 else 0.0,\n",
" }\n",
" try:\n",
" from scipy import stats\n",
" out[\"paired_t_p\"] = float(stats.ttest_rel(a_vals, b_vals, nan_policy=\"omit\").pvalue) if n > 1 else np.nan\n",
" except Exception as exc:\n",
" out[\"paired_t_p\"] = np.nan\n",
" out[\"test_note\"] = f\"scipy unavailable: {exc}\"\n",
" return out\n",
"\n",
"PHASE1_RUNS = {\n",
" \"SimpleCNN\": \"p1_simplecnn_baseline\",\n",
" \"ResNet18\": \"p1_resnet18_baseline\",\n",
"}\n"
]
},
{
"cell_type": "markdown",
"id": "5ea808ee",
"metadata": {},
"source": [
"## 1. Load Phase 1 logs and protocol\n",
"\n",
"These logs are the source of truth. They contain fold histories, held-out test metrics, per-source metrics, and real-vs-fake-source pairwise AUC using the current schema: `aggregated_metrics`, `aggregated_per_source`, `aggregated_pairwise`, `fold_results[].source_metrics`, and `fold_results[].pair_metrics`.\n",
"\n",
"The protocol table below is loaded from `shared.json`; the model table is loaded from the Phase 1 config files.\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "d82fbe69",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>setting</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>seed</td>\n",
" <td>42.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>cv_folds</td>\n",
" <td>5.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>batch_size</td>\n",
" <td>32.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>lr</td>\n",
" <td>0.0001</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>weight_decay</td>\n",
" <td>0.0001</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>T_max</td>\n",
" <td>15.0000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>early_stopping_patience</td>\n",
" <td>5.0000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" setting value\n",
"0 seed 42.0000\n",
"1 cv_folds 5.0000\n",
"2 batch_size 32.0000\n",
"3 lr 0.0001\n",
"4 weight_decay 0.0001\n",
"5 T_max 15.0000\n",
"6 early_stopping_patience 5.0000"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>run</th>\n",
" <th>backbone</th>\n",
" <th>pretrained</th>\n",
" <th>epochs</th>\n",
" <th>image_size</th>\n",
" <th>subsample</th>\n",
" <th>data_dir</th>\n",
" <th>augment</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>p1_resnet18_baseline</td>\n",
" <td>resnet18</td>\n",
" <td>True</td>\n",
" <td>15</td>\n",
" <td>128</td>\n",
" <td>0.2</td>\n",
" <td>data</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>p1_simplecnn_baseline</td>\n",
" <td>simple_cnn</td>\n",
" <td>False</td>\n",
" <td>15</td>\n",
" <td>128</td>\n",
" <td>0.2</td>\n",
" <td>data</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" run backbone pretrained epochs image_size \\\n",
"0 p1_resnet18_baseline resnet18 True 15 128 \n",
"1 p1_simplecnn_baseline simple_cnn False 15 128 \n",
"\n",
" subsample data_dir augment \n",
"0 0.2 data False \n",
"1 0.2 data False "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# <!-- phase1-protocol -->\n",
"shared_cfg = json.loads((CONFIGS_DIR / \"shared.json\").read_text())\n",
"protocol_df = pd.DataFrame([\n",
" {\"setting\": \"seed\", \"value\": shared_cfg[\"seed\"]},\n",
" {\"setting\": \"cv_folds\", \"value\": shared_cfg[\"cv_folds\"]},\n",
" {\"setting\": \"batch_size\", \"value\": shared_cfg[\"batch_size\"]},\n",
" {\"setting\": \"lr\", \"value\": shared_cfg[\"lr\"]},\n",
" {\"setting\": \"weight_decay\", \"value\": shared_cfg[\"weight_decay\"]},\n",
" {\"setting\": \"T_max\", \"value\": shared_cfg[\"T_max\"]},\n",
" {\"setting\": \"early_stopping_patience\", \"value\": shared_cfg[\"early_stopping_patience\"]},\n",
"])\n",
"phase1_config_rows = []\n",
"for cfg_path in sorted((CONFIGS_DIR / \"phase1\").glob(\"*.json\")):\n",
" cfg = load_config(str(cfg_path))\n",
" phase1_config_rows.append({\n",
" \"run\": cfg[\"run_name\"],\n",
" \"backbone\": cfg.get(\"backbone\"),\n",
" \"pretrained\": cfg.get(\"pretrained\", False),\n",
" \"epochs\": cfg.get(\"epochs\"),\n",
" \"image_size\": cfg.get(\"image_size\"),\n",
" \"subsample\": cfg.get(\"subsample\"),\n",
" \"data_dir\": cfg.get(\"data_dir\"),\n",
" \"augment\": bool(cfg.get(\"augment\")) if cfg.get(\"augment\") is not None else False,\n",
" })\n",
"phase1_config_df = pd.DataFrame(phase1_config_rows)\n",
"\n",
"display(protocol_df)\n",
"display(phase1_config_df)\n"
]
},
{
"cell_type": "markdown",
"id": "1f4f6f2d",
"metadata": {},
"source": [
"<!-- phase1-protocol -->\n",
"Both Phase 1 runs use the same protocol: seed `42`, `5` folds, batch size `32`, learning rate `1e-4`, weight decay `1e-4`, cosine `T_max=15`, and early-stopping patience `5`. The intended comparison is therefore model capacity and pretraining: SimpleCNN from scratch versus pretrained ResNet18.\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "8caffd91",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style type=\"text/css\">\n",
"</style>\n",
"<table id=\"T_ec959\">\n",
" <thead>\n",
" <tr>\n",
" <th class=\"blank level0\" >&nbsp;</th>\n",
" <th id=\"T_ec959_level0_col0\" class=\"col_heading level0 col0\" >label</th>\n",
" <th id=\"T_ec959_level0_col1\" class=\"col_heading level0 col1\" >run</th>\n",
" <th id=\"T_ec959_level0_col2\" class=\"col_heading level0 col2\" >backbone</th>\n",
" <th id=\"T_ec959_level0_col3\" class=\"col_heading level0 col3\" >image_size</th>\n",
" <th id=\"T_ec959_level0_col4\" class=\"col_heading level0 col4\" >auc</th>\n",
" <th id=\"T_ec959_level0_col5\" class=\"col_heading level0 col5\" >auc_std</th>\n",
" <th id=\"T_ec959_level0_col6\" class=\"col_heading level0 col6\" >accuracy</th>\n",
" <th id=\"T_ec959_level0_col7\" class=\"col_heading level0 col7\" >f1</th>\n",
" <th id=\"T_ec959_level0_col8\" class=\"col_heading level0 col8\" >best_gap</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th id=\"T_ec959_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
" <td id=\"T_ec959_row0_col0\" class=\"data row0 col0\" >SimpleCNN</td>\n",
" <td id=\"T_ec959_row0_col1\" class=\"data row0 col1\" >p1_simplecnn_baseline</td>\n",
" <td id=\"T_ec959_row0_col2\" class=\"data row0 col2\" >simple_cnn</td>\n",
" <td id=\"T_ec959_row0_col3\" class=\"data row0 col3\" >128</td>\n",
" <td id=\"T_ec959_row0_col4\" class=\"data row0 col4\" >0.7786</td>\n",
" <td id=\"T_ec959_row0_col5\" class=\"data row0 col5\" >0.0066</td>\n",
" <td id=\"T_ec959_row0_col6\" class=\"data row0 col6\" >0.7039</td>\n",
" <td id=\"T_ec959_row0_col7\" class=\"data row0 col7\" >0.7801</td>\n",
" <td id=\"T_ec959_row0_col8\" class=\"data row0 col8\" >+0.0069</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_ec959_level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
" <td id=\"T_ec959_row1_col0\" class=\"data row1 col0\" >ResNet18</td>\n",
" <td id=\"T_ec959_row1_col1\" class=\"data row1 col1\" >p1_resnet18_baseline</td>\n",
" <td id=\"T_ec959_row1_col2\" class=\"data row1 col2\" >resnet18</td>\n",
" <td id=\"T_ec959_row1_col3\" class=\"data row1 col3\" >128</td>\n",
" <td id=\"T_ec959_row1_col4\" class=\"data row1 col4\" >0.9366</td>\n",
" <td id=\"T_ec959_row1_col5\" class=\"data row1 col5\" >0.0038</td>\n",
" <td id=\"T_ec959_row1_col6\" class=\"data row1 col6\" >0.8650</td>\n",
" <td id=\"T_ec959_row1_col7\" class=\"data row1 col7\" >0.9073</td>\n",
" <td id=\"T_ec959_row1_col8\" class=\"data row1 col8\" >+0.0394</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n"
],
"text/plain": [
"<pandas.io.formats.style.Styler at 0x1fb35db5280>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"phase1_summary = pd.DataFrame([\n",
" summarize_run(run_name, label=model)\n",
" for model, run_name in PHASE1_RUNS.items()\n",
"])\n",
"display(\n",
" phase1_summary[[\"label\", \"run\", \"backbone\", \"image_size\", \"auc\", \"auc_std\", \"accuracy\", \"f1\", \"best_gap\"]]\n",
" .style.format({\"auc\": \"{:.4f}\", \"auc_std\": \"{:.4f}\", \"accuracy\": \"{:.4f}\", \"f1\": \"{:.4f}\", \"best_gap\": \"{:+.4f}\"})\n",
")\n"
]
},
{
"cell_type": "markdown",
"id": "693269b8",
"metadata": {},
"source": [
"## 2. Overall baseline comparison\n",
"\n",
"ResNet18 is the stronger baseline by a large margin. Because both models use the same folds and the same preprocessing, fold-level paired deltas are meaningful directional evidence.\n",
"\n",
"**Interpretation:** the pretrained backbone brings useful visual features even before Phase 2 improvements. SimpleCNN remains valuable as a stress test: if an ablation only helps ResNet18, it may depend on pretrained feature quality or capacity.\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "f21d65db",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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AADgHEIsAAAAnEOIBQAAacLYsWNNqVKlTNasWU2tWrXMd999F+2yZ8+eNQMGDDBly5a1y1etWtUsWrQoZJnx48ebq6++2kRERNjbDTfcYD799NMo61q9erVp2LChyZEjh13upptuMidPngxZZsGCBXafsmXLZi677DLTpk2bJHznqVOyhdjOnTubdOnS2VumTJlM6dKlTc+ePc2pU6eSZP1arw6qP//8M+RxfejadlytWLHCruvQoUMhj3/55ZemVatWpmjRovb5uXPnRnntsWPHTPfu3c3ll19uD7orrrjCTJgwIRHvCgAAJIePPvrIPPXUU6Zfv35m7dq1NpQ2bdrU7N27N+zyL7zwgnnzzTfNG2+8YX777TfzyCOPmLZt25p169YFltHP/6FDh5o1a9aYH374wQbV1q1bm19//TUkwDZr1sw0adLEhubvv//eZof06f8XwWbNmmXuuece06VLF/PTTz+ZVatWmQ4dOnAgXMpKrD603bt3m61bt5qRI0fag0EHT1JRuHzxxRdNcjh+/Lg9wHXWFh39Z9BZ2XvvvWd+//138+STT9oDc968ecmyTwAAIGFGjBhhHnzwQRsU/aJT9uzZzaRJk8Iu/+6775revXubW265xZQpU8Z07drV/vu1114LLKNilx4rX768qVChghk8eLDJmTOn+eabbwLL9OjRwzz++OOmV69epkqVKqZixYrmzjvvNFmyZLHPnzt3zjzxxBNm2LBhNihrPdo/LYNLGGL1ARUuXNgUL17cVkgbN25sli5dap+7cOGCGTJkiK3QqoqpwDhz5szAaw8ePGg6duxoChQoYJ/XATJ58uSQ9SswKkCuX78+2n2IaTvbt283DRo0sP9W6V6h2K/iNm/e3AwaNMiedUXn66+/Np06dTL169e3lyceeughu/6YLk8AAICL68yZM7ZaqhziUyVU91UpDef06dP2im8w5YiVK1eGXf78+fNm+vTptgimbgWiKu+3335rChYsaGrXrm0KFSpk6tWrF7IOVYV37dpl9+eaa64xRYoUsRkkpmyDi9wnVh+GQl/mzJntfQXLadOm2TMhld11pnL33XebL774wj7ft29fW75X3xJVOdXvJH/+/CHrrFOnjmnZsqU9u4lOTNtRuFYJXzZu3GirxqNHj47ze9IBqaqrDj7P88zy5cvNH3/8YS8ZAACApHP2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6623XqSWAYA0EGJVXVi3bp2ZOnWqvUQ2b948WxXdv3+/fV5f4gq3KdE999xjq7e6rKdLeQqmffv2tT90lixZElhOl/ImTpxof/DERgF2+PDhybznABLrzJkztgrauHHjwGPp06e391evXh2ndeh74a677jI5cuQI+/yePXvMggULzP333x94LF++fKZixYo2oB4/ftxWZN988017AlyjRg27jMLxhQsXzK5du0zlypXN5Zdfbu68806zc+fORL9vAEit4hViDx06ZL766ivzyiuv2EpDyZIlTc2aNc3zzz8fqBgEdyfwq5Uff/yxufHGG022bNnMddddZ8Pv999/b6ugqoiqcqsKr69z586mTZs25qWXXjIFChSwfchUGdUPoeicPn3aPPPMM6ZYsWL2B4yqrStWrAg8r314//33zYcffmh69+5t90P94hRodYlP78enHzi6r0t7sXnsscdsdSe6y5EAEub42bNxvx0/Huttx44d5vz586ZQoUIh29H94Mv60VHfWVVOH3jggWiX0cl9rly5zG233RZ4TN+B6hqgk389p5NkfWcsWrTIXHbZZXaZrVu32hD78ssv2ytDM2fONAcOHDA333xzjN97AJCWZYzPwgqcuimkXn/99XGuuKr/mb6Y1QXhvvvus5fL9GU+evRoe2lOFYcXX3zRjB8/PvCazz77zH7ZK4gqDOvynyoagwcPDruN7t27m99++81Mnz7dFC1a1MyZM8c0a9bM/PLLL/bynQKswqlCa2T6IZM7d+6Qx3S5T0H3hx9+sGE7Ou3bt7dVlAEDBpgxY8bEqT0UuHXzHTlyJE6vA9KSsmPHxX3h+CybQKrCXnXVVfbEPTrqltCxY0f73RXcjUkDtFR5VRFAJ/PvvPOOadWqlT2ZL1KkiA2wZ8+eNa+//rpp0qSJfZ1OuHVlS1eN6BsLAImsxGbMmNGOnlW1Qf1J69SpY6uaP//8c4yvU4VUX8K6TPbEE0/YS3q6jK/XX3PNNfbSW+SRupkzZ7Y/EKpUqWJHAisk6gteX/aRqcIyefJkM2PGDFvxVX8ybVMjgPW4qGuAQmxcVa9e3Ybr5557LsblFIAVeNXXdsuWLXFa95AhQ2xo9m/FixeP834BSBxd8o98X2ExJqrk6gQ5uJtAZAqoGzdujFKp1ZWe+fPn29frO0/fLePGjbNhVt+loiAr6qfr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",
"text/plain": [
"<Figure size 700x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<style type=\"text/css\">\n",
"</style>\n",
"<table id=\"T_ed8b6\">\n",
" <thead>\n",
" <tr>\n",
" <th class=\"blank level0\" >&nbsp;</th>\n",
" <th id=\"T_ed8b6_level0_col0\" class=\"col_heading level0 col0\" >before</th>\n",
" <th id=\"T_ed8b6_level0_col1\" class=\"col_heading level0 col1\" >after</th>\n",
" <th id=\"T_ed8b6_level0_col2\" class=\"col_heading level0 col2\" >metric</th>\n",
" <th id=\"T_ed8b6_level0_col3\" class=\"col_heading level0 col3\" >n_folds</th>\n",
" <th id=\"T_ed8b6_level0_col4\" class=\"col_heading level0 col4\" >before_mean</th>\n",
" <th id=\"T_ed8b6_level0_col5\" class=\"col_heading level0 col5\" >after_mean</th>\n",
" <th id=\"T_ed8b6_level0_col6\" class=\"col_heading level0 col6\" >delta_mean</th>\n",
" <th id=\"T_ed8b6_level0_col7\" class=\"col_heading level0 col7\" >delta_ci95</th>\n",
" <th id=\"T_ed8b6_level0_col8\" class=\"col_heading level0 col8\" >paired_t_p</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th id=\"T_ed8b6_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
" <td id=\"T_ed8b6_row0_col0\" class=\"data row0 col0\" >p1_simplecnn_baseline</td>\n",
" <td id=\"T_ed8b6_row0_col1\" class=\"data row0 col1\" >p1_resnet18_baseline</td>\n",
" <td id=\"T_ed8b6_row0_col2\" class=\"data row0 col2\" >auc_roc</td>\n",
" <td id=\"T_ed8b6_row0_col3\" class=\"data row0 col3\" >5</td>\n",
" <td id=\"T_ed8b6_row0_col4\" class=\"data row0 col4\" >0.7786</td>\n",
" <td id=\"T_ed8b6_row0_col5\" class=\"data row0 col5\" >0.9366</td>\n",
" <td id=\"T_ed8b6_row0_col6\" class=\"data row0 col6\" >+0.1579</td>\n",
" <td id=\"T_ed8b6_row0_col7\" class=\"data row0 col7\" >0.0063</td>\n",
" <td id=\"T_ed8b6_row0_col8\" class=\"data row0 col8\" >1.011e-06</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n"
],
"text/plain": [
"<pandas.io.formats.style.Styler at 0x1fb3638b500>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize=(7, 4))\n",
"plot_df = phase1_summary.sort_values(\"auc\")\n",
"ax.barh(plot_df[\"label\"], plot_df[\"auc\"], xerr=plot_df[\"auc_std\"], color=[\"#E45756\", \"#54A24B\"], alpha=0.85)\n",
"ax.set_xlim(0.65, 1.0)\n",
"ax.set_xlabel(\"Mean held-out AUC across 5 folds\")\n",
"ax.set_title(\"Phase 1 baseline AUC\")\n",
"for y, (_, row) in enumerate(plot_df.iterrows()):\n",
" ax.text(row[\"auc\"] + 0.005, y, f\"{row['auc']:.4f}\", va=\"center\")\n",
"fig.tight_layout()\n",
"fig.savefig(FIGURES_DIR / \"03_phase1_auc.png\", dpi=180, bbox_inches=\"tight\")\n",
"plt.show()\n",
"\n",
"baseline_delta = paired_delta(\"p1_simplecnn_baseline\", \"p1_resnet18_baseline\")\n",
"display(pd.DataFrame([baseline_delta]).style.format({\n",
" \"before_mean\": \"{:.4f}\",\n",
" \"after_mean\": \"{:.4f}\",\n",
" \"delta_mean\": \"{:+.4f}\",\n",
" \"delta_ci95\": \"{:.4f}\",\n",
" \"paired_t_p\": \"{:.4g}\",\n",
"}))\n"
]
},
{
"cell_type": "markdown",
"id": "71da6fcf",
"metadata": {},
"source": [
"## 3. Per-source pairwise AUC\n",
"\n",
"Single fake sources contain only one class, so their standalone AUC is undefined. The useful source metric is pairwise AUC: `wiki` real versus each fake source.\n",
"\n",
"**Why this matters:** global AUC can hide source imbalance. Pairwise AUC shows whether a model is learning a broadly useful real-vs-fake boundary or doing well mostly on one generator family.\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "8af46695",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style type=\"text/css\">\n",
"</style>\n",
"<table id=\"T_9dbf7\">\n",
" <thead>\n",
" <tr>\n",
" <th class=\"blank level0\" >&nbsp;</th>\n",
" <th id=\"T_9dbf7_level0_col0\" class=\"col_heading level0 col0\" >model</th>\n",
" <th id=\"T_9dbf7_level0_col1\" class=\"col_heading level0 col1\" >pair</th>\n",
" <th id=\"T_9dbf7_level0_col2\" class=\"col_heading level0 col2\" >auc</th>\n",
" <th id=\"T_9dbf7_level0_col3\" class=\"col_heading level0 col3\" >std</th>\n",
" <th id=\"T_9dbf7_level0_col4\" class=\"col_heading level0 col4\" >ci95</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th id=\"T_9dbf7_level0_row0\" class=\"row_heading level0 row0\" >3</th>\n",
" <td id=\"T_9dbf7_row0_col0\" class=\"data row0 col0\" >ResNet18</td>\n",
" <td id=\"T_9dbf7_row0_col1\" class=\"data row0 col1\" >wiki_vs_inpainting</td>\n",
" <td id=\"T_9dbf7_row0_col2\" class=\"data row0 col2\" >0.9416</td>\n",
" <td id=\"T_9dbf7_row0_col3\" class=\"data row0 col3\" >0.0063</td>\n",
" <td id=\"T_9dbf7_row0_col4\" class=\"data row0 col4\" >0.0055</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_9dbf7_level0_row1\" class=\"row_heading level0 row1\" >4</th>\n",
" <td id=\"T_9dbf7_row1_col0\" class=\"data row1 col0\" >ResNet18</td>\n",
" <td id=\"T_9dbf7_row1_col1\" class=\"data row1 col1\" >wiki_vs_insight</td>\n",
" <td id=\"T_9dbf7_row1_col2\" class=\"data row1 col2\" >0.9069</td>\n",
" <td id=\"T_9dbf7_row1_col3\" class=\"data row1 col3\" >0.0044</td>\n",
" <td id=\"T_9dbf7_row1_col4\" class=\"data row1 col4\" >0.0039</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_9dbf7_level0_row2\" class=\"row_heading level0 row2\" >5</th>\n",
" <td id=\"T_9dbf7_row2_col0\" class=\"data row2 col0\" >ResNet18</td>\n",
" <td id=\"T_9dbf7_row2_col1\" class=\"data row2 col1\" >wiki_vs_text2img</td>\n",
" <td id=\"T_9dbf7_row2_col2\" class=\"data row2 col2\" >0.9612</td>\n",
" <td id=\"T_9dbf7_row2_col3\" class=\"data row2 col3\" >0.0044</td>\n",
" <td id=\"T_9dbf7_row2_col4\" class=\"data row2 col4\" >0.0038</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_9dbf7_level0_row3\" class=\"row_heading level0 row3\" >0</th>\n",
" <td id=\"T_9dbf7_row3_col0\" class=\"data row3 col0\" >SimpleCNN</td>\n",
" <td id=\"T_9dbf7_row3_col1\" class=\"data row3 col1\" >wiki_vs_inpainting</td>\n",
" <td id=\"T_9dbf7_row3_col2\" class=\"data row3 col2\" >0.7689</td>\n",
" <td id=\"T_9dbf7_row3_col3\" class=\"data row3 col3\" >0.0108</td>\n",
" <td id=\"T_9dbf7_row3_col4\" class=\"data row3 col4\" >0.0095</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_9dbf7_level0_row4\" class=\"row_heading level0 row4\" >1</th>\n",
" <td id=\"T_9dbf7_row4_col0\" class=\"data row4 col0\" >SimpleCNN</td>\n",
" <td id=\"T_9dbf7_row4_col1\" class=\"data row4 col1\" >wiki_vs_insight</td>\n",
" <td id=\"T_9dbf7_row4_col2\" class=\"data row4 col2\" >0.6780</td>\n",
" <td id=\"T_9dbf7_row4_col3\" class=\"data row4 col3\" >0.0077</td>\n",
" <td id=\"T_9dbf7_row4_col4\" class=\"data row4 col4\" >0.0068</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_9dbf7_level0_row5\" class=\"row_heading level0 row5\" >2</th>\n",
" <td id=\"T_9dbf7_row5_col0\" class=\"data row5 col0\" >SimpleCNN</td>\n",
" <td id=\"T_9dbf7_row5_col1\" class=\"data row5 col1\" >wiki_vs_text2img</td>\n",
" <td id=\"T_9dbf7_row5_col2\" class=\"data row5 col2\" >0.8890</td>\n",
" <td id=\"T_9dbf7_row5_col3\" class=\"data row5 col3\" >0.0083</td>\n",
" <td id=\"T_9dbf7_row5_col4\" class=\"data row5 col4\" >0.0073</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n"
],
"text/plain": [
"<pandas.io.formats.style.Styler at 0x1fb121dc500>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAGGCAYAAADmRxfNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYWtJREFUeJzt3Qm8jOX///EPx76v2SOVLVspEiKUaKFVIhIqpYUkS5EKlbJUSimllZSkSAshUYpSyr7vWyE7x/1/vK//757vzDlzOOfM2c/r+XhMmTn33HPPcs9cn+v6XJ8ri+d5ngEAAABABLJGcmcAAAAAILAAAAAAkCQYsQAAAAAQMQILAAAAABEjsAAAAAAQMQILAAAAABEjsAAAAAAQMQILAAAAABEjsAAAAAAQMQILAMnmnXfesSxZstivv/7KqxyBChUq2J133pmsr2GTJk3cBRnL8OHDrWLFihYVFWW1a9dO7cMBkMERWABIdMDgX3LlymWVKlWyHj162M6dO9P1K3rw4EEbNGiQXX311VakSBH3/PR8gfTmm2++sT59+liDBg3s7bfftqFDh6b2IQHI4LKl9gEASL+eeuopO+ecc+zo0aM2f/58e+2112zGjBm2bNkyy5Mnj6VHe/bscc/r7LPPtlq1atmcOXNS+5Bs5cqVljVr1mRvhCJjmT17tvvcvPXWW5YjR47UPhwAmQCBBYBEa9mypV188cXu3127drWiRYvaiBEj7PPPP7d27dqly1e2VKlStn37ditZsqRL4brkkktS+5AsZ86cZ9zm0KFDljdv3kQ/RmZueEb62qU1hw8fdoH9rl27LHfu3En23nqe5zoRtE8ACIdUKABJpmnTpu7/69evD7n92LFj1qtXLytevLhrwN1www22e/fukG0UjFxzzTVWunRp15A+99xz7emnn7bo6OiQ7VavXm033XSTa/grBats2bJ222232f79+0O2e//9961OnTquEaSUJm2zefPmMz4HPbb2nViaC5EvXz5bt26dtWjRwj1fPSeNgqhhFuyFF16wyy67zAVkOk4d7yeffHLGORZ+KtrcuXPtvvvus7POOsu9Dn/88Ye7fdq0aYFtFy9e7G676KKLYgWF9erVO+0ci5dfftkuuOAC10gtXLiwCyI//PDDkG22bt1qd911l5UoUcK9dtp+/Pjx8Xqtvv32W2vYsKEVKlTIvWaVK1e2/v37h2yjxnGXLl3c/vV+axRpwoQJIdtoVEnPMebo0oYNG2Klsvnvz9q1a61Vq1aWP39+a9++vfvbqVOnbPTo0VajRg33WPq8KiUu5hyhxH62nnzySXc8K1assFtvvdUKFCjg3vuHHnrINdhjis/j6D2rXr26e58vv/xy917pNdTjKP1JQZOfsui/DidPnnTnls4xvWf6fOk+Ok+D6fZrr73Wvv76a/fe6zhef/31wOv98ccf2+DBg61MmTLudbz55pvdeaj9PPzww+5zqde6c+fOsfatY9P3hbbRMVSrVs2NeMbkH4NGROvWreveF80Zeffdd2Ntu2/fPuvZs6e7j/apc6Jjx45uFNKn41Cq43nnnee2KVeunEsXi3l8ABKHEQsASUaNNVFjKdgDDzzgGqb6QVdjb9SoUW4+xqRJkwLbqNGjRogCEP1faRwDBw60AwcOuAmocvz4cddYVyNA+1QAoIbtl19+6RoVBQsWdNsNGTLEnnjiCdd400iKghg1ktXw+u2331xDNjkpGFKD9NJLL7Xnn3/eZs6c6Z67GnQKMHxqxF5//fWuYavnNnHiRLvlllvc81GQdSYKKtT41eukBqQamHpu8+bNc/uVH374waXDLF261L2WasyqAb1gwQK7++6749z3uHHj7MEHH3SNRb/hq8Dl559/tttvv91to/k0eo5qZOr91LF89dVXLhDQY6lxGZe//vrLNRhr1qzpXhM18tasWWM//vhjYJsjR464hrNu1/6Vdjd58mQXHOj91nElht4HfY4U1Ci489P2dNz6HCro0udG2+n1++mnnwIjc0nx2dJ91fgdNmyY2/dLL71k//77b0hjOSGPs3fvXnfMCjw6dOjggjAd7xtvvGGLFi2yN998022nIFa0PwVnem8feeQR957qWJYvX26fffZZrDQ8jT7ec8891q1bNxf8+XQfBRt9+/Z175GOL3v27O7zpuejQErPT6+p3jt9Tn0KIhSE6nOaLVs2++KLL9znWZ/N+++/P+QYtG8dq96fTp06ucBVnwEFXdqHPzeqUaNG7jko0FUgrYBCQfaWLVusWLFibt96PAUp+uxXrVrV/vzzTxs5cqStWrXKpk6dmsBPEoBYPABIoLfffltd7953333n7d6929u8ebM3ceJEr2jRol7u3Lm9LVu2hGzXvHlz79SpU4H7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cuVKK1++fOD2Nm3auDKtWmQ1PubMmeMWav3333/d/Xzz5s2z4cOH2+LFi91irZ999pnbd7CDBw9a3759berUqbZ37163iOuDDz5o9957b8TPDwDSI0YsAADJ4uqrr3aN8nXr1tnIkSPt9ddft0GDBiXZ/hVcDBw40JLDoUOHrFatWjZmzJg4t+nVq5fNnDnT3n//fVu+fLk9/PDD1qNHD5s2bVqyHBMApHUEFgCAZKERBS3wVq5cOdfb37x5c/v222/d306dOmXDhg1zvfwqrapG/CeffBK4r0YQ2rdvb8WLF3d/P//88+3tt98O2b8a8WrUL1u2LM5jON3jbNiwwY1WSOHChV2gopEWadmypT3zzDN2ww03xLnvBQsWWKdOnaxJkyZWoUIFu/vuu93+Fy1aFOErBwDpE6lQAIBkp8a/GuJ+2pIa+woKxo4d64IGpR516NDBBRKNGze2J554wv7++2/76quvrFixYrZmzRo7cuRIyD4bNGhgq1atculIX375ZdjHPd3jNGzY0D799FO76aabXEpVgQIFAutHxMdll13mRifuuusuK126tEur0vFodAYAMiMCCwBAslBjP1++fHby5Ek7duyYZc2a1V555RX376FDh9p3331n9evXd9tWrFjR5s+f79KlFFhs2rTJLrzwQrv44ovd3zUiEFfgULNmTfvhhx+sUaNGIX+Lz+MUKVLE3a5F6ILnWMTHyy+/7EYpNH9E80j0/MaNG2eXX355ol4vAEjvCCwAAMlCaUavvfaam6+gXnw1vjU68Ndff9nhw4ftyiuvDNn++PHjLpiQ7t27u22XLFliV111lUul0ghBTNWqVbOOHTu6UYsff/wx5G8a5TjT40RCgcVPP/3kRi00EqPRkPvvv9+NXijtCwAyGwILAECyyJs3r5133nnu3+PHj3fzD9566y2rXr26u2369OlWpkyZWPMy/DkOGzdutBkzZrh5Gc2aNXON9hdeeCHW4wwePNgqVarkqjPFrNp0psdJLKVl9e/f31WLuuaaa9xtGjn5/fff3TESWADIjAgsAADJTmlCaoirkpLmIahhr3QnpSPFRfMgNDlaF6U5Pfroo2EDC00O10Ru7f/cc88NGc040+PkyJHD/T86OjpBz+fEiRPuoucVLCoqyk0YB4DMiMACAJAitI6FggPNb+jdu7f17NnTNcI1iXr/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6cns3k1S+xAAIENJ1RGLSZMmWa9evWzQoEG2ZMkSFwS0aNHCdu3aFXb7xx9/3F5//XUXKPz9999277332g033GC//fZbovcJAAAAIJ0HFiNGjLBu3bpZ586drVq1ajZ27FjLkyePjR8/Puz27733nvXv399atWplFStWtO7du7t/v/jii4neJwAAAIB0HFgcP37cFi9ebM2bN//fwWTN6q4vXLgw7H2OHTtmuXLlCrktd+7cNn/+/ETvEwCQOEp9umL49+6S3tKgAAAZKLDYs2ePRUdHW4kSJUJu13XNjQhHKU0akVi9erWdOnXKvv32W5syZYpt37490fv0A5YDBw6EXAAAAABk0KpQo0ePtvPPP9+qVKliOXLksB49eriUJ41KREITwgsWLBi4lCtXLsmOGQAAAMgMUi2wKFasmEVFRdnOnTtDbtf1kiVLhr1P8eLFberUqW4hpo0bN9qKFSssX758br5FYvcp/fr1s/379wcumzdvTpLnCAAAAGQWqRZYaMShTp06NmvWrMBtSm/S9fr165/2vppnUaZMGTt58qR9+umn1rp164j2mTNnTitQoEDIBQAAABmDymN//+gVliVLFtdBjQy4joXKwnbq1Mkuvvhit87EqFGj3Jut9Cbp2LGjCyCUqiQ///yzW7+idu3a7v9PPvmkCxz69OkT730CAAAAyGCBRdu2bW337t02cOBAN7laAcPMmTMDk683bdoUMn/i6NGjbi2LdevWuRQolZpVCdpChQrFe58AAAAAMuDK25qArUs4c+aErkLbuHFjtzBeJPsEAAAAkMmrQgEAAABIm1J9xAIAAADpy4RD3S09OXz8lFXxr7zWwCxnlKUrDyy29IARCwAAAAARI7AAAAAAEDECCwAAAAAEFgAAAABSHyMWAAAAACJGVSgAAABkaHlyZLVNT1axckXypPahZGiMWAAAAACIGIEFAAAAgIgRWAAAAACIGIEFAAAAgIgRWAAAAACIGIEFAAAAgIgRWAAAAACIGIEFAAAAgIgRWAAAAACIGIEFAAAAgIgRWAAAAACIGIEFAAAAgJQLLBYvXmxXXHGFHThwINbf9u/f7/62dOnSyI8IAAAAQMYNLF588UVr2rSpFShQINbfChYsaFdeeaUNHz48qY8PAAAAQEYKLH7++Wdr3bp1nH+/7rrrbMGCBUl1XAAAAAAyYmCxdetWy58/f5x/z5cvn23fvj2pjgsAAABARgwsihcvbitXrozz7ytWrLBixYol+ADGjBljFSpUsFy5clm9evVs0aJFp91+1KhRVrlyZcudO7eVK1fOevbsaUePHg38/cknn7QsWbKEXKpUqZLg4wIAAACQDIFF8+bNbciQIWH/5nme+5u2SYhJkyZZr169bNCgQbZkyRKrVauWtWjRwnbt2hV2+w8//ND69u3rtl++fLm99dZbbh/9+/cP2e6CCy5woyf+Zf78+Qk6LgAAAAAJky2+Gz7++ONWp04dN6rwyCOPuFEDf6RCE7tXrVpl77zzToIefMSIEdatWzfr3Lmzuz527FibPn26jR8/3gUQMWkOR4MGDez222931zXS0a5dOzf/I+RJZctmJUuWTNCxAAAAAEiBEYtzzz3XvvvuOzt06JDddtttdtFFF7mLGvaHDx+2b7/91s4777x4P/Dx48ddCdvgUY6sWbO66wsXLgx7n8suu8zdx0+XWrdunc2YMcNatWoVst3q1autdOnSVrFiRWvfvr1t2rQp3scFAAAAIBlHLOTiiy+2ZcuW2W+//WZr1qxxKVCVKlWy2rVrJ/iB9+zZY9HR0VaiRImQ23VdoyDhaKRC92vYsKF77JMnT9q9994bkgqlERWNnGhERWlQgwcPtkaNGrnjjmvy+bFjx9zFF26tDgAAAABJFFj4LrzwQndJaXPmzLGhQ4faq6++6gIIBTcPPfSQPf300/bEE0+4bVq2bBnYvmbNmm678uXL28cff2xdunQJu99hw4a5AAQAAABAMgcWN954Y9jbtTieRi26du3qKkfFlypIRUVF2c6dO0Nu1/W45kcoeLjjjjvcY0mNGjVcatbdd99tAwYMcKlUMRUqVMgdn4KQuPTr189NIg8esVDFKQAAAABJPMdCAUS4y759+2zcuHEu9UjpRvGVI0cONxl81qxZgdtOnTrlrtevXz/sfTSXI2bwoOBElBoVzsGDB23t2rVWqlSpOI8lZ86cbkXx4AsAAACAZBixePvtt+P8mwICVXdSz/8XX3wR7wfXKEGnTp3c3I26deu6NSo0AuFXierYsaOVKVPGpSr5q3urkpTSsPxUKI1i6HY/wOjdu7e7rvSnbdu2udK0+psmmQMAAABIQ3MsYtIowoMPPhgyvyE+2rZta7t377aBAwfajh073CTwmTNnBiZ0q5pT8AiFSt5qwTv9XyuBK/VKQUTw+hpbtmxxQcTevXvd3zXR+6effkpQmhYAAACAVAgsJG/evC5VKaF69OjhLnFN1o65PoVGIHSJy8SJExN8DAAAAABSaI7FmWgdC02SBgAAAJD5xHvEYtq0aWFv379/v1u07s0333QXAAAAAJlPvAOLNm3ahL1di86pIpSCCq3IDQAAACDziXdgocpPAAAAAJCscyy0nsUrr7ySVLsDAAAAkJkCCy1od/vtt7sF6E5XrQkAAABAxpWowGLz5s321FNP2TnnnGNXXXWVW1vis88+c2tRAAAAAMh84h1YnDhxwiZPnmwtWrRwk7V///13Gz58uFvAbsCAAXb11Vdb9uzZk/doAQAAAKTvydtlypSxKlWqWIcOHdwidIULF3a3a5VrAAAAAJlbvEcsTp486VKedImKikreowIAAACQMQOLbdu22d13320fffSRlSxZ0m666SY3r0KBBgAAAIDMLd6BRa5cuax9+/Y2e/Zs+/PPP61q1ar24IMPupGMIUOG2LfffmvR0dHJe7QAAAAAMk5VqHPPPdeeeeYZ27hxo02fPt2OHTtm1157rZUoUSLpjxAAAABAxpm8HY4qQrVs2dJddu/ebe+9917SHRkAAACAzLfydvHixa1Xr15JtTsAAAAAmTGwAAAAAJB5EVgAAAAAiBiBBQAAAIDUCyyOHz9uK1eudOVmAQAAAGRuCQ4sDh8+bF26dLE8efLYBRdcYJs2bXK3P/DAA/bss88mxzECAAAAyGiBRb9+/Wzp0qU2Z84ct2ier3nz5jZp0qSkPj4AAAAAGXEdi6lTp7oA4tJLL7UsWbIEbtfoxdq1a5P6+AAAAABkxBELLYR31llnxbr90KFDIYEGAAAAgMwjwYHFxRdfbNOnTw9c94OJN9980+rXr5+0RwcAAAAgY6ZCDR061Fq2bGl///23qwg1evRo9+8FCxbY3Llzk+coAQAAAGSsEYuGDRva77//7oKKGjVq2DfffONSoxYuXGh16tRJ8AGMGTPGKlSo4CaC16tXzxYtWnTa7UeNGmWVK1e23LlzW7ly5axnz5529OjRiPYJAAAAIIVHLOTcc8+1cePGRfjQ5iaB9+rVy8aOHesCAAUNLVq0cOtjhJvH8eGHH1rfvn1t/Pjxdtlll9mqVavszjvvdOlYI0aMSNQ+AQAAAKTCiMWSJUvszz//DFz//PPPrU2bNta/f3+3aF5CKBjo1q2bde7c2apVq+aCAa2PocAhHKVbNWjQwG6//XY3InHVVVdZu3btQkYkErpPAAAAAKkQWNxzzz1upEDWrVtnbdu2dQ33yZMnW58+feK9HwUhixcvdutfBA4ma1Z3XWlV4WiUQvfxAwk9/owZM6xVq1aJ3qccO3bMDhw4EHIBAAAAkIyBhYKK2rVru38rmGjcuLFLUXrnnXfs008/jfd+9uzZY9HR0VaiRImQ23V9x44dYe+jkYqnnnrKzfPInj27S8lq0qSJGy1J7D5l2LBhVrBgwcBFczcAAAAAJGNg4XmenTp1yv37u+++C4wWqDGuhn1y0mrfqkr16quvupSsKVOmuNK3Tz/9dET71Wri+/fvD1w2b96cZMcMAAAAZAbZErOOxTPPPOPSi1Re9rXXXnO3r1+/PtZIwekUK1bMoqKibOfOnSG363rJkiXD3ueJJ56wO+64w7p27equqyqVFua7++67bcCAAYnap+TMmdNdAAAAAKTQiIWqLGm0oEePHq4xf95557nbP/nkEzcHIr5y5MjhytPOmjUrcJtGQnQ9roX2Dh8+7OZMBFMg4Y+kJGafAAAAAFJhxKJmzZohVaF8w4cPDzTy40tlYTt16uRGQerWreuCFo1AqKKTdOzY0cqUKePmQMh1113nqj5deOGFrpTsmjVr3CiGbvcf+0z7BAAAAJBG1rEIR4vRJZQqSu3evdsGDhzoJldrUvjMmTMDKVWbNm0KGaF4/PHH3ZoV+v/WrVutePHiLqgYMmRIvPcJAAAAIOll8ZRDdAZFihRx1aA0h6Fw4cKucR+Xf/75x9I7lZtVdShN5C5QoECqHEPTF+akyuNmVrN7N0ntQwA471MY5z3SivT4mz/hUHdLj8oVyWPp0gOL00W7OF4jFiNHjrT8+fMH/n26wAIAAABA5hOvwEJzFnx33nlnch4PAAAAgMxQFUoTqt9++21bu3Zt8hwRAAAAgIwfWKikq6o0nX/++W5RvA4dOtibb75pq1evTp4jBAAAAJDxAgsFEZrIrdWpn3/+ecuXL5+9+OKLVqVKFStbtmzyHCUAAACAjBVY+FQdqmjRou7/hQoVsmzZsrnyrwAAAAAynwQHFv3793crbCuo6Nu3rx09etT9X2tG/Pbbb8lzlAAAAAAy1gJ5zz77rBuZGDRokN14441WqVKl5DkyIAVEHz9i8wa0siyPmh08eNDy5s3L6w4AAJASgYVGJebOnWtz5sxxcys0mbtx48bWpEkTdyHQAAAAADKfBAcWtWrVcpcHH3zQXV+6dKlbNO/++++3U6dOWXR0dHIcJwAAAICMFFh4nudGLTRiocv8+fPdUt81a9Z0IxcAAAAAMp8EBxZFihRxuegatVAg0a1bN2vUqJGrDAUAAAAgc0pwYPH++++7QKJAgQLJc0QAAAAAMna52RMnTljr1q1t06ZNyXdEAAAAADJ2YJE9e3Y7++yzmaANAAAAILJUqAEDBrhF8t577z033wIINuFQ93T1ghw+fsqq+Fdea2CWM8rSlQcWp/YRAAAAJC6weOWVV2zNmjVWunRpK1++fKwFxZYsWZLQXQIAAADIbIFFmzZtkudIAAAAAGSewGLQoEHJcyQAAAAAMsfkbQAAAABI9IiFJmmvWrXKihUrZoULF7YsWbLEue0///wTn10CAAAAyGyBxciRIy1//vzu36NGjUruYwIAAACQEQOLTp06hf03AAAAAMQ7sIjL0aNH7fjx4yG3FShQgFcW6UaeHFlt05NVrFyRPKl9KAAAAJlr8vahQ4esR48edtZZZ7k1LDTnIviSGGPGjLEKFSpYrly5rF69erZo0aI4t23SpImb4xHzcs011wS2ufPOO2P9/eqrr07UsQEAAABIhsCiT58+Nnv2bHvttdcsZ86c9uabb9rgwYPdgnnvvvtuQndnkyZNsl69erkytlpcr1atWtaiRQvbtWtX2O2nTJli27dvD1yWLVtmUVFRdsstt4Rsp0AieLuPPvoowccGAAAAIJlSob744gsXQGjkoHPnztaoUSM777zz3CrcH3zwgbVv3z5B+xsxYoR169bN7UvGjh1r06dPt/Hjx1vfvn3DVqgKNnHiRMuTJ0+swEJBT8mSJRP69AAAAACkxIiFyslWrFgxMJ/CLy/bsGFDmzdvXoL2pfkZixcvtubNm//vgLJmddcXLlwYr3289dZbdtttt7m0rGBz5sxx6VqVK1e27t272969e+Pcx7Fjx+zAgQMhFwAAAADJGFgoqFi/fr37d5UqVezjjz8OjGQUKlQoQfvas2ePRUdHW4kSJUJu1/UdO3ac8f6ai6FUqK5du8ZKg9KoyqxZs+y5556zuXPnWsuWLd1jhTNs2DArWLBg4FKuXLkEPQ8AAAAgs0twKpRSlpYuXWqNGzd2qUrXXXedvfLKK3bixAmX1pSSNFpRo0YNq1u3bsjtGsHw6e81a9a0c889141iNGvWLNZ++vXr5+Z5+DRiQXABAAAAJGNg0bNnz8C/lbK0YsUKl86keRZqwCeEVvLWxOudO3eG3K7rZ5ofoepUml/x1FNPxWuURY+1Zs2asIGF5mPoAgAAACCZU6FOnTrl0ooaNGhgl1xyiRutOHLkiJu0feONNyY4qJAcOXJYnTp1XMpS8OPoev369U9738mTJ7u5ER06dDjj42zZssXNsShVqlSCjxEAAABAEgYWQ4YMsf79+1u+fPmsTJkyNnr0aLv//vstUkpBGjdunE2YMMGWL1/uJlprNMKvEtWxY0eXqhQuDapNmzZWtGjRkNsPHjxojz76qP3000+2YcMGF6S0bt3ajaiojC0AAACAVEyF0mToV1991e655x53/bvvvnOL0mkdC1VySqy2bdva7t27beDAgW7Cdu3atW3mzJmBCd2bNm2Ktf+VK1fa/Pnz7Ztvvom1P6VW/fHHHy5Q2bdvn1tf46qrrrKnn36adCcAAAAgtQMLNfBbtWoVMr9CK1pv27bNypYtG9FBaCVvXcLRhOuYVELW87yw2+fOndu+/vrriI4HAAAAQMLEe6jh5MmTlitXrpDbsmfP7qpBAQAAAMjc4j1ioRGCO++8MySd6OjRo3bvvfeGLE43ZcqUpD9KAAAAABkjsOjUqVOs2+JTkQkAAABAxhfvwOLtt99O3iMBAAAAkG4lvpwTAAAAAPwfAgsAAAAAESOwAAAAABAxAgsAAAAAESOwAAAAABAxAgsAAAAAESOwAAAAABAxAgsAAAAAESOwAAAAAEBgAQAAACD1MWIBAAAAIGIEFgAAAAAiRmABAAAAIGIEFgAAAAAiRmABAAAAIGIEFgAAAAAiRmABAAAAIGIEFgAAAAAiRmABAAAAIGIEFgAAAAAyRmAxZswYq1ChguXKlcvq1atnixYtinPbJk2aWJYsWWJdrrnmmsA2nufZwIEDrVSpUpY7d25r3ry5rV69OoWeDQAAAJD5pHpgMWnSJOvVq5cNGjTIlixZYrVq1bIWLVrYrl27wm4/ZcoU2759e+CybNkyi4qKsltuuSWwzfPPP28vvfSSjR071n7++WfLmzev2+fRo0dT8JkBAAAAmUeqBxYjRoywbt26WefOna1atWouGMiTJ4+NHz8+7PZFihSxkiVLBi7ffvut294PLDRaMWrUKHv88cetdevWVrNmTXv33Xdt27ZtNnXq1BR+dgAAAEDmkKqBxfHjx23x4sUuVSlwQFmzuusLFy6M1z7eeustu+2229yohKxfv9527NgRss+CBQu6FKu49nns2DE7cOBAyAUAAABAOgks9uzZY9HR0VaiRImQ23VdwcGZaC6GUqG6du0auM2/X0L2OWzYMBd8+Jdy5col8hkBAAAAmVOqp0JFQqMVNWrUsLp160a0n379+tn+/fsDl82bNyfZMQIAAACZQaoGFsWKFXMTr3fu3Blyu65r/sTpHDp0yCZOnGhdunQJud2/X0L2mTNnTitQoEDIBQAAAEA6CSxy5MhhderUsVmzZgVuO3XqlLtev37909538uTJbm5Ehw4dQm4/55xzXAARvE/NmVB1qDPtEwAAAEDiZLNUplKznTp1sosvvtilNKmik0YjVCVKOnbsaGXKlHHzIGKmQbVp08aKFi0acrvWtHj44YftmWeesfPPP98FGk888YSVLl3abQ8AAAAgAwYWbdu2td27d7sF7TS5unbt2jZz5szA5OtNmza5SlHBVq5cafPnz7dvvvkm7D779OnjgpO7777b9u3bZw0bNnT71AJ8AAAAADJgYCE9evRwl3DmzJkT67bKlSu79SriolGLp556yl0AAAAAJL90XRUKAAAAQNpAYAEAAAAgYgQWAAAAACJGYAEAyFSijx+x7x+9ws3HU6EPAEDSILAAAAAAEDECCwAAAAARI7AAAAAAEDECCwAAAAARI7AAAAAAkDFW3gYApF8TDnW39OTw8VNWxb/yWgOznFGWrjywOLWPAADCYsQCAAAAQMQILAAAAABEjMACAAAAQMQILAAAAABEjMnbAIBMJU+OrLbpySpWrkie1D4UAMhQGLEAAAAAEDECCwAAAAARI7AAAAAAEDECCwAAAAARI7AAAAAAEDECCwAAAAARI7AAAAAAEDECCwAAAAARI7AAAAAAkP4DizFjxliFChUsV65cVq9ePVu0aNFpt9+3b5/df//9VqpUKcuZM6dVqlTJZsyYEfj7k08+aVmyZAm5VKlSJQWeCQAAAJB5ZUvNB580aZL16tXLxo4d64KKUaNGWYsWLWzlypV2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K7JpDoXSl7p16+YqwaiSm9KfVClKKYq6v74HtNClggWd6/7ilJqYqUng+v7Rue9XnQKQtKjqBiQjL5OJjo52/58/f77XoUOHwPVw240ePdobPny4u37ixIkz7rtBgwZemzZtvN27d3stW7b0+vTpE/jbzz//7LVr186rWbOmlzdvXvfvVatWhdz/n3/+cY9XrVo1r1ChQt4111zjff755/F6bACRW7BggVevXr3A98KkSZO8unXrevnz5/e+/PJLd1vt2rW9l156yTt16pTXtGlT76abbnK3b9++3bvrrru8q6++2l0/ePCg98wzz3iVKlXyqlat6m3YsME7fPhwyOPt27fPe/HFF73q1at7BQsW9K699lrvo48+8g4cOMDbCSSDZcuWeY0bN/Zmz57trq9cudKddzp3fQsXLvQqVKjg/fbbb+76V1995RUpUsTdLnG1G4Jpv/ny5fOyZMniPfnkk97JkyfDbqfb/d/4Xbt2ue+cv/76K0meK5AaMlVg8d5777lGv4wbN84rW7asN2PGDHf92LFj7uR+7bXXvGnTprnbunTp4pUpU+aM+/W/MPSlc+WVV7rGxh133OHdc889gW207w8//NCbMmVKrEBBDRIFOVFRUd5ll13mvfzyy962bduS9LkDOLOdO3d6xYsX9x577DF3XefsAw884D300EOus2DevHlet27d3HUZOXKka3Do+0Nef/11950xZ86cwD63bt3qHT9+POxj6TtIgYs6MbQdgOShjgCJ2cDX7/HAgQNdcP/vv/+629S50K9fv8A2Gzdu9Bo1ahQIPuIKEnx+4DFhwgT3XbJly5Y4twEymkyTCqX0ozfffNP+/PNPd10pCqovr1Ur/cmVWglTKQ9KYZKbb77Zjhw54mrSS1wTKP0KL6rw9Morr9iiRYvcUGupUqUCEzSVYqG69jfccIP7t27387l1f5Wj0yJaWsVX1WR0XwApS+lKI0eOtG+++cZ9N2jV6s8//9xVcvEXnVMVOKVC6ftAqU36tyZsiypEqcxs8ORrTeJWueng7w916uixtPilqs74k70BpExVt2HDhrl2gX6PVdVNf1dVt7lz58ZZ1U3r0Pj7iM9jKS1Sq2XHLBUtzJtCRpXhAwt/joNKwWl1XOVF+5Mt9WWiIECTtUV5zWr8K+AQ1aRWQ2HcuHEh+4qLGg4qS6fJmcqv7tq1a6wvIL9xodv9fG41WFR6lgWtgNSnc1HBwZAhQ1yHg+ZMqc68vh+0AJ3mVOg7Qw0DNRj0HaEVtuWyyy5z86fUcXG6hoTf8PA7MQAkP6q6AckvwwcW9FIASAiNLtx3333u/1opVx0Q6tnUQlcaxZQvv/zS/b9EiRJuwatp06aFfN/ELCULIPlR1Q1IfRk+sBB6KQAkhEY0lRaptAiVlPVX0W3durUbjfSrRPlpEjFHNM+UKgEg6VHVDUh9GSKwoJcCQFJT2uSdd95pu3btCvmOUc5027Zt3b+D51IE/xtAylu4cKGb6+inHKtDQOvLaF0ZzY9Q4KES74sXL3ZpixqN1NxLv1x0hQoVXNqj0pi1Jo1GKLWSttKjNbfq3nvvdWWhtV+d7yo3rUUytUCmHkdl4seOHevKVDNnCplVhggs6KUAkJT80YfHH3/cjXhef/31IX8n1QlIe7QIpdaS6t+/f+A8VQGGu+66y819/OGHH1wAsHbtWhcYqGiKFsDUOjMaedS2KvCikcq8efPagAED3N+XLl1q5cuXt9y5cwceSx0O1atXd0GL1q35+++/3Vyr2267zfLnz5+KrwKQujJEYEEvBYCk5I8+lC1b1i16FxOpTkDaQ1U3IPVliMCCXgoAAEBVNyB1ZYjAgl4KAABAVTcgdWWIwELopQAAAFR1A1JPFi2/bRmEJm1p4lThwoWtWLFirqKDVrrWyrn6/9lnn20bNmxwEzNV+cEvE+nTRC9ypwEASP9UxemNN96wqVOnxirAACB5ZKjAQlTBoWXLllaoUCG3cFWrVq3c7X379nULXKlMpJ6yPzkz+N8AACB983/XVSL2yJEjsQow0IkIJJ8MF1gIvRQAAABAyspQgQW9FAAAAEDqyFCBBQAAAIDUkWGqQgEAAABIPQQWAAAAACJGYAEAAAAgYgQWAAAAACJGYAEAAAAgYgQWAAAAACJGYAEAAAAgYgQWAAAAACJGYAEAAAAgYgQWAAAAACJGYAEAAAAgYgQWAAAAACxS/w9u3+EveaYSHgAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 800x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"rows = []\n",
"for model, run_name in PHASE1_RUNS.items():\n",
" results = load_run(run_name)\n",
" for pair_key, metrics in (results or {}).get(\"aggregated_pairwise\", {}).items():\n",
" auc = metrics.get(\"auc_roc\", {})\n",
" rows.append({\n",
" \"model\": model,\n",
" \"pair\": pair_key,\n",
" \"auc\": auc.get(\"mean\", np.nan),\n",
" \"std\": auc.get(\"std\", np.nan),\n",
" \"ci95\": auc.get(\"ci_95\", np.nan),\n",
" })\n",
"pair_df = pd.DataFrame(rows)\n",
"display(pair_df.sort_values([\"model\", \"pair\"]).style.format({\"auc\": \"{:.4f}\", \"std\": \"{:.4f}\", \"ci95\": \"{:.4f}\"}))\n",
"\n",
"fig, ax = plt.subplots(figsize=(8, 4))\n",
"for i, (model, sub) in enumerate(pair_df.groupby(\"model\")):\n",
" x = np.arange(len(sub)) + (i - 0.5) * 0.18\n",
" ax.bar(x, sub[\"auc\"], width=0.36, yerr=sub[\"std\"], label=model, alpha=0.85)\n",
"ax.set_xticks(np.arange(pair_df[\"pair\"].nunique()))\n",
"ax.set_xticklabels(sorted(pair_df[\"pair\"].unique()), rotation=20, ha=\"right\")\n",
"ax.set_ylim(0.6, 1.0)\n",
"ax.set_ylabel(\"Pairwise AUC\")\n",
"ax.set_title(\"Phase 1 pairwise source performance\")\n",
"ax.legend()\n",
"fig.tight_layout()\n",
"fig.savefig(FIGURES_DIR / \"03_phase1_pairwise_auc.png\", dpi=180, bbox_inches=\"tight\")\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "0aefa0eb",
"metadata": {},
"source": [
"## 4. Training dynamics\n",
"\n",
"The train/validation curves show whether high test AUC came with obvious overfitting. The table uses the saved best-checkpoint epoch per fold, matching the model state used for held-out testing.\n",
"\n",
"**Interpretation rule:** a larger train-val gap is not automatically fatal, but it warns that later improvements should be checked against source-wise behavior and not only aggregate AUC.\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "495edc97",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAGGCAYAAACqvTJ0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgRZJREFUeJzt3Qd4VGXaxvE7vRBCCxB6B0VpgiCoa0NZcbErdtTV1bWLrh2wY0UsuK5r4RMbFiyrLoisYgEbiIpK7z20VNLnu553MkMSkpBAkslk/r/rGmfOmTNnzszE5OWe531OmMfj8QgAAAAAAACoReG1+WQAAAAAAACAIZQCAAAAAABArSOUAgAAAAAAQK0jlAIAAAAAAECtI5QCAAAAAABArSOUAgAAAAAAQK0jlAIAAAAAAECtI5QCAAAAAABArSOUAgAAAAAAQK0jlAJQL3Ts2FEXX3xxQJ777rvvVlhYWECeGwAAAACCFaEUgDrv119/1ZlnnqkOHTooNjZWbdq00fHHH6+nn35a9cUXX3yh008/XcnJyYqOjlaLFi00YsQITZs2zb/NqlWrXPhll3fffbfccGzr1q3+dRbU2brevXvL4/Hs8Ri775prrqnBVwYAAPZm8uTJ/r/xdomMjHTjHfs7vn79+hp5A33jhpYtWyorK6vML/z+8pe/7NO+n332WfeayvLAAw/o5JNPds9rz2/HUZ7PPvtMxxxzjJKSktS4cWMNHDhQU6ZM2adjAlA3EUoBqNPmzJmjAQMG6Oeff9bll1+uZ555RpdddpnCw8P15JNP+rdbvHix/v3vfysYjRs3zg24Fi5cqCuuuELPPfec/vGPfygjI0NnnHGGXn/99T0ec++995YZMlUU7BUPuAAAQN1jf98tdLGxwIknnqhXX31VRx11lLKzs2vsObds2aJ//vOf1brPikKpu+66Sz/88IP69etX4T4+/PBDnXDCCcrNzXXBlYVZcXFxuuiii/TEE09U6/ECCJzIAD43AOyVDUAaNWrkBi/2DVnpQZRPTExMUL6b77zzjhuAWiWYhU9RUVH++yyYmjFjhvLy8ko8pm/fvlqwYIHee+89V121NzaAa9eunXse256phgAA1E0WRNmXcca+hLMKoYcfftgFNGeffXaNPKeNKx599FFdddVVbsxQ01auXOmqsKyyu3nz5uVuZ19EtmrVSv/73//84zz78u6AAw5wgdeNN95Y48cKoOZRKQWgTlu+fLkOOuigPQIpY1Pcyusp5SuD//rrr3Xddde5QY/twwYz9o3bzp073TdtTZo0cZdbbrmlROWRb6rcY4895r6Ns6mDNlCzbyutoqky7NvN/v37u8c1bdpU55xzjtauXVtimzFjxrj7XnrppRKBlM+wYcP2KJ23/XTv3r3S1VJWVWbfSv7yyy8uyAIAAMHhyCOP9I+HfBYtWuS+zLLxg7U1sBDLQqvi7Aute+65R926dXPbNGvWTEcccYRmzpy5x3OMHTtWmzdvrlS1VGFhoSZOnOjGZrZfm4JnY6sdO3aUGJP99ttvmj17tn864tFHH13i/spIS0tzY7TiXzzatEYL6mojPANQOwilANRpFgbNmzev0kFQaddee62WLl3qBmbWv+D55593QZD1ayooKNCDDz7oBmn2DWFZPQpeeeUVPfXUU7r66qt1++23u+M49thj3eBtbxVeFnrZYHDChAm64YYbNGvWLP3pT39ygZix47KB5amnnqqGDRtW+jVFRES4kMmmNFY2ZDrvvPPcsVR12h8AAAgc+5LMWDhjLOw57LDD9Mcff+i2227T448/rgYNGrixRPExgU13s7GPtQewiqM777xT7du31/z588sMvmxs88gjj2jXrl0VHo8FUFbJffjhh7s2Cpdccolee+019yWar7LbQqu2bdu6iiYbW9nFnr+qLMiy12vjtmXLlrlg7r777tOPP/7ovkwEUE94AKAO+/TTTz0RERHuMnjwYM8tt9zimTFjhic3N7fEdh06dPCMGjXKv/zyyy9b8uIZNmyYp7Cw0L/e9hEWFua58sor/evy8/M9bdu29Rx11FH+dStXrnSPj4uL86xbt86//rvvvnPrb7zxRv+6cePGuXU+q1atcsf7wAMPlDjGX3/91RMZGelf/8EHH7jHPfHEE5V6L3zH9Oijj7pj7tatm6dPnz7+1+c7jpSUFP9j7D1p0KCBu/1///d/7v5p06b577flq6++ulLPDwAAaoZv3PLZZ5+5v+Nr1671vPPOO57mzZt7YmJi3LI57rjjPL169fJkZ2f7H2vjgCFDhrhxgY+ND0466aQKn7P4uGH27Nnu9oQJE0qMrYrv46uvvnLbvPbaayX2M3369D3WH3TQQSXGVWWx57XH2XGUJSMjw3P22We7cZtt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//53Fz49/vjjLqwqHkIlJyfX4isBAABAqPj0t0266rX5yi/0+BuXn39Ye40c0E7NaFwOAEDdD6Vyc3M1b9483X777f514eHhGjp0qObOnVvmY3JycvZoCGpnzPn6669LrFu6dKlat27tth08eLA7g0779u3LPRbbr118qnLmHwAAgLqCMU3tVEjd9PbPLpAa1KmpLj+ys46hcTkAAMHVU2rr1q0qKChQy5YtS6y35U2bNpX5GJvaZ9VVFjoVFhZq5syZmjZtmjZu3OjfxqYBTp482fWa+uc//+nObnPkkUcqPT293GOx0Mq6wvsudupnAADqGvvbh+BXk58jY5qa7x911evzlJ6dr/4dmujVywZpaM+WnEkPAIB9FFTNlp588kk33c/6SdkcfWt4blP/bLqfz4knnui/3bt3bxdSdejQQW+99Zb++te/lrlfq9ay3lbFK6UIpgAAdUV0dLSrJt6wYYOaN2/ululVE3w8Ho+rFE9JSXGfp32O1Y0xTc164OM/tHB9mprER+mZ8/opKiLg5wwCACCoBSyUSkpKUkREhDZv3lxivS2X1w/KBuLvv/++srOztW3bNjdFz3pPde7cudznady4sbp3765ly5aVu01MTIy7AABQF1mA0alTJ1cZbMEUglt8fLxrK2Cfa3VjTFNz/vPzBk35drW7PWFkX7VqFFeDzwYAQGgIWChl3w72799fs2bN0qmnnuovZ7fla665psLHWq+oNm3aKC8vT++++67OPvvscrfNyMjQ8uXLdeGFF1b7awAAoDb/blqQkZ+f76a/IzjZF3J2QhYq3YLLyq2Zun3ar+72VUd30TE99jxLNAAACLLpezZlbtSoURowYIAGDhyoiRMnKjMz0382vosuusiFT9YfwXz33Xdav369+vbt667vvvtuF2Tdcsst/n3efPPNGjFihJuyZ98mjxs3zg0Azz333IC9TgAAqoMFGVFRUe4CoBb7SL02Xxk5+RrYqalGH9+dtx4AgPoQSo0cOdL1VRg7dqxrbm5hkzUo9zU/X7NmTYnSdpu2d9ddd2nFihVKSEjQ8OHDNWXKFDdFz2fdunUugLLpfTbd74gjjtC3337rbgMAAABVcc9/ftcfG9PUrEG0nj63nyLpIwUAQLUJ81jXTZRgjc7tLHypqalKTEzk3QEAAEE5BmFMs38+WLBe17+5QGFh0iuX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XmfNmqUlS5a49+Pnn3923yqeeOKJvD/FrFy5Ups2bSrx/1WjRo00aNAgzZ07l/eqjN/LVkLfuHHjkH9vCgsLdeGFF+of//iH+wYfqAtCcexkU17efPNNVx1m0/hCQSiOCW1avVWkdu7cWeeff77WrFmj+o5xrpSbm6tXX31Vl156qRt/1GehOnbPz893v8djY2NLrLdpfIGqiIwMyLOiTg72bV6plawefPDBCnU22LLpM4GcW1sXrVixwpW5jh49WnfccYd7f6677jpFR0dr1KhRgT68gLrtttuUlpbmei5ERES4X/YPPPCAG8hhNwukTMuWLUu8Lbbsuw9eNp3Rekyde+65rodLqLOy+sjISPc7B6gLQm3sZFM8LISy300JCQluKm3Pnj1V34XimNC+KJo8ebJ69OjhpnPdc889OvLII7Vw4ULXT62+Ypwr1xtw586duvjii1XfherYvWHDhu53ufXPOvDAA90Y/I033nBfDnft2jUgx0QoBf83QPaHJhTmi+/N2rVrdf3117t5tqUT5FBnA3CrlHrwwQfdslVK2c+N9QYK9VDqrbfe0muvvabXX3/dVXEsWLDA/WPFvmUM9fcGVWd9as4++2zXbNOC4FBnfWyefPJJ9w/D+v7NLYJHqI2dLKCwv21WHfbOO++4v23WY6s+B1OhOiYsXiliPbQspLKGyDbW+etf/6r6inGu9OKLL7rPPxT6Noby2H3KlCmuGq5NmzYukDvkkEPcl6A23goEpu9B11xzjT766CN9/vnnrpFlqLP/Gbds2eL+57Rv5e1igy5rzGy3LUUPVXa2tNKDT0vYQ6Gke29sSpF943LOOee4M7XYNKMbb7zRnakJuyUnJ7vrzZs3l3hbbNl3X6jzBVKrV692/xCiSkr66quv3O/l9u3b+38v2/tz0003ubMGAbUtFMdOVhVt36L379/f/W2zJvcWFtdnjAm9bAp59+7dtWzZMtVnoT7Otb+rn332mWuCHQpCeezepUsX9+/bjIwMF75///33bvxp03UDgUqpEGbfwF977bWu/PqLL75wp8OEdNxxx7kS9eIuueQSV9ppU2ksTQ5VNkWh9KmvbR62fXsW6uzMaeHhJXN++1mxb92wm/2esfDJ5vD37dvXrbPSaTsL39///veQf6t8gZT18rB/7NopqSE3UCzdy8XO2Gjr7fczUFsYO+1m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",
"text/plain": [
"<Figure size 1200x400 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def history_frame(results: dict, model: str) -> pd.DataFrame:\n",
" rows = []\n",
" for fold in results.get(\"fold_results\", []):\n",
" hist = fold.get(\"history\") or {}\n",
" max_len = max(len(hist.get(\"train_auc\", [])), len(hist.get(\"val_auc\", [])))\n",
" for epoch in range(max_len):\n",
" rows.append({\n",
" \"model\": model,\n",
" \"fold\": fold[\"fold\"],\n",
" \"epoch\": epoch + 1,\n",
" \"train_auc\": hist.get(\"train_auc\", [np.nan] * max_len)[epoch] if epoch < len(hist.get(\"train_auc\", [])) else np.nan,\n",
" \"val_auc\": hist.get(\"val_auc\", [np.nan] * max_len)[epoch] if epoch < len(hist.get(\"val_auc\", [])) else np.nan,\n",
" })\n",
" return pd.DataFrame(rows)\n",
"\n",
"hist_df = pd.concat([\n",
" history_frame(load_run(run_name), model)\n",
" for model, run_name in PHASE1_RUNS.items()\n",
"], ignore_index=True)\n",
"\n",
"fig, axes = plt.subplots(1, 2, figsize=(12, 4), sharey=True)\n",
"for ax, model in zip(axes, PHASE1_RUNS):\n",
" sub = hist_df[hist_df[\"model\"].eq(model)]\n",
" mean_df = sub.groupby(\"epoch\")[[\"train_auc\", \"val_auc\"]].mean()\n",
" ax.plot(mean_df.index, mean_df[\"train_auc\"], label=\"train AUC\")\n",
" ax.plot(mean_df.index, mean_df[\"val_auc\"], label=\"val AUC\")\n",
" ax.set_title(model)\n",
" ax.set_xlabel(\"epoch\")\n",
" ax.set_ylim(0.65, 1.01)\n",
" ax.legend()\n",
"axes[0].set_ylabel(\"AUC\")\n",
"fig.tight_layout()\n",
"fig.savefig(FIGURES_DIR / \"03_phase1_training_curves.png\", dpi=180, bbox_inches=\"tight\")\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "97cfc057",
"metadata": {},
"source": [
"SimpleCNN improves slowly and its train/validation AUC curves stay close together, which points more to limited capacity than severe overfitting. ResNet18 learns much faster and reaches very high training AUC, while validation AUC plateaus around the low `0.93` range after the first few epochs. That gap means the pretrained model can fit the training folds more strongly than it generalizes, so later improvements need to be checked on held-out folds and source-wise metrics, not training curves alone.\n"
]
},
{
"cell_type": "markdown",
"id": "d0b44acd",
"metadata": {},
"source": [
"## 5. Confusion matrices\n",
"\n",
"These are aggregated across the five held-out test folds.\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "7828fe8a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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39eZ7z2IiIiIiMh6aAUbFmYsExYdHW22JCUlWewt2bVrF9q1a2dap9Pp1OMtW7ZYvKwVK1agefPmakiYv78/6tSpg3HjxiEtLS1fL48BCxERERGRHSTdawVYRFBQELy8vEzL+PHjc5wjMjJSBRoSeGQlj8PCwixe1+nTp9VQMNlP8lZGjBiBL774Ap988km+Xh+HhBERERER2TDt5n8F2U+EhobC09PTtF6S4wtDenq6yl+ZOXMm9Ho9GjVqhIsXL2LixIkYNWpUno/DgIWIiIiIqBjnsHh6epoFLJb4+PiooCM8PNxsvTwOCAiwuI9UBpPcFdnPqGbNmqpHRoaYOTk55e0687QVEREREREVW05OTqqHZP369WY9KPJY8lQsuf/++3Hy5Em1ndHx48dVIJPXYEUwYCEiIiIismHaPZqHRUoaz5o1Cz/99BOOHDmCV199FXFxcaaqYb1798bw4cNN28vzUiVs0KBBKlCRimKSdC9J+PnBIWFERERERDZMu0cz3Xfv3h0REREYOXKkGtYVEhKCNWvWmBLxz58/ryqHGUky/9q1azF48GDUq1dPzcMiwcvQoUPzdV4GLERERERENkynaWopyH75NXDgQLVYsmHDhhzrZLjY1q1bcScYsBARERER2TDtHvWwFBUGLERERERENkwrQD6KcT9bwKR7IiIiIiKyWuxhISIiIiKyYRqHhBERERERkbXS3cOk+6LAHhYiIiIiIhum3VwKsp8tYMBCRERERGTDNDtPumfAQkRERERkw3RaxlKQ/WwBq4QREREREZHVYg8LEREREZEN0zgkjIiIiIiIrJlmI8O7CoI9LERERERENkxjDwsREREREVkrnZ0n3bOHhYiIiIjIhml23sPCKmFERERERGS12MNCRERERGTDNM50T0RERERE1kqnaWopyH62gD0sREREREQ2TNMKVtbYRuIVBixERERERLZMs/Oke/awEBERERHZMM3Oe1hYJYyIiIiIiKwWe1iIiIiIiGyYjkn3RERERERkrTQ7HxLGHpZCNLZrPbi5exTmIakYefuXfUV9CWTD0pLiUJxs/OQxeHh4FvVlkI2q2e/nor4EsnGGlARYE41J90REREREZM1J6boC7mcL2MNCRERERGTDNDvvYbGVwIqIiIiIiIoh9rAQEREREdkwTZNKYQXbzxYwYCEiIiIismG6AgYsBdmnKDBgISIiIiKyYZqd57AwYCEiIiIismE69rAQEREREZG10ux84khWCSMiIiIiIqvFIWFERERERDZMp2lqKch+toABCxERERGRDdNxpnsiIiIiIrJWmp3nsLCHhYiIiIjIhulQwCFhsI2IhQELEREREZEN0+y8h4VVwoiIiIiIyGqxh4WIiIiIyIbpOHEkERERERFZK00FLJrdDgljDwsRERERkQ3T7DyHhQELEREREZEN03FIGBERERERWSvt5n8F2c8WsEoYERERERFZLQ4JIyIiIiKyYToOCSMiIiIiImulY8BCRERERETWStM0tRRkP1vAIWFERERERDZMxx4WIiIiIiKyVpqdz8PCKmFERERERGS1GLAQEREREdkwnaYVeMmvadOmITg4GC4uLmjWrBm2b9+ep/0WLFigcma6dOmS/9eX7z2IiIiIiMjqclh0BVjyY+HChRgyZAhGjRqF3bt3o379+ujQoQOuXLlyy/3Onj2Ld955B61atSrY6yvQXkREREREZB20zDyW/Cz5nej+yy+/RP/+/fHiiy+iVq1amDFjBtzc3PD999/nuk9aWhqee+45fPTRR6hUqVKBXh4DFiIiIiIiG6aDVuBFREdHmy1JSUk5zpGcnIxdu3ahXbt2mefV6dTjLVu25HptH3/8Mfz8/PDSSy/dwesjIiIiIqJiKygoCF5eXqZl/PjxObaJjIxUvSX+/v5m6+VxWFiYxeP+999/mD17NmbNmnVH18d5WIiIiIiIinFZ49DQUHh6eprWOzs73/E1xcTEoFevXipY8fHxuaNjMWAhIiIiIirGE0d6enqaBSyWSNCh1+sRHh5utl4eBwQE5Nj+1KlTKtm+c+fOpnXp6enq/w4ODjh27BgqV66ct+vM01ZERERERFRsyxo7OTmhUaNGWL9+vVkAIo+bN2+eY/saNWrgwIED2Lt3r2l5/PHH8cADD6ifZRhaXrGHhYiIiIjIhmn3aKZ7KWncp08fNG7cGE2bNsXkyZMRFxenqoaJ3r17IzAwUOXAyDwtderUMdvf29tb/T/7+tthwEJEREREZMN0UvGrABGLsUpYXnXv3h0REREYOXKkSrQPCQnBmjVrTIn458+fV5XDChsDFiIiIiIiypOBAweqxZINGzbcct8ff/wRBcGAhYiIiIjIhmn3aEhYUWHAQkRERERkw3QF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8N1336npLNavX5+v8zJgISIiIiKi2+a17dq1Sw3rMpJCIfJYek/yIj4+HikpKShVKn/DGZl0T0RERERUjJPuo6OjzdY7OzurJavIyEikpaXB39980mV5fPTo0Tydb+jQoShbtqxZ0JMX7GEhIiIiIirGSfdBQUGqPLJxGT9+fKFf4qeffooFCxZg2bJlKmE/P9jDQkRERERUjGe6Dw0NNZuHJXvvivDx8YFer0d4eLjZenkcEBBwy/N8/vnnKmBZt24d6tWrl+/rZA8LEREREVExTrr39PQ0WywFLFLqvFGjRmYJ88YE+ubNm+d6bRMmTMCYMWOwZs0aNG7cuECvjz0sREREREQ2TLtHE0dKSeM+ffqowKNp06aYPHky4uLiVNUw0bt3bwQGBpqGlH322WcYOXIk5s+fr+ZuCQsLU+vd3d3VklcMWIiIiIiI6La6d++OiIgIFYRI8CHliqXnxJiIf/78eVU5zOibb75R1cWeeeYZs+PIPC6jR49GXjFgISIiIiKyZdo96mIBMHDgQLXkNlFkVmfPnkVhYMBCRERERFSMk+6tHQMWIiIiIiIbphVg1nrjfraAAQsRERERkQ3T7t2IsCLBgIWIiIiIyJZp9h2xcB4WIiIiIiKyWuxhISIiIiKyYRqT7omIiIiIyFppTLonIiIiIiJrpdl3CguHhBERERER2TTNviMWJt0TEREREZHVYtI9EREREZEN05h0T0REREREVksr4Kz1NjIkjD0sREREREQ2TLPvFBYGLERERERENk2z74iFPSxERERERDZMs/McFlYJIyIiIiIiq8UeFiIiIiIiG6ZxpnsiIiIiIrJWmn2nsLCHhYiIiIjIpmn2HbFwSBgRERERkQ3T7DzpngELEREREZGtd7BoBdvPFrBKGBERERERWS32sBARERER2TDNvlNYGLAQEREREdkyjWWNiYiIiIjIeml23cfCIWFERERERDZMYw8LERERERFZK82u+1dYJYyIiIiIiKwYh4QREREREdkwjUPCiIiIiIjIWmmc6Z6IiIiIiKyWZt9JLBwSRkRERERkwzT7jlcYsBARERER2TLNznNYdEV9AURERERERLnhkDAiIiIiIhumMemeiIiIiIislmbfSSzsYSEiIiIismGafccrDFiIiIiIiGyZZudJ9+xhISIiIiKygyyW/LONiIVVwoiIiIiIyGqxh4WIiIiIyIZpdj4kjD0sRERERERktdjDQkRERERkwzQ772FhwEJEREREZMM0ThxJRERERETWSmMPC92OwWBQ/4+Pi+EviwosLSmOvz26g/dPvFl7ZK+Mry82hu0t3cH7KCWBvz66s7YoJdGsTaK7i0PCCkHMzQ/O3g81KIzDERHdUXvk5eVl9+1ti/pVivpSiIisps3VONM93U7ZsmURGhoKDw8PaLaSvXSPRUdHIygoSP2ePD09i/pyyAbxPXRrcpdPPjilPbJnbG9vj/9W6E7xPWSDba5m3xELe1gKgU6nQ7ly5QrjUHZPghUGLMT30N1hDXf57ja2t3nH9pbuFN9DttPmaky6JyIiIiIia6Ux6Z6IiIiIiKyVZt8jwjjTPd0bzs7OGDVqlPo/Ed9DRGxvyXrxM5tuZdq0aQgODoaLiwuaNWuG7du333L7RYsWoUaNGmr7unXrYtWqVcgvzcB6bERERERENlkgwcvLC5cjowqUIyz7l/Hxxo0bN/K0/8KFC9G7d2/MmDFDBSuTJ09WAcmxY8fg5+eXY/vNmzejdevWGD9+PB577DHMnz8fn332GXbv3o06derk+ToZsBARERER2XDAEhaZt4DD0v4BPl55DlgkSGnSpAm+/vpr9Tg9PV1VgX3jjTcwbNiwHNt3794dcXFx+OOPP0zr7rvvPoSEhKigJ69YJYyIiIiIyIbFxESrxPuC7GcMXLIPC8w+jD85ORm7du3C8OHDzSo3tmvXDlu2bLF4fFk/ZMgQs3UdOnTA8uXL83WdDFiIiIiIiGyQk5MTAgICULViUIGP4e7urnpJspK849GjR5uti4yMRFpaGvz9/c3Wy+OjR49aPHZYWJjF7WV9fujytTVRAUhiloxxLAoykWd+o3iyrfeONKjS+OXnb833Bdkrtrd0N987bG+tj4uLC86cOaOGdBV0uXDhQo51WXtRrAF7WIjIZh05cgQfffQRli1bpsbElixZsqgviYjILrG9te6gxcXF5a6fx8fHB3q9HuHh4Wbr5bH08lgi6/OzfW7Yw0J5IuMW7fFcZNt/z1OnTqn/P/HEE6rxY9lssgdsb8ka3ztsb8nJyQmNGjXC+vXrTb8MSbqXx82bN7f4C5L1WbcXf/31V67b54YBSzHUtm1bDBw4UC1SWUIi5hEjRiBrhWvpGh4zZowqXSdVIwYMGKDW//fff2jVqhVcXV3VeMc333xTVX8wunLlCjp37qyer1ixIubNm3fb63nhhRfQpUsXjB07FmXLlkX16tXV+tDQUHTr1g3e3t4oVaqU+lJ69uxZ0347duxA+/bt1fXL62jTpo0qk0fF470jQxNke2PSnwzzKuj7QsbqlilTBvv378/TtRLZ4r8ZwfbWdljTe4ftLRlJAv2sWbPw008/qV63V199Vb23XnzxRfW8vBezDicbNGgQ1qxZgy+++ELluch7aefOnep9nS8yDwsVL23atDG4u7sbBg0aZDh69Khh7ty5Bjc3N8PMmTNN21SoUMHg6elp+Pzzzw0nT540LSVKlDBMmjTJcPz4ccOmTZsMDRo0MLzwwgum/Tp16mSoX7++YcuWLYadO3caWrRoYXB1dVX75KZPnz7qenr16mU4ePCgWpKTkw01a9Y09O3b17B//37D4cOHDT179jRUr17dkJSUpPZbv369Yc6cOYYjR46o51966SWDv7+/ITo62nRseYsvW7bsrv0uixtreu/ExMQYfvjhB/U3vnz5slry+75IT083DBw40BAcHGw4ceKEei4v10pki/9mBNtb22FN7x22t5TV1KlTDeXLlzc4OTkZmjZtati6davZ+1bamax+/fVXQ7Vq1dT2tWvXNqxcudKQXwxYiiF5M0kwIF/WjIYOHarWZW0Eu3TpYraffPEbMGCA2bp///3XoNPpDAkJCYZjx46pL4Lbt283PS9fGmXd7T5A5QulMRAR8oVTgpOs1yjPS4O6du1ai8dJS0szeHh4GH7//XfTOgYs9v3ekaDjdvddcntfLFq0SAXBcu0XLlzI87US2fK/Gba3tsPa3jtsb6koMem+mJIEZeMQGiFjCaW7TsrVSUKVaNy4sdk++/btU0NmsnYdy3c/Gb8oFSqOHz8OBwcHNb7RqEaNGmpI1+3UrVtXjY3Meq6TJ0/Cw8PDbLvExETTOFpJ2vrwww+xYcMG1b0t1x4fH4/z588X6HdCtvneyS6v74vBgwernJetW7eqoRZ5vdaaNWvm+5qoeLO2fzNsb22Htb13smN7S/cKAxbKVYkSJcwex8bG4uWXX1ZjYbMrX768agQL81zSmFoaV+vr66v+36dPH1y9ehVfffUVKlSooL58SmPOpP3i9d7JLq/vC8lz+eWXX7B27Vo899xzeb5WoruB7S3ZwnsnO7a3dK8wYCmmtm3bZvZY7jJXrVrVdMfGkoYNG+Lw4cOoUqWKxeflDk1qaqqaBbVJkyZq3bFjxxAVFZXv65NzLVy4EH5+fiqR0JJNmzZh+vTpeOSRR0xJ+jKpERXv905e3xePP/64Sjrt2bOnuvZnn302T9dKZG//ZtjeWi9rf++wvaV7hVXCiikZHiOVHqSRkrvMU6dOVZUcbmXo0KHYvHmzquywd+9enDhxAr/99pup0oNU9+rYsaO6syONrDSG/fr1U1VI8kvueMswHakM9u+//6pubBniI3eMZIIjIY32nDlzVJUKOZ/sU5BzkX29d/LzvnjyySfVtlLdZPHixXm6ViJ7+zfD9tZ6Wft7h+0t3SsMWIopKTuXkJCApk2b4vXXX1cNoLEcYm7q1auHjRs3qu5kKZfYoEEDjBw5UpUiNvrhhx/UYykl+9RTT6ljSi9Jfrm5ueGff/5R3ddyHMkbeOmll1QOi7HHZfbs2bh+/bq6m9SrVy8VzBTkXGRf7538vi+eeeYZVZ5Rtl26dGmerpXInv7NsL21Xtb+3mF7S/eKJpn39+xsZDW13UNCQjB58uSivhSyMXzvEPHfDLG9JbrX2MNCRERERERWiwELERERERFZLQ4JIyIiIiIiq8UeFiIiIiIisloMWIiIiIiIyGoxYCEiIiIiIqvFgIWIiIiIiKwWAxYiIiIiIrJaDFiIiIiIiMhqMWAhIiIiIiKrxYCFiIiIiIisFgMWIiIiIiKCtfo/Kq6sOIIeXCgAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 900x400 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def aggregated_confusion(results: dict | None) -> np.ndarray:\n",
" cm = np.zeros((2, 2), dtype=int)\n",
" for fold in (results or {}).get(\"fold_results\", []):\n",
" cm += np.asarray(fold.get(\"test_metrics\", {}).get(\"confusion_matrix\", [[0, 0], [0, 0]]), dtype=int)\n",
" return cm\n",
"\n",
"fig, axes = plt.subplots(1, 2, figsize=(9, 4))\n",
"for ax, (model, run_name) in zip(axes, PHASE1_RUNS.items()):\n",
" cm = aggregated_confusion(load_run(run_name))\n",
" norm = cm / cm.sum(axis=1, keepdims=True)\n",
" im = ax.imshow(norm, cmap=\"Blues\", vmin=0, vmax=1)\n",
" ax.set_title(model)\n",
" ax.set_xticks([0, 1], [\"pred real\", \"pred fake\"])\n",
" ax.set_yticks([0, 1], [\"true real\", \"true fake\"])\n",
" for i in range(2):\n",
" for j in range(2):\n",
" ax.text(j, i, f\"{norm[i, j]:.2f}\\n({cm[i, j]})\", ha=\"center\", va=\"center\")\n",
"fig.colorbar(im, ax=axes.ravel().tolist(), fraction=0.035)\n",
"fig.savefig(FIGURES_DIR / \"03_phase1_confusion.png\", dpi=180, bbox_inches=\"tight\")\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "2ddecd94",
"metadata": {},
"source": [
"The confusion matrices show the AUC story in error-count form. SimpleCNN correctly classifies about `71%` of real images and `70%` of fake images, so it misses many examples in both directions. ResNet18 improves both sides: about `81%` of real images are kept real, and about `88%` of fake images are detected as fake. The most important practical gain is fewer fake images predicted as real (`30%` -> `12%`), although the model still produces some false alarms on real images (`19%`).\n"
]
},
{
"cell_type": "markdown",
"id": "624839d8",
"metadata": {},
"source": [
"## Conclusion\n",
"\n",
"Under identical Phase 1 conditions, ResNet18 is the stronger baseline. SimpleCNN reaches AUC `0.7786`, accuracy `0.7039`, and F1 `0.7801`. ResNet18 reaches AUC `0.9366`, accuracy `0.8650`, and F1 `0.9073`. The mean fold-wise AUC improvement is about `+0.1580`.\n",
"\n",
"Per-source pairwise AUC also shows the value of the pretrained backbone. ResNet18 is much more stable across fake sources, while SimpleCNN struggles especially on `wiki_vs_insight`. This justifies using ResNet18 as the main diagnostic model for Phase 2 preprocessing ablations, while still tracking SimpleCNN to check whether preprocessing effects generalize to a smaller architecture.\n",
"\n",
"Next: `04_phase2_analysis.ipynb` keeps the same evidence discipline and tests resolution, normalization, facecrop, augmentation, and source-holdout behavior.\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}