|
| 1 | +# Makefile — Multimodal Pneumonia Detection Pipeline |
| 2 | +# Requires: .venv activated or use PYTHON variable below |
| 3 | +PYTHON ?= python |
| 4 | +SEED := 42 |
| 5 | +export MPLCONFIGDIR := artifacts/.mpl_cache |
| 6 | + |
| 7 | +# ─── Data pipeline ─────────────────────────────────────────────────────────── |
| 8 | +preprocess: |
| 9 | + bash scripts/run_data_pipeline.sh |
| 10 | + |
| 11 | +preprocess_labs: |
| 12 | + bash scripts/run_lab_pipeline.sh |
| 13 | + |
| 14 | +# ─── Pretraining ───────────────────────────────────────────────────────────── |
| 15 | +pretrain: |
| 16 | + $(PYTHON) -m src.training.train_image_multilabel_pretrain |
| 17 | + |
| 18 | +# ─── Image fine-tuning ─────────────────────────────────────────────────────── |
| 19 | +finetune_image: |
| 20 | + $(PYTHON) -m src.training.train_image_pneumonia_finetune --lr-head 5e-5 --lr-backbone 1e-5 |
| 21 | + |
| 22 | +# ─── Multimodal training (canonical run) ───────────────────────────────────── |
| 23 | +finetune_multimodal: |
| 24 | + $(PYTHON) -m src.training.train_multimodal_pneumonia --lr-head 5e-5 --lr-backbone 1e-5 |
| 25 | + |
| 26 | +# ─── Clinical baselines ────────────────────────────────────────────────────── |
| 27 | +train_clinical_lr: |
| 28 | + $(PYTHON) -m src.training.train_clinical_baseline |
| 29 | + |
| 30 | +train_clinical_xgb: |
| 31 | + $(PYTHON) -m src.training.train_clinical_xgb |
| 32 | + |
| 33 | +train_clinical: train_clinical_lr train_clinical_xgb |
| 34 | + |
| 35 | +# ─── Evaluation ────────────────────────────────────────────────────────────── |
| 36 | +bootstrap_delta: |
| 37 | + $(PYTHON) -m src.evaluation.bootstrap_eval \ |
| 38 | + --model-a artifacts/models/multimodal_pneumonia_densenet121_triage_u_ignore_temporal_stronger_lr_v3/test_predictions.csv \ |
| 39 | + --model-b artifacts/models/image_pneumonia_finetune_densenet121_u_ignore_temporal_stronger_lr_v3/test_predictions.csv \ |
| 40 | + --output-json artifacts/evaluation/bootstrap_multimodal_vs_image_stronger_lr_v3.json \ |
| 41 | + --n-bootstrap 2000 --seed $(SEED) |
| 42 | + |
| 43 | +calibration: |
| 44 | + $(PYTHON) -m src.evaluation.calibration_analysis \ |
| 45 | + --output-dir artifacts/evaluation/calibration_stronger_lr_v3 \ |
| 46 | + --n-bins 10 --bootstrap --n-bootstrap 2000 \ |
| 47 | + --model "Image" artifacts/models/image_pneumonia_finetune_densenet121_u_ignore_temporal_stronger_lr_v3/test_predictions.csv \ |
| 48 | + --model "Multimodal" artifacts/models/multimodal_pneumonia_densenet121_triage_u_ignore_temporal_stronger_lr_v3/test_predictions.csv \ |
| 49 | + --model "Clinical Logistic" artifacts/models/clinical_baseline_u_ignore_temporal_strong_v2/test_predictions.csv \ |
| 50 | + --model "Clinical XGBoost" artifacts/models/clinical_xgb_u_ignore_temporal_strong_v2/test_predictions.csv |
| 51 | + $(PYTHON) -m src.evaluation.calibration_analysis \ |
| 52 | + --output-dir artifacts/evaluation/calibration_final \ |
| 53 | + --n-bins 10 --bootstrap --n-bootstrap 2000 \ |
| 54 | + --model "Image" artifacts/models/image_pneumonia_finetune_densenet121_u_ignore_temporal_stronger_lr_v3/test_predictions.csv \ |
| 55 | + --model "Multimodal" artifacts/models/multimodal_pneumonia_densenet121_triage_u_ignore_temporal_stronger_lr_v3/test_predictions.csv |
| 56 | + |
| 57 | +dca: |
| 58 | + $(PYTHON) -m src.evaluation.decision_curve_analysis \ |
| 59 | + --output-dir artifacts/evaluation/dca \ |
| 60 | + --model "Image" artifacts/models/image_pneumonia_finetune_densenet121_u_ignore_temporal_stronger_lr_v3/test_predictions.csv \ |
| 61 | + --model "Multimodal" artifacts/models/multimodal_pneumonia_densenet121_triage_u_ignore_temporal_stronger_lr_v3/test_predictions.csv |
| 62 | + |
| 63 | +feature_ablation: |
| 64 | + $(PYTHON) scripts/collect_feature_ablation_results.py |
| 65 | + |
| 66 | +evaluate: bootstrap_delta calibration dca feature_ablation |
| 67 | + |
| 68 | +# ─── SHAP ──────────────────────────────────────────────────────────────────── |
| 69 | +shap: |
| 70 | + $(PYTHON) scripts/generate_shap_clinical.py \ |
| 71 | + --model-dir artifacts/models/clinical_xgb_u_ignore_temporal_strong_v2 \ |
| 72 | + --feature-groups all |
| 73 | + |
| 74 | +# ─── Publication report ─────────────────────────────────────────────────────── |
| 75 | +report: |
| 76 | + $(PYTHON) scripts/generate_publication_report.py |
| 77 | + |
| 78 | +# ─── Testing ───────────────────────────────────────────────────────────────── |
| 79 | +test: |
| 80 | + $(PYTHON) -m pytest tests/ -v --tb=short |
| 81 | + |
| 82 | +# ─── Full pipeline ──────────────────────────────────────────────────────────── |
| 83 | +all: pretrain finetune_image finetune_multimodal train_clinical evaluate shap report |
| 84 | + |
| 85 | +.PHONY: preprocess preprocess_labs pretrain finetune_image finetune_multimodal \ |
| 86 | + train_clinical_lr train_clinical_xgb train_clinical bootstrap_delta \ |
| 87 | + calibration dca feature_ablation evaluate shap report all test |
0 commit comments