Trim the card: drop the checkpoint-reselection history, add the four md5s
Browse files
README.md
CHANGED
|
@@ -35,77 +35,24 @@ changed.
|
|
| 35 |
| `prepibind_ic50_1000_s42_f1.pt` | IC50, binder threshold < 1000 nM | 42 | 1 | 0.49456 | `configs/predict/config_ic50_1000.py` |
|
| 36 |
|
| 37 |
Each is 213.0 MiB, a one-key `{"model_state_dict": ...}` dict of 64 float32 tensors, 55,820,161
|
| 38 |
-
parameters.
|
| 39 |
|
| 40 |
-
All four
|
| 41 |
-
and nothing has been uploaded to HuggingFace; that is a human step, and the sequence is
|
| 42 |
-
`tools/release/upload_plan.md`.
|
| 43 |
|
| 44 |
## How these four were chosen, and why they are not the paper's numbers
|
| 45 |
|
| 46 |
-
Each arm was trained as **15 runs**: three seeds (42, 100, 128) by five cross-validation folds
|
| 47 |
-
**
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
**The ms row changed on 2026-09-10, and only the ms row.** It was seed 100, fold 1 from
|
| 56 |
-
`250527/1_ms_re`, whose true val_loss is 0.13128. The corrected parse puts the arm's argmin at seed
|
| 57 |
-
128, fold 3 from `260829/ms`, 0.12274. That run was already one of the fifteen this arm averages:
|
| 58 |
-
`analysis/scoring/2_ms/per_run_results.csv` draws 9 of them from `250527/1_ms_re` and 6 from
|
| 59 |
-
`260829/ms` (seed 100 fold 4, and seed 128 folds 0-4). The two directories carry byte-identical
|
| 60 |
-
`config_global.json` and `config_esmc_small.py`, both log `Total samples: 77954` from the one
|
| 61 |
-
`data/dataset/ms_ql/train.csv`, and `260829`'s replicate of three seed-42 folds reproduces the
|
| 62 |
-
earlier root's validation losses exactly (0.14181, 0.14277, 0.14074). So this is a re-selection
|
| 63 |
-
inside the arm, on a criterion that did not change — not a new model, and not a new comparison.
|
| 64 |
-
|
| 65 |
-
The val_loss values above were re-derived on 2026-09-10 from `analysis/val_metrics.csv`, after a
|
| 66 |
-
regex in `analysis/tools/parse_train_logs.py` was fixed: it required an unsigned number for
|
| 67 |
-
`Val ROC-AUC`, so every epoch line carrying one of those negative values was dropped and the
|
| 68 |
-
recorded minimum was a minimum over a filtered subset. It could only ever come out too high, and on
|
| 69 |
-
46.7 % of runs it did. The training itself was never affected — `train.py` checkpoints on the true
|
| 70 |
-
minimum — which is why the epoch stored inside each of these four files (20, 27, 28, 28) matches the
|
| 71 |
-
corrected argmin and not the old one.
|
| 72 |
-
|
| 73 |
-
So a released checkpoint does not reproduce a paper number and is not meant to. It scores a little
|
| 74 |
-
above the mean on most metrics, because it was picked for a quantity correlated with test
|
| 75 |
-
performance — though not on all of them: F1 comes out slightly below the mean in the qualitative and
|
| 76 |
-
ic50_1000 arms. Both are below:
|
| 77 |
-
|
| 78 |
-
| arm | metric | paper (mean ± sd over 15 runs) | this checkpoint alone |
|
| 79 |
-
|---|---|---|---|
|
| 80 |
-
| qualitative | ROC AUC | 0.9193 ± 0.0028 | 0.9211 |
|
| 81 |
-
| | PR AUC | 0.9448 ± 0.0019 | 0.9460 |
|
| 82 |
-
| | F1 | 0.8586 ± 0.0037 | 0.8582 |
|
| 83 |
-
| | accuracy | 0.8375 ± 0.0038 | 0.8391 |
|
| 84 |
-
| | MCC | 0.6683 ± 0.0084 | 0.6736 |
|
| 85 |
-
| ms | ROC AUC | 0.9897 ± 0.0009 | 0.9911 |
|
| 86 |
-
| | PR AUC | 0.9865 ± 0.0012 | 0.9884 |
|
| 87 |
-
| | F1 | 0.9439 ± 0.0042 | 0.9502 |
|
| 88 |
-
| | accuracy | 0.9563 ± 0.0030 | 0.9612 |
|
| 89 |
-
| | MCC | 0.9083 ± 0.0063 | 0.9186 |
|
| 90 |
-
| ic50_500 | ROC AUC | 0.8375 ± 0.0039 | 0.8436 |
|
| 91 |
-
| | PR AUC | 0.7429 ± 0.0055 | 0.7520 |
|
| 92 |
-
| | F1 | 0.6764 ± 0.0146 | 0.6805 |
|
| 93 |
-
| | accuracy | 0.7685 ± 0.0035 | 0.7739 |
|
| 94 |
-
| | MCC | 0.4979 ± 0.0107 | 0.5067 |
|
| 95 |
-
| ic50_1000 | ROC AUC | 0.8347 ± 0.0044 | 0.8401 |
|
| 96 |
-
| | PR AUC | 0.8024 ± 0.0057 | 0.8093 |
|
| 97 |
-
| | F1 | 0.7399 ± 0.0083 | 0.7322 |
|
| 98 |
-
| | accuracy | 0.7554 ± 0.0039 | 0.7575 |
|
| 99 |
-
| | MCC | 0.5101 ± 0.0092 | 0.5110 |
|
| 100 |
|
| 101 |
Held-out test sets, never used for selection: 48,352 rows (qualitative), 33,490 (ms), 14,150 (both
|
| 102 |
-
IC50 arms).
|
| 103 |
-
repository. Ignore its `val_auc` column, and the `Val ROC-AUC` in the training logs it comes from:
|
| 104 |
-
the `roc_auc_score` arguments are swapped and the values are meaningless. **Ignore its `val_loss`
|
| 105 |
-
column too** — it was written before the parser fix and is still the filtered minimum, 0.36951 for
|
| 106 |
-
the qualitative checkpoint and 0.14216 for the ms one. The validation losses in this card come from
|
| 107 |
-
`analysis/val_metrics.csv`, which was regenerated on 2026-09-10, and that is the only file to quote
|
| 108 |
-
them from.
|
| 109 |
|
| 110 |
## Training data
|
| 111 |
|
|
@@ -231,17 +178,11 @@ back to float32 and says so.
|
|
| 231 |
|
| 232 |
## Licence
|
| 233 |
|
| 234 |
-
**MIT** for these weights and for the PREpiBind code
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
copied from — ships a plain MIT licence, "Copyright 2026 Chan Zuckerberg Biohub, Inc.". These
|
| 240 |
-
checkpoints were produced by training on ESMC 300M embeddings. Checked 2026-09-10; the repository's
|
| 241 |
-
`THIRD_PARTY_NOTICES.md` records the evidence and every other dependency.
|
| 242 |
-
|
| 243 |
-
Training data derives from the IEDB Export v3 (free to use, asks to be cited) and allele sequences
|
| 244 |
-
from IPD-IMGT/HLA and UniProt.
|
| 245 |
|
| 246 |
## Citation
|
| 247 |
|
|
|
|
| 35 |
| `prepibind_ic50_1000_s42_f1.pt` | IC50, binder threshold < 1000 nM | 42 | 1 | 0.49456 | `configs/predict/config_ic50_1000.py` |
|
| 36 |
|
| 37 |
Each is 213.0 MiB, a one-key `{"model_state_dict": ...}` dict of 64 float32 tensors, 55,820,161
|
| 38 |
+
parameters. md5, in table order: `e0d105b1…`, `fd30ab20…`, `c589a329…`, `708a3753…`.
|
| 39 |
|
| 40 |
+
All four are the val_loss argmin of their arm.
|
|
|
|
|
|
|
| 41 |
|
| 42 |
## How these four were chosen, and why they are not the paper's numbers
|
| 43 |
|
| 44 |
+
Each arm was trained as **15 runs**: three seeds (42, 100, 128) by five cross-validation folds, and
|
| 45 |
+
**every number reported in the paper is a mean over those 15**. A released checkpoint is one of the
|
| 46 |
+
fifteen — the one with the lowest validation loss, the value in the table above. No test-set
|
| 47 |
+
quantity took part in the choice. For a benchmark comparison, use the paper's means, not one
|
| 48 |
+
checkpoint.
|
| 49 |
+
|
| 50 |
+
Quote the validation losses from `analysis/val_metrics.csv` in the repository. The `val_loss` and
|
| 51 |
+
`val_auc` columns of `analysis/scoring/*/per_run_results.csv` are not usable for this: the first
|
| 52 |
+
predates a parser fix, and the second comes from a `roc_auc_score` call with its arguments swapped.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
|
| 54 |
Held-out test sets, never used for selection: 48,352 rows (qualitative), 33,490 (ms), 14,150 (both
|
| 55 |
+
IC50 arms).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
|
| 57 |
## Training data
|
| 58 |
|
|
|
|
| 178 |
|
| 179 |
## Licence
|
| 180 |
|
| 181 |
+
**MIT** for these weights and for the PREpiBind code. The backbone is not ours but is also MIT:
|
| 182 |
+
ESMC 300M is now [`biohub/esmc-300m-2024-12`](https://huggingface.co/biohub/esmc-300m-2024-12), and
|
| 183 |
+
`esm` 3.4.0 — the release the vendored `prepibind/esmc/` source comes from — ships a plain MIT
|
| 184 |
+
licence. Training data derives from IEDB (CC BY 4.0) and allele sequences from IPD-IMGT/HLA
|
| 185 |
+
(CC BY-NoDerivs) and UniProt (CC BY 4.0). The repository's `THIRD_PARTY_NOTICES.md` has the detail.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
|
| 187 |
## Citation
|
| 188 |
|