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

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

Начнем с импорта необходимых библиотек.

Теперь давайте получим наш набор данных.

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

Прежде чем мы оптимизируем веса для средневзвешенного значения, давайте сначала установим базовый уровень, взяв простое среднее значение по всем прогнозам моделей.

Мы будем использовать значения параметров по умолчанию для всех наших моделей.

Мы получаем оценку MSE 0,26. Давайте посмотрим, сможем ли мы победить его, используя оптимальное средневзвешенное значение.

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

Нежное знакомство с Optuna

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

Благодаря высокой модульности Optuna мы можем использовать ее для нашей задачи поиска оптимальных весов для получения средневзвешенного значения и многого другого.

Как работает Оптуна?

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

Затем Optuna требует от нас создать новое исследование, передать ему параметр направления и вызвать его функцию оптимизации, передав ему целевую функцию, которую мы создали ранее, и количество испытаний. Количество испытаний определяет, сколько раз объект исследования будет запускать целевую функцию, получать в ответ значение оценки, а затем в зависимости от возвращаемого значения и направления, которое мы указали для направления parameter (максимизация или минимизация), он выберет следующий набор значений для гиперпараметров, который, по его мнению, даст лучший результат.

Достаточно с теорией, давайте запачкаем руки реальной реализацией!

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

Важно помнить, что все имена, которые вы передаете функциям, должны быть уникальными!

Затем мы создаем новое исследование и вызываем его метод оптимизации. Мы передаем параметр minimize в параметр direction, потому что чем меньше среднеквадратическая ошибка (mse), тем лучше наша модель или ансамбль.

После завершения исследования мы можем получить доступ к наилучшему результату, полученному с помощью study.best_value, который в данном случае возвращает 0,21, и получить доступ к параметрам, которые достигли этого наилучшего значения, с помощью изучать.best_params. Обратите внимание, что атрибут best_params в этом случае вернет только значения для двух весов, для которых Optuna предлагала значения. Формула для третьего была определена нами. Но получить максимальную отдачу несложно. Все, что вам нужно сделать, это вычесть лучшие значения двух других весов из 100, как в целевой функции.

В любом случае, наша сборка с использованием оптимизированного средневзвешенного значения привела к среднеквадратической ошибке (mse) до 0,21 по сравнению с 0,26, которую мы получили, взяв простое среднее значение прогнозов одни и те же модели. Следовательно, преимущество оптимизации весов для получения средневзвешенного значения выглядит довольно очевидным.

Выводы:

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

2. Благодаря высокой модульности Optuna мы можем очень быстро и эффективно подобрать оптимальные веса для нашего ансамбля.

Я надеюсь, что вы нашли эту статью полезной! Блокнот со всем кодом и комментариями вы можете найти на GitHub. Поскольку это моя первая статья, я буду рад любым отзывам, поскольку они помогут мне улучшить и создать более качественный контент. Вы можете связаться со мной в Твиттере или в комментариях.