Model release: 12 August 2026. Both models on this page come from that release.
Every model behind this site can be downloaded and run on your own machine.
The command line package is
github.com/smuskal/KFM; the
weights are served from here. Nothing on this page is a different model
from the one the website uses, the command line imports the
bundle's own predict.py, so it computes the same number.
LICENSE-MODELS.txt, and downloading is accepting them.
The weights are fetched by an explicit command, not by
pip install and not on every run. They are cached on
your machine and every later run reads them from disk without touching
this site.
One command installs the code and both models, then proves it works by scoring the published worked example: if bosutinib does not come back at 0.85 against ABL1 it fails rather than reporting success. Name a single model to install just that one.
Everything stays inside the KFM folder: the environment in
./env, the weights in ./kfm-models. No global
environment is created or changed, nothing is written to your home
directory, and deleting the folder removes every trace. It uses conda when
it can find it and falls back to Python's own venv when it
cannot.
Always run through ./kfm.sh. It uses the environment the
installer built; a plain python is usually a base conda install
with a different scikit-learn, which cannot load these models.
They land in ./kfm-models, in the directory you run the
download from: in plain sight, not in a hidden cache under your home
directory. A later command run from a subdirectory still finds them.
KFM_HOME moves them, but do not point it inside Dropbox,
iCloud or Drive, or every machine you own will re-sync several gigabytes of
random forest.
Both models are trained on the Kinase Knowledgebase, Q2-2026 release, and on nothing else. ChEMBL is held back and used only to test, so every accuracy quoted for these downloads was measured on measurements the models have never seen. Targets are keyed by sequence, so a mutant is a target in its own right.
| Quantity | Potency | Selectivity |
|---|---|---|
| Measurements from the Knowledgebase | 841,187 | 841,187 |
| Distinct ligands | 302,999 | 99,739 |
| Distinct target sequences | 733 | 728 |
| Comparisons fitted on | 15,256,017 | 4,340,117 |
| Rows after the label-reversal swap | 40,056,452 | 8,680,234 |
| Held-out ChEMBL comparisons scored | 1,836,100 | 3,137,588 |
| Targets covered by that test | 477 | 482 |
A comparison is built from a pair of measurements, which is why the comparison counts run far ahead of the measurement count: one kinase measured against 1,000 compounds yields 499,500 ordered pairs from 1,000 experiments. Full construction and every caveat are in the potency report and the selectivity report.
RAM is the constraint, not disk, not cores, and no GPU is used. These are random forests pickled with joblib, and they expand about sevenfold when loaded, so the file size badly understates what a machine needs. Measured on arm64, Python 3.11, scikit-learn 1.7.2:
| Model | On disk | RAM once loaded | Load time |
|---|---|---|---|
| Potency | 0.76 GB | 5.0 GB | ~8 s |
| Selectivity | 2.84 GB | 22 GB | ~27 s |
kfm where prints each model's requirement next to what your
machine actually has, and says which are too big. More cores make scoring
faster but none are required; a single core works, just slower.
What each model can and cannot do: limitations. Inquiries: Eidogen-Sertanty.