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
PeakDetector
: Identifie les raies d'absorption.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
puismatch_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é, et0
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
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.
# ... 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}")
- 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.
- 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.