Подбор гиперпараметров в Python
Alex Scriven
Data Scientist
До сих пор мы использовали ненаправленный поиск:
Ненаправленный поиск: каждая итерация подбора гиперпараметров не учитывает результаты предыдущих итераций.
Именно это позволяет распараллеливать работу. Но звучит не очень эффективно, не правда ли?
Текущий процесс:

Альтернативный подход:

Базовая стратегия направленного поиска:
Начните с грубого случайного подхода и постепенно сужайте область поиска.
Процесс:
Вместо шага (3) можно выполнить дополнительный случайный поиск перед поиском по сетке
Преимущества подхода от грубого к точному:
Не нужно тратить время на области поиска, которые не дают хороших результатов!
Примечание: настройка выполняется не на одной модели, а на пакетах
Рассмотрим пример со следующими диапазонами гиперпараметров:
max_depth_list от 1 до 65min_sample_list от 3 до 17learn_rate_list — 150 значений от 0,01 до 150Сколько возможных моделей получится?
combinations_list = [list(x) for x in product(max_depth_list, min_sample_list, learn_rate_list)]
print(len(combinations_list))
134400
Выполним случайный поиск по 500 комбинациям.
Визуализируем значения точности:

Какие модели оказались лучшими?
Лучшие результаты:
| max_depth | min_samples_leaf | learn_rate | accuracy |
|---|---|---|---|
| 10 | 7 | 0.01 | 96 |
| 19 | 7 | 0.023355705 | 96 |
| 30 | 6 | 1.038389262 | 93 |
| 27 | 7 | 1.11852349 | 91 |
| 16 | 7 | 0.597651007 | 91 |
Визуализируем значения max_depth в сравнении с точностью:

min_samples_leaf лучше при значениях ниже 8

learn_rate хуже при значениях выше 1,3

Что мы узнали после первой итерации:
max_depth в диапазоне от 8 до 30learn_rate меньше 1,3min_samples_leaf предпочтительно меньше 8Что дальше? Случайный или сеточный поиск с учётом полученных знаний!
Примечание: это был лишь бивариантный анализ. Можно рассматривать несколько гиперпараметров (3, 4 и более) на одном графике, но это выходит за рамки данного курса.
Подбор гиперпараметров в Python