Supervised Evo 2 classifier for SNV pathogenicity
Classifier of ClinVar pathogenic/likely pathogenic (P/LP) versus benign/likely benign (B/LB) coding SNVs in 24 cardiomyopathy genes, from Evo 2 40B embeddings. It is the supervised SNV classifier of Evo 2 Predicts Cardiomyopathy-Associated Variants and Elucidates Their Underlying Mechanisms (Kurozumi, Otsuka et al.; bioRxiv doi:10.64898/2026.05.15.725304), Supplementary Methods and Figure S2A.
Input
For each SNV, a 128-bp window with the variant at the 65th position (GRCh38) is embedded with Evo 2 40B
(arcinstitute/evo2_40b, layer blocks.20.mlp.l3) for four sequences: reference, its reverse complement,
alternate, its reverse complement. Each embedding is averaged over the 128 positions (8,192 values) and the four are
concatenated (32,768 values), then standardised with scaler_mean / scaler_scale stored in the checkpoint.
Model and training
- Input (32,768) β Linear (512) β ReLU β BatchNorm β Dropout (0.3) β Linear (128) β ReLU β BatchNorm β Dropout (0.3) β Linear (32) β ReLU β BatchNorm β Dropout (0.3) β Linear (1); the output is a logit (sigmoid gives the probability).
- Data: all 22,840 coding SNVs (3,535 P/LP, 19,305 B/LB), split at the SNV level into training 14,617, validation 3,655 and test 4,568 by two stratified random splits (scikit-learn, random_state 42).
- Adam (learning rate 3 Γ 10β»β΄, batch 128), binary cross-entropy, up to 500 epochs; early stopping (patience 100) on the validation AUROC; learning-rate decay (Γ0.5, patience 20, minimum 10β»βΆ) on the validation loss; gradient clipping 1.0; seed 42. The weights of the epoch with the highest validation AUROC (epoch 29) are given here.
Test performance (n = 4,568)
| AUROC | AUPRC |
|---|---|
| 0.996 | 0.982 |
test_predictions.csv lists every test SNV with its predicted probability.
Usage
import torch, torch.nn as nn
class SNVClassifier(nn.Module):
def __init__(self, d_in=32768, p=0.3):
super().__init__()
self.fc1, self.bn1, self.dropout1 = nn.Linear(d_in, 512), nn.BatchNorm1d(512), nn.Dropout(p)
self.fc2, self.bn2, self.dropout2 = nn.Linear(512, 128), nn.BatchNorm1d(128), nn.Dropout(p)
self.fc3, self.bn3, self.dropout3 = nn.Linear(128, 32), nn.BatchNorm1d(32), nn.Dropout(p)
self.fc4 = nn.Linear(32, 1)
def forward(self, x):
x = self.dropout1(self.bn1(torch.relu(self.fc1(x))))
x = self.dropout2(self.bn2(torch.relu(self.fc2(x))))
x = self.dropout3(self.bn3(torch.relu(self.fc3(x))))
return self.fc4(x).squeeze(-1)
ck = torch.load("snv_classifier_22840.pth", map_location="cpu", weights_only=True)
model = SNVClassifier(); model.load_state_dict(ck["model_state_dict"]); model.eval()
prob = torch.sigmoid(model((x - ck["scaler_mean"]) / ck["scaler_scale"])) # x: (n, 32,768) as described above
Files
snv_classifier_22840.pth: weights and feature standardisationtest_predictions.csv,metrics.json,history.csv
Also archived on Zenodo with the analysis code: doi:10.5281/zenodo.23824204.
Citation
@article{kurozumi2026evo2,
title={Evo 2 Predicts Cardiomyopathy-Associated Variants and Elucidates Their Underlying Mechanisms},
author={Kurozumi, Atsumasa and Otsuka, Naoto and Ito, Masamichi and Kawakami, Toshinaru and Isagawa, Takayuki and Kodera, Satoshi and Takeda, Norihiko},
journal={bioRxiv}, year={2026}, doi={10.64898/2026.05.15.725304}
}
Model tree for harari/evo2-snv-pathogenicity-classifier
Base model
arcinstitute/evo2_40b