Aller au contenu principal

peak_detector.py & feature_engineering.py

Cette étape est le cœur de l'approche "physique" du pipeline. Elle est gérée par deux modules qui travaillent en tandem : peak_detector.py et feature_engineering.py. Leur rôle combiné est de transformer un spectre normalisé en un vecteur de features numériques.

Workflow du Traitement

  1. PeakDetector : Identifie les raies d'absorption.
  2. FeatureEngineer : Convertit ces détections en un vecteur numérique.

Classe PeakDetector

Cette classe recherche les minima locaux significatifs dans un spectre et les associe à des raies spectrales connues.

Détails des attributs et de la configuration

Le PeakDetector est initialisé avec des paramètres par défaut qui contrôlent sa sensibilité :

  • prominence (défaut: 1.4) : C'est le paramètre le plus important, hérité de scipy.signal.find_peaks. Il définit l'amplitude minimale qu'un pic doit avoir par rapport à son entourage pour être considéré comme significatif. Une faible valeur détectera plus de pics (potentiellement du bruit), une valeur élevée ne gardera que les raies les plus profondes.
  • window (défaut: 30 Å) : Définit la fenêtre de tolérance autour d'une raie théorique pour le matching.
  • target_lines : Un dictionnaire des raies que nous cherchons (Hα, Hβ, CaII K, CaII H), choisies pour leur fort pouvoir discriminant dans la classification stellaire.

Méthodes Principales

detect_peaks(wavelength, flux)

  • Rôle : Détecte tous les minima locaux (pics d'absorption) dans le spectre.
  • Logique : Utilise scipy.signal.find_peaks sur le flux inversé (-flux).
  • Retourne : Les indices des pics détectés.

match_known_lines(peak_wavelengths)

  • Rôle : Compare les longueurs d'onde des pics détectés à un dictionnaire de raies cibles (Hα, Hβ, etc.).
  • Retourne : Un dictionnaire associant chaque nom de raie cible à la longueur d'onde du pic le plus proche trouvé (ou None si aucun pic n'est trouvé dans la fenêtre de tolérance).

analyze_spectrum(wavelength, flux)

  • Rôle : Orchestre le processus complet en appelant detect_peaks puis match_known_lines.
  • C'est la méthode principale à utiliser.

Classe FeatureEngineer

Cette classe prend le résultat du PeakDetector et le transforme en un vecteur de features simple.

Méthodes Principales

extract_features(matched_lines)

  • Rôle : Convertit le dictionnaire de raies détectées en un vecteur numérique.
  • Logique (v0.1.0) : Pour chaque raie cible, la feature est 1 si un pic a été trouvé, et 0 sinon.
  • Retourne : Une liste de features (ex: [1, 0, 1, 1]).

Exemples & Bonnes Pratiques

Ce snippet montre comment les deux classes travaillent ensemble.

Traitement d'un seul spectre

Python title=
from src.pipeline.peak_detector import PeakDetector
from src.pipeline.feature_engineering import FeatureEngineer

# Initialisation
peak_detector = PeakDetector()
feature_engineer = FeatureEngineer()

# ... supposons que wavelength et flux_normalized sont disponibles ...

# Détection et matching des raies
matched_lines = peak_detector.analyze_spectrum(wavelength, flux_normalized)

# Vectorisation
features_vector = feature_engineer.extract_features(matched_lines)
# Résultat possible : [6565.2, 0.0, 3932.8, 3969.1]

Traitement par Lot (Batch)

Pour le Machine Learning, il est plus efficace de traiter les spectres en lot.

Traitement par lot optimisé
# ... peak_detector et feature_engineer initialisés ...
# ... all_spectra est une liste de tuples (wavelength, flux) ...

matched_lines_list = [peak_detector.analyze_spectrum(wl, flux) for wl, flux in all_spectra]

# Utilise la méthode optimisée pour traiter toute la liste d'un coup
X = feature_engineer.batch_features(matched_lines_list)

# X est maintenant une matrice NumPy de shape (N_spectres, N_features)
print(f"Matrice de features créée, shape : {X.shape}")
💡Bonnes Pratiques
  • Normalisation d'abord : Toujours appliquer le prétraitement et la normalisation avant de détecter les pics.
  • Ajuster la prominence : Pour des spectres très bruités (faible SNR), envisagez de l'augmenter pour éviter de détecter le bruit comme des raies.
☢️Cas Limites & Erreurs
  • Si aucune raie n'est trouvée pour un spectre, le vecteur de features contiendra uniquement des zéros.
  • Si un spectre est fortement décalé en longueur d'onde (redshift élevé non corrigé), le matching pourrait échouer.

Prochaine Étape du Pipeline

Une fois le vecteur de features obtenu, il est prêt à être utilisé pour entraîner un modèle.