Repository navigation
feat(bench): multi-class triage benchmark — ensemble fails, selectivity_proxy only correct triager - #116
Merged
Conversation
…ty_proxy only correct triager Addresses v1.1 ROADMAP item: benchmark candidate triage against a reference panel that includes selective AMPs, hemolytic positives, inactive peptides, and random controls. The existing benchmarks test two separate 2-class problems (AMP vs decoy, hemolytic vs selective). No benchmark tested the combined triage task that the virtual assay layer must solve: rank selective AMPs above hemolytic AMPs above random decoys in a single panel. Dataset: 125 selective AMPs (HC50 >= 100) + 45 hemolytic AMPs (HC50 < 25) + 96 random background decoys = 266 total. Key findings (documented honestly): - Ensemble does NOT triage correctly: ranks hemolytic > selective (AUROC 0.466) due to activity scorer anti-selective bias - Only selectivity_proxy triages correctly (all 3 pairwise AUROCs > 0.5) but sacrifices decoy discrimination (0.782 vs ensemble 0.848) - Naive triage_score (activity * (1 - hemolysis_risk)) does NOT fix the bias because hemolysis_risk is too weak (detection AUROC 0.565, not significant) - triage_score shifts top-20 favorably (16 selective vs 14, 4 hemolytic vs 6) but pairwise AUROC remains below 0.5 This establishes the baseline that any future virtual assay module must beat: triage correctly (all 3 AUROCs > 0.5) while maintaining decoy discrimination (sel_vs_decoy > 0.80). New components: - src/openamp_foundry/benchmark/triage.py - CLI: openamp-foundry bench triage - Makefile: make bench-triage - 16 new tests (15 benchmark + 1 CLI) - 1487 tests total, 7 skipped Constraint: Uses existing datasets (hemolysis_reference.csv + random_background.csv) Rejected: Adding MODERATE class to binary task | Would muddy the triage signal Directive: Do not claim triage_score as a virtual assay — it is a baseline composite Confidence: high Scope-risk: narrow Tested: 1487 tests pass, 7 skipped; benchmark run on full 266-peptide panel Co-authored-by: OmX <noreply@omx.ai>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Addresses the v1.1 ROADMAP item: "benchmark candidate triage against a reference panel that includes selective AMPs, hemolytic positives, inactive peptides, and random controls."
Prior benchmarks tested two separate 2-class problems (AMP vs decoy, hemolytic vs selective). No benchmark tested the combined triage task that the virtual assay layer must solve: rank selective AMPs above hemolytic AMPs above random decoys in a single panel.
Dataset
125 selective AMPs (HC50 >= 100 µg/mL) + 45 hemolytic AMPs (HC50 < 25 µg/mL) + 96 random background decoys = 266 total.
Key findings (documented honestly)
New components
src/openamp_foundry/benchmark/triage.py— multi-class triage benchmark moduleopenamp-foundry bench triage --hemolysis-csv ... --decoy-csv ...make bench-triageVerification
Implication for virtual assay layer
This establishes the baseline that any future virtual assay module must beat: triage correctly (all 3 AUROCs > 0.5) while maintaining decoy discrimination (sel_vs_decoy > 0.80). The selectivity_proxy achieves correct triage but at the cost of decoy discrimination. A successful virtual assay must achieve both.
Constraint: Uses existing datasets (hemolysis_reference.csv + random_background.csv)
Rejected: Adding MODERATE class to binary task | Would muddy the triage signal
Directive: Do not claim triage_score as a virtual assay — it is a baseline composite
Confidence: high
Scope-risk: narrow
Tested: 1487 tests pass, 7 skipped; benchmark run on full 266-peptide panel
Co-authored-by: OmX noreply@omx.ai