]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
feat(quickadapter): add model_path parameter for CatBoost train_dir
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 13 Jan 2026 20:05:42 +0000 (21:05 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 13 Jan 2026 20:05:42 +0000 (21:05 +0100)
Pass dk.data_path to fit_regressor to enable CatBoost train_dir configuration. For Optuna trials, creates isolated hp_trial_{N} subdirectories to avoid conflicts between parallel trial logs. Follows FreqTrade's mkdir pattern (parents=True, exist_ok=True).

quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py
quickadapter/user_data/strategies/Utils.py

index e297399c16b7cf449a80fe745d5a82e47b2f263d..afd50a61aa2b45224afee68313a0762f634f94c8 100644 (file)
@@ -1448,6 +1448,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
                     model_training_parameters,
                     self._optuna_config.get("space_reduction"),
                     self._optuna_config.get("space_fraction"),
+                    dk.data_path,
                 ),
                 direction=optuna.study.StudyDirection.MINIMIZE,
             )
@@ -1479,6 +1480,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
             eval_weights=eval_weights,
             model_training_parameters=model_training_parameters,
             init_model=self.get_init_model(dk.pair),
+            model_path=dk.data_path,
         )
         time_spent = time.time() - start_time
         self.dd.update_metric_tracker("fit_time", time_spent, dk.pair)
@@ -3270,6 +3272,7 @@ def hp_objective(
     model_training_parameters: dict[str, Any],
     space_reduction: bool,
     space_fraction: float,
+    model_path: Optional[Path] = None,
 ) -> float:
     study_model_parameters = get_optuna_study_model_parameters(
         trial,
@@ -3293,6 +3296,7 @@ def hp_objective(
         eval_set=eval_set,
         eval_weights=eval_weights,
         model_training_parameters=model_training_parameters,
+        model_path=model_path,
         trial=trial,
     )
     y_pred = model.predict(X_test)
index 03993244779db1e18b66d18f9de43c9f57b841d6..414a608fc080e3a1ffd8e8125896e0a1458ebb7e 100644 (file)
@@ -5,6 +5,7 @@ import math
 from enum import IntEnum
 from functools import lru_cache
 from logging import Logger
+from pathlib import Path
 from typing import (
     TYPE_CHECKING,
     Any,
@@ -1677,6 +1678,7 @@ def fit_regressor(
     model_training_parameters: dict[str, Any],
     init_model: Any = None,
     callbacks: Optional[list[RegressorCallback]] = None,
+    model_path: Optional[Path] = None,
     trial: Optional[optuna.trial.Trial] = None,
 ) -> Any:
     """Fit a regressor model."""
@@ -1894,6 +1896,18 @@ def fit_regressor(
         model_training_parameters.setdefault("random_seed", 1)
         model_training_parameters.setdefault("loss_function", "RMSE")
 
+        if model_path is not None and "train_dir" not in model_training_parameters:
+            if trial is not None:
+                trial_path = model_path / f"hp_trial_{trial.number}"
+                trial_path.mkdir(parents=True, exist_ok=True)
+                model_training_parameters["train_dir"] = str(
+                    trial_path / "catboost_info"
+                )
+            else:
+                model_training_parameters["train_dir"] = str(
+                    model_path / "catboost_info"
+                )
+
         task_type = model_training_parameters.get("task_type", "CPU")
         loss_function = model_training_parameters.get("loss_function", "RMSE")
         if task_type == "GPU":