Skip to content

Зацикливание при бесконечном значении функции #132

@YamLyubov

Description

@YamLyubov

Сейчас пробую добавить оптимизатор 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions