Spaces:
Sleeping
Sleeping
# ===================================== | |
# Fichier: optimizers/optuna_optimizer.py | |
# ===================================== | |
from typing import Dict, Any, TYPE_CHECKING | |
from interfaces.hyperparameter_optimizer import HyperparameterOptimizer | |
import optuna | |
if TYPE_CHECKING: | |
from base_trainer import BaseTrainer | |
class OptunaOptimizer(HyperparameterOptimizer): | |
""" | |
Optimiseur d'hyperparamètres basé sur la librairie Optuna. | |
Implémente l'interface HyperparameterOptimizer. | |
""" | |
def optimize(self, trainer: "BaseTrainer", | |
param_grid: Dict[str, Any]) -> Dict[str, Any]: | |
""" | |
Recherche les meilleurs hyperparamètres pour un 'trainer' donné, | |
selon la grille 'param_grid', en utilisant Optuna. | |
:param trainer: Instance d'une classe implémentant BaseTrainer. | |
:param param_grid: Dictionnaire définissant l'espace de recherche | |
pour chaque hyperparamètre. | |
:return: Un dictionnaire contenant les hyperparamètres optimaux trouvés. | |
""" | |
def suggest_param(trial, param, values): | |
return ( | |
trial.suggest_categorical(param, values) if isinstance(values, list) else | |
trial.suggest_float(param, values['low'], values['high'], log=values.get('log', False)) if isinstance(values, dict) and 'low' in values and 'high' in values else | |
trial.suggest_int(param, values['low'], values.get('high', 10)) if isinstance(values, dict) else | |
trial.suggest_float(param, 0.0, 1.0) | |
) | |
def objective(trial): | |
params = {param: suggest_param(trial, param, vals) for param, vals in param_grid.items()} | |
trainer.config.hyperparameters = params | |
trainer.train() | |
results = trainer.evaluate() | |
# Utiliser f1 comme métrique à maximiser (en inversant le signe car Optuna minimise) | |
model_type = trainer.config.model.type.lower() | |
return -results.get(f'{model_type}_f1', 0.0) # Inverser le signe pour maximiser | |
study = optuna.create_study(direction='minimize') # Minimiser -f1 équivaut à maximiser f1 | |
n_trials = trainer.config.hyperparameters.n_trials | |
study.optimize(objective, n_trials=n_trials) | |
return study.best_params | |