From 4e5356623c32b57f5f59f10a0ee935709757410c Mon Sep 17 00:00:00 2001 From: Stephan Breimann Date: Fri, 18 Sep 2026 19:37:15 +0200 Subject: [PATCH] doc(protocols): add P11, a pinned benchmark protocol for comparable scores The package ships fourteen benchmark tables across three prediction levels but no procedure over them. Two scores computed a month apart, on a different slice with a different split and seed, were therefore not comparable, so a performance regression was invisible and "method X improves over baseline" could not be checked. The data existed; the protocol over it did not. P11 pins the four decisions a comparable score needs, and records the result: - dataset: AA_CASPASE3 (residue), DOM_GSEC (domain), SEQ_AMYLO (protein), the trio the rest of the documentation already teaches on. The residue set is selected explicitly -- 20 seeded proteins carrying at least three sites, all their sites plus 25 seeded non-sites -- because load_dataset's deterministic head-of-class selection returns every negative from a single protein at small n, which is one protein, not a benchmark set. - split: StratifiedGroupKFold(5, shuffle=True, random_state=42) bound with aa.bind_groups on the protein accession, so windows cut from one protein cannot straddle a fold, scored by the pooled out-of-fold principle. - metric: ROC-AUC at all three levels against the aac and dpc composition baselines through identical folds (AAPred.eval's baseline= mode), plus per-protein average precision at the residue level. - seed: 42 throughout. random=False is pinned deliberately: load_dataset takes no random_state and aa.options["random_state"] does not reach it, so random=True is not reproducible and cannot appear in a benchmark. The tolerance is derived, not declared. A ten-seed sweep measures a widest across-seed standard deviation of 0.014, so three sigma rounds up to the 0.05 absolute ROC-AUC that separates noise from a regression. A tolerance picked a priori is either so tight it fires on unrelated changes or so loose it hides a real drop. Rerunning the pinned procedure reproduces every score exactly (max absolute difference 0.0), which is asserted in the notebook rather than claimed in prose. Two concept figures carry the teaching. The fold-composition panel shows the ungrouped split putting all 20 proteins in both halves of every fold while the grouped split holds 16 against 4, and reports honestly that the score gap on this set is small: you cannot know that until you measure it. The seed panel shows the free-seed cloud the tolerance is read off. The scoreboard reports that the amino-acid composition baseline beats the CPP feature set at the protein level. That is the protocol working: a benchmark that could only confirm the house method would be worth nothing. No new public symbols. The deliverable is the documented procedure, built from load_dataset, CPP, aa.bind_groups, AAPred.eval and comp_per_protein_ap as they already ship. Building the runner that automates it stays a separate concern. Co-Authored-By: Claude Fable 5.1 --- docs/guides/protocol_style_guide.md | 1 + docs/source/_static/img/thumbs/protocol11.png | Bin 0 -> 125079 bytes .../evaluation/eval_feature_selection.rst | 7 + docs/source/protocols.rst | 6 +- protocols/protocol11_benchmark.ipynb | 1471 +++++++++++++++++ 5 files changed, 1484 insertions(+), 1 deletion(-) create mode 100644 docs/source/_static/img/thumbs/protocol11.png create mode 100644 protocols/protocol11_benchmark.ipynb diff --git a/docs/guides/protocol_style_guide.md b/docs/guides/protocol_style_guide.md index 535e6a44e..8fe969197 100644 --- a/docs/guides/protocol_style_guide.md +++ b/docs/guides/protocol_style_guide.md @@ -89,6 +89,7 @@ CPP signature is P1; the exploratory no-label first look is P2: 5 engineer features 6 compositional vs positional 7 select & reduce features 8 classifier 9 interpretability 10 validate ("can I trust this?") +11 benchmark ("is this number comparable?") ``` This is a **living catalog**: append protocols as the package grows. diff --git a/docs/source/_static/img/thumbs/protocol11.png b/docs/source/_static/img/thumbs/protocol11.png new file mode 100644 index 0000000000000000000000000000000000000000..c5819381d4ef672472823c95d806e4de48e2617f GIT binary patch literal 125079 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.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. It runs the +first regime above deliberately (the feature set is selected once, then frozen) so that a +rerun measures the method rather than a reshuffled feature set, and it records the +resulting scores together with the seed spread that separates noise from a regression. diff --git a/docs/source/protocols.rst b/docs/source/protocols.rst index 13f1334ad..ac5fbf45c 100644 --- a/docs/source/protocols.rst +++ b/docs/source/protocols.rst @@ -52,6 +52,7 @@ protocol; click it to open that protocol. P8: Prediction

P9: Interpretability
P9: Interpretability
P10: Validation
P10: Validation
+ P11: Benchmark protocol
P11: Benchmark protocol
AAanalysis turns a biological *question* into an @@ -61,7 +62,9 @@ distinguish them), and the rest of the pipeline helps you sample fairly, enginee features, select what matters, predict, explain, and check that the signal is real. The catalog follows that data flow, opening with the CPP signature, then an exploratory no-label first look, and on through sampling, feature engineering, -selection, modelling, explanation, and validation. +selection, modelling, explanation, and validation. It closes with the **benchmark +protocol**, which pins the dataset, split, metric and seed a score has to come from +before two scores can be compared at all. .. toctree:: :maxdepth: 1 @@ -77,3 +80,4 @@ selection, modelling, explanation, and validation. generated/protocol8_prediction generated/protocol9_interpretability generated/protocol10_validation + generated/protocol11_benchmark diff --git a/protocols/protocol11_benchmark.ipynb b/protocols/protocol11_benchmark.ipynb new file mode 100644 index 000000000..be2516892 --- /dev/null +++ b/protocols/protocol11_benchmark.ipynb @@ -0,0 +1,1471 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ecda34b0", + "metadata": {}, + "source": [ + "# P11: Benchmark protocol\n", + "\n", + "Every other protocol in this catalog hands you a number: an `abs_auc`, an MCC, a cross-validated ROC-AUC. None of them records *where that number came from*. Two scores computed a month apart, on a different slice of a dataset with a different split and a different seed, are not comparable, so a quiet performance regression is invisible and a claim that some change \"improves\" a result cannot be checked. A **benchmark protocol** fixes that by pinning four decisions once and writing the resulting scores down.\n", + "\n", + "The package ships fourteen benchmark tables (plus an `Overview`) spanning the three prediction levels, and shipped data alone is not a benchmark. A benchmark is the data **plus a frozen procedure over it**. This protocol defines that procedure, runs it end to end, and records the numbers it produces together with the tolerance that separates noise from a regression.\n", + "\n", + "> **Key mental model.** A benchmark is four pinned decisions and one recorded table: *which dataset*, *which split*, *which metric*, *which seed*. Pin all four and a rerun reproduces the table exactly, so any change in the number is a change in the method and not in the weather. Leave one loose and your comparison quietly measures the loose one instead." + ] + }, + { + "cell_type": "markdown", + "id": "cf166ac8", + "metadata": {}, + "source": [ + "**When to use it.** Use this protocol when you want to claim that a change helps: a new scale set, a different `split_kws`, another classifier, a preprocessing tweak. Run the frozen procedure before and after the change, then compare the two recorded tables. Use it the same way as a release check, to confirm that a refactor left the numbers where they were.\n", + "\n", + "**When *not* to use it.** This is not a validation protocol. It does not ask whether a single result is real; that is *P10: Validation*, with its shuffled-label control, bootstrap interval and learning curve. Nor is it a leaderboard or a continuous-integration job. It is a fixed yardstick you apply deliberately, by hand, when one number has to be comparable to another number.\n", + "\n", + "One more boundary, and it is the important one: a benchmark measures **relative** movement. The absolute scores below are optimistic, because the CPP feature set is selected once on the full labelled set before the folds are cut (the exploratory regime described in the *Four Evaluation Regimes* chapter of the usage principles). That is a deliberate choice: it keeps the feature set frozen, so a rerun compares methods rather than reshuffling the features underneath them. Read the deltas, not the absolute values." + ] + }, + { + "cell_type": "markdown", + "id": "28bf6c8b", + "metadata": {}, + "source": [ + "**Input.** The benchmark set is three shipped tables, one per prediction level, so that a claim at one level never silently stands in for another. The levels come from the dataset-name prefix (`AA_*` residue, `DOM_*` domain, `SEQ_*` protein); *P4: Prediction levels* explains what one example means at each of them.\n", + "\n", + "| Level | Dataset | Unit of comparison | Why this one |\n", + "| --- | --- | --- | --- |\n", + "| residue | `AA_CASPASE3` | 9-residue window around the scissile bond | the only level where several examples share one protein, so it is the level that needs grouping |\n", + "| domain | `DOM_GSEC` | TMD part set (`jmd_n`, `tmd`, `jmd_c`) | CPP's native ground, balanced 63 vs 63 |\n", + "| protein | `SEQ_AMYLO` | whole peptide | short chains, purely compositional signal |\n", + "\n", + "These three are the trio the rest of the documentation already teaches on, which is the point: a benchmark that introduces its own unfamiliar datasets buys nothing.\n", + "\n", + "Two loader facts decide how the set is built, and both are easy to get wrong:\n", + "\n", + "- **`load_dataset(name=..., n=N)` returns `2N` rows**, `N` per class. Read group sizes from the `label` column, never from `len(df_seq)`.\n", + "- **`random=True` is not seed-controlled.** `load_dataset` takes no `random_state`, and `aa.options[\"random_state\"]` does not reach it, so `random=True` draws a different sample on every call. A reproducible benchmark must therefore pin **`random=False`** and do any subsampling itself, with an explicit seeded generator." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f2fb4266", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:30:52.918308Z", + "iopub.status.busy": "2026-09-18T17:30:52.918115Z", + "iopub.status.idle": "2026-09-18T17:30:55.968747Z", + "shell.execute_reply": "2026-09-18T17:30:55.968448Z" + } + }, + "outputs": [], + "source": [ + "import warnings\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.model_selection import StratifiedGroupKFold, StratifiedKFold, train_test_split\n", + "from sklearn.model_selection import cross_val_predict\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "\n", + "import aaanalysis as aa\n", + "\n", + "aa.options[\"verbose\"] = False\n", + "\n", + "# The four pinned decisions of this protocol live here, and nowhere else.\n", + "SEED = 42 # every generator, splitter and estimator\n", + "N_SPLITS = 5 # folds of the grouped cross-validation\n", + "N_FILTER = 25 # CPP features per level (equal budget across levels)\n", + "METRICS = [\"roc_auc\", \"mcc\"] # headline metric first\n", + "TOLERANCE = 0.05 # regression threshold, derived from the seed sweep below\n", + "\n", + "sf = aa.SequenceFeature()" + ] + }, + { + "cell_type": "markdown", + "id": "1ca7b396", + "metadata": {}, + "source": [ + "**Selecting the residue set.** The domain and protein tables can be taken straight from the loader, because one row is one protein there. The residue table cannot. Its `entry` ids read `CASPASE3__pos`, so many windows come from one protein, and with `random=False` the loader returns the *first* `N` rows of each class: at `n=30` every one of the 30 negatives comes from a single protein. That is not a benchmark set, it is one protein.\n", + "\n", + "So the residue set is selected explicitly, with a seeded generator, and the rule is part of the protocol: take the proteins carrying at least three annotated sites, draw **20** of them with `default_rng(42)`, and within each keep **all** of its sites plus **25** seeded non-site windows. The result keeps the task imbalanced and realistic while staying small enough to rerun in seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "15606122", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:30:55.970388Z", + "iopub.status.busy": "2026-09-18T17:30:55.970218Z", + "iopub.status.idle": "2026-09-18T17:30:56.275591Z", + "shell.execute_reply": "2026-09-18T17:30:56.275293Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataFrame shape: (606, 4)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 entryproteinsequencelabel
1CASPASE3_115_pos100CASPASE3_115KRSEMATCA0
2CASPASE3_115_pos111CASPASE3_115VFGLLEDEE0
3CASPASE3_115_pos202CASPASE3_115RDDFLGQVD0
4CASPASE3_115_pos206CASPASE3_115LGQVDVPLY1
5CASPASE3_115_pos207CASPASE3_115GQVDVPLYP1
6CASPASE3_115_pos219CASPASE3_115ENPRLERPY0
7CASPASE3_115_pos278CASPASE3_115LDQPDAACH1
8CASPASE3_115_pos279CASPASE3_115DQPDAACHL1
9CASPASE3_115_pos288CASPASE3_115QQQQEPSPL0
10CASPASE3_115_pos317CASPASE3_115SRRTQWKRP0
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Residue level: select the benchmark set explicitly, because the loader cannot.\n", + "df_aa = aa.load_dataset(name=\"AA_CASPASE3\", n=None, # n=None keeps every window\n", + " random=False, # pinned: random=True is NOT seed-controlled\n", + " non_canonical_aa=\"remove\", min_len=None, max_len=None,\n", + " aa_window_size=9, verbose=False)\n", + "# \"CASPASE3__pos\" -> the parent protein, which is the group\n", + "df_aa[\"protein\"] = df_aa[\"entry\"].str.rsplit(\"_pos\", n=1).str[0]\n", + "\n", + "n_sites = df_aa.groupby(\"protein\")[\"label\"].sum()\n", + "eligible = sorted(n_sites[n_sites >= 3].index) # proteins with >= 3 annotated sites\n", + "rng = np.random.default_rng(SEED)\n", + "proteins = sorted(rng.choice(eligible, size=20, replace=False))\n", + "\n", + "blocks = []\n", + "for p in proteins:\n", + " df_p = df_aa[df_aa[\"protein\"] == p]\n", + " sites = df_p[df_p[\"label\"] == 1] # keep every site\n", + " non_sites = df_p[df_p[\"label\"] == 0].sample(n=25, random_state=SEED)\n", + " blocks.append(pd.concat([sites, non_sites]))\n", + "df_res = pd.concat(blocks).sort_values(\"entry\").reset_index(drop=True)\n", + "\n", + "labels_res = df_res[\"label\"].to_numpy()\n", + "groups_res = df_res[\"protein\"].to_numpy()\n", + "aa.display_df(df=df_res[[\"entry\", \"protein\", \"sequence\", \"label\"]], n_rows=10, show_shape=True)" + ] + }, + { + "cell_type": "markdown", + "id": "07c919b7", + "metadata": {}, + "source": [ + "**Selecting the domain and protein sets.** Both are one row per protein, so the loader's own deterministic head-of-class selection is enough. Every loader parameter is passed by name; only `name` and `n` move between the two calls." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0607a85c", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:30:56.277193Z", + "iopub.status.busy": "2026-09-18T17:30:56.276995Z", + "iopub.status.idle": "2026-09-18T17:30:56.288169Z", + "shell.execute_reply": "2026-09-18T17:30:56.287894Z" + } + }, + "outputs": [], + "source": [ + "# Domain and protein levels: one row per protein, so the loader's own deterministic\n", + "# head-of-class selection is the whole rule. Note n=N returns 2N rows (N per class).\n", + "df_dom = aa.load_dataset(name=\"DOM_GSEC\", n=30, random=False,\n", + " non_canonical_aa=\"remove\", min_len=None, max_len=None,\n", + " aa_window_size=9, verbose=False)\n", + "df_prot = aa.load_dataset(name=\"SEQ_AMYLO\", n=60, random=False,\n", + " non_canonical_aa=\"remove\", min_len=None, max_len=None,\n", + " aa_window_size=9, verbose=False)\n", + "\n", + "labels_dom, groups_dom = df_dom[\"label\"].to_numpy(), df_dom[\"entry\"].to_numpy()\n", + "labels_prot, groups_prot = df_prot[\"label\"].to_numpy(), df_prot[\"entry\"].to_numpy()" + ] + }, + { + "cell_type": "markdown", + "id": "5f0826cf", + "metadata": {}, + "source": [ + "The three tables together are the **benchmark set**, and this registry is the first half of what the protocol pins down. `n_groups` is the number of distinct proteins, which is what the split below is not allowed to break apart." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c0e83a5a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:30:56.289509Z", + "iopub.status.busy": "2026-09-18T17:30:56.289414Z", + "iopub.status.idle": "2026-09-18T17:30:56.294041Z", + "shell.execute_reply": "2026-09-18T17:30:56.293731Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataFrame shape: (3, 6)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 leveldatasetn_rowsn_positiven_groupsselection rule
1residueAA_CASPASE36061062020 seeded proteins with >=3 si...ll sites + 25 seeded non-sites
2domainDOM_GSEC603060load_dataset(n=30), deterministic
3proteinSEQ_AMYLO12060120load_dataset(n=60), deterministic
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# The benchmark set: the first half of what this protocol pins down.\n", + "df_registry = pd.DataFrame({\n", + " \"level\": [\"residue\", \"domain\", \"protein\"],\n", + " \"dataset\": [\"AA_CASPASE3\", \"DOM_GSEC\", \"SEQ_AMYLO\"],\n", + " \"n_rows\": [len(df_res), len(df_dom), len(df_prot)],\n", + " \"n_positive\": [int(labels_res.sum()), int(labels_dom.sum()), int(labels_prot.sum())],\n", + " \"n_groups\": [len(set(groups_res)), len(set(groups_dom)), len(set(groups_prot))],\n", + " \"selection rule\": [\"20 seeded proteins with >=3 sites, all sites + 25 seeded non-sites\",\n", + " \"load_dataset(n=30), deterministic\",\n", + " \"load_dataset(n=60), deterministic\"],\n", + "})\n", + "aa.display_df(df=df_registry, n_rows=10, show_shape=True, char_limit=60)" + ] + }, + { + "cell_type": "markdown", + "id": "f03c6282", + "metadata": {}, + "source": [ + "**Building the feature matrix.** Each level gets the `df_parts` and `split_kws` that *P4: Prediction levels* derives for it, then one `CPP.run` and one `feature_matrix`. Nothing here is new; it is pinned so that the benchmark always measures the same feature construction. `n_filter=25` keeps every level at the same feature budget, so a level's score is not helped by simply having more columns." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "89aa91c8", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:30:56.295210Z", + "iopub.status.busy": "2026-09-18T17:30:56.295120Z", + "iopub.status.idle": "2026-09-18T17:30:59.610460Z", + "shell.execute_reply": "2026-09-18T17:30:59.610034Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'residue': (606, 25), 'domain': (60, 25), 'protein': (120, 9)}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# One pinned feature construction per level (the df_parts / split_kws of P4).\n", + "def build_matrix(df_seq, labels, list_parts, jmd_n_len, jmd_c_len, split_kws):\n", + " \"\"\"Return the pinned CPP feature matrix for one level.\"\"\"\n", + " df_parts = sf.get_df_parts(df_seq=df_seq, list_parts=list_parts, all_parts=False,\n", + " jmd_n_len=jmd_n_len, jmd_c_len=jmd_c_len, tmd_len=None,\n", + " remove_entries_with_gaps=False, replace_non_canonical_aa=False)\n", + " cpp = aa.CPP(df_parts=df_parts, split_kws=split_kws, verbose=False, random_state=SEED)\n", + " df_feat = cpp.run(labels=labels, n_filter=N_FILTER, n_jobs=1)\n", + " return sf.feature_matrix(features=df_feat[\"feature\"], df_parts=df_parts, n_jobs=1)\n", + "\n", + "\n", + "X_res = build_matrix(\n", + " df_seq=df_res[[\"entry\", \"sequence\", \"label\"]], labels=labels_res,\n", + " list_parts=[\"tmd\"], jmd_n_len=0, jmd_c_len=0,\n", + " split_kws=sf.get_split_kws(split_types=[\"Segment\", \"Pattern\"], n_split_min=1, n_split_max=4,\n", + " steps_pattern=[1, 2], n_min=2, n_max=3, len_max=9,\n", + " steps_periodicpattern=None, strategy=None))\n", + "X_dom = build_matrix(\n", + " df_seq=df_dom, labels=labels_dom,\n", + " list_parts=[\"jmd_n\", \"tmd\", \"jmd_c\"], jmd_n_len=10, jmd_c_len=10,\n", + " split_kws=sf.get_split_kws(split_types=None, n_split_min=1, n_split_max=10,\n", + " steps_pattern=[3, 4], n_min=2, n_max=4, len_max=10,\n", + " steps_periodicpattern=None, strategy=None))\n", + "X_prot = build_matrix(\n", + " df_seq=df_prot[[\"entry\", \"sequence\", \"label\"]], labels=labels_prot,\n", + " list_parts=[\"tmd\"], jmd_n_len=0, jmd_c_len=0,\n", + " split_kws=sf.get_split_kws(split_types=\"Segment\", n_split_min=1, n_split_max=1))\n", + "\n", + "LEVELS = {\"residue\": (X_res, labels_res, groups_res, df_res[[\"entry\", \"sequence\"]]),\n", + " \"domain\": (X_dom, labels_dom, groups_dom, df_dom),\n", + " \"protein\": (X_prot, labels_prot, groups_prot, df_prot[[\"entry\", \"sequence\"]])}\n", + "{k: v[0].shape for k, v in LEVELS.items()}" + ] + }, + { + "cell_type": "markdown", + "id": "dbbd897e", + "metadata": {}, + "source": [ + "**Run.** The second pinned decision is the **split**, and it is the one a protein dataset gets wrong most easily. Several windows cut from one protein are not independent samples: scatter them across train and test and the model is scored partly on proteins it has already seen. `aa.bind_groups` attaches the group labels (here the protein accession) to a scikit-learn splitter, so the splitter keeps each protein whole and the bound object drops straight into `AAPred.eval(cv=...)`.\n", + "\n", + "The pinned splitter is `StratifiedGroupKFold(n_splits=5, shuffle=True, random_state=42)`, which keeps proteins whole *and* holds the class balance roughly steady across folds. Passing a splitter as `cv` also switches `eval` to the pooled principle: every out-of-fold prediction is collected and the metric is applied once to the pooled vector, which is the right choice on an imbalanced residue set where per-fold averaging is unstable." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "14fc4a9d", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:30:59.612370Z", + "iopub.status.busy": "2026-09-18T17:30:59.612207Z", + "iopub.status.idle": "2026-09-18T17:30:59.626400Z", + "shell.execute_reply": "2026-09-18T17:30:59.625867Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataFrame shape: (5, 7)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 foldn_trainn_testn_groups_trainn_groups_testpos_rate_trainpos_rate_test
104881181640.1803280.152542
214871191640.1786450.159664
324871191640.1786450.159664
434841221640.1735540.180328
544781281640.1631800.218750
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def pinned_cv(groups, allow_overlap=False, seed=SEED):\n", + " \"\"\"The pinned splitter: proteins stay whole, class balance is held, seed is fixed.\"\"\"\n", + " return aa.bind_groups(cv=StratifiedGroupKFold(n_splits=N_SPLITS, shuffle=True,\n", + " random_state=seed),\n", + " groups=groups, allow_overlap=allow_overlap)\n", + "\n", + "\n", + "# Consume the folds once so df_folds_ is populated, then read it.\n", + "cv_res = pinned_cv(groups=groups_res)\n", + "_ = list(cv_res.split(X_res, labels_res))\n", + "aa.display_df(df=cv_res.df_folds_, n_rows=10, show_shape=True)" + ] + }, + { + "cell_type": "markdown", + "id": "6fdaa176", + "metadata": {}, + "source": [ + "`df_folds_` is populated once the folds are consumed, and it is worth reading rather than assuming. At the residue level 16 proteins train and 4 are held out per fold, and the positive rate stays near the dataset's own. At the domain and protein levels each protein is its own group, so grouping is a no-op there, which is exactly what you want a benchmark to make explicit instead of leaving implicit." + ] + }, + { + "cell_type": "markdown", + "id": "ff1db856", + "metadata": {}, + "source": [ + "**Choosing the metric.** The third pinned decision. **ROC-AUC** is the headline metric at all three levels: it is threshold-free, comparable across the three very different class balances, and reported by `AAPred.eval` directly. MCC rides along as a secondary, threshold-dependent read.\n", + "\n", + "A benchmark also needs something to beat, otherwise a score is just a number. `AAPred.eval(baseline=...)` cross-validates plain composition featurizers (`aac`, amino-acid composition; `dpc`, dipeptide composition) through the **same models and the same folds** and appends their rows, so the \"do the positional CPP features earn their keep\" comparison comes out of one call. `list_parts=\"tmd_jmd\"` makes every baseline span the same residues the CPP features were built from, so the comparison is not confounded by geometry.\n", + "\n", + "A note on a tempting wrong turn: `comp_auc_adjusted` is a **feature**-ranking effect size (one value per column of `X`), not a model metric. It is the right tool for ordering a signature and the wrong tool for scoring a classifier; `roc_auc` is the model-level counterpart." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "04e42ec0", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:30:59.628524Z", + "iopub.status.busy": "2026-09-18T17:30:59.628279Z", + "iopub.status.idle": "2026-09-18T17:31:06.866617Z", + "shell.execute_reply": "2026-09-18T17:31:06.866330Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataFrame shape: (9, 5)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 levelfeaturesmetricprinciplescore
1residuecpproc_auccv_pooled0.948538
3residueaacroc_auccv_pooled0.853981
5residuedpcroc_auccv_pooled0.874443
7domaincpproc_auccv_pooled0.928889
9domainaacroc_auccv_pooled0.738333
11domaindpcroc_auccv_pooled0.616111
13proteincpproc_auccv_pooled0.829306
15proteinaacroc_auccv_pooled0.912778
17proteindpcroc_auccv_pooled0.898472
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# The recorded artifact: CPP against two composition baselines, identical folds.\n", + "frames = []\n", + "for level, (X, labels, groups, df_seq) in LEVELS.items():\n", + " aap = aa.AAPred(models=[\"rf\"], list_model_classes=None, list_model_kwargs=None,\n", + " list_metrics=None, df_feat=None, df_scales=None,\n", + " verbose=False, random_state=SEED)\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\") # tiny folds -> expected sklearn advisories\n", + " df_eval = aap.eval(X, labels=labels, metrics=METRICS,\n", + " cv=pinned_cv(groups=groups),\n", + " df_seq=df_seq, baseline=[\"aac\", \"dpc\"],\n", + " list_parts=\"tmd_jmd\") # same span the CPP matrix was built from\n", + " frames.append(df_eval.assign(level=level))\n", + "\n", + "df_bench = pd.concat(frames, ignore_index=True)\n", + "df_bench = df_bench[[\"level\", \"features\", \"metric\", \"principle\", \"score\"]]\n", + "aa.display_df(df=df_bench[df_bench[\"metric\"] == \"roc_auc\"], n_rows=10, show_shape=True)" + ] + }, + { + "cell_type": "markdown", + "id": "b40bd33c", + "metadata": {}, + "source": [ + "**Output.** One long-format table, one row per (level, features, model, metric). This is the recorded artifact: the thing a future rerun is diffed against." + ] + }, + { + "cell_type": "markdown", + "id": "81a11ca7", + "metadata": {}, + "source": [ + "The scoreboard reads the whole benchmark at a glance. Each level gets three bars: the pinned CPP feature set and the two composition baselines, all through identical folds.\n", + "\n", + "Look at the protein level before anything else. The plain amino-acid composition baseline **beats** the CPP feature set on `SEQ_AMYLO`. That is not a bug in the protocol, it is the protocol doing its job: `SEQ_AMYLO` is a 6-residue peptide task whose signal really is pure composition, and a single `Segment(1,1)` scale average per chain throws away information that raw composition counts keep. A benchmark that could only ever confirm the house method would be worthless; this one reports where the method does not help, which is the only way the numbers stay trustworthy where it does." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b6c67ce3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:31:06.867744Z", + "iopub.status.busy": "2026-09-18T17:31:06.867663Z", + "iopub.status.idle": "2026-09-18T17:31:06.977695Z", + "shell.execute_reply": "2026-09-18T17:31:06.977390Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm0AAAGGCAYAAAApYLZiAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAjUlJREFUeJztnQeUFEX3t4ucJSlgliRiAjEgKiJmQcyooCBiRMwRxYRixpwAAyJiBjGgqKASFBXJKChRQSQropKZ7zz3/9Z8vbM9szOzcXZ/zznNLB2rq6urb926oVQkEok4IYQQQghRpCld2AUQQgghhBA5I6FNCCGEECIDkNAmhBBCCJEBSGgTQgghhMgAyub2BBs2bHATJkxwP/74o1uxYoX7+++/XZUqVdwee+zhDjjgAHfQQQe5MmXK5E1phRBCCCFKKGkLbR9//LF7/vnn3ejRo01wi0fNmjXdueee666//nrXqFGjdC8nhBBCCFGiKZVqyA+0atddd5374Ycf7P9eo7b33nu7WrVquUqVKrnVq1e7VatWuenTp7vvvvvOrV+/3rRt5513nuvTp48dI4QQQggh8kFoQ/C64YYbXP/+/d3uu+/uLrnkEtexY0fXuHHjhMdt3rzZjR8/3r344otu+PDhrnz58u7xxx93F110UQrFFEIIIYQo2SQttPXo0cO9//777t5773XdunVLy04N7dt9993nnn32WTdkyBB3zjnnuJLOP//84+bNm5dtfenSpV2NGjVcvXr1TNAt6qBdXbx4satbt67bcccdXSayZs0a99tvv2X0PeQHvLdLliyxtsiSqWzatMn99NNPZnOb02Az08mLe8VGeenSpa5JkyY2gxLG1q1b3a+//uo2btxo7wx9Vl6wZcsWN2vWrLjbq1atmpK5DZ85+ifKueuuu7qKFSumVJ6VK1e633//3e6R/iEnSlJbKyjyok7/+ecfe44VKlRwu+22m31nY5k/f75bt25d0t+BZcuW2bL99tu7XXbZxeU7kST5/PPPI+vWrYvkBXPnzo1MnTo1T86V6Xz55ZcIzXGXKlWqRDp37hz5448/IkWZ559/3sp7yy23RDKVF154IePvIT94+umnrV569+4dyWTod7iPli1bRoo7ub3Xf//9N7LXXnvZOcL66uXLl0e6d+9u/ZPvq0qVKhU54ogjIt9//32uy//dd98l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IYQQogCFthYtWtjvu+++a/ZrYZDW5bvvvrO/mzVrlu6lhBBCCCFKPGkLbWeddZalbcHBoGvXruYxGmTChAnulFNOcevXr7cp1AYNGpT4yhZCCCGEKHChrVq1am7o0KGuUqVKlvSY5MkkhD/ggAMs6TERwH/66Se3yy67uJdffjntAgohhBBCiFwIbXD88ce7iRMnulNPPdWVL1/enA2mTZtmgXZr1qzpevTo4aZMmeJ222031bUQQgghRGFmRMBWbcSIEW7jxo1u8eLFltKqRo0aJqiVKlUqt6cXQgghhBDKPSqEEEIIkRko96gQQgghRAag3KNCCCGEEBmAco8KIYQQQhRn79HY3KPBZPHB3KN16tSJ5h4VQgghhBDpodyjQgghhBAZgHKPCiGEEEJkAMo9KoQQQgiRASj3qBBCCCFEBqDco0IIIYQQGYByjwohhBBCZADKPSqEEEIIURKENohEIm7mzJlu7ty5ljCe2Gzly5d3O+64Y16cXgghhBCixFM2t8LaCy+84Pr06eOWLl2aZVupUqXc0Ucf7Z544gm37777lviKFkIIIYQoNKHtpptuco8++qj93bBhQ9e8eXNXt25dt2LFCvfll1+6MWPGuJYtW7qxY8e6gw46KFcFFUIIIYQoyaQttE2fPj0qsD322GPu6quvdmXKlIluX79+vbvwwgvdW2+95S644AJLZYX2TQghhBBCFKD36HvvvWe/Z599trvuuuuyCGxQqVIl9/LLL5td208//eR++OGHdC8lhBBCCFHiSVtoW758uf0eeeSRcfepXLmyTY/CwoULS3xlCyGEEEIUuNC299572+/8+fMT7rdkyRL7bdy4cbqXEkIIIYQo8aQttHXr1s3ts88+rn///u6bb74J3eftt9+2aVGmUA844IASX9lCCCGEEAXuiLBo0SJ366232tK6dWt33nnn2e8uu+zi/vrrLzd69Gg3ePBgV7t2bdesWTPXr1+/LMefdNJJJvQJIYQQQoh8FNrwHEUo8wwZMsSWWFavXu169+6dbf32228voU0IIYQQIr+FtjPPPNM1atQo3cNdixYt0j5WCCFE+sybN89t3brVNWnSJO4+y5Yts6DpzJQEowP88ssv7r///nP77bdftqgBQogiKrR16NDBFiGEEJnD3XffbZlsKlSo4I466igLzRTLM8884x566CFXo0YN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H9wURtvLVV++ofDaXrp9ebCtFWTby01fnp9tL16bCSO81CE8++yzFs7juOOOcwsXLnT9+vUz7dLhhx9uXqMpzckKIYQQQoiUSFpoQ53dqVMn99lnn7lFixaZdyiRgb/55hvTuDFVOm7cuNSuLoQQQggh8lZoC4KA1rt3bzd37lwT1Lp3727zt2jg4JZbbrGwHxMmTMgyZyyEEEIIIQpQaAvSunVr99JLL7lly5a5V155xbLer1y50qZT2UY4kBtvvNH99ttvub2UEEIIIUSJJddCW9DI+YILLnBfffWVmz9/vrvzzjtNYMNx4dFHH3VffPFFXl1KCCGEEKLEkWdCWxCSqfbp08emS0ePHm02b7hyCyGEEEKI9MjThKBPPPGECWnXXXedO+aYY8xtmV8WIYQQQghRRDRt06ZNcyNHjrQpUSGEEEIIUcSnR4UQQgghRN4ioU0IIYQQIgOQ0CaEEEIIkQFIaBNCCCGEKGlCG1kSxo8f79q1a5eXpxVCCCGEKPHkaciPxo0b27Jt27YSX7FCCCGEEIWuaSPjAblFSVcVy99//+3q1avnrrrqKvf777/nRRmFEEIIIUo8KQtt/fv3d3vuuaflFp04cWK27V9//bUJc88884zbd9993aefflriK1kIIYQQokCFtgEDBrgePXrY9OfJJ59swlssbdu2dW+88YZr1qyZ++uvv9xpp53mZsyYkeuCCiGEEEKUZJIW2hDAbrzxRvv74Ycfdh9++KHba6+9su1XsWJFd+6555rGjfRVGzZscNdee23elloIIYQQooSRtNA2YsQI988//7iDDz7Y3XTTTTnuX6VKFZtKLVu2rPvyyy/dkiVLcltWIYQQQogSS9JC2/Tp0+2XadFkadSokTvggAOieUmFEEIIIUQ+C23//fef/datWzelC9SvX99+165dm2rZhBBCCCFEqkLbjjvuaL9//PGHS4VVq1bZb9WqVVM6TgghhBBCpCG07bPPPvb71VdfJXuIxWz7/vvv7e8mTZokfZwQQgghhEhTaOvQoYOrUaOGGzt2rPviiy+SOubBBx8054UGDRqEepoKIYQQQog8FtoI5eG9Rs844wz38ccfx9138+bN7v777zehDe6+++5kLyOEEEIIIXKbe7RXr15uwoQJ7pNPPnHt27e38B8nnHCCeYlWqlTJrV692s2cOdN99NFHbvHixXYMgl6XLl1cunCu9957zy1dutTtvPPOrnPnzu7oo492ueHVV191L7/8suvbt6874ogjcnUuIYQQQogiJ7SVLl3affDBB6Y5e+ihh9ykSZNsCYP8o/369XPnnXdeWgWLRCKue/fu7pVXXsmy/qWXXnK33HJLVIuXKoQeueyyyyzor3eSEEIIIYQoVkKbHVC2rGmorr76avfmm29a5gMSw2O7RjiQhg0bunbt2rljjz3WplTTBU0YAhtep71797a0WOQ6JRsDAuNRRx3lTjzxxJTOSdiRs846ywQ2IYQQQohiLbR56tSpY4IbS36AYAaky0JAg5NOOsnynTLd+uijj6YstKG5Y5r1+OOPd5999lm+lFsIIYQQotATxsebxly+fLmbM2eO+/PPP/OkUNjDzZ0717RrXmDzMN1KzDhSY/mAv8nw+OOPu+HDh7vnnnvO7bfffnlSTiGEEEKIIi20Iai99dZbltKKKVDs15o2bepq1aplYUG6detmDgvpMmXKFPtt2bJltm2lSpVyBx54oNu6daubPXt2UudjWhU7ODRtlE0IIYQQotgLbdivYa927rnnupEjR7pNmzbZ+jJlykTtxgYPHuxat27trrzyyrTsx9asWWO/u+66a+h2vEhhxYoVOZ4LZ4Ozzz7b7b333u6ZZ55JuSxCCCGEEBln07Zu3TqzB/vpp59c5cqVXc+ePV3Hjh0t28F2221nGRCmTp1qITUQ3J599lmbMh06dGhKheI8wDXCILwI/PvvvwnPs23bNnf++efb+QgI7I9LhY0bN9oShvc+TVbjlw6ppg0rCmzcOM9lGj9lqHPK+v9ppYsaarcFQya226LaZkHttmBQu82KlyHWr1/vciSSAl27do1wSP369SPz5s1LuO/nn38eqVSpku3/2muvpXKZyNNPP23HPfTQQ6Hbr7zyStv+4YcfJjxPnz59bL933303y/obbrjB1r/33ns5luWuu+6yfbWoDtQG1AbUBtQG1AbUBlw+1UEyslIp/slZtHPut99+c/Xr17e/0abtv//+OR7Tv39/16NHD7NB++GHH1yyDBkyxHXt2tXddttt7r777su2He/R1157zY0bN86mYcMgBEn16tVdhQoV3CGHHJJl2/z5892SJUssn+r222/v7rzzzrgBe3PStI0fPz4aXFjkLzzTNm3aWCo1QsEIkQmo3YpM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p56ZM2dm22f33XePbl+9enWkXbt22fbZbrvtIq+++mroPfDOxa7jnpo3b57tPGeccYZ9J0Q4SWvacCYAJO5YsGcDtC+M+Bo0aJCXcqUoIjANzkiqW7duZs+I5o1R1rHHHmsaBkZzjOoqVqzopk+fbiP/Dh062Mhuv/32s3M8+uij7p133rE2QgBm2gwaELyR8TRm1JdIE7J8+XI7bu3ata5p06Z2PTQpaMwweM0tqd6PKLqglTj//PPNVKNVq1a2oH3C6512F7Y/GjI0bbQttGvkUcY0hPaAExbahViNcI8ePdzq1atNy4X5CKn70EBcdNFFZoBNG0LD980331j/eNNNN1m5qlataseTOQa7YDTOtK86deqYFgRtyHfffefuvfde2x9tb07cfvvtrkqVKq5r166mqaPsaDGuueYa00ZzbpFZ0F8y64BmClMjnid90a233up22223bGkiBwwYYBq266+/3uzKu3fvbm2adjh79mz7XtPOmLqkjU2cONFdffXV1h4vvPBCayPMmqFtYyaEWTP/3edd4h2hHTPLcvLJJ9v5iCjBzMcFF1xg50W7mxMvvPCC/dLnY0rFPfJu0pcPHTrU2rAIIZIkF1xwQbbRXey2Xr16JXs6kYGatho1akRWrVqVZdvDDz8cHTWhMQjywQcfREdOsVrZH3/8Mcu+06ZNM23Y6NGjE2raGEX6kdumTZui6xcsWBDZeeedc61pS/V+RNGlQ4cO9rxuvvnmbJraihUrZtO0nXDCCbbuoosuimzevDm6/p9//okcf/zxtu3CCy/Mpt3aYYcdIr///nt0PdpYrzUIzkzQntAIs37y5MlZtIG0zyVLlmS7h1NOOcX2f++995LStKEl/O2336LruQ9/zffffz+tehSFg9dIsTz22GNZtj399NO2vnHjxtk0bWhnf/rppyz7o91lW5MmTSJ//PFHlm2PPPKIbatbt26WPnWfffax9cF3Yfjw4baOd2XDhg1ZzkOb5r3af//9k9K0sbz99ttZznHnnXdme89Empq2ZAjOm4viB5qHoO0DYCsE2O+EaboY9ROyA7dx9vH2OYzEGO0ddNBBptlipMWSE9gGAblvg2nS0H4wsrzhhhtydY+p3o8omvB80EagPYg1hMZGslOnTmaL60ET8eWXX9rzReMbtF9j3fPPP+8aNmxotmKxoAXztp2AXQ6U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mKYNsFOhvfjpRrz4vJcu5IWmjSlRzsFUVBhMiwXbq2+POU2XoY3DLouyYTPKMRjVBw2p07FpQ3PCMbm1i6VOfZmKGt78IdZLNxE4F2EKgXbTG9EzrZdbmzZiwXEMfVMqmrbYa6cC5YsNsRO7EH4kkaYNdt999yzvOd+JoDduTpo2oN+ijeQ0I7A5RU0b5g3sf8UVV6Q0I8YsQSxEBMivcFrJIk1bAeJHv/G0J4MGDbIo4/FGZYw60PbEagvSPS4VGjdubL8//PBDjvsOGzbMtGrBrATplJERkh/texi1NWvWzF155ZXuq6++cv3797dR7p133pmtHO3bt8+iMVuzZo1bvHixGzt2rLvjjjtc7dq1o/u++eabFrU7niaCZ4amhHsLRinnvLGR5hmpnXLKKe7pp592v/zyi9Ud9TFu3DiXH5ARoV+/fqa1nDFjhmkRY/EalHgamPyAa2GCkU6U/yDcU7AN8kt7YT0ZFnICzQhQP4m0BbSj9957L6o1oOxoCvKKnXfe2epi1apVbuHChdm20waD7fXdd9/Nsp17ZT3R5IOglUALTRuYN2+eO/jgg+09RXudGxo0aGDvLO3JayviQbnQLvtnVdhtLy/6ZLRMbI/Vou24446uY8eO7oUXXjAtZ926dU0r9PPPP+eqLL59+/aaE99++6398rzThXLT56JNjacJZKbjyy+/THge6mPBggVRDRRaato7mupk4Z3mGGAWJK/Yc889k/525dRfFIW2LKGtAPEPnGmaWPig0zl26dIlS8cdXE488US3aNEiEwBye1yqIITA0KFDTfUdDwQfpnP4iPipunTLuPfee5tgFSu4BbnsssssvcusWbNcbqcIEAgRssLK58vFh8lDp830Vd++feOel6nLzp0729+5LWO8j0hshxc2zYzACjmlOyqo9p4sCMZMcwPTv/6jecQRR9iggI9OTiA8+w9LovZNO2JKB9566y3XunVrm/7KK5hKZwoKnnnmmZSPf//99629XX311XH34ePrp1Nz294QBqkDBiUIlIl47bXXbDqN97EotL28aKO819Q373k8MLc47bTT7O94pgnJwnkYgNHXYO4QK7Dfd9997rfffrP/L1u2zIR6hCqm99OBQQnvD3XA+cL6vVdffTVbv5doipT3h7Iy+GHAUxTSPh1zzDH2HUEYy0kgpo996aWX4vYXRaEt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HPfcwWuLkouEtmLOb7/95p555hk3ZswY16lTJ3f00UebNqxt27Zu7ty5tk/ZsmXdoYceastRRx1lI7zPP/88x23wzz//2Aj3zz//dM8//7xp4ND+nHzyya5jx45u4sSJ0X0pxymnnOJOOOGEqPaBzmncuHHutttuc0OGDHEvvvhidH/Oy+jy9ddfd4888ojr0KGD/Q1h10AY7dmzpzvuuOPc7bffboJHcee5555zJ510kgnVCAowfvx416VLF3teCNibN2+O1j910717dxPGPbNnz7b9TzzxRDufPw+sXbvW3XfffabZu/TSS00g4Rw8r02bNiU8/txzzzWhPJZ45Yu3PsjUqVPtvLShoJZx8uTJtp66oH1TBsqMpuvJJ5+0ds9H8YcffnDt27e3trVq1Srb57LLLnMPP/yw7XP//fe7bdu2xT1nvHr09cTAhXfiiCOOiK5LVL54dVpc+f77760PuPzyy63+YcWKFe766693xxxzjOvcubObN2+eree9PuOMM9xpp53m3n777eg5/v33X6sr6gyN5urVq7Ncg3fh999/N80efQr9Bn3f/PnzEx4/YMAA9+ijj2Yr87Jly2wm4Pjjj7dBa9h1RowYYdv5m+ea6Dph+3/55Zfugw8+sPbD3/7c8a6dUx3A33//bTMgtGv6bd8f0lez/thjj7V6p9/05Ro1apS9x7RLznnJJZfYu0YfHa/somCR0FbMmTBhgmvWrJmrU6dOlvV8ePbdd9/QY9CwxBtBxm5DSEPwatSokWka3n//fde/f3931VVXuXPOOcc+josWLTKVPh/Za6+91jqEK6+80joLPpj77befdQB0UkzLxY6cly5d6p566inrQA455JC41+DjV7p0aRPYKGe/fv1ccYaPEAud9uDBg61O+BCeffbZ9qG688477cNHvTP1MmjQIBOGmjZtagIEIFjwYaRjZsr8o48+MuE7qNFDUOL3hRdeME0JHT7aUT6IiY7nWrSLIPHKF299EKYbuc5hhx1mH32uhxDGhwNBrHXr1tYmEBypC8pMvSD400b5cDF15j9yzz77rO3DfdDuOB+DiaeffjruOePVo6+nCy64wN4JPv5+XaLyhdVpceaVV16xgRXw7kK3bt3M9OKuu+5y9evXt7oA6hZhi/7i6quvdr/88outZ+oQ6G/o1xi4BZk1a5YJNWj2GARS51Wq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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Headline figure: the benchmark scoreboard.\n", + "aa.plot_settings(font_scale=0.9, weight_bold=False)\n", + "df_auc = df_bench[df_bench[\"metric\"] == \"roc_auc\"]\n", + "kinds = [\"cpp\", \"aac\", \"dpc\"]\n", + "levels = [\"residue\", \"domain\", \"protein\"]\n", + "colors = aa.plot_get_clist(n_colors=3)\n", + "\n", + "fig, ax = plt.subplots(figsize=(6.5, 4))\n", + "width = 0.26\n", + "x = np.arange(len(levels))\n", + "for i, kind in enumerate(kinds):\n", + " vals = [float(df_auc[(df_auc[\"level\"] == lv) & (df_auc[\"features\"] == kind)][\"score\"].iloc[0])\n", + " for lv in levels]\n", + " bars = ax.bar(x + (i - 1) * width, vals, width, color=colors[i],\n", + " label={\"cpp\": \"CPP features\", \"aac\": \"baseline: aa composition\",\n", + " \"dpc\": \"baseline: dipeptide comp.\"}[kind])\n", + " ax.bar_label(bars, fmt=\"%.2f\", fontsize=7, padding=2)\n", + "ax.axhline(0.5, color=\"black\", lw=0.8, ls=\"--\")\n", + "ax.text(2.42, 0.515, \"chance\", fontsize=7, ha=\"right\")\n", + "ax.set_xticks(x)\n", + "ax.set_xticklabels([f\"{lv}\\n({ds})\" for lv, ds in zip(levels, df_registry[\"dataset\"])])\n", + "ax.set_ylabel(\"ROC-AUC (pooled out-of-fold)\")\n", + "ax.set_ylim(0.4, 1.06)\n", + "ax.set_title(\"Benchmark scoreboard: seed 42, 5-fold grouped CV\")\n", + "fig.legend(*ax.get_legend_handles_labels(), frameon=False, fontsize=8, ncol=3,\n", + " loc=\"upper center\", bbox_to_anchor=(0.5, 0.075))\n", + "plt.tight_layout(rect=(0, 0.09, 1, 1))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c65df8f7", + "metadata": {}, + "source": [ + "**The concept the split makes visible: a group in both halves.** The score gap between a grouped and an ungrouped split is a weak way to see leakage, because on this set it happens to be small. The fold composition shows it directly. Below, the same five-fold split is cut twice over the same residue data: once ignoring proteins (`StratifiedKFold`, wrapped with `allow_overlap=True` so the guard permits it) and once respecting them (`StratifiedGroupKFold`).\n", + "\n", + "Read the left panel: the ungrouped split puts **all 20 proteins in the training half and all 20 in the test half of every fold**. Every protein is on both sides of every boundary. The grouped split splits 16 against 4, with no protein shared. The right panel shows what that costs in score here, and the honest answer on this dataset is: very little. That is a finding, not a let-off. You cannot know the gap is small until you measure it, and on a set with more within-protein redundancy it will not be." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e05b59c8", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:31:06.979049Z", + "iopub.status.busy": "2026-09-18T17:31:06.978946Z", + "iopub.status.idle": "2026-09-18T17:31:08.667802Z", + "shell.execute_reply": "2026-09-18T17:31:08.664177Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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FStWDLkj6lD07t3bpjtWnX71i6YG3eonrX///nZ8sFVHAABph9NmOaH2ZE7W3lCSgvzyyy82C/Dtt98e7/rXvXt38/zzz9sU/qGUnF199dVBLx8AkMaCs7lz59oLjNOmK5AJEyZEpbNqhzrH/uabb+yFTtVTPD3yyCO2g2oAADxVr17dJgT55JNPzF133eVz5yxbtsxs2bLF1r5Qp9XBcgKq6667Lt64PHny2BofKolT4in9P6GSMwWG6dOnNw888ID5/fff7WdatGhhHnroIZMjRw6+WABIy8GZ+oHp0KGDzZCoi4KqeeTNm9dvfzClSpVKzHraPsy0jGLFivkcnzFjRnuB/eCDD8ysWbPMwYMHzeWXX24vtq1bt07UsgEAqdN9991nE3PMmzfPPuRT1kPnOnPhwgX70E/ZGlUrpHPnziFVj3dK44oXL+5zvJaj4EzXq0DBmWql/PPPP7adWu3ateP0yfndd9/Zh596j2btFABAjAdnahitwEztvZRq2MmYGC3NmjWzr0B04VJfNHoBAJAQlV69++675sEHH7QJQfQqWLCgzd574MABdyBUp04dM2zYsJB2qJM8xF9AlzVrVvt+6tSpgPNRAOc8CH300UfttVAPJJX18dVXXzWrV6829957r/n666/9zkPb4RnU+aqyCQBIwcHZpk2b7LuqNUY7MAMAIFpU5V6p6BV8ffXVVzYoE9UEqVq1qg18Hn74YZuxMRRO+zSVwPmiLJGSUGmcap4oGYmCRs/Ssbp165rmzZuba665xpbwKYi74oorfM5j8ODBZsCAASGtPwAgBQVnTofO/qoxAgCQUig4U7szpyRLpV6qqu+v/8tgOFUVlbXRF2d4Qu3NVGLmL0OjgjFlI54/f77ts81fcKbqmkqa5Yvar914440B1wEAEOP9nN100032Xe28AABITRkcCxcubEu81q5dm2C1Q3+cQEkZjX21I9uwYYMNAAsUKJCo9XUCSCULCTSNHqr6eimtPwAghQdnyhCleu8//vij6du3r9mxY0dk1wwAgCSwf/9+W7KkpBuOUaNG2Sr76gZG74MGDQp5vqp2KLNnz7bdznhasGCBOXbsmG3LllANlJEjR9qSs7fffjveuCNHjth236IuZAAAaTQ4GzFihDl9+rT7IlayZEn79E114n29Pv3000iuNwAAiaZSsXr16pkhQ4a4qxkq0YYSb2hciRIlbNuwF154wXYYHQql3VeH0+roWl26OAk59H9lgJSuXbsGle5fgeNzzz1nqy96Zk2+7bbbbBu5Jk2a2OQmAIA0GpypcfLChQvjDDt58qRNCezrpUxTAADEko8++shWL7zhhhtsuzMZO3asTZ2vZCCbN292dxStAE7DQ/H666/bRCLKAlmoUCGb4VilYOo3TbVP2rdvH2d6ZV/UeH3OsxnBnXfeaUvJWrZsaeejrmJKly5tU+gXLVrUZpwEAKTh4Gz8+PH2aWKwL/UPAwBALPnhhx/suzpyVu0PBV+qhijt2rWzKesVHJUpU8bs2rXLbNy4MeSqjSrtUsClJCP6vLI49uzZ08yYMSNeOzEtQ6Vke/bsiRdEDhw40AZmKilTqZnmo5KzX375hVIzAEjr2Rp1QQnU+BgAgFi3d+9e+67SJ/njjz/cwxo0aOCeTu3OVIqmmiAq/QpFo0aNbG0TBVxqDqBmAAr6fHn++edtlUcFYZ40fb9+/ez47du3m3PnztlOrJW8BACQeoQdnAEAkNKpTbQcPXrUvjvJNZS+XlUdHc74XLlyhb0szz7K/FGQ6ASKvih5iPo9AwCkTkEXffXp0ydOYg/n/8G+SAgCAIg1SrYhU6dOtaVRkydPtv9v1aqVO0X9vn37zPr1621n0eXKlUvW9QUApG5Bl5yprrxnYg/n/8EiIQgAINYoW6IyDk+aNMlMnz7dBmiqsv/444+7p+nVq5ftl6xjx46J6pQaAICIlZxNnDjRNpTu0qVLnP8H+3I+BwBArFBVwyVLlpjGjRvbkjH1FaZEHbVr13ZPo7ZiypIYaip9AABCRZszAECapv7B1Cm0P6qWX7x48SRdJwBA2kS6RQAAAiAwAwAkFYIzAAAAAIgBBGcAAAAAEAMIzgAAAAAgBhCcAQAAAEAMIDgDAAAAgNSQSv/06dP2lT9/fvv/U6dOmTFjxpjffvvNlCxZ0nTv3t2mKQYAAAAARKnkbNq0aaZo0aJm9uzZ9v/qbPrmm282Tz31lJk8ebIZOnSoqVGjhlm8eHFiFgMAAAAAqV7YwdmePXvMvffea44fP26KFClih3311Vfm+++/t38PHjzYdOvWzY7v2rVr5NYYAAAAAFKhsKs1zpw505w5c8Z06tTJtGjRwg6bMmWKfa9Tp4555plnbEmagrU1a9aY33//3ZaiAQAAAAAiWHK2evVq+163bl37rkBs3rx59u+GDRva93Tp0pnq1avbv9evXx/uogAAAAAg1Qs7OLt48aJ9z5AhgztY27dvn/27cePG/1tA+vRxpgcAAAAARDA4czIwrl271r47bc1y5cplGjRo4J5u69at9r148eLhLgoAAAAAUr2w25y1bNnSZmUcO3asyZ07txk3bpwdfscdd5jMmTPbvxcuXGiWL19ux9esWTNyaw0AAAAAqUzYJWeVK1c2b7zxhu3jbMCAAWbXrl2mXLlyZtCgQe5p3n//fXPp0iWbUj9r1qyRWmcAAAAASHUS1Ql1r169TP369c0PP/xgChQoYNq2bWty5MjhHq/Ssvbt25tbb701EusKAAAAAKlWooIzqVatmn35C94AAAAAAEkQnKnaovoxO3TokM3IqJT6vlSsWNHdWTUAAAAAIILB2dy5c0337t3Nzp07E5x2woQJpkuXLolZHAAAAACkWmEHZ9u2bTMdOnQwZ86cse3Mrr32WpM3b17b8bQvpUqVSsx6AgAAAECqFnZwNnnyZBuYlS9f3ixatMhcdtllkV0zAAAAAEhDwk6lv2nTJvuuao0EZgAAAACQTMGZOpYWf9UYAQAAAABJEJzddNNN9n3OnDnhzgIAAAAAkNjgrEWLFqZZs2bmxx9/NH379jU7duwId1YAAAAAkOaFHZyNGDHCnD592v49atQoU7JkSZMzZ05TsGBBn69PP/00ze9sAAAAAIh4tsa//vrLLFy4MM6wkydP2pcvyuwIAAAAAIhwcDZ+/Hjz3nvvBT19hgwZwl0UAAAAAKR6YQdn6dOnty8AAAAAQOIRXQEAAABASgrO+vTpEyexh/P/YF8kBAEAAACACFRrPH78uDl48KA7sYfz/2CREAQAAAAAIhCcTZw40b78/R8AAAAAED7anAEAAABAagjOVL1x5MiRpmXLlqZq1apm5syZdviYMWPM5MmTzYULFyKxngAAAACQqoWdSl/WrFljWrRoYbZu3eoedvToUfu+fPly88EHH9j+0KZPn27y5MmT+LUFAAAAgFQq7OBMJWLt2rWzgVnv3r3Nhg0bzPz5893ju3btan766SezYMEC+7cCNETP6oqVorp7K61ZbVIC9gP7guOC3wgAAGmuWuOsWbNsyVmdOnXMm2++aQoXLhxnfP369c23335rMmfObD777DOz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4sVdJ0+ejMhn8S9KzlIYHfQqLdPJVj8uTxs3brRPQcqWLZts64fk8eCDD9ony+vWrYs3bsaMGfYkePPNNyfLuiH5HT582D4tr1ixon1ST3CGWBVsQPLcc8/Z6fr27ese9ueff9proB5CLFq0yO9n9QCrSJEi9vOvv/66e/iyZcvcNVJWrlzp9/NapqZr165dyNvXuHFj+1mdq++//37795QpUyIenCXFtiD2OMHWyJEj7ftrr73mc7oPPvjAliqPGDHC5zE2ePBgd60bXT98OXv2rOvaa6+1040ZMyYin8W/yNaYwqxYscI24mzcuLFtGO2pbNmyplq1ambTpk1mz549ybaOSHpjx441v//+u6lQoUK8cWokLmqIi7RHD+E6d+5s9u3bZ2bMmEESAKSaxAfimfDorbfessd7z549Tb169fx+tlixYmbEiBH273HjxrmHT5w40b5369bNXH311X4//8ILL5i+ffuaO++8M6R1VhKQ7777ztSvX9+eq7Uceeedd0ykRXtbENuaNWtmO7OfOnWqz/GTJ082N9xwg02uE+j4GTx4sJ2PL5kzZzYjR440L774YpxjLDGfxb9Il5LCbNy40b77y/BUsWJF88cff5j169ebIkWKJPHaIRZ99tln9v3GG29M7lVBMhg2bJiZPXu2+fjjj03lypXt30CsO3DggH3g5J2JVtkGp0yZ4r7pbNeunXv8999/b987dOiQ4Pzbt29vcuXKZf755x+b3VYZ5JzP33bbbQE/qyynurEM1YQJE2zw+OSTT9r/165d2zRo0MAud82aNfb6HSnR3hbENgU/bdq0MR988IH7+PbMArpgwQLz+uuv+/ysfmPK6Js9e3bTokWLgMvRgwa9IvFZ/A+P0lOYo0eP2nd/KbCdpxTHjx9P0vVCbFq6dKl9QqxA/cEHH0zu1UESW7hwoXn++edN9+7dzd13383+R4qhAExP1D1fderUsUGVxqVLl84+ma9Vq5b7M5s3b7bvVapUSXD+SmOvVOPipO5XSnoJlN4+XJcuXbIlCgrAbr75ZvfwZ599NiqlZ9HcFqQMt99+u333Lj2bPn26PR79Be7OsaPaWKF2PZGYz+J/KDlLYdRni9Pfi7+nJXL+/PkkXS/Enl9++cW0atXK3sToZkZPiZF2qBqjqipVr17djBo1KrlXBwhJwYIF3f0u6bq3bt06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t2+f2bt3r7l06VJQ0x87dsxOf/r06ZCXBQAAgPARnAExavHixTYwU8nXBx98YHLlymUKFCiQ3KsFAACAKCE4A2KUU3LVuHFjc9VVVyX36gAAACDKaHMGxJj9+/fbNl+PP/64/f9bb71l/9+mTRv3NGfPnjWjR482jRo1su3RKlWqZO69916zfPnyoJdz6NAh8+KLL5qaNWuacuXKmXvuucds27YtKtsEAACAhFFyBsQYtStTmy/HyZMn7evgwYP2/4cPH7ZJQlauXBnnc2vWrDGffPKJef31102fPn0CLkNBmErkNmzY4B62adMmm4Ckbt26Ed8mAAAAJIySMyDGXHbZZWb37t1m+PDh9v+9e/e2/589e7b9/3333WcDs0KFCpn33nvPrF692vz888+mc+fONulH3759zY8//hhwGQ899JANzMqXL28+//xzs27dOjNlyhSTKVMmM3PmzCTZTgAAAMRFyRkQY9KnT2+rMebOndv+P0eOHPb/snbtWpviPnv27GbJkiWmbNmy7s9df/31JmvWrObdd981gwcPNjfeeKPfLJBz5841+fLls0lHFORJhQoV7DxURfL48eNJsq0AAAD4H0rOgBTku+++s++33XZbnMDMoTZkopKzCxcuBJxH27Zt3YGZo3jx4qZ9+/ZRWHMAAAAkhOAMSEF27Nhh36tWrepzfLFixUzevHnNmTNn3G3U/M3jiiuu8DmezJAAAADJg+AMSEGc0rDz58/7nSZnzpz2PWNG37WWnY6sM2TI4LdaJQAAAJIed2FAClK4cGH77pll0ZOyOip5iAKz/Pnz+y1dc7Iz+rJly5aIrS8AAACCR3AGpCD16tWz7zNmzDD79u2LN37ixIm2ZEzp8NOlS+dzHuobTT777LN4iT9OnTpl5w0AAICkR3AGpCB16tQxV199tTl27Jhp2bKlTanvcrnMiRMnzBtvvGGeeOIJO123bt38zuPKK6+0fZwpuGvevLntH83p+0yJRnbt2pVk2wMAAID/IZU+kMJ89NFHpmHDhjYwu/baa21a/dOnT9sgTe6//37TqVOngPNQuv369eubX375xabOV7p+VYlUO7Q777zTfPrpp0m0NQAAAHBQcgakMFWqVDErVqywnU6rLzRVRVQSDwVqH374oXn//fcTnEe5cuVsP2l33XWXyZYtmw3MSpcubas61q5dO0m2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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Concept figure: what the grouped split changes, in fold composition and in score.\n", + "cv_leaky = aa.bind_groups(cv=StratifiedKFold(n_splits=N_SPLITS, shuffle=True, random_state=SEED),\n", + " groups=groups_res, allow_overlap=True) # permitted, so it can be shown\n", + "cv_honest = pinned_cv(groups=groups_res)\n", + "\n", + "scores = {}\n", + "for name, cv in [(\"ungrouped\", cv_leaky), (\"grouped\", cv_honest)]:\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " df_e = aa.AAPred(models=[\"rf\"], verbose=False, random_state=SEED).eval(\n", + " X_res, labels=labels_res, metrics=METRICS, cv=cv)\n", + " scores[name] = {r.metric: float(r.score) for r in df_e.itertuples()}\n", + "\n", + "aa.plot_settings(font_scale=0.9, weight_bold=False)\n", + "fig, axes = plt.subplots(1, 2, figsize=(9, 3.6))\n", + "c_leak, c_ok = aa.plot_get_clist(n_colors=2)\n", + "\n", + "ax = axes[0]\n", + "folds = cv_leaky.df_folds_[\"fold\"].to_numpy()\n", + "ax.bar(folds - 0.18, cv_leaky.df_folds_[\"n_groups_test\"], 0.36, color=c_leak, label=\"ungrouped\")\n", + "ax.bar(folds + 0.18, cv_honest.df_folds_[\"n_groups_test\"], 0.36, color=c_ok, label=\"grouped\")\n", + "ax.axhline(len(set(groups_res)), color=\"black\", lw=0.8, ls=\"--\")\n", + "ax.text(4.4, len(set(groups_res)) - 1.4, \"all 20 proteins\", fontsize=7, ha=\"right\")\n", + "ax.set_xlabel(\"fold\")\n", + "ax.set_ylabel(\"proteins in the test half\")\n", + "ax.set_title(\"Fold composition: who is held out\")\n", + "\n", + "ax = axes[1]\n", + "xs = np.arange(len(METRICS))\n", + "ax.bar(xs - 0.18, [scores[\"ungrouped\"][m] for m in METRICS], 0.36, color=c_leak, label=\"ungrouped\")\n", + "ax.bar(xs + 0.18, [scores[\"grouped\"][m] for m in METRICS], 0.36, color=c_ok, label=\"grouped\")\n", + "for i, m in enumerate(METRICS):\n", + " delta = scores[\"ungrouped\"][m] - scores[\"grouped\"][m]\n", + " ax.text(i, max(scores[\"ungrouped\"][m], scores[\"grouped\"][m]) + 0.03,\n", + " f\"+{delta:.3f}\" if delta > 0 else f\"{delta:.3f}\", ha=\"center\", fontsize=7.5)\n", + "ax.set_xticks(xs)\n", + "ax.set_xticklabels([\"ROC-AUC\", \"MCC\"])\n", + "ax.set_ylim(0, 1.15)\n", + "ax.set_ylabel(\"score\")\n", + "ax.set_title(\"What it costs here (residue level)\")\n", + "handles, labels_ = axes[0].get_legend_handles_labels()\n", + "fig.legend(handles, labels_, frameon=False, fontsize=8, ncol=2,\n", + " loc=\"upper center\", bbox_to_anchor=(0.5, 0.045))\n", + "plt.tight_layout(rect=(0, 0.07, 1, 1))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "17f8f8b1", + "metadata": {}, + "source": [ + "Set `allow_overlap=False` (the default) and the same leaky splitter stops being a silent inflation and becomes an error that names the shared groups. This is the guard worth keeping on." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a163ea76", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:31:08.669879Z", + "iopub.status.busy": "2026-09-18T17:31:08.669679Z", + "iopub.status.idle": "2026-09-18T17:31:08.678023Z", + "shell.execute_reply": "2026-09-18T17:31:08.677595Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "\"'cv' put 20 group(s) in both train and test of fold 0 (e.g. 'CASPASE3_115'), which leaks between folds. Use a group-aware splitter (e.g. 'GroupKFold', 'StratifiedGroupKFold', 'LeaveOneGroupOut') or set 'allow_overlap=True' to permit it\"" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# The guard: the same leaky splitter with allow_overlap left at its default.\n", + "cv_guarded = aa.bind_groups(cv=StratifiedKFold(n_splits=N_SPLITS, shuffle=True, random_state=SEED),\n", + " groups=groups_res, allow_overlap=False)\n", + "try:\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\") # StratifiedKFold notes that it ignores groups\n", + " list(cv_guarded.split(X_res, labels_res))\n", + " message = \"no error raised\"\n", + "except ValueError as err:\n", + " message = str(err)\n", + "message" + ] + }, + { + "cell_type": "markdown", + "id": "ad5b94bd", + "metadata": {}, + "source": [ + "**The concept the seed makes visible: how far a score drifts on its own.** The fourth pinned decision is the seed, and it is what turns \"the number moved\" into \"the method changed\". Pin the seed and a rerun is bit-identical. Leave it free and the same unchanged method produces a spread, purely from where the fold boundaries fall and how the forest is grown.\n", + "\n", + "That spread is not a nuisance, it is the measurement that sets the regression tolerance. Below, the protocol is rerun across ten seeds at every level: the cloud is the free-seed spread, the marker is the pinned seed 42 that the recorded table uses." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c3de0ece", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:31:08.679934Z", + "iopub.status.busy": "2026-09-18T17:31:08.679733Z", + "iopub.status.idle": "2026-09-18T17:31:30.921789Z", + "shell.execute_reply": "2026-09-18T17:31:30.921213Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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jxkzRm/Ce/bsqYENgqjx48dnmm4NpThHjx6VoUOHSlBQkO6rs7/70cn0r7/+Wj799FOdjsDKX3ht8LJgwQINVBAVI1ps0KCBfhGoq3viiSd0bKCWLVtmu57HH39cAxf8kD/00ENSr149Lc1BnSQOsgoVKsitt95qWR4ROAKX6667Tp577rlM68tumG5vLg5FsWb37t3lzJkzWu+JE8H6LgOv8XnjgSAmqwAH68fDfj4RkS+XOuf0pgxBT0xMjD4jeGnXrp3WFAwbNkyvze+//74uhwDn1KlT+rvkaLp16UubNm30Bn79+vXSvn17ef31153+3fdOpqOaaOTIkdKjRw/p2rVrpht5X+W1wctrr72mz3PmzJF7773XEoggiHn22WfljTfekIULF2a5DpQe4O9DQ0Nl1apVcsMNN1jm4Yvs3LmzPP3007J9+3bL9D/++EOfEdD85z//EX8oDkXkX7hwYS2twmcCM2bMkIEDB2pVHE5i8+4jOjpaqlevLn///bf+vbMAB4ERHkREvsC84cqvm7KoqCh9RmDUunVr6d27t2UerrPOpltDIIVACAHI3LlztWQFJUat3VgfHhitGXBjjvfnD7wyeImLi5Nt27ZpHZ8ZuJiefPJJGTdunEaP+CHN6iDDF44qJ6zDOnCBTp06SfPmzWXLli0abaOEAlAqA40aNRJ/KA69cOGCFiHOmjVLix/NUiYEc4jQUapVpEgRDfBwkKOu9Prrr9ciSgQ+CGjMuxTrAAefF6uMyNulZxiSmJoukWEhEhIcVNC7QwXIvOHK75uyRx99VG666SbZunWrlClTRmrWrCm33HKL0+nWli5dKlOmTNHfMdx4Tps2TZo2berW+lBTceONN8qSJUv0Om4GVb7OK4MXJDmZRWb28CPbokULDV6QxISSGGfwww116tRxOL9y5coavKB4zQxezJIXVLXMmzdP1q5dq184DgpUuXjbD7bZyZyzHBXkr6DeFAHM7bffrsEL7jBwMvzyyy8a1KBEC58FSlzMKiY8I4ENELCYJTlmgIP5RN7qclKqLNp+QjYePCuJKekSGR4iraqXku4NK0hMBEsMAxGu3bjO59VNGRJpkecCuFlG6gHgeombS/PGuGHDhvo75my6tS5dukjt2rW1+gfPZtrCDjfWh+moXfj999/193LXrl3iD7y25AWqVKnicH6lSpX0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6w6WvBAREXlpyYs1BAiA0gx3NGvWTJs4mwEDSm8QQFxzzTVaJWUfQKDZ86xZs3TUa2soMUHpCkpbMG4R1onApV27dvLLL79kSr51d7tERESUv/J8bHizeXFwsPtxEqpoOnXqJGvWrJFz585p53EovTGbNltr27atzJw505J0a0Lz5/fff9+SsIsBJuvWrSu1a9f2yHaJiIjIz4IXsyM4tFbKaf5Mx44ds10OQwA4GwbAbLqNh6e3S0RERPkrT6uNvvvuO02UReIs8keIiIiIvDJ4QT8v6NW2d+/e+vqBBx6QiIiIvNgUERERBRiXq40GDRokc+fOzXa5q1evSmpqquV106ZN5Y033sj5HhIRERHlJHhBUGIOXJgdJOciKfb++++Xp59+momuRERElP/By4QJE2TMmDHZBi3oGh+DMrJlDhERERVo8IKAJDcjRRMRERF5Qp53Unf69GkZP368fP/993m9KSIiIgoAeRK8YMSBFStWaGdvlSpVktGjR2sLJCIiIiKv6qQOAx1+/PHH8uGHH8rBgwct09G1vjlMABEREVGBBy8YFHHGjBmyYMECSUlJsYzQjJGl+/XrJ23atPHEZoiIiIhyHrycPXtWPv30Uy1l2b9/v808jCP0yiuvaMsjIiIiogINXjBYIUpZvv32W0lOTtZp9erVkyFDhsjKlSvl66+/ljp16jBwISIiooINXubPny/PP/+87N27V19jdOa77rpLBg8eLLfeeqtO27hxY97sJREREZG7wcvixYs1cDFbDyGfpUSJEq7+OREREVH+NpU281eOHj0qL7zwgowYMUKrkIiIiIi8MniZPn26LF++XPtuuXz5snz00Udy8803a74LRpCOj4/P2z0lIiIicid4CQkJkY4dO8pXX30lJ0+elGnTpkmTJk1k165dmqwbGxurHdMREREReV0Pu8WLF9dE3V9//VV27Nghw4YNk8jISDl+/LjOf+KJJ3RE6aVLl0pqaqqn95mIiIgCWK6HB0C10eTJkzVwWbhwoXTv3l2bUM+ZM0e6du0qZcuWlQEDBshff/3lmT0mIiKigOaxsY1CQ0M1cEEAg0Dmrbfekvr168uFCxdk1qxZsm7dOk9tioiIiAJYngzMWLp0aXn66aflzz//1Kol5MRguAAiIiIirxqY8fXXX9cWSejMDsm9gKRePIiIiIi8ruQFYxytX79eTp8+7cnVEhEREeVttRERERFRXmHwQkRERD6FwQsRERH5FAYvREREFLjBy7hx47TH3R49enhytURERER501Qa4xvhkZSU5MnVEhEREeWu5OX333/XsYtOnTqVaR561C1VqpT069dPDhw4kJPVExEREXkueHnjjTekcePGOnbRxo0bM83fsGGDJCQkyOeffy4NGzaUb775xt1NEBEREXkmeJk0aZKMGjVKgoKCtOQFwYk99Kz73XffSevWreXq1avSp08f2bJlizubISIiIsp98HL27FkZO3as/v+DDz6Q2bNnS7Vq1TKvMDhYOnToIKtWrdJRpVNTU3WcIyIiIqJ8DV4wWjQScdu0aSMDBw7Mdvnw8HCZNm2aFCpUSKuSjhw5ktt9JSIiInI9eEETaGjfvr3LH1vlypUtVUt//PEHP24iIiLKv+AlOTlZn9GSyB1VqlTR5/j4eHf3jYiIiCjnwUuFChX0+cSJE+KOuLg4fY6JiXHr74iIiIhyFbzUr19fn3/66SdX/0T7fNm8ebP+v06dOi7/HREREVGug5fOnTtrldGmTZtkyZIlLv3NSy+9JImJiVK7dm2pUaOGq5siIiIiyn3wgtZDY8aM0f/fd999MnfuXDEMw+Gy6N9l+PDh8s477+jr1157zdXNEBEREXlubKMnn3xSmz1/9dVX0rdvX3nllVekXbt2WqoSGRkp586d01ZJP/zwg5w/f17/5tVXX5W77rrLnc0QEREReW5gxi+++EKaNWsmL774ouzbt08fjlSvXl2mTp2q1U1EREREBRa8YGiAZ599Vh577DGZP3++rF+/Xo4fPy5XrlyRsmXLatDSqVMnHR4Ave0SERERFWjwYipSpIj0799fH0REREReH7yYUOKCkhc0i0bJS2xsrCb3EhEREeWFHNXrpKWlyYwZM3ScI3Q+h6bQrVq1kmuuuUZLZHr06CHLli3z/N4SERFRwHM7ePnrr780nwU5L8h3QXPp0NBQKVGihD5jFOlFixZJly5d5P777+ewAERERFRwwQuqhjAw49atW6VYsWIybtw42b9/v457hGbSeN6+fbsMGzZMq47mzJmjAQwRERFRgQQvAwcOlEOHDmlX/7t375bRo0dLzZo1La2K8NygQQOZPHmyrFmzRqKjo2Xx4sXy0UcfeWyHiYiIKLC5HLwcPHhQvv32W60aQrVQ+fLls1y+RYsW8u677+r/zZ52iYiIiPIteFm+fLnmt3Tt2lVLW1zRr18/bYGEXncPHDiQm/0kIiIici94QW4LNG/e3NU/0Wokc3lUNxERERHlW/CSkpKiz2hV5A40nQYk9BIRERHlW/BSqlQpfT5y5IhbG/jnn3/0uXTp0u7uGxEREVHOgxez+gfJush9ccWJEydk8+bNmuTbpEkTVzdFRERElPvgpV27dlr6smvXLpk1a5ZLf/P0009rb7zosM7d6iYiIiKiXAUvhQsXlpdffln/P2TIEPnvf//rtAQG4x09/PDD8tVXX2lfL2+88YarmyEiIiLy3MCMgwYN0h50Z86cqcHJm2++KR07dpRatWppkBIfH6/z0R8MEnRRXfT555/rfCIiIqICGVX6ww8/lHr16slLL72kzafNJtT2sMwnn3zCXBciIiIq2OAFhg4dKg8++KAsWLBAVq9eLX///beWuqBFUY0aNeTOO++Um266SYKCgvh1ERERUcEHL4Bqov79++uDiIiIyCsHZsypP//8UzZs2JAfmyIiIiIPM9LTJf1Kgj77bMnLli1bdLyikJAQadOmjVYVOZKamirjxo2T119/XXNlWrdundv9JSIionySHh8vl5culYRNmyUjKUmCIyIkqmULienSRUKio8UngheMT3TvvffKr7/+apmGvJYBAwbI+++/r8GMCcs89NBDGuSA9TwiIiLy/sAlbsJESdq3T9LOnBEjJUWCwsMl9eRJSdq9R8oMf67AAhiXq42SkpKkffv2GpSEhYVJq1atpE6dOtrXC5pOv/DCC5ZlP/30U52PwCUiIkL7eenTp09evQciIiLyMJS4aOASFydhsbESUbeuhFWooK8xHfMLisvBy3fffSd//fWXBiPr16/XHJbdu3drXy8wdepUSUhI0Nf/+c9/tGddVCn98ccfMmLECJa8EBER+QgjPV2rilDigsAlpEgRCQoO1pIWvMb0hM1bCiwHxuVqo99++02f+/btK82aNbNMf/bZZ2XatGly9OhR/f8HH3ygAc748ePlySefzHVz6b1798qSJUt0nKTY2Fi5++67pWrVqm6vB2Msff/999p5Xvny5aVbt25St25dh8u+8847Gpg5UqVKFRk1apTb2yciIvIVGYlJmuOCqqLgqCibeXiN6RmJibpcSBHb+V4VvJw/f97S+Zy14OBg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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataFrame shape: (3, 5)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 levelmeanstdminmax
1domain0.9246000.0124000.9083000.949400
2protein0.8332000.0140000.8042000.854700
3residue0.9491000.0036000.9418000.954300
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Concept figure: the free-seed spread that sets the tolerance.\n", + "rows = []\n", + "for level, (X, labels, groups, _) in LEVELS.items():\n", + " for seed in range(SEED, SEED + 10):\n", + " aap = aa.AAPred(models=[\"rf\"], verbose=False, random_state=seed)\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " df_e = aap.eval(X, labels=labels, metrics=[\"roc_auc\"],\n", + " cv=pinned_cv(groups=groups, seed=seed))\n", + " rows.append({\"level\": level, \"seed\": seed, \"roc_auc\": float(df_e[\"score\"].iloc[0])})\n", + "df_seeds = pd.DataFrame(rows)\n", + "df_spread = df_seeds.groupby(\"level\")[\"roc_auc\"].agg([\"mean\", \"std\", \"min\", \"max\"]).round(4)\n", + "\n", + "aa.plot_settings(font_scale=0.9, weight_bold=False)\n", + "fig, ax = plt.subplots(figsize=(6, 3.8))\n", + "jitter = np.random.default_rng(0)\n", + "for i, level in enumerate(levels):\n", + " vals = df_seeds[df_seeds[\"level\"] == level][\"roc_auc\"].to_numpy()\n", + " ax.scatter(i + jitter.normal(0, 0.05, size=len(vals)), vals, color=colors[i],\n", + " alpha=0.7, s=26, label=\"free seed\" if i == 0 else None)\n", + " pinned = df_seeds[(df_seeds[\"level\"] == level) & (df_seeds[\"seed\"] == SEED)][\"roc_auc\"].iloc[0]\n", + " ax.scatter([i], [pinned], marker=\"D\", s=58, facecolor=\"none\", edgecolor=\"black\", lw=1.2,\n", + " label=\"pinned seed 42\" if i == 0 else None, zorder=5)\n", + "ax.set_xticks(range(len(levels)))\n", + "ax.set_xticklabels(levels)\n", + "ax.set_ylabel(\"ROC-AUC\")\n", + "ax.set_title(\"Ten seeds of the same unchanged method\")\n", + "ax.legend(frameon=False, fontsize=7.5, loc=\"upper right\")\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "aa.display_df(df=df_spread.reset_index(), n_rows=10, show_shape=True)" + ] + }, + { + "cell_type": "markdown", + "id": "aa60ab9f", + "metadata": {}, + "source": [ + "**The tolerance.** The widest across-seed standard deviation over the three levels is the protocol's noise floor. Rounding three standard deviations up to a round number gives the rule this protocol adopts:\n", + "\n", + "> A drop of more than **0.05 absolute ROC-AUC** at any level, at the pinned seed, is a regression. Anything smaller is inside the noise the seed sweep just measured.\n", + "\n", + "Deriving the tolerance from a measured spread is the whole point. A tolerance picked *a priori* is either so tight that ordinary seed jitter trips it on every unrelated pull request or so loose that a real regression slips through." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "4e81c87e", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:31:30.923466Z", + "iopub.status.busy": "2026-09-18T17:31:30.923338Z", + "iopub.status.idle": "2026-09-18T17:31:30.926182Z", + "shell.execute_reply": "2026-09-18T17:31:30.925876Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'widest across-seed std': 0.014,\n", + " 'three standard deviations': 0.042,\n", + " 'adopted tolerance': 0.05}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sigma_max = float(df_spread[\"std\"].max())\n", + "{\"widest across-seed std\": round(sigma_max, 4),\n", + " \"three standard deviations\": round(3 * sigma_max, 4),\n", + " \"adopted tolerance\": TOLERANCE}" + ] + }, + { + "cell_type": "markdown", + "id": "9b9e2f61", + "metadata": {}, + "source": [ + "**Reproducibility.** The protocol's central claim is that a rerun reproduces the table. Here it is, checked rather than asserted: the pinned procedure is run a second time from the same inputs and the two score vectors are compared exactly." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a3b1ad06", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:31:30.927577Z", + "iopub.status.busy": "2026-09-18T17:31:30.927457Z", + "iopub.status.idle": "2026-09-18T17:31:38.248088Z", + "shell.execute_reply": "2026-09-18T17:31:38.247500Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'rerun reproduces every score exactly': True, 'max absolute difference': 0.0}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Rerun the pinned procedure and compare the two score vectors exactly.\n", + "frames_again = []\n", + "for level, (X, labels, groups, df_seq) in LEVELS.items():\n", + " aap = aa.AAPred(models=[\"rf\"], verbose=False, random_state=SEED)\n", + " with warnings.catch_warnings():\n", + " warnings.simplefilter(\"ignore\")\n", + " df_eval = aap.eval(X, labels=labels, metrics=METRICS, cv=pinned_cv(groups=groups),\n", + " df_seq=df_seq, baseline=[\"aac\", \"dpc\"], list_parts=\"tmd_jmd\")\n", + " frames_again.append(df_eval.assign(level=level))\n", + "df_again = pd.concat(frames_again, ignore_index=True)[[\"level\", \"features\", \"metric\",\n", + " \"principle\", \"score\"]]\n", + "\n", + "identical = np.array_equal(df_bench[\"score\"].to_numpy(), df_again[\"score\"].to_numpy())\n", + "{\"rerun reproduces every score exactly\": bool(identical),\n", + " \"max absolute difference\": float(np.abs(df_bench[\"score\"].to_numpy()\n", + " - df_again[\"score\"].to_numpy()).max())}" + ] + }, + { + "cell_type": "markdown", + "id": "91632ffd", + "metadata": {}, + "source": [ + "**The residue level's own primary metric.** ROC-AUC over pooled windows answers \"can the model tell a site from a non-site anywhere in the set\". Site prediction is usually asked a harder question: *within one protein*, are the true sites ranked at the top? That is per-protein average precision, and `comp_per_protein_ap` computes it from per-protein score vectors and the 0-based indices of the true sites. It is reported alongside ROC-AUC because the two can move apart: a model can separate sites from non-sites globally and still rank badly inside individual proteins.\n", + "\n", + "The scores are out-of-fold, taken through the same grouped splitter, so each protein is scored only by folds that never trained on it." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "858cf3d4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:31:38.250157Z", + "iopub.status.busy": "2026-09-18T17:31:38.249952Z", + "iopub.status.idle": "2026-09-18T17:31:38.557984Z", + "shell.execute_reply": "2026-09-18T17:31:38.557665Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'n proteins': 20, 'per-protein AP (mean)': 0.8003}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Residue-level primary metric: per-protein average precision, out-of-fold.\n", + "oof = cross_val_predict(RandomForestClassifier(n_estimators=100, random_state=SEED),\n", + " X_res, labels_res, cv=pinned_cv(groups=groups_res),\n", + " method=\"predict_proba\")[:, 1]\n", + "df_oof = df_res[[\"entry\", \"protein\", \"label\"]].copy()\n", + "df_oof[\"position\"] = df_oof[\"entry\"].str.rsplit(\"_pos\", n=1).str[1].astype(int)\n", + "df_oof[\"score\"] = oof\n", + "\n", + "list_scores, list_positions = [], []\n", + "for _, df_p in df_oof.sort_values(\"position\").groupby(\"protein\", sort=True):\n", + " list_scores.append(df_p[\"score\"].to_numpy())\n", + " list_positions.append(np.flatnonzero(df_p[\"label\"].to_numpy() == 1))\n", + "\n", + "ap = aa.comp_per_protein_ap(list_scores=list_scores, list_positions=list_positions, tolerance=0)\n", + "{\"n proteins\": int(len(ap)), \"per-protein AP (mean)\": round(float(np.nanmean(ap)), 4)}" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "5c5010a4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-09-18T17:31:38.559141Z", + "iopub.status.busy": "2026-09-18T17:31:38.559062Z", + "iopub.status.idle": "2026-09-18T17:31:38.565251Z", + "shell.execute_reply": "2026-09-18T17:31:38.565044Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataFrame shape: (3, 7)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
featureslevelcppaacdpcbest baselinecpp - baselinetolerance
1residue0.9485000.8540000.8744000.8744000.0741000.050000
2domain0.9289000.7383000.6161000.7383000.1906000.050000
3protein0.8293000.9128000.8985000.912800-0.0835000.050000
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# The recorded baseline table: what a future rerun is diffed against.\n", + "df_record = (df_bench[df_bench[\"metric\"] == \"roc_auc\"]\n", + " .pivot(index=\"level\", columns=\"features\", values=\"score\")\n", + " .reindex(levels)[[\"cpp\", \"aac\", \"dpc\"]]\n", + " .round(4)\n", + " .reset_index())\n", + "df_record[\"best baseline\"] = df_record[[\"aac\", \"dpc\"]].max(axis=1).round(4)\n", + "df_record[\"cpp - baseline\"] = (df_record[\"cpp\"] - df_record[\"best baseline\"]).round(4)\n", + "df_record[\"tolerance\"] = TOLERANCE\n", + "aa.display_df(df=df_record, n_rows=10, show_shape=True)" + ] + }, + { + "cell_type": "markdown", + "id": "4e2c00c4", + "metadata": {}, + "source": [ + "**How to interpret.** Read the recorded table as a baseline, not as an achievement.\n", + "\n", + "| What you see | What it means |\n", + "| --- | --- |\n", + "| a delta inside +/- 0.05 | noise, at the measured seed spread; not a change |\n", + "| a drop beyond 0.05 at one level | a regression at that level; the other levels do not excuse it |\n", + "| `cpp` below a composition baseline | positional features do not earn their keep on that task |\n", + "| a grouped score far below its ungrouped twin | the samples are more dependent than assumed |\n", + "| `holdout` far from `cv_pooled` | the held-out slice is too small to estimate anything |\n", + "\n", + "**Key takeaways**\n", + "\n", + "- **A benchmark is a frozen procedure, not a dataset.** The four pinned decisions (dataset, split, metric, seed) are the deliverable; the shipped tables were always there.\n", + "- **The tolerance has to be measured.** The across-seed spread is the noise floor, and a regression threshold below it only produces false alarms.\n", + "- **Grouping is a property you verify, not assume.** `df_folds_` states it per fold, and `allow_overlap=False` turns a violated assumption into an error instead of an inflated score." + ] + }, + { + "cell_type": "markdown", + "id": "ce8a2db8", + "metadata": {}, + "source": [ + "**Common mistakes.**\n", + "\n", + "- **Using `random=True` for a benchmark.** It takes no seed and `aa.options[\"random_state\"]` does not reach it, so the set changes under you between runs. Pin `random=False` and subsample with your own seeded generator.\n", + "- **Reading `len(df_seq)` as the group size.** `load_dataset(n=N)` returns `2N` rows; take counts from the `label` column.\n", + "- **Splitting residue windows without groups.** Windows share proteins, so a plain `KFold` puts the same protein on both sides of every fold. Bind the accession with `aa.bind_groups` and leave `allow_overlap=False`.\n", + "- **Comparing against a baseline built over a different span.** A baseline over `tmd_jmd` and a CPP matrix over `tmd` measure different residues, so the delta is geometry, not method. Match `list_parts` to the matrix.\n", + "- **Quoting the absolute score as a generalization estimate.** Feature selection here runs once on the full set, so the number is post-selection and optimistic. It is a valid yardstick for comparing runs, not an estimate of held-out performance.\n", + "- **Setting a tolerance tighter than the seed spread.** It will fire on unrelated changes until everyone learns to ignore it.\n", + "- **Using `comp_auc_adjusted` to score a model.** It ranks features; use `roc_auc` for a classifier." + ] + }, + { + "cell_type": "markdown", + "id": "db0112be", + "metadata": {}, + "source": [ + "**Next step.** Two directions from here. To ask whether a single result is real rather than comparable, go to *P10: Validation*, which adds the shuffled-label control and the bootstrap interval this protocol deliberately leaves out. To change something and measure it, rerun this notebook unchanged, diff the recorded table against the one committed here, and read the deltas against the 0.05 tolerance." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.13.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}