Spaces:
Sleeping
Sleeping
File size: 2,326 Bytes
bf5fb5f 8ffb539 bf5fb5f 8ffb539 bf5fb5f 8ffb539 bf5fb5f 8ffb539 bf5fb5f 513cd3c bf5fb5f 513cd3c bf5fb5f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# =====================================
# 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
|