Головоломка специалиста по данным: мы очистили данные, сделали предположения для моделирования и с нетерпением загрузили sklearn; все, что стоит между нами и соревновательной славой Kaggle, - это эти надоедливые гиперпараметры. Как мы их выбираем?

Эффективность модели часто сводится к трем ключевым компонентам: данные, соответствие модели и выбор гиперпараметров. Мы можем рассматривать данные и класс модели как ингредиенты в величайшем рецепте черничных маффинов, но даже они не спасут продукт от пекаря, который ставит их в духовку при 300 ° C на три часа. Как мы можем помочь ему найти эти оптимальные настройки?

Оптимизация гиперпараметров

Искусство оптимизации гиперпараметров модели называется, как вы уже догадались, оптимизацией гиперпараметров. На этом этапе моделирования мы ставим вопрос: какой выбор настроек модели дает наилучшую производительность в моем наборе данных проверки?

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

мы узнаем β из наших данных y и X. Если X содержит много функций с некоторой базовой структурой корреляции, мы можем захотеть использовать что-то вроде L1, L2 или регуляризации elasticNet, чтобы уменьшить переоснащение.

Оптимизация гиперпараметров помогает нам ответить на такие вопросы, как «какой метод регуляризации мне выбрать?» и «какое значение для параметра регуляризации я должен установить?». Мы можем настроить другие модели, такие как случайный регрессор леса, задав вопрос: «Сколько деревьев мне нужно?» и «какой должна быть максимальная глубина дерева?».

Поиск по сетке

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

Выше представлены два класса моделей, настроенные для набора данных игрушек со 100 функциями и 1000 образцами. В этом поиске по сетке каждая пара гиперпараметров используется для обучения новой модели с оценкой эффективности валидации на удерживаемом наборе данных. Хотя это относительно возможно в модели Elastic Net (Рис. 1. Слева), это может быть чрезвычайно затратным с точки зрения вычислений в случае непараметрического класса модели, такого как Random Forest Regression (Рис. 1. Справа).

Поиск по сетке - это детерминированный подход к настройке гиперпараметров: мы рассматриваем каждую конфигурацию гиперпараметров независимо. Ключевое наблюдение за поверхностями на рис. 1. состоит в том, что они непрерывны и хорошо себя ведут (если мы знаем какую-либо точку на поверхности с уверенностью, мы можем взять приличную угадайте значения рядом с ним). Поэтому, если вместо этого мы воспользуемся вероятностным подходом, мы сможем аппроксимировать поверхности на рис. 1., используя гораздо меньшее количество обученных моделей. Вот где невероятно полезна байесовская оптимизация.

Байесовская оптимизация

Правило Байеса позволяет нам задать следующий вопрос: у меня есть некоторое предварительное мнение о том, как будет выглядеть моя поверхность ошибки, у меня есть класс модели и данные, которые я могу использовать для сбора больше свидетельств, как мне обновить поверхность ошибки, используя недавно собранные свидетельства, чтобы получить апостериорную оценку оптимального гиперпараметра?

Для начала нам нужна гибкая, масштабируемая и хорошо управляемая модель, чтобы аппроксимировать поверхность ошибок моей регрессионной модели по нашим гиперпараметрам. В байесовской оптимизации это называется суррогатной моделью. Предположим, мы настраиваем гиперпараметр Lambda для модели регрессии Ridge, которая принимает значения в [0,1] в реализации python sklearn.

Мы предполагаем, что наша ошибка проверки является функцией этого гиперпараметра, но не уверены, какую форму принимает эта функция. Поскольку у нас еще нет никаких доказательств, мы можем начать с предположения о неинформативной структуре, в которой каждое значение ошибки независимо извлекается из стандартного нормального распределения со средним значением 0 и стандартным отклонением 1. Это нанесено на область лямбда на рис. . ниже.

Вы можете представить бесконечное количество отдельных нормальных распределений, собранных вдоль оси x, с заштрихованной областью, представляющей +/- 1 стандартное отклонение от среднего с центром в 0. Ранее мы заявляли, что наша уверенность в отношении значения предложенной точки должна увеличиваются, когда известны близкие к нему точки; нам нужно закодировать эту зависимость в ковариационной структуре.

Здесь особенно полезны функции ядра, они измеряют сходство между любыми двумя заданными точками и могут использоваться для установки априорного распределения по всем возможным ковариационным матрицам. Схожие значения L1-Ratio с большей вероятностью будут иметь схожие распределения ошибки модели, чем отдаленные значения, и это закодировано в нашем выборе функции ядра. Самое лучшее в этом то, что мы можем использовать его для настройки предшествующих распределений по функциям. У этой конструкции есть специальное название: предшествующий гауссовский процесс (GP). Подробный обзор GP, включая различные типы функций ядра и их приложения для байесовской оптимизации, можно найти здесь.

Мы будем использовать ядро Matern как априор для ковариационной матрицы нашей суррогатной функции. Выборка значений из нашего предыдущего дает нам распределение строк:

Чтобы обновить нашу предыдущую версию, мы можем начать со случайной выборки Lambda и использовать ее для обновления суррогатной функции. Подгоняя модель регрессии хребта к тому же набору данных игрушек, что и раньше, мы можем вычислить коэффициент детерминации при Lambda = 0,1; мы видим, что неопределенность вокруг точек, прилегающих к нему, значительно уменьшается:

В идеале, мы хотели бы, чтобы наша следующая выборка лямбды имела более высокое ожидаемое значение коэффициента детерминации, чем наша текущая выборка. К этому можно подойти, используя функцию сбора данных, например Ожидаемое улучшение (EI). Мы можем рассчитать это непосредственно из нашей суррогатной модели и использовать ее, чтобы предложить следующую точку для оценки.

Мы можем выполнять итерацию между оценкой, выборкой, оценкой и выборкой столько, сколько захотим; разработчик моделей выбирает компромисс между точностью и вычислительной нагрузкой. Ниже приведены графики следующих четырех раундов обновлений:

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

В заключение: байесовская оптимизация с использованием априорных значений гауссовских процессов - чрезвычайно полезный инструмент для настройки гиперпараметров модели при минимизации общих вычислительных затрат. Тем, кто хочет узнать больше, я определенно рекомендую обзор этого района Питером Фрейзером. Thomas Huijskens разработал отличный ресурс python для байесовской оптимизации с использованием ожидаемого улучшения.

Да пребудет с вами байесовская сила и все ваши усилия Кагглинга.