Compound preference built 13 September 2026, target preference 21 September 2026. Two models, one shared data pipeline, and a separate holdout for each.
The data, the pairing rules they have in common and the pinned environment are described once. Everything that differs is under the preference model and the target-preference model.
Measurements come from ChEMBL 37. The endpoints are Ki, IC50, Kd, EC50 and Kb.
Activity is derived from the reported value and unit rather than read from a precomputed column. Duplicate readings collapse by median, never by the most potent value, because the best value selects unit errors. Only exact readings are used; censored readings are dropped.
High-throughput screening is excluded. On the sibling GPCR model, comparisons drawn from withheld screening endpoints scored 0.54 where neither compound had been seen, against 0.77 on held-out medicinal chemistry.
One target held fixed and two compounds. Row layout is ligand, sequence, ligand, the LSL layout, 2,556 columns. Run it →
Each compound comparison is anchored at one target, and the family span lives in the roster the estimator serves: one forest ranks compounds at any of 2,079 targets across 32 families, kinases, GPCRs, proteases, transferases, oxidoreductases, hydrolases, nuclear receptors, transporters, ion channels, and the epigenetic readers, writers and erasers. The two comparators reach the same breadth from opposite directions: the target comparison crosses a boundary inside one comparison, the compound comparison carries the whole roster inside one model.
Q09472,
against Molibresib and Inobrodib. Both are
clinical-stage bromodomain compounds, so this is a hard discrimination inside
one mechanistic class. p300 carries two family labels, reader and
writer: its acetyltransferase domain writes acetyl marks onto lysines and
its bromodomain reads marks already there, so one protein does both jobs. Both
readings are Kd, so the comparison is endpoint
matched: pKd 4.15
against 8.77. The model prefers
Inobrodib at strength 0.79,
which is the measured order, and neither compound appeared anywhere in training.
Compound-disjoint on both compounds by InChIKey, with comparisons that straddle the two sides discarded rather than assigned. A held-out comparison therefore involves two compounds the model never saw.
| Quantity | Value |
|---|---|
| Comparisons fitted on | 1,827,578 |
| Straddling comparisons discarded | 626,130 |
| Compounds fitted on | 474,708 |
| Held-out comparisons | 65,725 |
| Compounds across those comparisons | 43,961 |
| Targets servable | 2,079 |
| Held-out accuracy | 0.71 |
Accuracy depends on how far apart the two measured values really are.
| True separation | Comparisons | Accuracy |
|---|---|---|
| Under half a log | 20,200 | 0.57 |
| Half a log to one log | 15,559 | 0.67 |
| One to two logs | 18,293 | 0.78 |
| Beyond two logs | 11,673 | 0.90 |
Cumulative over the held-out set: every comparison at or above each strength.
| Strength at or above | Comparisons kept | Share kept | Accuracy |
|---|---|---|---|
| 0.50, answer everything | 65,725 | 100% | 0.71 |
| 0.60 | 28,097 | 43% | 0.84 |
| 0.70 | 11,435 | 17% | 0.92 |
| 0.80 | 3,995 | 6.1% | 0.96 |
| 0.90 | 794 | 1.2% | 0.98 |
The same two curves as the target-preference model, and the trade is much sharper: this model concentrates its confidence, so a gate costs more coverage and buys more accuracy.
This is what evidences the multi-family claim, and it is also where the gate earns its keep: move the control and watch each family trade coverage for accuracy at its own rate.
Across every family: 0.71 on 65,725 comparisons, 100.0% of the held-out set.
| Family | Held out | Kept at this gate | Coverage | Accuracy, 95% CI |
|---|---|---|---|---|
| Kinase | 9,585 | 9,585 | 100.0% | 0.69 [0.68, 0.70] |
| Family A G protein-coupled receptor | 7,266 | 7,266 | 100.0% | 0.72 [0.71, 0.73] |
| Protease | 3,160 | 3,160 | 100.0% | 0.71 [0.70, 0.73] |
| Transferase | 2,517 | 2,517 | 100.0% | 0.71 [0.69, 0.73] |
| Electrochemical transporter | 2,306 | 2,306 | 100.0% | 0.67 [0.65, 0.69] |
| Hydrolase | 2,069 | 2,069 | 100.0% | 0.70 [0.68, 0.72] |
| Fatty acid binding protein family | 2,019 | 2,019 | 100.0% | 0.69 [0.67, 0.71] |
| Reader | 2,012 | 2,012 | 100.0% | 0.72 [0.70, 0.74] |
| Other ion channel | 1,993 | 1,993 | 100.0% | 0.75 [0.73, 0.77] |
| Ligand-gated ion channel | 1,977 | 1,977 | 100.0% | 0.69 [0.67, 0.71] |
| Eraser | 1,974 | 1,974 | 100.0% | 0.72 [0.70, 0.74] |
| Ligase | 1,952 | 1,952 | 100.0% | 0.73 [0.71, 0.75] |
| Phosphatase | 1,944 | 1,944 | 100.0% | 0.75 [0.73, 0.77] |
| Writer | 1,931 | 1,931 | 100.0% | 0.80 [0.78, 0.81] |
| Oxidoreductase | 1,918 | 1,918 | 100.0% | 0.72 [0.70, 0.74] |
| Isomerase | 1,914 | 1,914 | 100.0% | 0.73 [0.71, 0.75] |
| Lyase | 1,893 | 1,893 | 100.0% | 0.73 [0.71, 0.75] |
| Toll-like and Il-1 receptors | 1,880 | 1,880 | 100.0% | 0.69 [0.67, 0.72] |
| Nuclear receptor | 1,871 | 1,871 | 100.0% | 0.72 [0.70, 0.74] |
| Phosphodiesterase | 1,829 | 1,829 | 100.0% | 0.72 [0.70, 0.74] |
| Cytochrome P450 | 1,785 | 1,785 | 100.0% | 0.70 [0.67, 0.72] |
| Primary active transporter | 1,781 | 1,781 | 100.0% | 0.69 [0.66, 0.71] |
| Voltage-gated ion channel | 1,773 | 1,773 | 100.0% | 0.71 [0.69, 0.73] |
| Family C G protein-coupled receptor | 1,751 | 1,751 | 100.0% | 0.70 [0.68, 0.72] |
| Family B G protein-coupled receptor | 1,727 | 1,727 | 100.0% | 0.74 [0.72, 0.76] |
| Aminoacyltransferase | 960 | 960 | 100.0% | 0.66 [0.63, 0.69] |
| Frizzled family G protein-coupled receptor | 515 | 515 | 100.0% | 0.74 [0.70, 0.78] |
| Taste family G protein-coupled receptor | 474 | 474 | 100.0% | 0.59 [0.55, 0.64] |
| Calcium channel auxiliary subunit alpha2delta family | 434 | 434 | 100.0% | 0.62 [0.58, 0.67] |
| Transmembrane 1-electron transfer carriers | 367 | 367 | 100.0% | 0.73 [0.68, 0.77] |
| Group translocator | 148 | 148 | 100.0% | 0.72 [0.65, 0.79] |
Families are ordered by how much of the held-out set they carry. The holdout fraction is set per family so that each one has enough held-out comparisons to quote an accuracy for at all; families differ in pool size by a factor of 600, so an equal share of each pool would have left the smallest with too few. Every accuracy is printed with its n.
| Endpoint | Comparisons | No gate | At 0.80 |
|---|---|---|---|
| IC50 | 34,481 | 0.71 | 0.96 |
| Ki | 12,900 | 0.72 | 0.97 |
| EC50 | 9,375 | 0.71 | 0.95 |
| Kd | 8,431 | 0.69 | 0.96 |
| Kb | 538 | 0.73 | 0.90 |
Real EC50 and Kb volume is what lets this model reach agonist and functional readings as well as binding ones.
One compound held fixed and two targets. Row layout is sequence, ligand, sequence, 1,998 columns. Run it →
A comparison puts one compound to two targets, and those targets either come from different families or from one family. Both kinds are formed by the same rules and fitted in one forest, and their results are reported separately everywhere. That is not a formality. The held-out set is 79.0% same-family, so a pooled number would be dominated by one arm and could rise while the other fell. There is no single accuracy for this model on this site.
| The question | Held-out comparisons | Compounds | Accuracy |
|---|---|---|---|
| Two targets from different families | 8,689 | 2,195 | 0.75 |
| Two different targets from one family | 32,738 | 13,343 | 0.78 |
No compound in either holdout appeared anywhere in fitting.
Two weaker answers on the same held-out comparisons: the family labels alone, and the same model with the ligand blinded so only the two sequences remain.
| Answering with | Across families | Within one family |
|---|---|---|
| A family prior, the family labels alone | 0.66 | 0.50 |
| The same model with the ligand blinded | 0.71 | 0.67 |
| The model | 0.75 | 0.78 |
Inside one family the family labels are identical, so a family prior is chance by construction and every point above 0.50 is earned by the comparison. The model beats its own sequence-only twin by 11.2 points within a family against 4.4 across them: the compound carries more of the call inside a family than across one.
Four rules, and they are the substance of the method.
The holdout is compound-disjoint: a ligand's InChIKey decides which side it lands on, so zero ligands appear on both sides. A held-out comparison therefore involves chemistry the model was never fitted on. It is not a temporal split.
A random forest. Every comparison is entered twice, once as given and once with the two sequence blocks exchanged and the label inverted, so no answer depends on which side a target was written on.
| Quantity | Value |
|---|---|
| Comparisons fitted on | 382,354 |
| Rows after the swap | 764,708 |
| Label balance | 0.5 |
| Compounds fitted on | 135,852 |
| Held-out comparisons, across families | 8,689 |
| Held-out accuracy, across families | 0.75 |
| Held-out comparisons, within one family | 32,738 |
| Held-out accuracy, within one family | 0.78 |
Accuracy depends on how far apart the two measured values really are.
| True separation | Across families | Within one family |
|---|---|---|
| Under half a log | 0.59 on 2,264 | 0.64 on 11,228 |
| Half a log to one log | 0.69 on 1,783 | 0.80 on 7,546 |
| One to two logs | 0.79 on 2,354 | 0.88 on 8,710 |
| Beyond two logs | 0.91 on 2,288 | 0.92 on 5,254 |
Cumulative over each held-out set: every comparison at or above each strength.
| Strength at or above | Across families | Within one family | ||
|---|---|---|---|---|
| Share kept | Accuracy | Share kept | Accuracy | |
| 0.50, answer everything | 100.0% | 0.75 | 100.0% | 0.78 |
| 0.60 | 70.6% | 0.82 | 76.1% | 0.85 |
| 0.70 | 49.5% | 0.89 | 56.0% | 0.91 |
| 0.80 | 34.3% | 0.94 | 38.3% | 0.95 |
| 0.90 | 20.5% | 0.97 | 20.8% | 0.98 |
Two curves and two axes, because the trade is the point. Accuracy climbs as the cutoff rises, and the number of comparisons you still get an answer for falls. Either curve on its own tells half the story. One figure per kind of comparison, never combined: first two targets from different families, then two different targets from one family. They are measured on separate held-out sets, so the two curves are not two views of one result. Both carry vertical bars, each over its own unit: the across-family curve over family pairings, because such a comparison belongs to two families at once but to exactly one pairing, and the within-family curve over families. Each figure says which inside the plot.
| Endpoint | Across families | Within one family |
|---|---|---|
| IC50 | 0.78 on 6,577 | 0.80 on 18,533 |
| Ki | 0.70 on 1,440 | 0.78 on 8,825 |
| Kd | 0.57 on 558 | 0.67 on 2,492 |
| EC50 | 0.66 on 114 | 0.81 on 2,815 |
| Kb | no comparisons | 0.78 on 73 |
Kd is the weakest endpoint in both and should not be leaned on. Kb appears only within a family: two agonist readings of one compound at two targets are rarely published across families.
A comparison is filed under the family its two targets share. Targets behind it is how many distinct proteins appear on either side of that family's held-out comparisons, and it is the column to read beside the accuracy: a family can carry thousands of comparisons over a handful of proteins, and then the figure describes those proteins rather than the family.
| Family | Held-out comparisons | Accuracy | Targets behind it |
|---|---|---|---|
| Family A G protein-coupled receptor | 5,412 | 0.76 | 160 |
| Kinase | 4,979 | 0.73 | 360 |
| Protease | 3,889 | 0.81 | 134 |
| Lyase | 2,792 | 0.77 | 15 |
| Eraser | 2,315 | 0.79 | 36 |
| Transferase | 1,993 | 0.85 | 90 |
| Cytochrome P450 | 1,755 | 0.76 | 28 |
| Nuclear receptor | 1,601 | 0.81 | 33 |
| Electrochemical transporter | 1,207 | 0.79 | 45 |
| Oxidoreductase | 1,137 | 0.79 | 86 |
| Phosphodiesterase | 938 | 0.80 | 22 |
| Reader | 924 | 0.83 | 53 |
| Toll-like and Il-1 receptors | 922 | 0.94 | 6 |
| Voltage-gated ion channel | 811 | 0.81 | 48 |
| Hydrolase | 600 | 0.77 | 70 |
| Phosphatase | 575 | 0.74 | 40 |
| Ligand-gated ion channel | 250 | 0.69 | 31 |
Kinase carries the most of this work and reads lowest, and that is the question being hard rather than the model falling short. Kinases resemble one another more than members of most families do, so telling two of them apart for one compound is the harder question, and it is asked here on more held-out comparisons and more proteins than any other family.
For two kinases there is a deeper instrument. The Kinase Foundation Model answers this same question within the kinome, built on data assembled for kinases alone rather than on one public release, so it sees far more of the family than a roster-wide model can. Its headline is measured on its own holdout, under a different split and a different test-set composition, so the two figures are not a like-for-like comparison and neither should be read as beating the other. Use it when both targets are kinases, and this model when the comparison leaves the family. The same holds for G protein-coupled receptors and the GPCR Foundation Model.
These 13 families carry within-family data but too little held out to score, so they are marked rather than scored: Primary active transporter (170), Writer (143), Other ion channel (112), Family C G protein-coupled receptor (85), Fatty acid binding protein family (62), Family B G protein-coupled receptor (50), Isomerase (39), Aminoacyltransferase (15), Transmembrane 1-electron transfer carriers (8), Calcium channel auxiliary subunit alpha2delta family (3), Taste family G protein-coupled receptor (3), Ligase (1), Frizzled family G protein-coupled receptor (1). The remaining 4 families on the roster carry no within-family comparisons.
| Stage | Count |
|---|---|
| Measurements after scoping to human single-protein targets carrying a family | 1,263,626 |
| Targets in that pool | 2,705 |
| Ligands in that pool | 794,638 |
| Comparisons formed | 423,781 |
| of those, two targets from different families | 89,888 |
| of those, two different targets from one family | 333,893 |
| Comparisons fitted on | 382,354 |
| Comparisons held out | 41,427 |
| of those, across families and within one family | 8,689 and 32,738 |
| Ligands across those comparisons | 150,571 |
| Targets servable | 2,279 |
A comparison is one row of three concatenated blocks, in a fixed order. Nothing is scored on its own and subtracted.
| Block | Dimensions | Contents |
|---|---|---|
| Sequence A | 480 | ESM2 esm2_t12_35M_UR50D, mean pooled over residues, full-length UniProt canonical sequence |
| Ligand | 1,038 | Morgan count fingerprint, radius 2, 1,024 bits, then 14 descriptors: molecular weight, heavy atom count, bond count, rotatable bonds, ring count, and per-element atom counts for C, N, O, S, F, Cl, Br, I and P |
| Sequence B | 480 | as sequence A |
Rows are sequence, ligand, sequence, so 2×480 + 1,038 = 1,998 columns. At prediction time the same symmetry is applied as an average over both argument orders, so comparing A with B and comparing B with A return probabilities summing to exactly 1. The strength printed on every page is the larger of the two, max(p, 1 − p), which is why it runs from 0.5 to 1.0 and is the only number a reader needs.
The serving image pins every version the forest was fitted under. RDKit computes 1,024 of every ligand block's 1,038 dimensions, so a different RDKit produces different features, scores worse, and nothing in the model detects it. The image refuses to build unless the joblib matches its manifest checksum, the 30 shipped reference predictions replay to 1e-6, and the both-orders average still returns exactly 0.5 for a target against itself.
| Package | Pinned |
|---|---|
| numpy | 2.2.6 |
| python | 3.10.15 |
| sklearn | 1.7.2 |
These two models are the broad instrument: two separately fitted models over one roster of 34 protein families, so one preference model ranks compounds at a kinase, a protease or an ion channel without being told which, and one target-preference model ranks two targets for a compound whether they sit in different families or in the same one.
Two sibling sites do the opposite, and deliberately. Each takes one family and goes deep, on data assembled for that family rather than on a single public release.
| Model | Roster | Primary data |
|---|---|---|
| Family Foundation Model this site |
34 families in two models | ChEMBL 37 alone, which is what lets the weights be downloaded freely |
| GPCR Foundation Model | G protein-coupled receptors | ChEMBL plus Eidogen-curated GPCR data |
| Kinase Foundation Model | protein kinases | the Eidogen-Sertanty Kinase Knowledgebase, with ChEMBL used to cross-validate rather than to train |
Both siblings run the same two layouts this site runs, one that ranks compounds at a fixed target and one that ranks targets for a fixed compound, so the shapes of the questions match and the answers read the same way. What differs is the trade. A deep dive has more measurements per target and a roster narrow enough to model on its own terms, so within its family it is the sharper instrument. These models give up that depth and buy reach: one roster, one pair of forests, and a question you can ask across families rather than inside one.
They answer different questions and neither replaces the other. A deep dive is the sharper instrument when every target you care about sits inside its family. These reach wider: one roster, one pair of forests, and a panel that can mix families freely, which is what off-target triage and repurposing usually require.