Где установить n_job: Estimator или GridSearchCV? - PullRequest
2 голосов
/ 27 мая 2020

Я часто использую GridSearchCV для настройки гиперпараметров. Например, для настройки параметра регуляризации C в Logisti c Regression . Всякий раз, когда используемый мной оценщик имеет свой собственный параметр n_jobs, я не понимаю, где его установить: в оценщике, в GridSearchCV или в обоих? То же самое относится к cross_validate.

1 Ответ

2 голосов
/ 28 мая 2020

Это очень интересный вопрос. У меня нет окончательного ответа, но некоторые элементы, которые стоит упомянуть, чтобы разобраться в проблеме, не упоминаются в комментариях.

Начнем с того, почему вам следует или не следует использовать многопроцессорность:

  • Многопроцессорность полезна для независимых задач. Это случай GridSearch, где все ваши различные варианты ваших моделей независимы.
  • Многопроцессорность бесполезна / замедляет работу, когда:
    • Задача слишком мала: создание нового процесса требует времени, и если ваша задача действительно небольшая, это накладные расходы с медленным выполнением всего кода
    • Создается слишком много процессов: ваш компьютер имеет ограниченное количество ядер. Если у вас больше процессов, чем ядер, механизм балансировки нагрузки заставит компьютер регулярно переключать запущенные процессы. Эти переключатели занимают некоторое время, что приводит к более медленному выполнению.

Первый вывод заключается в том, что вы не должны использовать n_jobs как в GridSearch, так и в модели вы оптимизируете, потому что вы создадите множество процессов и в конечном итоге замедлите их выполнение.

Теперь многие модели и функции sklearn основаны на Numpy / SciPy, которые, в свою очередь, обычно реализован на C / Fortran, поэтому уже использует многопроцессорность. Это означает, что они не должны использоваться с n_jobs> 1, установленным в GridSearch.

Если вы предполагаете, что ваша модель еще не распараллелена, вы можете установить n_jobs на уровне модели или на уровне GridSearch. Некоторые модели могут быть полностью распараллелены (например, RandomForest), но большинство из них могут иметь по крайней мере часть, которая является последовательной (например, Boosting). С другой стороны, GridSearch не имеет последовательного компонента по конструкции, поэтому имеет смысл установить n_jobs в GridSearch, а не в модели.

При этом, это зависит от реализации модели, и вы не можете получить окончательный ответ, не проверив себя в своем случае. Например, если конвейер по какой-то причине потребляет много памяти, установка n_jobs в GridSearch может вызвать проблемы с памятью.

В качестве дополнения, вот очень интересное примечание о параллелизме в склеарне

...