From 5c9f140c5db6330a751c88ec7984bc01931d18e8 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 22 Dec 2025 07:11:11 +0100 Subject: [PATCH] feat: remove catboost models and dependency --- .../prediction_models/CatboostClassifier.py | 61 -------------- .../CatboostClassifierMultiTarget.py | 79 ------------------- .../prediction_models/CatboostRegressor.py | 60 -------------- .../CatboostRegressorMultiTarget.py | 78 ------------------ pyproject.toml | 1 - requirements-freqai.txt | 1 - 6 files changed, 280 deletions(-) delete mode 100644 freqtrade/freqai/prediction_models/CatboostClassifier.py delete mode 100644 freqtrade/freqai/prediction_models/CatboostClassifierMultiTarget.py delete mode 100644 freqtrade/freqai/prediction_models/CatboostRegressor.py delete mode 100644 freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py diff --git a/freqtrade/freqai/prediction_models/CatboostClassifier.py b/freqtrade/freqai/prediction_models/CatboostClassifier.py deleted file mode 100644 index 632dc781e..000000000 --- a/freqtrade/freqai/prediction_models/CatboostClassifier.py +++ /dev/null @@ -1,61 +0,0 @@ -import logging -from pathlib import Path -from typing import Any - -from catboost import CatBoostClassifier, Pool - -from freqtrade.freqai.base_models.BaseClassifierModel import BaseClassifierModel -from freqtrade.freqai.data_kitchen import FreqaiDataKitchen - - -logger = logging.getLogger(__name__) - - -class CatboostClassifier(BaseClassifierModel): - """ - User created prediction model. The class inherits IFreqaiModel, which - means it has full access to all Frequency AI functionality. Typically, - users would use this to override the common `fit()`, `train()`, or - `predict()` methods to add their custom data handling tools or change - various aspects of the training that cannot be configured via the - top level config.json file. - """ - - def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) -> Any: - """ - User sets up the training and test data to fit their desired model here - :param data_dictionary: the dictionary holding all data for train, test, - labels, weights - :param dk: The datakitchen object for the current coin/model - """ - - train_data = Pool( - data=data_dictionary["train_features"], - label=data_dictionary["train_labels"], - weight=data_dictionary["train_weights"], - ) - if self.freqai_info.get("data_split_parameters", {}).get("test_size", 0.1) == 0: - test_data = None - else: - test_data = Pool( - data=data_dictionary["test_features"], - label=data_dictionary["test_labels"], - weight=data_dictionary["test_weights"], - ) - - cbr = CatBoostClassifier( - allow_writing_files=True, - loss_function="MultiClass", - train_dir=Path(dk.data_path), - **self.model_training_parameters, - ) - - init_model = self.get_init_model(dk.pair) - - cbr.fit( - X=train_data, - eval_set=test_data, - init_model=init_model, - ) - - return cbr diff --git a/freqtrade/freqai/prediction_models/CatboostClassifierMultiTarget.py b/freqtrade/freqai/prediction_models/CatboostClassifierMultiTarget.py deleted file mode 100644 index a277bc2d7..000000000 --- a/freqtrade/freqai/prediction_models/CatboostClassifierMultiTarget.py +++ /dev/null @@ -1,79 +0,0 @@ -import logging -from pathlib import Path -from typing import Any - -from catboost import CatBoostClassifier, Pool - -from freqtrade.freqai.base_models.BaseClassifierModel import BaseClassifierModel -from freqtrade.freqai.base_models.FreqaiMultiOutputClassifier import FreqaiMultiOutputClassifier -from freqtrade.freqai.data_kitchen import FreqaiDataKitchen - - -logger = logging.getLogger(__name__) - - -class CatboostClassifierMultiTarget(BaseClassifierModel): - """ - User created prediction model. The class inherits IFreqaiModel, which - means it has full access to all Frequency AI functionality. Typically, - users would use this to override the common `fit()`, `train()`, or - `predict()` methods to add their custom data handling tools or change - various aspects of the training that cannot be configured via the - top level config.json file. - """ - - def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) -> Any: - """ - User sets up the training and test data to fit their desired model here - :param data_dictionary: the dictionary holding all data for train, test, - labels, weights - :param dk: The datakitchen object for the current coin/model - """ - - cbc = CatBoostClassifier( - allow_writing_files=True, - loss_function="MultiClass", - train_dir=Path(dk.data_path), - **self.model_training_parameters, - ) - - X = data_dictionary["train_features"] - y = data_dictionary["train_labels"] - - sample_weight = data_dictionary["train_weights"] - - eval_sets = [None] * y.shape[1] - - if self.freqai_info.get("data_split_parameters", {}).get("test_size", 0.1) != 0: - eval_sets = [None] * data_dictionary["test_labels"].shape[1] - - for i in range(data_dictionary["test_labels"].shape[1]): - eval_sets[i] = Pool( - data=data_dictionary["test_features"], - label=data_dictionary["test_labels"].iloc[:, i], - weight=data_dictionary["test_weights"], - ) - - init_model = self.get_init_model(dk.pair) - - if init_model: - init_models = init_model.estimators_ - else: - init_models = [None] * y.shape[1] - - fit_params = [] - for i in range(len(eval_sets)): - fit_params.append( - { - "eval_set": eval_sets[i], - "init_model": init_models[i], - } - ) - - model = FreqaiMultiOutputClassifier(estimator=cbc) - thread_training = self.freqai_info.get("multitarget_parallel_training", False) - if thread_training: - model.n_jobs = y.shape[1] - model.fit(X=X, y=y, sample_weight=sample_weight, fit_params=fit_params) - - return model diff --git a/freqtrade/freqai/prediction_models/CatboostRegressor.py b/freqtrade/freqai/prediction_models/CatboostRegressor.py deleted file mode 100644 index fb2727b33..000000000 --- a/freqtrade/freqai/prediction_models/CatboostRegressor.py +++ /dev/null @@ -1,60 +0,0 @@ -import logging -from pathlib import Path -from typing import Any - -from catboost import CatBoostRegressor, Pool - -from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel -from freqtrade.freqai.data_kitchen import FreqaiDataKitchen - - -logger = logging.getLogger(__name__) - - -class CatboostRegressor(BaseRegressionModel): - """ - User created prediction model. The class inherits IFreqaiModel, which - means it has full access to all Frequency AI functionality. Typically, - users would use this to override the common `fit()`, `train()`, or - `predict()` methods to add their custom data handling tools or change - various aspects of the training that cannot be configured via the - top level config.json file. - """ - - def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) -> Any: - """ - User sets up the training and test data to fit their desired model here - :param data_dictionary: the dictionary holding all data for train, test, - labels, weights - :param dk: The datakitchen object for the current coin/model - """ - - train_data = Pool( - data=data_dictionary["train_features"], - label=data_dictionary["train_labels"], - weight=data_dictionary["train_weights"], - ) - if self.freqai_info.get("data_split_parameters", {}).get("test_size", 0.1) == 0: - test_data = None - else: - test_data = Pool( - data=data_dictionary["test_features"], - label=data_dictionary["test_labels"], - weight=data_dictionary["test_weights"], - ) - - init_model = self.get_init_model(dk.pair) - - model = CatBoostRegressor( - allow_writing_files=True, - train_dir=Path(dk.data_path), - **self.model_training_parameters, - ) - - model.fit( - X=train_data, - eval_set=test_data, - init_model=init_model, - ) - - return model diff --git a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py deleted file mode 100644 index ad3ddcd9b..000000000 --- a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py +++ /dev/null @@ -1,78 +0,0 @@ -import logging -from pathlib import Path -from typing import Any - -from catboost import CatBoostRegressor, Pool - -from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel -from freqtrade.freqai.base_models.FreqaiMultiOutputRegressor import FreqaiMultiOutputRegressor -from freqtrade.freqai.data_kitchen import FreqaiDataKitchen - - -logger = logging.getLogger(__name__) - - -class CatboostRegressorMultiTarget(BaseRegressionModel): - """ - User created prediction model. The class inherits IFreqaiModel, which - means it has full access to all Frequency AI functionality. Typically, - users would use this to override the common `fit()`, `train()`, or - `predict()` methods to add their custom data handling tools or change - various aspects of the training that cannot be configured via the - top level config.json file. - """ - - def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) -> Any: - """ - User sets up the training and test data to fit their desired model here - :param data_dictionary: the dictionary holding all data for train, test, - labels, weights - :param dk: The datakitchen object for the current coin/model - """ - - cbr = CatBoostRegressor( - allow_writing_files=True, - train_dir=Path(dk.data_path), - **self.model_training_parameters, - ) - - X = data_dictionary["train_features"] - y = data_dictionary["train_labels"] - - sample_weight = data_dictionary["train_weights"] - - eval_sets = [None] * y.shape[1] - - if self.freqai_info.get("data_split_parameters", {}).get("test_size", 0.1) != 0: - eval_sets = [None] * data_dictionary["test_labels"].shape[1] - - for i in range(data_dictionary["test_labels"].shape[1]): - eval_sets[i] = Pool( - data=data_dictionary["test_features"], - label=data_dictionary["test_labels"].iloc[:, i], - weight=data_dictionary["test_weights"], - ) - - init_model = self.get_init_model(dk.pair) - - if init_model: - init_models = init_model.estimators_ - else: - init_models = [None] * y.shape[1] - - fit_params = [] - for i in range(len(eval_sets)): - fit_params.append( - { - "eval_set": eval_sets[i], - "init_model": init_models[i], - } - ) - - model = FreqaiMultiOutputRegressor(estimator=cbr) - thread_training = self.freqai_info.get("multitarget_parallel_training", False) - if thread_training: - model.n_jobs = y.shape[1] - model.fit(X=X, y=y, sample_weight=sample_weight, fit_params=fit_params) - - return model diff --git a/pyproject.toml b/pyproject.toml index 7ada3385c..ab22b1583 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,7 +85,6 @@ hyperopt = [ freqai = [ "scikit-learn", "joblib", - "catboost; platform_machine != 'arm'", "lightgbm", "xgboost", "tensorboard", diff --git a/requirements-freqai.txt b/requirements-freqai.txt index 24bf58986..b274f3914 100644 --- a/requirements-freqai.txt +++ b/requirements-freqai.txt @@ -5,7 +5,6 @@ # Required for freqai scikit-learn==1.7.2 joblib==1.5.2 -catboost==1.2.8; 'arm' not in platform_machine lightgbm==4.6.0 xgboost==3.1.2 tensorboard==2.20.0