--- license: mit language: - en tags: - genomics - dna - virus - bioinformatics - metagenomics - sequence-classification - giant-virus - mistral pipeline_tag: text-classification --- # GenomeOcean Main Classifier A GenomeOcean 100M v1.2 fine-tuned sequence classifier that splits genomic FASTA contigs into three broad biological categories: | Label | Meaning | |---|---| | `Cellular` | Sequences derived from cellular organisms (eukaryotic, bacterial, archaeal, mitochondrial, plastid) | | `NCLDV/Mirus` | Candidate Nucleocytoviricota (giant virus) or Mirus sequences | | `Other Viruses` | Phages and other viral sequences outside NCLDV/Mirus | This model is the **first stage** of a two-stage hierarchical Giant Virus classifier. Contigs predicted as `NCLDV/Mirus` here are meant to be passed to the companion [hyejong/genomeocean-sub-classifier](https://huggingface.co/hyejong/genomeocean-sub-classifier) model, which further splits them into `NCLDV` and `Mirus`. Full pipeline code, preprocessing details, and CLI tooling are available at [Genomeocean_Giant_Virus_Classifier](https://github.com/hyej0ng/Genomeocean_Giant_Virus_Classifier) on GitHub. ## Model architecture - Base: GenomeOcean 100M v1.2, a Mistral-architecture genomic language model, fine-tuned for sequence classification (`MistralForSequenceClassification`). - Hidden size 768, 12 layers, 8 attention heads, vocab size 4,096, max position embeddings 32,768. - Custom modeling code (`modeling_mistral.py`, `configuration_mistral.py`) is included in each fold folder, so loading requires `trust_remote_code=True`. ## 5-fold ensemble This repository hosts **five independently fine-tuned folds** (`fold1` – `fold5`), each in its own subfolder with a full set of model, tokenizer, and config files. The recommended way to use this model is to run all five folds on the same input and average (soft-vote) the softmax probabilities — this is what the reference pipeline below does automatically. A single fold can also be used on its own, at the cost of losing the variance/agreement signal the ensemble provides. ## Input format Inputs are 5,000 bp genomic chunks derived from FASTA contigs, preprocessed as follows before tokenization: 1. Convert the sequence to uppercase. 2. Remove characters other than `A`/`C`/`G`/`T`/`N`. 3. Remove `N`. 4. Split the cleaned sequence into 5,000 bp windows with a 5,000 bp stride (non-overlapping). 5. Contigs shorter than 5,000 bp, and the incomplete tail of longer contigs, are not used for prediction. Tokenization uses the fold's own tokenizer with `max_length=1250`. ## Usage ### Recommended: reference CLI package The GitHub repository ships an installable CLI (`genomeocean-main`) that handles FASTA parsing, chunking, batching, 5-fold ensembling, and result aggregation for you: ```bash git clone https://github.com/hyej0ng/Genomeocean_Giant_Virus_Classifier.git cd Genomeocean_Giant_Virus_Classifier python -m pip install -r requirements.txt python -m pip install ./genomeocean-main-classifier genomeocean-main predict \ --input /path/to/input.fasta \ --output-dir /path/to/results \ --model-id hyejong/genomeocean-main-classifier \ --subfolder fold1 --subfolder fold2 --subfolder fold3 \ --subfolder fold4 --subfolder fold5 \ --device cuda ``` See the [Main Classifier README](https://github.com/hyej0ng/Genomeocean_Giant_Virus_Classifier/blob/main/genomeocean-main-classifier/README.md) for the full CLI reference, or the [Integrated Pipeline README](https://github.com/hyej0ng/Genomeocean_Giant_Virus_Classifier/blob/main/genomeocean-classifier-pipeline/README.md) to run Main and Sub together and get final `Cellular` / `NCLDV` / `Mirus` / `Other Viruses` labels in one command. ### Direct `transformers` usage (single fold) ```python import torch from transformers import AutoModelForSequenceClassification, AutoTokenizer model_id = "hyejong/genomeocean-main-classifier" fold = "fold1" tokenizer = AutoTokenizer.from_pretrained(model_id, subfolder=fold, trust_remote_code=True) model = AutoModelForSequenceClassification.from_pretrained( model_id, subfolder=fold, trust_remote_code=True ) model.eval() id2label = {0: "Cellular", 1: "NCLDV/Mirus", 2: "Other Viruses"} sequence = "ACGT..." # a single, already-preprocessed 5,000 bp chunk inputs = tokenizer(sequence, return_tensors="pt", truncation=True, max_length=1250) with torch.inference_mode(): probs = torch.softmax(model(**inputs).logits, dim=-1)[0] predicted = id2label[int(probs.argmax())] print(predicted, probs.tolist()) ``` To reproduce the full 5-fold ensemble manually, repeat the above for `fold1` – `fold5` and average the resulting probability vectors before taking the `argmax`. ## Training data Trained on metagenome-derived genomic contigs/fragments: | Label | Scope | |---|---| | `Cellular` | Eukaryotic, bacterial, archaeal, mitochondrial, and plastid sequences | | `NCLDV/Mirus` | Full NCLDV and full Mirus sequences | | `Other Viruses` | Phages and other viruses | ## Limitations - Confidence scores are hierarchical/comparative, not calibrated probabilities of biological truth. - Sequence length, assembly quality, and distance from the training distribution can affect predictions; ensemble agreement across folds (`ensemble_agreement`, `confidence_std` in the reference pipeline output) should be checked for low-confidence or borderline calls. - For final NCLDV vs. Mirus resolution, pair this model with [hyejong/genomeocean-sub-classifier](https://huggingface.co/hyejong/genomeocean-sub-classifier). ## License MIT