Guide : Entraînement du Modèle
Une fois le jeu de features extrait, la classe SpectralClassifier orchestre l'entraînement, l'optimisation et l'évaluation du modèle de classification. Elle encapsule un pipeline scikit-learn / imblearn complet, supporte une douzaine de modèles, et logue automatiquement les résultats dans Weights & Biases.
Toute la logique d'entraînement est dans src/pipeline/classifier.py. Le notebook d'orchestration est 00_master_pipeline.ipynb.
Démarrage rapide
from src.pipeline.classifier import SpectralClassifier
# Entraînement XGBoost en mode spectroscopique pur
clf = SpectralClassifier(model_type="XGBoost", prediction_target="main_class")
clf, feature_cols, X, y = clf.train_and_evaluate(
features_df,
spectro_only=True, # exclut ra, dec, redshift, Gaia — mode publication
)
# Sauvegarder les artefacts
clf.save_model("data/models/spectral_classifier_xgboost.pkl")
Résultat de référence atteint en mode spectro_only=True :
1. Modèles disponibles
SpectralClassifier supporte 11 classificateurs via le paramètre model_type. Changer de modèle est trivial — le pipeline, le tuning et le logging W&B s'adaptent automatiquement.
"XGBoost""LightGBM""CatBoost""ExtraTrees""RandomForest""Ensemble""SVM""MLP""LogisticRegression""KNN""LDA"SpectralClassifier(model_type="LightGBM") — le pipeline, le tuning et le logging W&B s'adaptent automatiquement.2. Le processus d'entraînement
Préparation des données
SpectralClassifier prépare automatiquement les données avant l'entraînement :
- Nettoyage : Spectres sans
subclassvalide et classes avec < 10 échantillons sont exclus. - Sélection des features : En mode
spectro_only=True, toutes les colonnes non spectrales sont filtrées. - Séparation train/test : 80/20 stratifiée sur les classes.
Pipeline et suivi W&B
.pkl inclut le scaler et l'imputer — aucune préparation supplémentaire des données n'est nécessaire pour prédire.Tuning d'hyperparamètres
Option A — GridSearchCV (défaut) :
# Validation croisée stratifiée k=5 · métrique : balanced_accuracy
clf.train_and_evaluate(features_df, spectro_only=True)
Option B — Optuna (optimisation Bayésienne) :
L'infrastructure Optuna est déployée pour l'exploration à grande échelle. Particulièrement utile pour explorer n_estimators, max_depth, learning_rate, colsample, subsample, reg_alpha/lambda sur les ~139k spectres disponibles.
clf.train_and_evaluate(
features_df,
spectro_only=True,
tuner="optuna",
n_trials=200,
)
3. Mode spectro_only=True
Activer ce mode pour tous les résultats scientifiques rigoureux. Il garantit que le modèle apprend à classifier les étoiles à partir de leur physique intrinsèque uniquement, sans aucun biais observationnel.
clf.train_and_evaluate(features_df, spectro_only=True)
Features exclues automatiquement :
- Coordonnées angulaires :
ra,dec - Conditions d'observation :
redshift,seeing,snr_*,jd,fiber_id,magnitude_* - Colonnes Gaia :
parallax,bp_rp,teff_gspphot,logg_gspphot,M_G,v_tan_kms, etc.
La progression de 84 % → 87 % en supprimant ces features s'explique par l'élimination du bruit de fuite de données : ra/dec/redshift apportaient un signal corrélé avec les types spectraux via les biais observationnels de LAMOST (programmes d'observation ciblés par type), pas via la physique stellaire réelle.
4. Sauvegarde et artefacts
À la fin de chaque run, le pipeline génère automatiquement les fichiers suivants :
data/models/reports/<ISO>/Charger et prédire
clf_loaded = SpectralClassifier.load_model(
"data/models/spectral_classifier_xgboost_20260213T225019Z.pkl"
)
# Le pipeline chargé inclut le scaler et l'imputer
# Aucune préparation supplémentaire des données n'est nécessaire
predictions = clf_loaded.model_pipeline.predict(X_new)
probabilities = clf_loaded.model_pipeline.predict_proba(X_new)
5. Évaluation complète
Après l'entraînement, clf.evaluate() génère automatiquement :
clf.evaluate(X_test, y_test, plot=True)
| Sortie | Description |
|---|---|
| Rapport de classification | Precision / Recall / F1 par classe (A, F, G, K, M) |
| Matrice de confusion | Normalisée — visible la confusion F/G attendue |
| Courbes ROC et PR | One-vs-rest par classe |
| Score ECE | Expected Calibration Error — qualité des probabilités |
| Importance features | Gain XGBoost ou permutation importance |
6. Réproductibilité
Chaque run produit un identifiant ISO timestamp unique. Pour reproduire un run exact :
# Retrouver le fichier source d'entraînement
import json
with open("data/reports/20260213T225019Z/spectral_classifier_xgboost_20260213T225019Z_meta.json") as f:
meta = json.load(f)
print(meta["trained_on_file"]) # → features_20251217T160120Z.csv
print(meta["best_params_"]) # → hyperparamètres finaux
print(meta["n_features_used"]) # → 183
print(meta["balanced_accuracy"]) # → 0.87