From 4e172f3ac2b11b71fc24aeae683f92b590748533 Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 12:56:14 +0300 Subject: [PATCH 01/35] Added TabPFN implementation --- .../models/tabpfn.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py diff --git a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py new file mode 100644 index 0000000000..ceafb84c42 --- /dev/null +++ b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py @@ -0,0 +1,62 @@ +import numpy as np +from tabpfn import TabPFNClassifier, TabPFNRegressor +from typing import Optional +from fedot.core.data.data import InputData, OutputData +from fedot.core.operations.evaluation.operation_implementations.implementation_interfaces import ModelImplementation +from fedot.core.operations.operation_parameters import OperationParameters + + +class FedotTabPFNImplementation(ModelImplementation): + __operation_params = ['enable_categorical'] + + def __init__(self, params: Optional[OperationParameters] = None): + super().__init__(params) + + self.model_params = { + k: v for k, v in self.params.to_dict().items() if k not in self.__operation_params + } + self.model = None + self.classes_ = None + + + def fit(self, input_data: InputData): + self.model.categorical_features_indices = input_data.categorical_idx + + if self.params.get('enable_categorical'): + input_data = input_data.get_not_encoded_data() + + self.model.fit(X=input_data.features, y=input_data.target) + + return self.model + + + def predict(self, input_data: InputData) -> OutputData: + if self.params.get('enable_categorical'): + input_data = input_data.get_not_encoded_data() + + prediction = self.model.predict(input_data.features) + + return prediction + + +class FedotTabPFNClassificationImplementation(FedotTabPFNImplementation): + def __init__(self, params: Optional[OperationParameters] = None): + super().__init__(params) + self.model = TabPFNClassifier(**self.model_params) + + def fit(self, input_data: InputData): + self.classes_ = np.unique(np.array(input_data.target)) + return super().fit(input_data=input_data) + + def predict_proba(self, input_data: InputData): + if self.params.get('enable_categorical'): + input_data = input_data.get_not_encoded_data() + + prediction = self.model.predict_proba(input_data.features) + return prediction + + +class FedotTabPFNRegressionImplementation(FedotTabPFNImplementation): + def __init__(self, params: Optional[OperationParameters] = None): + super().__init__(params) + self.model = TabPFNRegressor(**self.model_params) From b79c8d1a65326d1eb4141529e8c0ba61fd75ec6f Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 12:56:32 +0300 Subject: [PATCH 02/35] Added TabPFN Strategy --- fedot/core/operations/evaluation/tabpfn.py | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 fedot/core/operations/evaluation/tabpfn.py diff --git a/fedot/core/operations/evaluation/tabpfn.py b/fedot/core/operations/evaluation/tabpfn.py new file mode 100644 index 0000000000..e90f6a782a --- /dev/null +++ b/fedot/core/operations/evaluation/tabpfn.py @@ -0,0 +1,67 @@ +from typing import Optional + +import numpy as np + +from fedot.core.data.data import InputData, OutputData +from fedot.core.operations.evaluation.evaluation_interfaces import EvaluationStrategy, is_multi_output_task +from fedot.core.operations.evaluation.operation_implementations.models.tabpfn import \ + FedotTabPFNClassificationImplementation, FedotTabPFNRegressionImplementation +from fedot.core.operations.operation_parameters import OperationParameters +from fedot.core.repository.tasks import TaskTypesEnum +from fedot.utilities.random import ImplementationRandomStateHandler + + +class TabPFNStrategy(EvaluationStrategy): + _operations_by_types = { + 'tabpfn': FedotTabPFNClassificationImplementation, + 'tabpfnreg': FedotTabPFNRegressionImplementation, + } + + def __init__(self, operation_type: str, params: Optional[OperationParameters] = None): + self.operation_impl = self._convert_to_operation(operation_type) + super().__init__(operation_type, params) + + def fit(self, train_data: InputData): + if train_data.task.task_type == TaskTypesEnum.ts_forecasting: + raise ValueError('Time series forecasting not supported for TabPFN') + + operation_implementation = self.operation_impl(self.params_for_fit) + + with ImplementationRandomStateHandler(implementation=operation_implementation): + operation_implementation.fit(train_data) + + return operation_implementation + + def predict(self, trained_operation, predict_data: InputData) -> OutputData: + raise NotImplementedError() + + +class TabPFNClassificationStrategy(TabPFNStrategy): + def __init__(self, operation_type: str, params: Optional[OperationParameters] = None): + super().__init__(operation_type, params) + + def predict(self, trained_operation, predict_data: InputData) -> OutputData: + if self.output_mode == 'labels': + prediction = trained_operation.predict(predict_data) + elif self.output_mode in ['probs', 'full_probs', 'default']: + n_classes = len(trained_operation.classes_) + prediction = trained_operation.predict_proba(predict_data) + if n_classes < 2: + raise ValueError('Data set contain only 1 target class. Please reformat your data.') + elif n_classes == 2 and self.output_mode != 'full_probs' and len(prediction.shape) > 1: + prediction = prediction[:, 1] + else: + raise ValueError(f'Output model {self.output_mode} is not supported') + + converted = self._convert_to_output(prediction, predict_data) + return converted + + +class TabPFNRegressionStrategy(TabPFNStrategy): + def __init__(self, operation_type: str, params: Optional[OperationParameters] = None): + super().__init__(operation_type, params) + + def predict(self, trained_operation, predict_data: InputData) -> OutputData: + prediction = trained_operation.predict(predict_data) + converted = self._convert_to_output(prediction, predict_data) + return converted From 42c6180e0637b28c3655d73bdd37b51a0439cac4 Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 12:56:47 +0300 Subject: [PATCH 03/35] Added TabPFN default parameters --- .../data/default_operation_params.json | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/fedot/core/repository/data/default_operation_params.json b/fedot/core/repository/data/default_operation_params.json index 2363d5450d..21fe3980e0 100644 --- a/fedot/core/repository/data/default_operation_params.json +++ b/fedot/core/repository/data/default_operation_params.json @@ -222,5 +222,34 @@ "max_homology_dimension": 1, "metric": "euclidean", "stride": 1 + }, + "tabpfn": { + "n_jobs": 1, + "n_estimators": 4, + "softmax_temperature": 0.9, + "balance_probabilities": false, + "average_before_softmax": false, + "model_path": "auto", + "device": "cpu", + "ignore_pretraining_limits": false, + "inference_precision": "auto", + "fit_mode": "fit_preprocessors", + "memory_saving_mode": "auto", + "inference_config": null + }, + "tabpfnreg": { + "n_jobs": 1, + "n_estimators": 4, + "softmax_temperature": 0.9, + "balance_probabilities": false, + "average_before_softmax": false, + "model_path": "auto", + "device": "cpu", + "ignore_pretraining_limits": false, + "inference_precision": "auto", + "fit_mode": "fit_preprocessors", + "memory_saving_mode": "auto", + "inference_config": null, + "enable_categorical": true } } \ No newline at end of file From d7e62b595af23ad4cb82019faddf4786f22259a3 Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 12:57:04 +0300 Subject: [PATCH 04/35] Added TabPFN search space --- fedot/core/pipelines/tuning/search_space.py | 44 +++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/fedot/core/pipelines/tuning/search_space.py b/fedot/core/pipelines/tuning/search_space.py index 816475674a..01b65b6f15 100644 --- a/fedot/core/pipelines/tuning/search_space.py +++ b/fedot/core/pipelines/tuning/search_space.py @@ -930,6 +930,50 @@ def get_parameters_dict(self): 'hyperopt-dist': hp.choice, 'sampling-scope': [['euclidean', 'manhattan', 'cosine']], 'type': 'categorical'} + }, + 'tabpfn': { + 'n_estimators': { + 'hyperopt-dist': hp.uniformint, + 'sampling-scope': [1, 10], + 'type': 'discrete' + }, + 'softmax_temperature': { + 'hyperopt-dist': hp.uniform, + 'sampling-scope': [0.0, 1.0], + 'type': 'continuous' + }, + 'balance_probabilities': { + 'hyperopt-dist': hp.choice, + 'sampling-scope': [[True, False]], + 'type': 'categorical' + }, + 'average_before_softmax': { + 'hyperopt-dist': hp.choice, + 'sampling-scope': [[True, False]], + 'type': 'categorical' + }, + }, + 'tabpfnreg': { + 'n_estimators': { + 'hyperopt-dist': hp.uniformint, + 'sampling-scope': [1, 10], + 'type': 'discrete' + }, + 'softmax_temperature': { + 'hyperopt-dist': hp.uniform, + 'sampling-scope': [0.0, 1.0], + 'type': 'continuous' + }, + 'balance_probabilities': { + 'hyperopt-dist': hp.choice, + 'sampling-scope': [[True, False]], + 'type': 'categorical' + }, + 'average_before_softmax': { + 'hyperopt-dist': hp.choice, + 'sampling-scope': [[True, False]], + 'type': 'categorical' + }, } } From 0fe2e6900de85a97a776ac5a8c8df299888690ba Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 12:58:13 +0300 Subject: [PATCH 05/35] Added TabPFN in model repository --- .../repository/data/model_repository.json | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/fedot/core/repository/data/model_repository.json b/fedot/core/repository/data/model_repository.json index e456eb3910..a27f9eaa29 100644 --- a/fedot/core/repository/data/model_repository.json +++ b/fedot/core/repository/data/model_repository.json @@ -129,6 +129,40 @@ ], "tasks": "[TaskTypesEnum.regression]" }, + "tabpfn_class": { + "accepted_node_types": [ + "any" + ], + "description": "TabPFN implementations for classification problems", + "forbidden_node_types": "[]", + "input_type": "[DataTypesEnum.table]", + "output_type": "[DataTypesEnum.table]", + "strategies": [ + "fedot.core.operations.evaluation.tabpfn", + "TabPFNClassificationStrategy" + ], + "tags": [ + "neural" + ], + "tasks": "[TaskTypesEnum.classification]" + }, + "tabpfn_regr": { + "accepted_node_types": [ + "any" + ], + "description": "TabPFN implementations for regression problems", + "forbidden_node_types": "[]", + "input_type": "[DataTypesEnum.table]", + "output_type": "[DataTypesEnum.table]", + "strategies": [ + "fedot.core.operations.evaluation.tabpfn", + "TabPFNRegressionStrategy" + ], + "tags": [ + "neural" + ], + "tasks": "[TaskTypesEnum.regression]" + }, "ts_model": { "description": "Implementations of the time series models", "input_type": "[DataTypesEnum.ts]", @@ -513,6 +547,20 @@ "custom_model", "non-default" ] - } + }, + "tabpfn": { + "meta": "tabpfn_class", + "tags": [ + "neural", + "non_linear" + ] + }, + "tabpfnreg": { + "meta": "tabpfn_regr", + "tags": [ + "neural", + "non_linear" + ] + } } } \ No newline at end of file From f046413087ffb21407340d5314f79e5d1b5af9fb Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 12:58:46 +0300 Subject: [PATCH 06/35] Added TabPFN in requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index e0d252ae8c..93aa277c9d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,7 @@ anytree>=2.8.0 catboost>=0.25.0 lightgbm>=3.0.0 xgboost>=1.4.0 # to prevent warnings +tabpfn==2.0.9 statsmodels>=0.12.0 ete3>=3.1.0 networkx>=2.4, !=2.7.*, !=2.8.1, !=2.8.2, !=2.8.3 From d448bb906117bd6f3d8227e52fb77b1c379ae66d Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 14:01:10 +0300 Subject: [PATCH 07/35] Fixed parameters in TabPFN Regression --- fedot/core/pipelines/tuning/search_space.py | 5 ----- fedot/core/repository/data/default_operation_params.json | 1 - 2 files changed, 6 deletions(-) diff --git a/fedot/core/pipelines/tuning/search_space.py b/fedot/core/pipelines/tuning/search_space.py index 01b65b6f15..f6fae6e49b 100644 --- a/fedot/core/pipelines/tuning/search_space.py +++ b/fedot/core/pipelines/tuning/search_space.py @@ -964,11 +964,6 @@ def get_parameters_dict(self): 'sampling-scope': [0.0, 1.0], 'type': 'continuous' }, - 'balance_probabilities': { - 'hyperopt-dist': hp.choice, - 'sampling-scope': [[True, False]], - 'type': 'categorical' - }, 'average_before_softmax': { 'hyperopt-dist': hp.choice, 'sampling-scope': [[True, False]], diff --git a/fedot/core/repository/data/default_operation_params.json b/fedot/core/repository/data/default_operation_params.json index 21fe3980e0..708b846ef4 100644 --- a/fedot/core/repository/data/default_operation_params.json +++ b/fedot/core/repository/data/default_operation_params.json @@ -241,7 +241,6 @@ "n_jobs": 1, "n_estimators": 4, "softmax_temperature": 0.9, - "balance_probabilities": false, "average_before_softmax": false, "model_path": "auto", "device": "cpu", From 6a23dcdf14583845a33b6e5c8429e3c0f5b200e8 Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 15:57:11 +0300 Subject: [PATCH 08/35] Added TabPFN into models list in automation_features.rst --- docs/source/introduction/fedot_features/automation_features.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/introduction/fedot_features/automation_features.rst b/docs/source/introduction/fedot_features/automation_features.rst index 65e2d28807..110da90e34 100644 --- a/docs/source/introduction/fedot_features/automation_features.rst +++ b/docs/source/introduction/fedot_features/automation_features.rst @@ -173,6 +173,8 @@ Apart from that there are other options whose names speak for themselves: ``'sta `polyfit`,Polynomial approximation,Forecasting `stl_arima`,STL Decomposition with ARIMA,Forecasting `ts_naive_average`,Naive Average,Forecasting + `tabpfn`,TabPFN classifier,Classification + `tabpfnreg`,TabPFN regressor,Regression .. csv-table:: Available models implementations From ca181af8863008e3345d0d86d4a83dbafb6f2387 Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 15:58:05 +0300 Subject: [PATCH 09/35] Added TabPFN as exception in test on constant data --- test/integration/models/test_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/models/test_model.py b/test/integration/models/test_model.py index 72822b4873..1d746210be 100644 --- a/test/integration/models/test_model.py +++ b/test/integration/models/test_model.py @@ -465,7 +465,7 @@ def test_locf_forecast_correctly(): def test_models_does_not_fall_on_constant_data(operation): """ Run models on constant data """ # models that raise exception - to_skip = {'custom', 'arima', 'catboost', 'cgru', 'clstm', 'catboostreg', 'lda', 'decompose', 'class_decompose'} + to_skip = {'custom', 'arima', 'catboost', 'cgru', 'clstm', 'catboostreg', 'lda', 'decompose', 'class_decompose', 'tabpfn', 'tabpfnreg'} if operation.id in to_skip: return From 7525d03a7176e48586c8590ca3b86ac58c1dc95a Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 14 May 2025 15:59:01 +0300 Subject: [PATCH 10/35] Added tests for TabPFN classification and regression strategies --- test/integration/models/test_strategy.py | 42 +++++++++++++++++++ .../pipelines/test_decompose_pipelines.py | 15 +++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/test/integration/models/test_strategy.py b/test/integration/models/test_strategy.py index a28aa71ce3..6bbef7bcfb 100644 --- a/test/integration/models/test_strategy.py +++ b/test/integration/models/test_strategy.py @@ -76,3 +76,45 @@ def test_boosting_regression_operation(): assert isinstance(pipeline, Pipeline) assert predicted_output.predict.shape[0] == n_samples * 0.2 assert metric < rmse_threshold + + +def test_tabpfn_classification_operation(): + train_data, test_data = get_classification_data( + classes_amount=2, + samples_amount=50, + features_amount=4, + ) + + model_names = OperationTypesRepository().suitable_operation( + task_type=TaskTypesEnum.classification, tags=['tabpfn'] + ) + + for model_name in model_names: + pipeline = PipelineBuilder().add_node(model_name).build() + pipeline.fit(train_data) + predicted_output = pipeline.predict(test_data, output_mode='labels') + metric = roc_auc(test_data.target, predicted_output.predict) + + assert isinstance(pipeline, Pipeline) + assert predicted_output.predict.shape[0] == 240 + assert metric > 0.5 + +def test_tabpfn_regression_operation(): + n_samples = 50 + data = get_synthetic_regression_data(n_samples=n_samples, n_features=4, random_state=42) + train_data, test_data = train_test_data_setup(data) + + model_names = OperationTypesRepository().suitable_operation( + task_type=TaskTypesEnum.regression, tags=['tabpfn'] + ) + + for model_name in model_names: + pipeline = PipelineBuilder().add_node(model_name).build() + pipeline.fit(train_data, n_jobs=-1) + predicted_output = pipeline.predict(test_data) + metric = mean_squared_error(test_data.target, predicted_output.predict) + rmse_threshold = np.std(test_data.target) ** 2 + + assert isinstance(pipeline, Pipeline) + assert predicted_output.predict.shape[0] == n_samples * 0.2 + assert metric < rmse_threshold diff --git a/test/unit/pipelines/test_decompose_pipelines.py b/test/unit/pipelines/test_decompose_pipelines.py index 4d03f339fc..12785db181 100644 --- a/test/unit/pipelines/test_decompose_pipelines.py +++ b/test/unit/pipelines/test_decompose_pipelines.py @@ -69,7 +69,11 @@ def generate_cascade_decompose_pipeline(): return pipeline -def get_classification_data(classes_amount: int = 2): +def get_classification_data( + classes_amount: int = 2, + samples_amount: int = 800, + features_amount: int = 4, +): """ Function generate synthetic dataset for classification task :param classes_amount: amount of classes to predict @@ -81,9 +85,12 @@ def get_classification_data(classes_amount: int = 2): # Define options for dataset with 800 objects features_options = {'informative': 2, 'redundant': 1, 'repeated': 1, 'clusters_per_class': 1} - x_train, y_train, x_test, y_test = get_classification_dataset(features_options, - 800, 4, - classes_amount) + x_train, y_train, x_test, y_test = get_classification_dataset( + features_options, + samples_amount=samples_amount, + features_amount=features_amount, + classes_amount=classes_amount + ) y_train = y_train.reshape((-1, 1)) y_test = y_test.reshape((-1, 1)) From 63c5ce3e089c54d930c65c3dd98552d050245587 Mon Sep 17 00:00:00 2001 From: martilut Date: Fri, 16 May 2025 13:00:16 +0300 Subject: [PATCH 11/35] Fixed default parameters for TabPFN classification and regression --- fedot/core/repository/data/default_operation_params.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fedot/core/repository/data/default_operation_params.json b/fedot/core/repository/data/default_operation_params.json index 708b846ef4..2fc3b28173 100644 --- a/fedot/core/repository/data/default_operation_params.json +++ b/fedot/core/repository/data/default_operation_params.json @@ -235,11 +235,12 @@ "inference_precision": "auto", "fit_mode": "fit_preprocessors", "memory_saving_mode": "auto", - "inference_config": null + "inference_config": null, + "enable_categorical": false }, "tabpfnreg": { "n_jobs": 1, - "n_estimators": 4, + "n_estimators": 8, "softmax_temperature": 0.9, "average_before_softmax": false, "model_path": "auto", From fe89d463a1b2bd14e7cfb65598eac39e28f2569c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 16 May 2025 10:06:04 +0000 Subject: [PATCH 12/35] Automated autopep8 fixes --- .../operation_implementations/models/tabpfn.py | 2 -- fedot/core/operations/evaluation/tabpfn.py | 2 +- test/integration/models/test_model.py | 13 ++++++++++++- test/integration/models/test_strategy.py | 1 + 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py index ceafb84c42..1260506474 100644 --- a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py +++ b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py @@ -18,7 +18,6 @@ def __init__(self, params: Optional[OperationParameters] = None): self.model = None self.classes_ = None - def fit(self, input_data: InputData): self.model.categorical_features_indices = input_data.categorical_idx @@ -29,7 +28,6 @@ def fit(self, input_data: InputData): return self.model - def predict(self, input_data: InputData) -> OutputData: if self.params.get('enable_categorical'): input_data = input_data.get_not_encoded_data() diff --git a/fedot/core/operations/evaluation/tabpfn.py b/fedot/core/operations/evaluation/tabpfn.py index e90f6a782a..44299e7184 100644 --- a/fedot/core/operations/evaluation/tabpfn.py +++ b/fedot/core/operations/evaluation/tabpfn.py @@ -57,7 +57,7 @@ def predict(self, trained_operation, predict_data: InputData) -> OutputData: return converted -class TabPFNRegressionStrategy(TabPFNStrategy): +class TabPFNRegressionStrategy(TabPFNStrategy): def __init__(self, operation_type: str, params: Optional[OperationParameters] = None): super().__init__(operation_type, params) diff --git a/test/integration/models/test_model.py b/test/integration/models/test_model.py index 1d746210be..ab2cfca13e 100644 --- a/test/integration/models/test_model.py +++ b/test/integration/models/test_model.py @@ -465,7 +465,18 @@ def test_locf_forecast_correctly(): def test_models_does_not_fall_on_constant_data(operation): """ Run models on constant data """ # models that raise exception - to_skip = {'custom', 'arima', 'catboost', 'cgru', 'clstm', 'catboostreg', 'lda', 'decompose', 'class_decompose', 'tabpfn', 'tabpfnreg'} + to_skip = { + 'custom', + 'arima', + 'catboost', + 'cgru', + 'clstm', + 'catboostreg', + 'lda', + 'decompose', + 'class_decompose', + 'tabpfn', + 'tabpfnreg'} if operation.id in to_skip: return diff --git a/test/integration/models/test_strategy.py b/test/integration/models/test_strategy.py index 6bbef7bcfb..8f246279f4 100644 --- a/test/integration/models/test_strategy.py +++ b/test/integration/models/test_strategy.py @@ -99,6 +99,7 @@ def test_tabpfn_classification_operation(): assert predicted_output.predict.shape[0] == 240 assert metric > 0.5 + def test_tabpfn_regression_operation(): n_samples = 50 data = get_synthetic_regression_data(n_samples=n_samples, n_features=4, random_state=42) From 75054b2bf0e4fce9a094a4f5346e5965bb64e400 Mon Sep 17 00:00:00 2001 From: martilut Date: Fri, 16 May 2025 13:09:22 +0300 Subject: [PATCH 13/35] Fixed TabPFN version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 93aa277c9d..290e550cb3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,7 @@ anytree>=2.8.0 catboost>=0.25.0 lightgbm>=3.0.0 xgboost>=1.4.0 # to prevent warnings -tabpfn==2.0.9 +tabpfn>=2.0.0 statsmodels>=0.12.0 ete3>=3.1.0 networkx>=2.4, !=2.7.*, !=2.8.1, !=2.8.2, !=2.8.3 From 245e9b4b7a124511878c833cab8fb05e880c9888 Mon Sep 17 00:00:00 2001 From: martilut Date: Tue, 20 May 2025 22:16:38 +0300 Subject: [PATCH 14/35] Added AutoTabPFN implementation --- .../fedot_features/automation_features.rst | 4 ++- .../models/tabpfn.py | 17 +++++++++++ fedot/core/operations/evaluation/tabpfn.py | 5 +++- .../data/default_operation_params.json | 20 +++++++++++++ .../repository/data/model_repository.json | 28 ++++++++++++------- requirements.txt | 2 ++ test/integration/models/test_model.py | 5 +++- 7 files changed, 68 insertions(+), 13 deletions(-) diff --git a/docs/source/introduction/fedot_features/automation_features.rst b/docs/source/introduction/fedot_features/automation_features.rst index 110da90e34..fe15cfdfb4 100644 --- a/docs/source/introduction/fedot_features/automation_features.rst +++ b/docs/source/introduction/fedot_features/automation_features.rst @@ -174,7 +174,9 @@ Apart from that there are other options whose names speak for themselves: ``'sta `stl_arima`,STL Decomposition with ARIMA,Forecasting `ts_naive_average`,Naive Average,Forecasting `tabpfn`,TabPFN classifier,Classification - `tabpfnreg`,TabPFN regressor,Regression + `tabpfnreg`,TabPFN regressor,Regression, + `autotabpfn`,AutoTabPFN classifier,Classification + `autotabpfnreg`,AutoTabPFN regressor,Regression, .. csv-table:: Available models implementations diff --git a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py index 1260506474..a3068c7de3 100644 --- a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py +++ b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py @@ -1,5 +1,6 @@ import numpy as np from tabpfn import TabPFNClassifier, TabPFNRegressor +from tabpfn_extensions.post_hoc_ensembles.sklearn_interface import AutoTabPFNClassifier, AutoTabPFNRegressor from typing import Optional from fedot.core.data.data import InputData, OutputData from fedot.core.operations.evaluation.operation_implementations.implementation_interfaces import ModelImplementation @@ -58,3 +59,19 @@ class FedotTabPFNRegressionImplementation(FedotTabPFNImplementation): def __init__(self, params: Optional[OperationParameters] = None): super().__init__(params) self.model = TabPFNRegressor(**self.model_params) + + +class FedotAutoTabPFNClassificationImplementation(FedotTabPFNImplementation): + def __init__(self, params: Optional[OperationParameters] = None): + super().__init__(params) + self.model = AutoTabPFNClassifier(**self.model_params) + + def fit(self, input_data: InputData): + self.classes_ = np.unique(np.array(input_data.target)) + return super().fit(input_data=input_data) + + +class FedotAutoTabPFNRegressionImplementation(FedotTabPFNImplementation): + def __init__(self, params: Optional[OperationParameters] = None): + super().__init__(params) + self.model = AutoTabPFNRegressor(**self.model_params) diff --git a/fedot/core/operations/evaluation/tabpfn.py b/fedot/core/operations/evaluation/tabpfn.py index 44299e7184..b9aa3287fe 100644 --- a/fedot/core/operations/evaluation/tabpfn.py +++ b/fedot/core/operations/evaluation/tabpfn.py @@ -5,7 +5,8 @@ from fedot.core.data.data import InputData, OutputData from fedot.core.operations.evaluation.evaluation_interfaces import EvaluationStrategy, is_multi_output_task from fedot.core.operations.evaluation.operation_implementations.models.tabpfn import \ - FedotTabPFNClassificationImplementation, FedotTabPFNRegressionImplementation + FedotTabPFNClassificationImplementation, FedotTabPFNRegressionImplementation, \ + FedotAutoTabPFNClassificationImplementation, FedotAutoTabPFNRegressionImplementation from fedot.core.operations.operation_parameters import OperationParameters from fedot.core.repository.tasks import TaskTypesEnum from fedot.utilities.random import ImplementationRandomStateHandler @@ -15,6 +16,8 @@ class TabPFNStrategy(EvaluationStrategy): _operations_by_types = { 'tabpfn': FedotTabPFNClassificationImplementation, 'tabpfnreg': FedotTabPFNRegressionImplementation, + 'autotabpfn': FedotAutoTabPFNClassificationImplementation, + 'autotabpfnreg': FedotAutoTabPFNRegressionImplementation, } def __init__(self, operation_type: str, params: Optional[OperationParameters] = None): diff --git a/fedot/core/repository/data/default_operation_params.json b/fedot/core/repository/data/default_operation_params.json index 2fc3b28173..befce1f4b2 100644 --- a/fedot/core/repository/data/default_operation_params.json +++ b/fedot/core/repository/data/default_operation_params.json @@ -251,5 +251,25 @@ "memory_saving_mode": "auto", "inference_config": null, "enable_categorical": true + }, + "autotabpfn": { + "max_time": 30, + "preset": "default", + "ges_scoring_string": "roc", + "device": "auto", + "ignore_pretraining_limits": false, + "enable_categorical": true, + "max_samples_cpu": 1000, + "max_samples_gpu": 5000 + }, + "autotabpfnreg": { + "max_time": 30, + "preset": "default", + "ges_scoring_string": "mse", + "device": "auto", + "ignore_pretraining_limits": false, + "enable_categorical": true, + "max_samples_cpu": 1000, + "max_samples_gpu": 5000 } } \ No newline at end of file diff --git a/fedot/core/repository/data/model_repository.json b/fedot/core/repository/data/model_repository.json index a27f9eaa29..e28f2bc047 100644 --- a/fedot/core/repository/data/model_repository.json +++ b/fedot/core/repository/data/model_repository.json @@ -142,7 +142,10 @@ "TabPFNClassificationStrategy" ], "tags": [ - "neural" + "ml", + "neural", + "non_linear", + "tabpfn" ], "tasks": "[TaskTypesEnum.classification]" }, @@ -159,7 +162,10 @@ "TabPFNRegressionStrategy" ], "tags": [ - "neural" + "ml", + "neural", + "non_linear", + "tabpfn" ], "tasks": "[TaskTypesEnum.regression]" }, @@ -550,17 +556,19 @@ }, "tabpfn": { "meta": "tabpfn_class", - "tags": [ - "neural", - "non_linear" - ] + "tags": ["non_auto"] }, "tabpfnreg": { "meta": "tabpfn_regr", - "tags": [ - "neural", - "non_linear" - ] + "tags": ["non_auto"] + }, + "autotabpfn": { + "meta": "tabpfn_class", + "tags": ["auto"] + }, + "autotabpfnreg": { + "meta": "tabpfn_regr", + "tags": ["auto"] } } } \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 290e550cb3..cf1436a159 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,9 @@ anytree>=2.8.0 catboost>=0.25.0 lightgbm>=3.0.0 xgboost>=1.4.0 # to prevent warnings +torch>=1.9.0 tabpfn>=2.0.0 +tabpfn-extensions>=0.0.4 statsmodels>=0.12.0 ete3>=3.1.0 networkx>=2.4, !=2.7.*, !=2.8.1, !=2.8.2, !=2.8.3 diff --git a/test/integration/models/test_model.py b/test/integration/models/test_model.py index ab2cfca13e..2996e1e831 100644 --- a/test/integration/models/test_model.py +++ b/test/integration/models/test_model.py @@ -476,7 +476,10 @@ def test_models_does_not_fall_on_constant_data(operation): 'decompose', 'class_decompose', 'tabpfn', - 'tabpfnreg'} + 'tabpfnreg', + 'autotabpfn', + 'autotabpfnreg', + } if operation.id in to_skip: return From 83d6608d9d1c43b8c99241d2cbd89aa28555e43b Mon Sep 17 00:00:00 2001 From: martilut Date: Tue, 20 May 2025 22:18:44 +0300 Subject: [PATCH 15/35] Added GPU support and fixed prediction output format --- .../models/tabpfn.py | 30 ++++++++---- fedot/core/operations/evaluation/tabpfn.py | 47 +++++++++++++++---- .../data/default_operation_params.json | 12 +++-- 3 files changed, 67 insertions(+), 22 deletions(-) diff --git a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py index a3068c7de3..1c97676cdd 100644 --- a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py +++ b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py @@ -8,7 +8,11 @@ class FedotTabPFNImplementation(ModelImplementation): - __operation_params = ['enable_categorical'] + __operation_params = [ + 'enable_categorical', + 'max_samples_cpu', + 'max_samples_gpu', + ] def __init__(self, params: Optional[OperationParameters] = None): super().__init__(params) @@ -35,7 +39,22 @@ def predict(self, input_data: InputData) -> OutputData: prediction = self.model.predict(input_data.features) - return prediction + output_data = self._convert_to_output( + input_data=input_data, + predict=prediction + ) + return output_data + + def predict_proba(self, input_data: InputData): + if self.params.get('enable_categorical'): + input_data = input_data.get_not_encoded_data() + + prediction = self.model.predict_proba(input_data.features) + output_data = self._convert_to_output( + input_data=input_data, + predict=prediction + ) + return output_data class FedotTabPFNClassificationImplementation(FedotTabPFNImplementation): @@ -47,13 +66,6 @@ def fit(self, input_data: InputData): self.classes_ = np.unique(np.array(input_data.target)) return super().fit(input_data=input_data) - def predict_proba(self, input_data: InputData): - if self.params.get('enable_categorical'): - input_data = input_data.get_not_encoded_data() - - prediction = self.model.predict_proba(input_data.features) - return prediction - class FedotTabPFNRegressionImplementation(FedotTabPFNImplementation): def __init__(self, params: Optional[OperationParameters] = None): diff --git a/fedot/core/operations/evaluation/tabpfn.py b/fedot/core/operations/evaluation/tabpfn.py index b9aa3287fe..94f1976200 100644 --- a/fedot/core/operations/evaluation/tabpfn.py +++ b/fedot/core/operations/evaluation/tabpfn.py @@ -1,6 +1,7 @@ from typing import Optional import numpy as np +import torch from fedot.core.data.data import InputData, OutputData from fedot.core.operations.evaluation.evaluation_interfaces import EvaluationStrategy, is_multi_output_task @@ -23,8 +24,17 @@ class TabPFNStrategy(EvaluationStrategy): def __init__(self, operation_type: str, params: Optional[OperationParameters] = None): self.operation_impl = self._convert_to_operation(operation_type) super().__init__(operation_type, params) + self.device = params.get('device', 'auto') + self.max_samples_cpu = params.get('max_samples_cpu', 1000) + self.max_samples_gpu = params.get('max_samples_gpu', 5000) def fit(self, train_data: InputData): + check_data_size( + data=train_data, + device=self.device, + max_samples_cpu=self.max_samples_cpu, + max_samples_gpu=self.max_samples_gpu + ) if train_data.task.task_type == TaskTypesEnum.ts_forecasting: raise ValueError('Time series forecasting not supported for TabPFN') @@ -45,19 +55,19 @@ def __init__(self, operation_type: str, params: Optional[OperationParameters] = def predict(self, trained_operation, predict_data: InputData) -> OutputData: if self.output_mode == 'labels': - prediction = trained_operation.predict(predict_data) + output = trained_operation.predict(predict_data) elif self.output_mode in ['probs', 'full_probs', 'default']: n_classes = len(trained_operation.classes_) - prediction = trained_operation.predict_proba(predict_data) + output = trained_operation.predict_proba(predict_data) if n_classes < 2: raise ValueError('Data set contain only 1 target class. Please reformat your data.') - elif n_classes == 2 and self.output_mode != 'full_probs' and len(prediction.shape) > 1: - prediction = prediction[:, 1] + elif (n_classes == 2 and self.output_mode != 'full_probs' + and len(output.predict.shape) > 1): + output.predict = output.predict[:, 1] else: raise ValueError(f'Output model {self.output_mode} is not supported') - converted = self._convert_to_output(prediction, predict_data) - return converted + return output class TabPFNRegressionStrategy(TabPFNStrategy): @@ -65,6 +75,25 @@ def __init__(self, operation_type: str, params: Optional[OperationParameters] = super().__init__(operation_type, params) def predict(self, trained_operation, predict_data: InputData) -> OutputData: - prediction = trained_operation.predict(predict_data) - converted = self._convert_to_output(prediction, predict_data) - return converted + return trained_operation.predict(predict_data) + + +def check_data_size( + data: InputData, + device: str = "auto", + max_samples_cpu: int = 1000, + max_samples_gpu: int = 5000, +) -> bool: + if device == "auto": + device = "cuda" if torch.cuda.is_available() else "cpu" + if device == "cpu": + max_samples = max_samples_cpu + else: + max_samples = max_samples_gpu + + if data.features.shape[0] > max_samples: + raise ValueError( + f"Input data has too many samples ({data.features.shape[0]}), " + f"maximum is {max_samples} for device '{device}'" + ) + return True diff --git a/fedot/core/repository/data/default_operation_params.json b/fedot/core/repository/data/default_operation_params.json index befce1f4b2..500e8a543a 100644 --- a/fedot/core/repository/data/default_operation_params.json +++ b/fedot/core/repository/data/default_operation_params.json @@ -230,13 +230,15 @@ "balance_probabilities": false, "average_before_softmax": false, "model_path": "auto", - "device": "cpu", + "device": "auto", "ignore_pretraining_limits": false, "inference_precision": "auto", "fit_mode": "fit_preprocessors", "memory_saving_mode": "auto", "inference_config": null, - "enable_categorical": false + "enable_categorical": false, + "max_samples_cpu": 1000, + "max_samples_gpu": 5000 }, "tabpfnreg": { "n_jobs": 1, @@ -244,13 +246,15 @@ "softmax_temperature": 0.9, "average_before_softmax": false, "model_path": "auto", - "device": "cpu", + "device": "auto", "ignore_pretraining_limits": false, "inference_precision": "auto", "fit_mode": "fit_preprocessors", "memory_saving_mode": "auto", "inference_config": null, - "enable_categorical": true + "enable_categorical": true, + "max_samples_cpu": 1000, + "max_samples_gpu": 5000 }, "autotabpfn": { "max_time": 30, From 51af4e91afb57725b59d357ee69f32ed19f555be Mon Sep 17 00:00:00 2001 From: martilut Date: Tue, 20 May 2025 22:19:00 +0300 Subject: [PATCH 16/35] Fixed tests for TabPFN --- test/integration/models/test_strategy.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/integration/models/test_strategy.py b/test/integration/models/test_strategy.py index 8f246279f4..457593d164 100644 --- a/test/integration/models/test_strategy.py +++ b/test/integration/models/test_strategy.py @@ -79,9 +79,10 @@ def test_boosting_regression_operation(): def test_tabpfn_classification_operation(): + n_samples = 50 train_data, test_data = get_classification_data( classes_amount=2, - samples_amount=50, + samples_amount=n_samples, features_amount=4, ) @@ -96,7 +97,7 @@ def test_tabpfn_classification_operation(): metric = roc_auc(test_data.target, predicted_output.predict) assert isinstance(pipeline, Pipeline) - assert predicted_output.predict.shape[0] == 240 + assert predicted_output.predict.shape[0] == n_samples * 0.3 assert metric > 0.5 From e1f29d22aa2b4662f93a2e4a332ca9a387006069 Mon Sep 17 00:00:00 2001 From: martilut Date: Thu, 19 Jun 2025 11:44:43 +0300 Subject: [PATCH 17/35] Added features size check --- .../operation_implementations/models/tabpfn.py | 1 + fedot/core/operations/evaluation/tabpfn.py | 10 +++++++++- .../repository/data/default_operation_params.json | 12 ++++++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py index 1c97676cdd..e61925e81c 100644 --- a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py +++ b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py @@ -12,6 +12,7 @@ class FedotTabPFNImplementation(ModelImplementation): 'enable_categorical', 'max_samples_cpu', 'max_samples_gpu', + 'max_features' ] def __init__(self, params: Optional[OperationParameters] = None): diff --git a/fedot/core/operations/evaluation/tabpfn.py b/fedot/core/operations/evaluation/tabpfn.py index 94f1976200..31d3399c12 100644 --- a/fedot/core/operations/evaluation/tabpfn.py +++ b/fedot/core/operations/evaluation/tabpfn.py @@ -27,13 +27,15 @@ def __init__(self, operation_type: str, params: Optional[OperationParameters] = self.device = params.get('device', 'auto') self.max_samples_cpu = params.get('max_samples_cpu', 1000) self.max_samples_gpu = params.get('max_samples_gpu', 5000) + self.max_features = params.get('max_features', 500) def fit(self, train_data: InputData): check_data_size( data=train_data, device=self.device, max_samples_cpu=self.max_samples_cpu, - max_samples_gpu=self.max_samples_gpu + max_samples_gpu=self.max_samples_gpu, + max_features=self.max_features, ) if train_data.task.task_type == TaskTypesEnum.ts_forecasting: raise ValueError('Time series forecasting not supported for TabPFN') @@ -83,6 +85,7 @@ def check_data_size( device: str = "auto", max_samples_cpu: int = 1000, max_samples_gpu: int = 5000, + max_features: int = 500, ) -> bool: if device == "auto": device = "cuda" if torch.cuda.is_available() else "cpu" @@ -96,4 +99,9 @@ def check_data_size( f"Input data has too many samples ({data.features.shape[0]}), " f"maximum is {max_samples} for device '{device}'" ) + if data.features.shape[1] > max_features: + raise ValueError( + f"Input data has too many features ({data.features.shape[1]}), " + f"maximum is {max_features}" + ) return True diff --git a/fedot/core/repository/data/default_operation_params.json b/fedot/core/repository/data/default_operation_params.json index 500e8a543a..3bba66641e 100644 --- a/fedot/core/repository/data/default_operation_params.json +++ b/fedot/core/repository/data/default_operation_params.json @@ -238,7 +238,8 @@ "inference_config": null, "enable_categorical": false, "max_samples_cpu": 1000, - "max_samples_gpu": 5000 + "max_samples_gpu": 5000, + "max_features": 500 }, "tabpfnreg": { "n_jobs": 1, @@ -254,7 +255,8 @@ "inference_config": null, "enable_categorical": true, "max_samples_cpu": 1000, - "max_samples_gpu": 5000 + "max_samples_gpu": 5000, + "max_features": 500 }, "autotabpfn": { "max_time": 30, @@ -264,7 +266,8 @@ "ignore_pretraining_limits": false, "enable_categorical": true, "max_samples_cpu": 1000, - "max_samples_gpu": 5000 + "max_samples_gpu": 5000, + "max_features": 500 }, "autotabpfnreg": { "max_time": 30, @@ -274,6 +277,7 @@ "ignore_pretraining_limits": false, "enable_categorical": true, "max_samples_cpu": 1000, - "max_samples_gpu": 5000 + "max_samples_gpu": 5000, + "max_features": 500 } } \ No newline at end of file From bfd8a08140ded8a71c3006263126af21319f44d0 Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 16 Jul 2025 18:42:49 +0300 Subject: [PATCH 18/35] Added non-default ans cpu tags for TabPFN --- fedot/core/repository/data/model_repository.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/fedot/core/repository/data/model_repository.json b/fedot/core/repository/data/model_repository.json index e28f2bc047..ed886f1949 100644 --- a/fedot/core/repository/data/model_repository.json +++ b/fedot/core/repository/data/model_repository.json @@ -145,7 +145,9 @@ "ml", "neural", "non_linear", - "tabpfn" + "tabpfn", + "non-default", + "cpu" ], "tasks": "[TaskTypesEnum.classification]" }, @@ -165,7 +167,9 @@ "ml", "neural", "non_linear", - "tabpfn" + "tabpfn", + "non-default", + "cpu" ], "tasks": "[TaskTypesEnum.regression]" }, From 921eae34c011d764982c65804b76f207c5cae32a Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 16 Jul 2025 18:45:56 +0300 Subject: [PATCH 19/35] Updated max_samples parameter --- .../operation_implementations/models/tabpfn.py | 3 +-- fedot/core/operations/evaluation/tabpfn.py | 16 +++------------- .../data/default_operation_params.json | 1 + 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py index e61925e81c..b83b3b0306 100644 --- a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py +++ b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py @@ -10,8 +10,7 @@ class FedotTabPFNImplementation(ModelImplementation): __operation_params = [ 'enable_categorical', - 'max_samples_cpu', - 'max_samples_gpu', + 'max_samples', 'max_features' ] diff --git a/fedot/core/operations/evaluation/tabpfn.py b/fedot/core/operations/evaluation/tabpfn.py index 31d3399c12..340bc7a93a 100644 --- a/fedot/core/operations/evaluation/tabpfn.py +++ b/fedot/core/operations/evaluation/tabpfn.py @@ -25,16 +25,14 @@ def __init__(self, operation_type: str, params: Optional[OperationParameters] = self.operation_impl = self._convert_to_operation(operation_type) super().__init__(operation_type, params) self.device = params.get('device', 'auto') - self.max_samples_cpu = params.get('max_samples_cpu', 1000) - self.max_samples_gpu = params.get('max_samples_gpu', 5000) + self.max_samples = params.get('max_samples', 1000) self.max_features = params.get('max_features', 500) def fit(self, train_data: InputData): check_data_size( data=train_data, device=self.device, - max_samples_cpu=self.max_samples_cpu, - max_samples_gpu=self.max_samples_gpu, + max_samples=self.max_samples, max_features=self.max_features, ) if train_data.task.task_type == TaskTypesEnum.ts_forecasting: @@ -83,17 +81,9 @@ def predict(self, trained_operation, predict_data: InputData) -> OutputData: def check_data_size( data: InputData, device: str = "auto", - max_samples_cpu: int = 1000, - max_samples_gpu: int = 5000, + max_samples: int = 1000, max_features: int = 500, ) -> bool: - if device == "auto": - device = "cuda" if torch.cuda.is_available() else "cpu" - if device == "cpu": - max_samples = max_samples_cpu - else: - max_samples = max_samples_gpu - if data.features.shape[0] > max_samples: raise ValueError( f"Input data has too many samples ({data.features.shape[0]}), " diff --git a/fedot/core/repository/data/default_operation_params.json b/fedot/core/repository/data/default_operation_params.json index 3bba66641e..b8f050ab1a 100644 --- a/fedot/core/repository/data/default_operation_params.json +++ b/fedot/core/repository/data/default_operation_params.json @@ -278,6 +278,7 @@ "enable_categorical": true, "max_samples_cpu": 1000, "max_samples_gpu": 5000, + "max_samples": 1000, "max_features": 500 } } \ No newline at end of file From e179182815be3a79c699e8728317c7a5c0a2c39d Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 16 Jul 2025 18:46:58 +0300 Subject: [PATCH 20/35] Updated all max_samples parameters --- .../repository/data/default_operation_params.json | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/fedot/core/repository/data/default_operation_params.json b/fedot/core/repository/data/default_operation_params.json index b8f050ab1a..6293a20249 100644 --- a/fedot/core/repository/data/default_operation_params.json +++ b/fedot/core/repository/data/default_operation_params.json @@ -237,8 +237,7 @@ "memory_saving_mode": "auto", "inference_config": null, "enable_categorical": false, - "max_samples_cpu": 1000, - "max_samples_gpu": 5000, + "max_samples": 1000, "max_features": 500 }, "tabpfnreg": { @@ -254,8 +253,7 @@ "memory_saving_mode": "auto", "inference_config": null, "enable_categorical": true, - "max_samples_cpu": 1000, - "max_samples_gpu": 5000, + "max_samples": 1000, "max_features": 500 }, "autotabpfn": { @@ -265,19 +263,16 @@ "device": "auto", "ignore_pretraining_limits": false, "enable_categorical": true, - "max_samples_cpu": 1000, - "max_samples_gpu": 5000, + "max_samples": 1000, "max_features": 500 }, "autotabpfnreg": { "max_time": 30, "preset": "default", "ges_scoring_string": "mse", - "device": "auto", + "device": "cpu", "ignore_pretraining_limits": false, "enable_categorical": true, - "max_samples_cpu": 1000, - "max_samples_gpu": 5000, "max_samples": 1000, "max_features": 500 } From 0d0e389f4cb10a54c19d0246992de65e9baf208a Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 16 Jul 2025 18:47:52 +0300 Subject: [PATCH 21/35] Added TabPFN into GPU preset --- .../data/default_operation_params.json | 59 ++++++++++++++++- .../data/gpu_models_repository.json | 64 +++++++++++++++++++ 2 files changed, 120 insertions(+), 3 deletions(-) diff --git a/fedot/core/repository/data/default_operation_params.json b/fedot/core/repository/data/default_operation_params.json index 6293a20249..3409e687a7 100644 --- a/fedot/core/repository/data/default_operation_params.json +++ b/fedot/core/repository/data/default_operation_params.json @@ -230,7 +230,7 @@ "balance_probabilities": false, "average_before_softmax": false, "model_path": "auto", - "device": "auto", + "device": "cpu", "ignore_pretraining_limits": false, "inference_precision": "auto", "fit_mode": "fit_preprocessors", @@ -246,7 +246,7 @@ "softmax_temperature": 0.9, "average_before_softmax": false, "model_path": "auto", - "device": "auto", + "device": "cpu", "ignore_pretraining_limits": false, "inference_precision": "auto", "fit_mode": "fit_preprocessors", @@ -260,7 +260,7 @@ "max_time": 30, "preset": "default", "ges_scoring_string": "roc", - "device": "auto", + "device": "cpu", "ignore_pretraining_limits": false, "enable_categorical": true, "max_samples": 1000, @@ -275,5 +275,58 @@ "enable_categorical": true, "max_samples": 1000, "max_features": 500 + }, + "tabpfn_gpu": { + "n_jobs": 1, + "n_estimators": 4, + "softmax_temperature": 0.9, + "balance_probabilities": false, + "average_before_softmax": false, + "model_path": "auto", + "device": "cuda", + "ignore_pretraining_limits": false, + "inference_precision": "auto", + "fit_mode": "fit_preprocessors", + "memory_saving_mode": "auto", + "inference_config": null, + "enable_categorical": false, + "max_samples": 10000, + "max_features": 500 + }, + "tabpfnreg_gpu": { + "n_jobs": 1, + "n_estimators": 8, + "softmax_temperature": 0.9, + "average_before_softmax": false, + "model_path": "auto", + "device": "cuda", + "ignore_pretraining_limits": false, + "inference_precision": "auto", + "fit_mode": "fit_preprocessors", + "memory_saving_mode": "auto", + "inference_config": null, + "enable_categorical": true, + "max_samples": 10000, + "max_features": 500 + }, + "autotabpfn_gpu": { + "max_time": 30, + "preset": "default", + "ges_scoring_string": "roc", + "device": "cuda", + "ignore_pretraining_limits": false, + "enable_categorical": true, + "max_samples": 10000, + "max_features": 500 + }, + "autotabpfnreg_gpu": { + "max_time": 30, + "preset": "default", + "ges_scoring_string": "mse", + "device": "cuda", + "ignore_pretraining_limits": false, + "enable_categorical": true, + "max_samples": 10000, + "max_features": 500 } } \ No newline at end of file diff --git a/fedot/core/repository/data/gpu_models_repository.json b/fedot/core/repository/data/gpu_models_repository.json index 6fbd2f129b..75b67515f0 100644 --- a/fedot/core/repository/data/gpu_models_repository.json +++ b/fedot/core/repository/data/gpu_models_repository.json @@ -59,6 +59,50 @@ "cuML", "gpu" ] + }, + "tabpfn_gpu_class": { + "tasks": "[TaskTypesEnum.classification]", + "input_type": "[DataTypesEnum.table]", + "output_type": "[DataTypesEnum.table]", + "accepted_node_types": [ + "any" + ], + "description": "TabPFN implementations for classification problems", + "forbidden_node_types": "[]", + "strategies": [ + "fedot.core.operations.evaluation.tabpfn", + "TabPFNClassificationStrategy" + ], + "tags": [ + "ml", + "neural", + "non_linear", + "tabpfn", + "non-default", + "gpu" + ] + }, + "tabpfn_gpu_regr": { + "tasks": "[TaskTypesEnum.regression]", + "input_type": "[DataTypesEnum.table]", + "output_type": "[DataTypesEnum.table]", + "accepted_node_types": [ + "any" + ], + "description": "TabPFN implementations for regression problems", + "forbidden_node_types": "[]", + "strategies": [ + "fedot.core.operations.evaluation.tabpfn", + "TabPFNRegressionStrategy" + ], + "tags": [ + "ml", + "neural", + "non_linear", + "tabpfn", + "non-default", + "gpu" + ] } }, "operations": { @@ -134,6 +178,26 @@ "cd": { "meta": "rapids_gpu_class", "presets": ["gpu"] + }, + "tabpfn_gpu": { + "meta": "tabpfn_gpu_class", + "presets": ["gpu"], + "tags": ["non_auto"] + }, + "tabpfnreg_gpu": { + "meta": "tabpfn_gpu_regr", + "presets": ["gpu"], + "tags": ["non_auto"] + }, + "autotabpfn_gpu": { + "meta": "tabpfn_gpu_class", + "presets": ["gpu"], + "tags": ["auto"] + }, + "autotabpfnreg_gpu": { + "meta": "tabpfn_gpu_regr", + "presets": ["gpu"], + "tags": ["auto"] } } } \ No newline at end of file From 49f18776f0a06a284842ade8abcea17d791723a8 Mon Sep 17 00:00:00 2001 From: martilut Date: Wed, 16 Jul 2025 18:48:08 +0300 Subject: [PATCH 22/35] Updated tests --- test/integration/models/test_strategy.py | 42 ++++++++++++------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/test/integration/models/test_strategy.py b/test/integration/models/test_strategy.py index 457593d164..f0d562366b 100644 --- a/test/integration/models/test_strategy.py +++ b/test/integration/models/test_strategy.py @@ -1,4 +1,5 @@ import numpy as np +import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics import roc_auc_score as roc_auc, mean_squared_error @@ -78,8 +79,22 @@ def test_boosting_regression_operation(): assert metric < rmse_threshold + +def run_tabpfn( + model_name: str, + train_data: pd.DataFrame, + test_data: pd.DataFrame, +): + pipeline = PipelineBuilder().add_node(model_name).build() + pipeline.fit(train_data) + predicted_output = pipeline.predict(test_data, output_mode='labels') + metric = roc_auc(test_data.target, predicted_output.predict) + + assert isinstance(pipeline, Pipeline) + assert metric > 0.5 + def test_tabpfn_classification_operation(): - n_samples = 50 + n_samples = 20 train_data, test_data = get_classification_data( classes_amount=2, samples_amount=n_samples, @@ -87,36 +102,21 @@ def test_tabpfn_classification_operation(): ) model_names = OperationTypesRepository().suitable_operation( - task_type=TaskTypesEnum.classification, tags=['tabpfn'] + task_type=TaskTypesEnum.classification, tags=['tabpfn', 'cpu'] ) for model_name in model_names: - pipeline = PipelineBuilder().add_node(model_name).build() - pipeline.fit(train_data) - predicted_output = pipeline.predict(test_data, output_mode='labels') - metric = roc_auc(test_data.target, predicted_output.predict) - - assert isinstance(pipeline, Pipeline) - assert predicted_output.predict.shape[0] == n_samples * 0.3 - assert metric > 0.5 + run_tabpfn(model_name, train_data, test_data) def test_tabpfn_regression_operation(): - n_samples = 50 + n_samples = 20 data = get_synthetic_regression_data(n_samples=n_samples, n_features=4, random_state=42) train_data, test_data = train_test_data_setup(data) model_names = OperationTypesRepository().suitable_operation( - task_type=TaskTypesEnum.regression, tags=['tabpfn'] + task_type=TaskTypesEnum.regression, tags=['tabpfn', 'cpu'] ) for model_name in model_names: - pipeline = PipelineBuilder().add_node(model_name).build() - pipeline.fit(train_data, n_jobs=-1) - predicted_output = pipeline.predict(test_data) - metric = mean_squared_error(test_data.target, predicted_output.predict) - rmse_threshold = np.std(test_data.target) ** 2 - - assert isinstance(pipeline, Pipeline) - assert predicted_output.predict.shape[0] == n_samples * 0.2 - assert metric < rmse_threshold + run_tabpfn(model_name, train_data, test_data) From 360758e5e99e50427fe4a703048ba3477a445497 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 21 Jul 2025 09:54:52 +0000 Subject: [PATCH 23/35] Automated autopep8 fixes --- test/integration/models/test_strategy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/models/test_strategy.py b/test/integration/models/test_strategy.py index f0d562366b..280454dc44 100644 --- a/test/integration/models/test_strategy.py +++ b/test/integration/models/test_strategy.py @@ -79,7 +79,6 @@ def test_boosting_regression_operation(): assert metric < rmse_threshold - def run_tabpfn( model_name: str, train_data: pd.DataFrame, @@ -93,6 +92,7 @@ def run_tabpfn( assert isinstance(pipeline, Pipeline) assert metric > 0.5 + def test_tabpfn_classification_operation(): n_samples = 20 train_data, test_data = get_classification_data( From d41aff165ad23910f6ade446c8fa527d0fbbb9d6 Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 18:43:40 +0300 Subject: [PATCH 24/35] Remove 3.8 from builds --- .github/workflows/integration-build.yml | 2 +- .github/workflows/unit-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration-build.yml b/.github/workflows/integration-build.yml index 1f7097dff3..03aaa644d7 100644 --- a/.github/workflows/integration-build.yml +++ b/.github/workflows/integration-build.yml @@ -15,7 +15,7 @@ jobs: timeout-minutes: 95 strategy: matrix: - python-version: [ 3.8, 3.9, '3.10' ] + python-version: [ 3.9, '3.10' ] steps: - name: Checkout branch diff --git a/.github/workflows/unit-build.yml b/.github/workflows/unit-build.yml index 1f58fea64f..d9dafeab2e 100644 --- a/.github/workflows/unit-build.yml +++ b/.github/workflows/unit-build.yml @@ -17,7 +17,7 @@ jobs: timeout-minutes: 15 strategy: matrix: - python-version: [ 3.8, 3.9, '3.10' ] + python-version: [ 3.9, '3.10' ] steps: - uses: actions/checkout@v2 From f984f63bf3499901bc302eb456d933b9b9ca7786 Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 18:54:50 +0300 Subject: [PATCH 25/35] Optimize imports --- fedot/core/operations/evaluation/tabpfn.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fedot/core/operations/evaluation/tabpfn.py b/fedot/core/operations/evaluation/tabpfn.py index 340bc7a93a..2d9b5b6a50 100644 --- a/fedot/core/operations/evaluation/tabpfn.py +++ b/fedot/core/operations/evaluation/tabpfn.py @@ -1,10 +1,7 @@ from typing import Optional -import numpy as np -import torch - from fedot.core.data.data import InputData, OutputData -from fedot.core.operations.evaluation.evaluation_interfaces import EvaluationStrategy, is_multi_output_task +from fedot.core.operations.evaluation.evaluation_interfaces import EvaluationStrategy from fedot.core.operations.evaluation.operation_implementations.models.tabpfn import \ FedotTabPFNClassificationImplementation, FedotTabPFNRegressionImplementation, \ FedotAutoTabPFNClassificationImplementation, FedotAutoTabPFNRegressionImplementation From 811c6170c666cc055b6945bd3ae72700ffdfd00e Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 19:27:29 +0300 Subject: [PATCH 26/35] Added TabPFN path in FEDOT dir --- .../evaluation/operation_implementations/models/tabpfn.py | 8 +++++++- fedot/core/operations/evaluation/tabpfn.py | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py index b83b3b0306..309ee25a36 100644 --- a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py +++ b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py @@ -11,7 +11,8 @@ class FedotTabPFNImplementation(ModelImplementation): __operation_params = [ 'enable_categorical', 'max_samples', - 'max_features' + 'max_features', + 'model_path' ] def __init__(self, params: Optional[OperationParameters] = None): @@ -20,6 +21,11 @@ def __init__(self, params: Optional[OperationParameters] = None): self.model_params = { k: v for k, v in self.params.to_dict().items() if k not in self.__operation_params } + + model_path = self.params.get('model_path', None) + if model_path is not None: + self.model_params['model_path'] = model_path + self.model = None self.classes_ = None diff --git a/fedot/core/operations/evaluation/tabpfn.py b/fedot/core/operations/evaluation/tabpfn.py index 2d9b5b6a50..cf137233c1 100644 --- a/fedot/core/operations/evaluation/tabpfn.py +++ b/fedot/core/operations/evaluation/tabpfn.py @@ -1,3 +1,4 @@ +import os from typing import Optional from fedot.core.data.data import InputData, OutputData @@ -7,6 +8,7 @@ FedotAutoTabPFNClassificationImplementation, FedotAutoTabPFNRegressionImplementation from fedot.core.operations.operation_parameters import OperationParameters from fedot.core.repository.tasks import TaskTypesEnum +from fedot.core.utils import default_fedot_data_dir from fedot.utilities.random import ImplementationRandomStateHandler @@ -25,6 +27,12 @@ def __init__(self, operation_type: str, params: Optional[OperationParameters] = self.max_samples = params.get('max_samples', 1000) self.max_features = params.get('max_features', 500) + model_path = params.get('model_path', None) + if model_path == "auto": + model_path = os.path.join(default_fedot_data_dir(), 'tabpfn') + + self.model_path = model_path + def fit(self, train_data: InputData): check_data_size( data=train_data, From b4f0fe0744d983b584a467ac4f8bbcbf1918c743 Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 19:37:06 +0300 Subject: [PATCH 27/35] Change Python version from 3.8 to 3.9 in publish_pypi.yml --- .github/workflows/publish_pypi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_pypi.yml b/.github/workflows/publish_pypi.yml index 633f8df53b..ef255c4c9d 100644 --- a/.github/workflows/publish_pypi.yml +++ b/.github/workflows/publish_pypi.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ 3.8 ] + python-version: [ 3.9 ] steps: - uses: actions/checkout@v2 From 120341f69f8d2557847b85ac5d5940cce267a8ef Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 19:42:18 +0300 Subject: [PATCH 28/35] Change Python version from 3.8 to 3.9 in .readthedocs.yml --- .readthedocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index b37d7d4c3c..6c32252236 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -8,7 +8,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.8" + python: "3.9" # Build documentation in the docs/ directory with Sphinx sphinx: From 061378f5555e7f867db9b80d3765822297486d0e Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 19:49:32 +0300 Subject: [PATCH 29/35] Replace tabpfn-requirements to requirements[extra] --- other_requirements/extra.txt | 2 ++ requirements.txt | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/other_requirements/extra.txt b/other_requirements/extra.txt index cf2980ec4f..04698766c4 100644 --- a/other_requirements/extra.txt +++ b/other_requirements/extra.txt @@ -1,6 +1,8 @@ # DNNs tensorflow >= 2.8.0; python_version >= '3.8' torch >= 1.9.0 +tabpfn >= 2.0.0 +tabpfn-extensions >= 0.0.4 # Images opencv-python >= 4.5.5.64 diff --git a/requirements.txt b/requirements.txt index cf1436a159..e0d252ae8c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,9 +16,6 @@ anytree>=2.8.0 catboost>=0.25.0 lightgbm>=3.0.0 xgboost>=1.4.0 # to prevent warnings -torch>=1.9.0 -tabpfn>=2.0.0 -tabpfn-extensions>=0.0.4 statsmodels>=0.12.0 ete3>=3.1.0 networkx>=2.4, !=2.7.*, !=2.8.1, !=2.8.2, !=2.8.3 From f052e9e2764432eef4254207d4a9116f8294b579 Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 20:08:11 +0300 Subject: [PATCH 30/35] Change sphinx version to match Python 3.9 --- other_requirements/docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/other_requirements/docs.txt b/other_requirements/docs.txt index bb5e855d75..2bcb8cfd39 100644 --- a/other_requirements/docs.txt +++ b/other_requirements/docs.txt @@ -1,4 +1,4 @@ -sphinx==4.2.0 +sphinx==5.3.0 sphinx_rtd_theme==1.0.0 readthedocs-sphinx-search==0.3.2 sphinxcontrib-details-directive From e62b5b2714eac2fb5ea4a1021f8aa24b1ef8d08d Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 20:15:10 +0300 Subject: [PATCH 31/35] Change sphinx version to 5.0.0 --- other_requirements/docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/other_requirements/docs.txt b/other_requirements/docs.txt index 2bcb8cfd39..3a81153af3 100644 --- a/other_requirements/docs.txt +++ b/other_requirements/docs.txt @@ -1,4 +1,4 @@ -sphinx==5.3.0 +sphinx==5.0.0 sphinx_rtd_theme==1.0.0 readthedocs-sphinx-search==0.3.2 sphinxcontrib-details-directive From 254b8f6c89bdcc58c42788abc2427f94dd3507d5 Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 20:16:21 +0300 Subject: [PATCH 32/35] Rollback to init sphinx version --- other_requirements/docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/other_requirements/docs.txt b/other_requirements/docs.txt index 3a81153af3..bb5e855d75 100644 --- a/other_requirements/docs.txt +++ b/other_requirements/docs.txt @@ -1,4 +1,4 @@ -sphinx==5.0.0 +sphinx==4.2.0 sphinx_rtd_theme==1.0.0 readthedocs-sphinx-search==0.3.2 sphinxcontrib-details-directive From 5c67de98a0ee0aedb95191f38e47f6b653e73759 Mon Sep 17 00:00:00 2001 From: martilut Date: Mon, 4 Aug 2025 20:21:36 +0300 Subject: [PATCH 33/35] Change sphinx version to 5.3.0 --- other_requirements/docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/other_requirements/docs.txt b/other_requirements/docs.txt index bb5e855d75..2bcb8cfd39 100644 --- a/other_requirements/docs.txt +++ b/other_requirements/docs.txt @@ -1,4 +1,4 @@ -sphinx==4.2.0 +sphinx==5.3.0 sphinx_rtd_theme==1.0.0 readthedocs-sphinx-search==0.3.2 sphinxcontrib-details-directive From 68d1ad3f2efc766cb4283453d7056107905b1bdb Mon Sep 17 00:00:00 2001 From: martilut Date: Tue, 5 Aug 2025 15:55:51 +0300 Subject: [PATCH 34/35] Fix model_path assignment --- .../evaluation/operation_implementations/models/tabpfn.py | 7 ++++++- fedot/core/operations/evaluation/tabpfn.py | 8 -------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py index 309ee25a36..17c194b7ee 100644 --- a/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py +++ b/fedot/core/operations/evaluation/operation_implementations/models/tabpfn.py @@ -1,3 +1,5 @@ +import os + import numpy as np from tabpfn import TabPFNClassifier, TabPFNRegressor from tabpfn_extensions.post_hoc_ensembles.sklearn_interface import AutoTabPFNClassifier, AutoTabPFNRegressor @@ -5,6 +7,7 @@ from fedot.core.data.data import InputData, OutputData from fedot.core.operations.evaluation.operation_implementations.implementation_interfaces import ModelImplementation from fedot.core.operations.operation_parameters import OperationParameters +from fedot.core.utils import default_fedot_data_dir class FedotTabPFNImplementation(ModelImplementation): @@ -23,7 +26,9 @@ def __init__(self, params: Optional[OperationParameters] = None): } model_path = self.params.get('model_path', None) - if model_path is not None: + if model_path == "auto": + self.model_params['model_path'] = os.path.join(default_fedot_data_dir(), 'tabpfn') + elif model_path is not None: self.model_params['model_path'] = model_path self.model = None diff --git a/fedot/core/operations/evaluation/tabpfn.py b/fedot/core/operations/evaluation/tabpfn.py index cf137233c1..2d9b5b6a50 100644 --- a/fedot/core/operations/evaluation/tabpfn.py +++ b/fedot/core/operations/evaluation/tabpfn.py @@ -1,4 +1,3 @@ -import os from typing import Optional from fedot.core.data.data import InputData, OutputData @@ -8,7 +7,6 @@ FedotAutoTabPFNClassificationImplementation, FedotAutoTabPFNRegressionImplementation from fedot.core.operations.operation_parameters import OperationParameters from fedot.core.repository.tasks import TaskTypesEnum -from fedot.core.utils import default_fedot_data_dir from fedot.utilities.random import ImplementationRandomStateHandler @@ -27,12 +25,6 @@ def __init__(self, operation_type: str, params: Optional[OperationParameters] = self.max_samples = params.get('max_samples', 1000) self.max_features = params.get('max_features', 500) - model_path = params.get('model_path', None) - if model_path == "auto": - model_path = os.path.join(default_fedot_data_dir(), 'tabpfn') - - self.model_path = model_path - def fit(self, train_data: InputData): check_data_size( data=train_data, From 1b89daea486d7063c8d2322c85b0d5839e73cd8b Mon Sep 17 00:00:00 2001 From: martilut Date: Tue, 5 Aug 2025 18:07:28 +0300 Subject: [PATCH 35/35] Remove Python 3.8 from .travis.yml --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3c2f5e2b50..b58383f3a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: python python: - - "3.8" - "3.9" - "3.10"