This project compares single-omics and multi-omics machine learning models for breast cancer subtype classification using TCGA-BRCA data from Kaggle.
The main question is simple:
Does integrating multiple omics layers improve subtype classification compared with using each omics block alone?
Late-fusion multi-omics modeling performed best on the holdout test set.
| Method | Feature set | Model | Accuracy | Macro F1 | Weighted F1 |
|---|---|---|---|---|---|
| Multi-omics | Late fusion | Averaged probabilities | 0.892 | 0.815 | 0.885 |
| Single-omics | Protein | XGBoost | 0.863 | 0.800 | 0.853 |
| Multi-omics | Early fusion | Logistic regression | 0.804 | 0.677 | 0.806 |
| Single-omics | Copy number | Random forest | 0.784 | 0.581 | 0.774 |
| Single-omics | RNA expression | Logistic regression | 0.765 | 0.559 | 0.762 |
| Single-omics | Mutation | Random forest | 0.667 | 0.341 | 0.632 |
The best multi-omics model improved macro F1 by +0.015 over the best single-omics model.
Dataset: BRCA Multi-Omics TCGA on Kaggle
The dataset contains 705 breast tumor samples and four omics blocks:
| Omics block | Prefix | Features |
|---|---|---|
| Copy number | cn_ |
860 |
| Mutation | mu_ |
249 |
| RNA expression | rs_ |
604 |
| Protein / phosphoprotein | pp_ |
223 |
The Kaggle files used here do not include a PAM50 subtype label. The supervised target in this project is a derived clinical_subtype based on ER, PR, and HER2 receptor status. Ambiguous or missing receptor-status rows are excluded from supervised modeling.
Modeling cohort after filtering:
| Class | Samples |
|---|---|
| HR+/HER2- | 335 |
| Triple-negative | 90 |
| HR+/HER2+ | 57 |
| HER2-enriched-like | 25 |
The workflow uses a fixed random seed and a stratified train/validation/test split:
| Split | Samples |
|---|---|
| Train | 303 |
| Validation | 102 |
| Test | 102 |
Preprocessing:
- Copy number, RNA expression, and protein features: median imputation and standard scaling
- Mutation features: most-frequent imputation and preserved as binary 0/1
- Feature selection:
SelectKBestwith ANOVA F-statistics inside model pipelines - Main model-selection metric: macro F1
Single-omics baselines:
- Logistic regression
- Random forest
- Linear SVM
- XGBoost when available
Multi-omics models:
- Early fusion: concatenate all omics features before modeling
- Late fusion: train one model per omics block and average predicted class probabilities
The best model is a late-fusion ensemble, so the main explanation uses grouped permutation importance by omics block. The score is the mean macro-F1 drop after shuffling one omics block on the holdout test set.
| Omics block | Mean macro-F1 drop |
|---|---|
| Protein | 0.300 |
| RNA expression | 0.265 |
| Copy number | 0.125 |
| Mutation | 0.061 |
Top feature-level signals included mu_TP53, mu_PIK3CA, mu_GATA3, pp_ER.alpha, pp_HER2, and pp_HER2.pY1248.
tcga-brca-multiomics-classification/
├── app/
├── data/
│ ├── raw/
│ ├── processed/
│ └── external/
├── models/
│ ├── checkpoints/
│ └── metrics/
├── notebooks/
├── reports/
│ ├── figures/
│ └── tables/
├── src/
│ ├── data/
│ ├── features/
│ ├── models/
│ └── visualization/
├── README.md
├── requirements.txt
└── .gitignore
Create and activate a virtual environment:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -r requirements.txtDownload the Kaggle files:
python -m src.data.download_dataRun the pipeline:
python -m src.visualization.run_eda
python -m src.features.run_preprocessing
python -m src.models.train_baselines
python -m src.models.train_fusion
python -m src.models.explain
python -m src.visualization.final_figuresOpen the notebooks:
python -m jupyter labFinal figures:
reports/figures/final_summary_panel.pngreports/figures/final_model_comparison_macro_f1.pngreports/figures/final_best_model_confusion_matrix.pngreports/figures/final_omics_importance.pngreports/figures/final_subtype_distribution.png
Final tables:
reports/tables/final_model_comparison.csvreports/tables/final_key_results.csv
Model artifacts:
models/checkpoints/single_omics_*.joblibmodels/checkpoints/multiomics_*.joblib
- The Kaggle dataset used here does not include PAM50 subtype labels, so this project predicts a receptor-status clinical subtype proxy.
- The HER2-enriched-like class is small, with 25 total samples before splitting.
- Results are based on one stratified holdout split. A larger study should use repeated cross-validation and external validation.
- Feature importance values are useful for model inspection, but they should not be interpreted as causal biological effects.
- Add an external PAM50 label source if sample identifiers can be matched safely.
- Add repeated cross-validation for more stable model comparison.
- Add a Streamlit demo for interactive prediction and model inspection.
- Compare late fusion with calibrated weighted fusion.

