Сейчас пробую добавить оптимизатор IOpt в FEDOT и столкнулась с такой проблемой.
Для задачи поиска гиперпараметров для композитных моделей машинного обучения бывает, что комбинация гиперпараметров может быть невалидной и для нее невозможно вычислить метрику (при обучении модели возвращается ошибка). В таком случае я попробовала возвращать оптимизатору худшее возможное значение метрики (для минимизации) - np.inf. Однако в таком случае алгоритм попадает в бесконечный цикл при попытке добавить dataItem в очередь, на первой итерации (это то, что мне удалось понять при дебаге, но возможно я не права).
Возможно, есть какой-то способ решить данную проблему? Подумала, что скорее всего поможет заменить np.inf на sys.maxsize, но решила все-таки рассказать о проблеме, вoзможно получится обработать такой экстремальный случай внутри IOpt.
Я использовала версию IOpt 0.1.6, но попробовала и текущую версию из main - алгоритм так же зависает.
Проблему сложно воспроизвести, если специально ничего не ломать, но вот код, который иногда ломается
import pandas as pd
from golem.core.tuning.iopt_tuner import IOptTuner
from fedot.core.data.data import InputData
from fedot.core.pipelines.pipeline_builder import PipelineBuilder
from fedot.core.pipelines.tuning.search_space import PipelineSearchSpace
from fedot.core.pipelines.tuning.tuner_builder import TunerBuilder
from fedot.core.repository.dataset_types import DataTypesEnum
from fedot.core.repository.tasks import TaskTypesEnum, Task, TsForecastingParams
from fedot.core.utils import fedot_project_root
search_space = PipelineSearchSpace().get_parameters_dict()
# Можно использовать
# pipeline = PipelineBuilder().add_node('cgru').build()
# чтобы сломать специально - тогда точно воспроизведется зацикливание
pipeline = PipelineBuilder().add_node('lagged').add_node('cgru').build()
task = Task(TaskTypesEnum.ts_forecasting, task_params=TsForecastingParams(forecast_length=10))
time_series = pd.read_csv(f'{fedot_project_root()}/examples/data/ts/beer.csv')
idx = time_series['idx'].values
time_series = time_series['value'].values
data = InputData(idx=idx,
features=time_series,
target=time_series,
task=task,
data_type=DataTypesEnum.ts)
tuner = TunerBuilder(task).with_tuner(IOptTuner).with_iterations(20).build(data)
tuner.tune(pipeline)
Датасет: https://github.com/aimclub/FEDOT/blob/master/examples/data/ts/beer.csv
Я использую FEDOT и требования для него из своей ветки: https://github.com/aimclub/FEDOT/tree/add-iopt (pr aimclub/FEDOT#1102)
FEDOT использует реализацию тюнера на основе IOpt из этой ветки GOLEM: https://github.com/aimclub/GOLEM/tree/iopt-tuner
Сам код IOptTuner: https://github.com/aimclub/GOLEM/blob/iopt-tuner/golem/core/tuning/iopt_tuner.py
Сейчас пробую добавить оптимизатор IOpt в FEDOT и столкнулась с такой проблемой.
Для задачи поиска гиперпараметров для композитных моделей машинного обучения бывает, что комбинация гиперпараметров может быть невалидной и для нее невозможно вычислить метрику (при обучении модели возвращается ошибка). В таком случае я попробовала возвращать оптимизатору худшее возможное значение метрики (для минимизации) -
np.inf. Однако в таком случае алгоритм попадает в бесконечный цикл при попытке добавить dataItem в очередь, на первой итерации (это то, что мне удалось понять при дебаге, но возможно я не права).Возможно, есть какой-то способ решить данную проблему? Подумала, что скорее всего поможет заменить
np.infнаsys.maxsize, но решила все-таки рассказать о проблеме, вoзможно получится обработать такой экстремальный случай внутри IOpt.Я использовала версию IOpt 0.1.6, но попробовала и текущую версию из main - алгоритм так же зависает.
Проблему сложно воспроизвести, если специально ничего не ломать, но вот код, который иногда ломается
Датасет: https://github.com/aimclub/FEDOT/blob/master/examples/data/ts/beer.csv
Я использую FEDOT и требования для него из своей ветки: https://github.com/aimclub/FEDOT/tree/add-iopt (pr aimclub/FEDOT#1102)
FEDOT использует реализацию тюнера на основе IOpt из этой ветки GOLEM: https://github.com/aimclub/GOLEM/tree/iopt-tuner
Сам код IOptTuner: https://github.com/aimclub/GOLEM/blob/iopt-tuner/golem/core/tuning/iopt_tuner.py