From: Jérôme Benoit Date: Fri, 21 Feb 2025 14:26:07 +0000 (+0100) Subject: refactor(qav3): cleanup optuna best params persistence handling X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=dce875fdb20ead2edbb7c6c567911cb0abe9a8c3;p=freqai-strategies.git refactor(qav3): cleanup optuna best params persistence handling Signed-off-by: Jérôme Benoit --- diff --git a/ReforceXY/user_data/config-template.json b/ReforceXY/user_data/config-template.json index ab66345..3af8461 100644 --- a/ReforceXY/user_data/config-template.json +++ b/ReforceXY/user_data/config-template.json @@ -155,7 +155,7 @@ "verbose": 1 }, "rl_config": { - "model_type": "PPO", + "model_type": "MaskablePPO", "policy_type": "MlpPolicy", "model_reward_parameters": { "rr": 1, diff --git a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py index d034a27..b1f316c 100644 --- a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py @@ -286,14 +286,12 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): self, pair: str, study: optuna.study.Study, - previous_study: optuna.study.Study, ) -> None: - if self.optuna_study_has_best_params(previous_study): - study.enqueue_trial(previous_study.best_params) - elif self.__optuna_hp_params.get(pair): + study_namespace = "hp" + if self.__optuna_hp_params.get(pair): study.enqueue_trial(self.__optuna_hp_params[pair]) - elif self.optuna_load_best_params(pair, "hp"): - study.enqueue_trial(self.optuna_load_best_params(pair, "hp")) + elif self.optuna_load_best_params(pair, study_namespace): + study.enqueue_trial(self.optuna_load_best_params(pair, study_namespace)) def optuna_hp_optimize( self, @@ -305,10 +303,10 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): y_test, test_weights, ) -> tuple[Dict | None, float | None]: - study_name = f"hp-{pair}" + study_namespace = "hp" + study_name = f"{study_namespace}-{pair}" storage = self.optuna_storage(pair) pruner = optuna.pruners.HyperbandPruner() - previous_study = self.optuna_study_load(study_name, storage) self.optuna_study_delete(study_name, storage) study = optuna.create_study( study_name=study_name, @@ -320,7 +318,7 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): direction=optuna.study.StudyDirection.MINIMIZE, storage=storage, ) - self.optuna_hp_enqueue_previous_best_trial(pair, study, previous_study) + self.optuna_hp_enqueue_previous_best_trial(pair, study) start = time.time() try: study.optimize( @@ -340,30 +338,30 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): gc_after_trial=True, ) except Exception as e: - logger.error(f"Optuna hp hyperopt failed: {e}", exc_info=True) + logger.error( + f"Optuna {study_namespace} hyperopt failed: {e}", exc_info=True + ) return None, None time_spent = time.time() - start - logger.info(f"Optuna hp hyperopt done ({time_spent:.2f} secs)") + logger.info(f"Optuna {study_namespace} hyperopt done ({time_spent:.2f} secs)") params = study.best_params - self.optuna_save_best_params(pair, "hp", params) + self.optuna_save_best_params(pair, study_namespace, params) # log params for key, value in {"rmse": study.best_value, **params}.items(): - logger.info(f"Optuna hp hyperopt | {key:>20s} : {value}") + logger.info(f"Optuna {study_namespace} hyperopt | {key:>20s} : {value}") return params, study.best_value def optuna_period_enqueue_previous_best_trial( self, pair: str, study: optuna.study.Study, - previous_study: optuna.study.Study, ) -> None: - if self.optuna_study_has_best_params(previous_study): - study.enqueue_trial(previous_study.best_params) - elif self.__optuna_period_params.get(pair): + study_namespace = "period" + if self.__optuna_period_params.get(pair): study.enqueue_trial(self.__optuna_period_params[pair]) - elif self.optuna_load_best_params(pair, "period"): - study.enqueue_trial(self.optuna_load_best_params(pair, "period")) + elif self.optuna_load_best_params(pair, study_namespace): + study.enqueue_trial(self.optuna_load_best_params(pair, study_namespace)) def optuna_period_optimize( self, @@ -376,10 +374,10 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): test_weights, model_training_parameters, ) -> tuple[Dict | None, float | None]: - study_name = f"period-{pair}" + study_namespace = "period" + study_name = f"{study_namespace}-{pair}" storage = self.optuna_storage(pair) pruner = optuna.pruners.HyperbandPruner() - previous_study = self.optuna_study_load(study_name, storage) self.optuna_study_delete(study_name, storage) study = optuna.create_study( study_name=study_name, @@ -391,7 +389,7 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): direction=optuna.study.StudyDirection.MINIMIZE, storage=storage, ) - self.optuna_period_enqueue_previous_best_trial(pair, study, previous_study) + self.optuna_period_enqueue_previous_best_trial(pair, study) start = time.time() try: study.optimize( @@ -414,16 +412,18 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): gc_after_trial=True, ) except Exception as e: - logger.error(f"Optuna period hyperopt failed: {e}", exc_info=True) + logger.error( + f"Optuna {study_namespace} hyperopt failed: {e}", exc_info=True + ) return None, None time_spent = time.time() - start - logger.info(f"Optuna period hyperopt done ({time_spent:.2f} secs)") + logger.info(f"Optuna {study_namespace} hyperopt done ({time_spent:.2f} secs)") params = study.best_params - self.optuna_save_best_params(pair, "period", params) + self.optuna_save_best_params(pair, study_namespace, params) # log params for key, value in {"rmse": study.best_value, **params}.items(): - logger.info(f"Optuna period hyperopt | {key:>20s} : {value}") + logger.info(f"Optuna {study_namespace} hyperopt | {key:>20s} : {value}") return params, study.best_value def optuna_save_best_params( diff --git a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py index 36db9bd..caff5fc 100644 --- a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py @@ -287,14 +287,12 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): self, pair: str, study: optuna.study.Study, - previous_study: optuna.study.Study, ) -> None: - if self.optuna_study_has_best_params(previous_study): - study.enqueue_trial(previous_study.best_params) - elif self.__optuna_hp_params.get(pair): + study_namespace = "hp" + if self.__optuna_hp_params.get(pair): study.enqueue_trial(self.__optuna_hp_params[pair]) - elif self.optuna_load_best_params(pair, "hp"): - study.enqueue_trial(self.optuna_load_best_params(pair, "hp")) + elif self.optuna_load_best_params(pair, study_namespace): + study.enqueue_trial(self.optuna_load_best_params(pair, study_namespace)) def optuna_hp_optimize( self, @@ -306,10 +304,10 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): y_test, test_weights, ) -> tuple[Dict | None, float | None]: - study_name = f"hp-{pair}" + study_namespace = "hp" + study_name = f"{study_namespace}-{pair}" storage = self.optuna_storage(pair) pruner = optuna.pruners.HyperbandPruner() - previous_study = self.optuna_study_load(study_name, storage) self.optuna_study_delete(study_name, storage) study = optuna.create_study( study_name=study_name, @@ -321,7 +319,7 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): direction=optuna.study.StudyDirection.MINIMIZE, storage=storage, ) - self.optuna_hp_enqueue_previous_best_trial(pair, study, previous_study) + self.optuna_hp_enqueue_previous_best_trial(pair, study) start = time.time() try: study.optimize( @@ -341,30 +339,30 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): gc_after_trial=True, ) except Exception as e: - logger.error(f"Optuna hp hyperopt failed: {e}", exc_info=True) + logger.error( + f"Optuna {study_namespace} hyperopt failed: {e}", exc_info=True + ) return None, None time_spent = time.time() - start - logger.info(f"Optuna hp hyperopt done ({time_spent:.2f} secs)") + logger.info(f"Optuna {study_namespace} hyperopt done ({time_spent:.2f} secs)") params = study.best_params - self.optuna_save_best_params(pair, "hp", params) + self.optuna_save_best_params(pair, study_namespace, params) # log params for key, value in {"rmse": study.best_value, **params}.items(): - logger.info(f"Optuna hp hyperopt | {key:>20s} : {value}") + logger.info(f"Optuna {study_namespace} hyperopt | {key:>20s} : {value}") return params, study.best_value def optuna_period_enqueue_previous_best_trial( self, pair: str, study: optuna.study.Study, - previous_study: optuna.study.Study, ) -> None: - if self.optuna_study_has_best_params(previous_study): - study.enqueue_trial(previous_study.best_params) - elif self.__optuna_period_params.get(pair): + study_namespace = "period" + if self.__optuna_period_params.get(pair): study.enqueue_trial(self.__optuna_period_params[pair]) - elif self.optuna_load_best_params(pair, "period"): - study.enqueue_trial(self.optuna_load_best_params(pair, "period")) + elif self.optuna_load_best_params(pair, study_namespace): + study.enqueue_trial(self.optuna_load_best_params(pair, study_namespace)) def optuna_period_optimize( self, @@ -377,10 +375,10 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): test_weights, model_training_parameters, ) -> tuple[Dict | None, float | None]: - study_name = f"period-{pair}" + study_namespace = "period" + study_name = f"{study_namespace}-{pair}" storage = self.optuna_storage(pair) pruner = optuna.pruners.HyperbandPruner() - previous_study = self.optuna_study_load(study_name, storage) self.optuna_study_delete(study_name, storage) study = optuna.create_study( study_name=study_name, @@ -392,7 +390,7 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): direction=optuna.study.StudyDirection.MINIMIZE, storage=storage, ) - self.optuna_period_enqueue_previous_best_trial(pair, study, previous_study) + self.optuna_period_enqueue_previous_best_trial(pair, study) start = time.time() try: study.optimize( @@ -415,16 +413,18 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): gc_after_trial=True, ) except Exception as e: - logger.error(f"Optuna period hyperopt failed: {e}", exc_info=True) + logger.error( + f"Optuna {study_namespace} hyperopt failed: {e}", exc_info=True + ) return None, None time_spent = time.time() - start - logger.info(f"Optuna period hyperopt done ({time_spent:.2f} secs)") + logger.info(f"Optuna {study_namespace} hyperopt done ({time_spent:.2f} secs)") params = study.best_params - self.optuna_save_best_params(pair, "period", params) + self.optuna_save_best_params(pair, study_namespace, params) # log params for key, value in {"rmse": study.best_value, **params}.items(): - logger.info(f"Optuna period hyperopt | {key:>20s} : {value}") + logger.info(f"Optuna {study_namespace} hyperopt | {key:>20s} : {value}") return params, study.best_value def optuna_save_best_params(