Aller au contenu principal

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.

Point de départ

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 :

BA
87%
Précision équilibrée
balanced accuracy · 5 classes
Sur les types A, F, G, K, M
P
96.3%
Confiance médiane
prédictions dans l'espace UMAP
Probabilité de classe prédite
AUC
~0.964
ROC-AUC macro
discriminabilité globale
Quasi-parfait · 1.000 = parfait

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"
87 % BA
Champion
XGBClassifier
Gradient boosting sur arbres — champion du pipeline AstroSpectro
"LightGBM"
Rapide
LGBMClassifier
Gradient boosting leaf-wise — très rapide sur grands jeux de données
"CatBoost"
Robust
CatBoostClassifier
Gradient boosting ordonné — gestion native des valeurs manquantes et catégorielles
"ExtraTrees"
Rapide
ExtraTreesClassifier
Arbres extrêmement randomisés — très rapide, bonne diversification
"RandomForest"
Baseline
RandomForestClassifier
Forêts aléatoires — référence historique du projet (baseline)
"Ensemble"
Combiné
VotingClassifier
Vote souple XGB + LightGBM + ExtraTrees — meilleure généralisation
"SVM"
Classique
SVC (calibré)
Support Vector Machine calibré — bon sur petits datasets, lent à grande échelle
"MLP"
Neural
MLPClassifier
Réseau dense multicouche — alternative neuronale légère
"LogisticRegression"
Linéaire
LR multiclasse
Régression logistique OvR — baseline linéaire interprétable
"KNN"
Géométrique
KNeighborsClassifier
K plus proches voisins — utile pour l'analyse de structure spectrale
"LDA"
Classique
LinearDiscriminantAnalysis
Analyse discriminante linéaire — référence classique projective
Changer de modèle est trivial : 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 :

  1. Nettoyage : Spectres sans subclass valide et classes avec < 10 échantillons sont exclus.
  2. Sélection des features : En mode spectro_only=True, toutes les colonnes non spectrales sont filtrées.
  3. Séparation train/test : 80/20 stratifiée sur les classes.

Pipeline et suivi W&B

imblearn.Pipeline — ajusté sur X_train uniquement · aucune fuite vers X_test · hover pour détails
SimpleImputer
Stratégie zéro
σ
StandardScaler
z-score sur train uniquement
optionnel
SMOTE
(optionnel)
Classificateur
XGBoost / LightGBM / ...
Le pipeline chargé depuis .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

Obligatoire pour les publications

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 :

Structure des artefacts
📂data/
📁models/
└─📄spectral_classifier_xgboost_<ISO>.pkl
Principal
~12 MB
📁reports/<ISO>/
└─📄spectral_classifier_xgboost_<ISO>_meta.json
Méta
└─📄confusion_matrix.png
Figure
Survoler un fichier pour la description
📋
Contenu du fichier _meta.json
model_type
Type de classifieur
prediction_target
Cible de prédiction
best_params_
Hyperparamètres finaux
class_labels
Labels A/F/G/K/M
feature_names_used
Liste complète des features entrée
selected_features_
Features retenues après sélection
trained_on_file
Fichier source (reproductibilité)
python_version
Version Python
sklearn_version
Version scikit-learn
xgboost_version
Version XGBoost

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)
SortieDescription
Rapport de classificationPrecision / Recall / F1 par classe (A, F, G, K, M)
Matrice de confusionNormalisée — visible la confusion F/G attendue
Courbes ROC et PROne-vs-rest par classe
Score ECEExpected Calibration Error — qualité des probabilités
Importance featuresGain 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