Cross-Validation for Genomic Models in Python
By Dr. Zubair Khalid, DVM, MS, PhD ·

The most common cause of a genomic model that scores brilliantly in cross-validation and then fails on real data is leakage between training and evaluation samples. In genomic datasets this usually happens when rows from the same individual, the same family, or the same sequencing batch end up on both sides of the split. The first thing to check when your reported AUC looks too good to be true is therefore not the model. It is the structure of your sample identifiers, and whether any preprocessing step ran before the split.
Cross-validation is the standard way to estimate how a model will behave on data it has never seen. You split the samples into k folds, train on k minus one of them, test on the held-out fold, and repeat until every fold has served as the test set. For genomic data this simple idea gets complicated by three properties of the data type: thousands to millions of features measured on relatively few samples, correlation between neighboring variants caused by linkage disequilibrium, and population structure that makes supposedly independent samples genetically similar. Published genomic machine learning studies routinely use cross-validation as their primary evaluation, from SNP-based disease prediction [1] to microbial virulence prediction from whole genome sequencing [2] and cancer primary-site classification from tumor variant data [3]. Getting the splitting logic right is what separates an honest estimate from an inflated one.
This guide covers cross-validation for genomic models in Python from a workflow perspective. It explains why genomic data breaks naive splits, gives runnable scikit-learn and Biopython code, and provides a troubleshooting table for the failure modes you are most likely to meet.
Why Genomic Data Breaks Standard Cross-Validation
Genomic prediction problems share a set of structural properties that make ordinary k-fold cross-validation misleading if applied without thought.
Dimensionality. A genotype matrix may contain millions of single nucleotide polymorphisms (SNPs) measured on hundreds or thousands of individuals. When the number of features exceeds the number of samples by orders of magnitude, models can memorize noise, which produces overfitting and inflated apparent accuracy. Reviews of genomic deep learning applications single out this complexity and high dimensionality as a direct driver of overfitting and computational inefficiency [4].
Linkage disequilibrium. Nearby variants on a chromosome are correlated because they are inherited together. If two correlated variants are correlated because they sit on the same shared haplotype, a model trained on one variant can effectively read the other. Standard feature-selection procedures run on the full dataset before splitting will pick up signals that only exist because the test samples leaked into the selection step.
Population structure and relatedness. Genetic variation is not distributed randomly. Samples from the same population, the same geographic region, or the same pedigree share long stretches of genome. If a naive random split places close relatives or same-population samples in both the training and test folds, the model can succeed by memorizing population-level patterns rather than learning the biology of the phenotype. Population structure-aware tools exist precisely because of this problem. DAPCy, a Python reimplementation of the Discriminant Analysis of Principal Components method built on scikit-learn, uses training-test cross-validation to evaluate genetic clustering on datasets such as MalariaGEN Plasmodium falciparum and the 1000 Genomes Project [5].
Duplicated and batch-processed samples. Public repositories contain duplicate accessions, technical replicates, and samples resequenced across runs. Batch effects from different sequencing centers or library preparations can be stronger predictors than the phenotype itself. A model that learns the batch signature of the positive class will cross-validate well and transfer poorly.
The practical consequence is that the causes of inflated cross-validation genomic data python scores are almost always structural rather than statistical. The fixes are likewise structural: split at the level of the independent unit, keep all supervised steps inside the fold loop, and reserve a truly untouched test set for the final number.
The Python Toolkit for Genomic Cross-Validation
Python for bioinformatics has converged on a small set of libraries that cover almost every cross-validation workflow you will need.
scikit-learn provides the splitting classes (KFold, StratifiedKFold, GroupKFold, StratifiedGroupKFold, LeaveOneGroupOut, RepeatedStratifiedKFold), the Pipeline object that keeps preprocessing inside the folds, and cross_val_score and cross_validate for running the loop. DAPCy demonstrates how far this stack scales, using compressed sparse matrices and truncated singular value decomposition to process genomic datasets with thousands of samples and features faster and with less memory than the original R implementation [5]. Other recent genomic Python packages build directly on scikit-learn interfaces as well, including pyVIPER for protein activity estimation in single-cell data [6].
Biopython handles the file formats genomics actually arrives in. A minimal Biopython tutorial loop for reading sequences looks like this:
from Bio import SeqIO
ids, seqs = [], []
for record in SeqIO.parse("contigs.fasta", "fasta"):
ids.append(record.id)
seqs.append(str(record.seq).upper())
This gives you parallel lists of identifiers and sequences. The identifiers matter as much as the sequences, because the identifier is where you detect duplicates, map samples to populations or families, and define the groups used for leakage-safe splitting.
NumPy, pandas, and scikit-allel store and manipulate genotype matrices. imbalanced-learn supplies resampling and class-weighted estimators for case-control imbalance. LightGBM and XGBoost are the gradient boosting implementations most often behind the strongest models in published genomic comparisons, as seen in IBD diagnosis from gut microbiomes with LightGBM [7] and cancer-of-unknown-primary classification with XGBoost [3].
Install the core stack in one line:
python -m pip install numpy pandas scikit-learn biopython imbalanced-learn lightgbm
Pin exact versions in a requirements.txt or environment file so that a re-run months later reproduces the same folds. Random seeds control fold assignment, and an unseeded split makes your reported metric unreproducible. Automated experimentation frameworks have adopted the same philosophy. Agentomics, an agentic system that builds biomedical machine learning pipelines end to end, enforces strict validation checkpoints at standard development steps so that each stage builds on validated artifacts, and it benchmarked this design across 20 datasets in protein engineering, drug discovery, and regulatory genomics [8].
Choosing the Right Cross-Validation Scheme
Stratified k-fold as the default
For case-control classification, stratified k-fold preserves the class ratio in every fold. Five folds is the most common reported choice in the genomic literature. A schizophrenia prediction study built ethnicity- and sex-specific SNP models from 4,693 participants and selected its models using stratified five-fold cross-validation before final evaluation on independent test sets [1]. The same design appears in variant pathogenicity work: SyMetrics integrated many per-variant features and reached 97% accuracy with a ROC-AUC of 0.89 on synonymous variants, validated through cross-validation plus external functional assays [9].
Group-aware splits when samples are not independent
When samples share families, donors, collection sites, or sequencing batches, the group identifier must drive the split. GroupKFold guarantees that a group appears in exactly one fold. StratifiedGroupKFold combines that guarantee with class balance. For population genetic data, a reasonable approximation of genetic grouping is to cluster samples by principal components of the genotype matrix and treat each cluster as a group, or to split by sampling location when that column exists.
Nested cross-validation when you tune hyperparameters
Any time you select hyperparameters, a single loop of cross-validation reports an optimistic score, because the same folds that tuned the model also graded it. Nested cross-validation runs an inner loop for tuning inside each outer fold. The outer loop score is the honest one. This is the standard answer to how to fix cross-validation genomic data python results that look inflated after model selection.
A held-out test set for the final claim
Cross-validation guides model development. The number you publish should come from samples the cross-validation never touched. In an in silico study of the OncoOrigin tool for predicting primary cancer sites from tumor sequencing data, the authors assessed model quality with training-set cross-validation and then evaluated four estimators on a segregated test set of more than 20,000 samples, where the XGBoost model achieved a top-2 accuracy of 0.91 and a ROC-AUC of 0.97 [3]. A clinical-genomic study of antibiotic resistance in Gram-negative pneumonia used the complementary design, randomly dividing 836 patients into 585 training and 251 validation cases at a 7:3 ratio and building random forest, logistic regression, and XGBoost models in Python 3.9 [10].
Simulation-based validation for methods development
If you are validating a new method rather than applying an existing one, simulated data with known truth lets you measure calibration directly. The simcat framework trains a neural network on coalescent simulations to detect introgression from SNP frequency patterns, and evaluates sensitivity against known simulation parameters before touching empirical oak genomes [11]. Similarly, when a confidence interval matters more than a point prediction, non-parametric bootstrap resampling is the standard companion to or substitute for cross-validation, as used in the POISE method for parent-of-origin effect inference on GWAS data [12].
Worked Example 1: Stratified Five-Fold Cross-Validation on a SNP Matrix
This is the baseline workflow for cross-validation for genomic models when samples can be treated as independent.
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_validate
X = np.load("genotypes.npy") # shape (n_samples, n_variants)
y = np.load("phenotypes.npy") # shape (n_samples,), 0/1 labels
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
pipe = Pipeline([
("scale", StandardScaler()),
("pca", PCA(n_components=50, random_state=42)),
("clf", LogisticRegression(max_iter=5000, class_weight="balanced")),
])
results = cross_validate(
pipe, X, y, cv=cv,
scoring=["roc_auc", "accuracy", "balanced_accuracy"],
return_train_score=True,
)
print("test AUC per fold:", results["test_roc_auc"])
print("mean AUC:", results["test_roc_auc"].mean())
print("train AUC:", results["train_roc_auc"].mean())
Three details in this snippet do most of the work. The Pipeline ensures that scaling and PCA are fitted on the training portion of each fold and applied to the held-out fold, never the reverse. class_weight="balanced" keeps a skewed case-control ratio from turning into a model that predicts only the majority class. Comparing train_roc_auc against test_roc_auc gives you a first overfitting diagnostic: a large gap means the model is memorizing the training folds.
If you need per-fold predictions for downstream analysis rather than a single score, use cross_val_predict with a method such as "predict_proba" and inspect the confusion matrix and calibration of the pooled out-of-fold predictions.
Worked Example 2: Group-Aware Splitting to Prevent Leakage
Suppose your cohort contains multiple samples per patient, or family members, or isolates from the same outbreak cluster. A row-level random split will leak. The fix is to pass a groups array to the splitter.
import numpy as np
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedGroupKFold, cross_validate
meta = pd.read_csv("sample_metadata.csv") # columns: sample_id, family_id, label
X = np.load("features.npy")
y = meta["label"].to_numpy()
groups = meta["family_id"].to_numpy()
sgkf = StratifiedGroupKFold(n_splits=5, shuffle=True, random_state=42)
pipe = Pipeline([
("scale", StandardScaler()),
("clf", RandomForestClassifier(n_estimators=500, random_state=42)),
])
results = cross_validate(pipe, X, y, groups=groups, cv=sgkf,
scoring="roc_auc")
print("leakage-safe AUC:", results["test_score"].mean())
Run this version and the naive random-split version on the same data and compare. A drop in mean AUC after switching to group-aware splitting is not a failure. It is a measurement of how much of your earlier score was leakage. Food safety surveillance work illustrates why this matters at scale: a whole-genome sequencing study of Listeria monocytogenes virulence combined a national collection of 169 isolates covering 38 MLST types with 2,880 public GenomeTrakr isolates spanning 80 MLST types, then compared predictive performance across three genomic feature levels and six machine learning algorithms [2]. With that many isolates sharing clonal backgrounds, an ungrouped split would place closely related strains on both sides of the divide and inflate every reported metric.
Worked Example 3: Nested Cross-Validation with Hyperparameter Tuning
from sklearn.model_selection import GridSearchCV, StratifiedKFold, cross_val_score
inner_cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=1)
outer_cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=2)
param_grid = {
"clf__C": [0.01, 0.1, 1.0, 10.0],
"pca__n_components": [25, 50, 100],
}
grid = GridSearchCV(pipe, param_grid=param_grid, cv=inner_cv,
scoring="roc_auc", n_jobs=-1)
nested_scores = cross_val_score(grid, X, y, cv=outer_cv, scoring="roc_auc")
print("nested CV AUC:", nested_scores.mean(), "+/-", nested_scores.std())
The cross_val_score call treats the entire GridSearchCV object as a single estimator, so for each of the five outer folds the grid search refits from scratch on that fold's training portion. The resulting mean AUC is an unbiased estimate of the performance of the whole procedure, tuning included. It will almost always be lower than a single-loop score with the same model, and that lower number is the correct one.
Worked Example 4: Sequence Features from Biopython into a Cross-Validated Model
For raw sequence data rather than variant matrices, a common approach is k-mer counting. This mini biopython tutorial pattern turns FASTA records into a feature matrix that scikit-learn can split and score.
from Bio import SeqIO
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.pipeline import make_pipeline
ids, seqs = [], []
for record in SeqIO.parse("virulence_candidates.fasta", "fasta"):
ids.append(record.id)
seqs.append(str(record.seq).upper())
vectorizer = CountVectorizer(analyzer="char", ngram_range=(4, 4))
X = vectorizer.fit_transform(seqs) # sparse k-mer counts
y = np.array([labels[i] for i in ids]) # your own label mapping
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
model = make_pipeline(LogisticRegression(max_iter=5000))
scores = cross_val_score(model, X, y, cv=cv, scoring="roc_auc")
print("k-mer model AUC:", scores.mean())
One caveat on vocabulary building: fit_transform here learns the alphabet of observed 4-mers from all sequences. For a fixed alphabet (A, C, G, T and ambiguity codes) this is harmless, but if your featurizer learns anything supervised, such as features selected by association with the label, it must move inside the pipeline so each fold fits it on training data only.
Troubleshooting Table: Symptoms, Causes, and Fixes
This table is the core reference for diagnosing problems in cross-validation genomic data python workflows. Work from the top down, because the earliest rows account for most real-world failures.
| Symptom | Likely cause | How to confirm | Fix |
|---|---|---|---|
| Accuracy or AUC near 1.0 on a hard biological problem | Data leakage, most often duplicate or related samples in both train and test folds | Search for duplicate identifiers and near-identical genotypes, check whether relatives share folds, re-run with group-aware splitting | Split by family, donor, or isolate cluster with GroupKFold or StratifiedGroupKFold, deduplicate before splitting |
| Score drops sharply after switching splitters | The earlier score was inflated by leakage, not the new splitter being wrong | Compare per-fold predictions, inspect which samples co-occurred in train and test previously | Accept the lower number as the honest estimate, document both in the project log |
| Model performs well in CV, poorly on the held-out set | Preprocessing or feature selection ran on the full dataset before splitting | Audit the script for any fit, fit_transform, or association test executed outside the fold loop | Wrap every supervised step in a Pipeline or move it inside the fold loop |
| Test-set score much lower than the cross-validation score after tuning | Hyperparameters were tuned against the test set or the CV folds were reused repeatedly | Count how many configurations touched the evaluation data | Use nested cross-validation for tuning, touch the held-out set once at the end |
| Extreme per-class metrics, such as near-perfect sensitivity with poor specificity | Class imbalance combined with a default 0.5 threshold | Inspect the confusion matrix per fold and the class counts in each training fold | Use class_weight="balanced", stratified splits, and report balanced accuracy, MCC, and AUC rather than raw accuracy |
| Fold scores swing wildly, for example AUCs from 0.55 to 0.90 | Too few samples per fold or a small minority class spread thinly | Plot per-fold scores and per-fold class counts | Use repeated stratified k-fold, reduce the number of folds, or report confidence intervals across repeats |
| Different SNP sets look significant depending on the split | Linkage disequilibrium and full-dataset feature selection | Compare selected feature lists across folds, check overlap between top variants of different folds | Prune correlated variants before analysis or select features within each training fold only |
| Memory errors or hours-long CV runs on large genotype matrices | Dense matrices for millions of variants | Check array shape and memory footprint | Store genotypes in sparse or bit-packed format, use truncated SVD instead of dense PCA, as DAPCy does for large population genomic datasets [5] |
| Preprocessing choices change the conclusion unpredictably | Pipeline steps interacting with the model in unanticipated ways | Re-run CV with each preprocessing step toggled on and off | Benchmark preprocessing variants explicitly, since preprocessing effects can be large, as CIRCE showed when single-cell count matrices outperformed a standard normalization step for interaction prediction [13] |
A Diagnostic Sequence for Suspicious Scores

Follow this order when a cross-validation result looks wrong. Each step takes minutes, not hours.
- Print the shape of X and the class counts. Confirm the number of samples, the number of features, and the case-control ratio.
- Check for duplicate identifiers and duplicated rows using
pandasduplicated()on metadata and hashing on genotype rows. - Re-run the model with labels randomly shuffled. A leakage-free pipeline should score near chance, around 0.5 AUC for binary problems. A model that still scores 0.9 on shuffled labels has a leak.
- Compare train and test scores per fold. A large gap confirms overfitting, and shrinking the model or adding regularization is the appropriate response.
- Switch from a random split to a group-aware split using family, donor, site, or batch identifiers. Record the score change.
- Confirm that every supervised transform sits inside a
Pipeline. Any scaler, imputer, feature selector, or oversampler fitted outside the folds leaks information. - Run nested cross-validation if any hyperparameter or model family was selected. Report the nested score, not the inner-loop best score.
- Evaluate the final configured model once on a held-out set that played no role in any prior decision.
The permutation check in step 3 deserves emphasis because it is the cheapest decisive test in the whole sequence. It directly answers whether the pipeline can distinguish real signal from structure, and it catches leakage modes that inspection misses.
Common Mistakes and Limitations
Feature selection outside the loop. Selecting SNPs or genes by association with the phenotype on the full dataset, then cross-validating a model on the selected features, is the single most frequent error in published and reviewed genomic machine learning code. The selection step has already seen the test folds. Several published genomic studies make their procedure explicit to avoid this, for example the schizophrenia SNP study, which performed feature selection and association analysis to rank SNPs and then evaluated models with stratified five-fold cross-validation, reporting per-group results such as an EA-F model with 75.1% accuracy, 95.4% sensitivity, and 34.2% specificity on independent test sets [1]. Note what that specificity value shows: cross-validated model selection does not guarantee balanced performance, and reporting sensitivity alone would have hidden the weakness.
Trust single high accuracy numbers. A 97% accuracy figure for a variant classifier, as reported for SyMetrics [9], or a 93.35% accuracy for a random forest miRNA precursor detector chosen by 10-fold cross-validation over 112 features [14], describes performance on the data distribution those studies tested. Transfer to your cohort depends on population, platform, and label quality. Re-run cross-validation on your own data before adopting any published feature set or threshold.
Ignoring the level of genomic features. Choice of feature representation, whether gene presence or absence, virulence genes, or SNPs, changes both the model and the appropriate null expectations. The Listeria study compared three genomic levels against six algorithms precisely because no single representation dominates [2].
Interpreting cross-validated latent representations as validated biology. Dimensionality reduction models such as the RVAgene recurrent variational autoencoder for gene expression time series showed through cross-validation that a low-error latent space can be learned from only a fraction of the data [15]. That supports the representation, not every biological claim made from clusters within it.
Conflating feature importance with causation. Random forest and gradient boosting models dominate genomic ML applications, from PTM cross-talk prediction achieving an AUC of 0.81 in 10-fold cross-validation [16] to tissue inference with SHAP-based explanations in MLMarker [17]. Importance scores describe association within the training distribution. They do not establish mechanism.
Scalability mistakes. Dense arrays for millions of variants exhaust memory during k-fold loops. Use bit-packed or sparse storage, incremental loaders, and truncated SVD. DAPCy's benchmark against the original R implementation on MalariaGEN and 1000 Genomes data showed that these choices reduce both runtime and memory substantially [5]. For very large cohort studies, such as an aminoglycoside resistance analysis of more than 110,000 Staphylococcus aureus genomes with elastic-net and related models [18], the splitting plan and the storage format need to be designed together.
Treating cross-validation as external validation. Cross-validation estimates generalization within your dataset. Calibration curves, decision curves, and fully external cohorts answer different questions, which is why the pneumonia resistance study evaluated its models with calibration and decision curve analysis in addition to accuracy, precision, recall, F1, and AUC [10].
Prevention Practices
Adopt these habits before the first line of modeling code, and most of the failure modes above never occur.
- Define the independent unit at project start. Decide what constitutes one independent observation, usually the individual donor or the unique isolate, and derive all splits from its identifier.
- Freeze a held-out test set first, then cross-validate on the remainder. Touch the held-out set once, at the end.
- Put every fitted step inside a
Pipeline, including imputation, scaling, feature selection, and resampling. - Seed every random number generator and log the splitter, its parameters, and the seed with each reported result.
- Run a permuted-label control with every experiment. It costs one extra fit and catches most leakage.
- Report the distribution of fold scores, not only the mean. Mean, standard deviation, and the worst fold together describe the result honestly.
- Record dataset versions, including the retrieval date for public repositories, so folds can be reconstructed.
- Version the environment with a lockfile, mirroring the reproducible, preconfigured-environment approach used in Python-driven life science teaching infrastructure that serves hundreds of users with consistent execution [19].
Automated pipelines can help enforce these rules once they exist. Agentomics demonstrated that strict validation checkpoints between ML development steps allow gradual, reliable accumulation of working components across diverse biomedical datasets [8]. The same checkpoint mentality, applied manually, is what keeps a hand-written genomic cross-validation workflow trustworthy.
A short note on data handling. Human genomic data is identifying even when stripped of names, and many datasets are governed by consent agreements that restrict reuse. Keep genotype files and metadata on access-controlled storage, follow the data use terms attached to each repository, and de-identify sample labels in any code, notebooks, or figures you share.
Frequently Asked Questions
How many folds should I use for genomic data?
Five folds is the most common choice and the default in many published genomic studies. Use fewer folds, such as three, when samples are scarce and fitting is expensive, and use repeated stratified five-fold when fold-to-fold variance is high. Leave-one-out is rarely worth its cost on large genomic matrices.
Why does my genomic model score near-perfectly in cross-validation but fail on new data?
Near-perfect cross-validation scores on genomic data almost always indicate leakage, usually duplicate or related samples appearing in both training and test folds, or preprocessing fitted on the full dataset before splitting. Check for duplicated identifiers, re-run with shuffled labels, and switch to a group-aware splitter to quantify the inflation.
Should feature selection happen inside or outside cross-validation?
Inside. Any selection step that uses the label, such as association testing or recursive elimination, must be fitted within each training fold. Selecting features on the full dataset before splitting leaks the test labels into the model and inflates every reported score.
What is nested cross-validation and when do I need it?
Nested cross-validation wraps an inner hyperparameter-tuning loop inside each outer evaluation fold. You need it whenever you select hyperparameters, model families, or feature counts, because a single loop grades the model on the same folds used to tune it and reports an optimistic score.
How do I handle class imbalance in case-control genomic datasets?
Use stratified folds to preserve class ratios, set class_weight="balanced" or use imbalance-aware resampling inside the pipeline, and evaluate with balanced accuracy, MCC, and ROC-AUC rather than raw accuracy. Inspect the full confusion matrix, because a model can show high sensitivity while specificity collapses.
Do I need to split by population or family?
Yes, when close relatives or same-population samples exist in the cohort. Group-aware splitting by family, donor, or sampling site prevents the model from exploiting shared genetic background. If no grouping column exists, cluster samples on genotype principal components and treat clusters as groups.
Which Python libraries do I need for cross-validation on genomic data?
scikit-learn for splitters, pipelines, and scoring, Biopython for FASTA and sequence formats, NumPy and pandas for matrices and metadata, scikit-allel or a bit-packed store for large genotype arrays, and LightGBM or XGBoost for competitive tree-based models. imbalanced-learn covers resampling for skewed classes.
When should I use cross-validation instead of a single train-test split?
Use cross-validation when the dataset is too small for a single split to give a stable estimate, which describes most genomic studies, or when you need scores for every sample. Use a single held-out split, ideally after cross-validation, when you need a final untouched number, or when training cost makes repeated fitting impractical.
Sources
- SNP-based prediction of schizophrenia using machine learning.
- Predicting Listeria monocytogenes virulence potential using whole genome sequencing and machine learning.
- In Silico Validation of OncoOrigin: An Integrative AI Tool for Primary Cancer Site Prediction with Graphical User Interface to Facilitate Clinical Application.
- Integrating Genomic Data and Imaging in Lung Cancer Prediction Using a Hybrid Deep Learning Approach.
- DAPCy: a Python package for the discriminant analysis of principal components method for population genetic analyses.
- pyVIPER: a fast and scalable Python package for protein activity estimation and master regulator analysis of single-cell RNA sequencing data.
- LightCUD: a program for diagnosing IBD based on human gut microbiome data.
- Agentomics: an agentic system that autonomously develops novel state-of-the-art solutions for biomedical machine learning tasks.
- SyMetrics: an integrated machine learning model for evaluating the pathogenicity of synonymous variants in the human genome.
- Machine learning prediction of antibiotic resistance in Gram-negative pneumonia: a clinical-genomic integrated model.
- Detecting introgression from phylogenetic invariant site patterns using machine learning.
- POISE: Spectral Inference of Parent-of-Origin Effects in Unlabeled Genomic Data.
- CIRCE: a scalable Python package to predict cis-regulatory DNA interactions from single-cell chromatin accessibility data.
- miRDetect: A combinatorial approach for automated detection of novel miRNA precursors from plant EST data using homology and Random Forest classification.
- RVAgene: generative modeling of gene expression time series data.
- Systematic characterization and prediction of post-translational modification cross-talk between proteins.
- MLMarker: a machine learning framework for tissue inference and biomarker discovery.
- Comprehensive in silico genomics analysis of global trends and host-specific emergence of aminoglycoside resistance in Staphylococcus aureus: a One-Health perspective.
- Python-Based Interactive Notebooks for Teaching AI and Data Science to Undergraduate Students in the Life Sciences.