--- license: mit tags: - genomics - dna - variant-effect-prediction - cardiomyopathy - evo2 base_model: arcinstitute/evo2_40b --- # 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 ```python 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 standardisation - `test_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} } ```