Практический пример применения полезных функций Scikit-learn, таких как конвейеры и поиск по сетке, в глубоком обучении.

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

Хотя нет недостатка в отличных руководствах для начала работы с удобными библиотеками, такими как Keras, было гораздо сложнее найти примеры, которые объединяют точки для новичков, демонстрируя, насколько полезны функции Scikit-learn, такие как конвейеры и сетка поиск может быть актуален и в глубоком обучении.

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

В этих блокнотах я использовал сочетание методов машинного обучения и глубокого обучения, чтобы попытаться предсказать характер дождя в Сингапуре в декабре 2019 года. Модели были обучены на 37-летних погодных данных в Сингапуре, с 1 января 1983 года до конца ноября. в 2019 году.

НОУТБУКИ, ДАННЫЕ И ПРЕДПОЛОЖЕНИЯ

Вот репозиторий Github для моей текущей серии проектов в области науки о данных с использованием исторических данных о погоде из Сингапура. Конкретные блокноты для этого поста можно найти здесь, здесь, здесь и здесь.

Для краткости я не буду вставлять код в этот пост. Записные книжки достаточно просты, и их легче читать на Github или при прямой загрузке.

Данные для этого поста были взяты с веб-сайта Сингапурская метеорологическая служба. Для простоты проекта была решена проблема бинарной классификации, чтобы предсказать, будет ли данный день дождливым (1) или засушливым (0). Я также решил не отбрасывать выбросы, чтобы предоставить модели как можно большему количеству данных.

Набор данных, который я использую, охватывает 37 лет, но он содержит чуть менее 13 500 строк данных. Справедливо спросить, нужно ли вам глубокое обучение для такого набора данных и обязательно ли оно дает лучшие результаты.

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

ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ

Я ненавижу листать длинный пост в блоге только для того, чтобы увидеть результаты, поэтому давайте быстро посмотрим, как модель XGB справилась с классификатором Keras при прогнозировании модели дождя / отсутствия дождя в Сингапуре в декабре 2019 года:

Модель Keras показала себя немного лучше, чем версия XGB, правильно классифицируя 26 дождливых / без дождевых дней из 31. Модель XGB справилась с 25 из 31.

Обе модели Keras и XGB обладали одной и той же слабостью в показателях отзыва (которые были относительно ниже по сравнению с показателями точности и f1), то есть в способности правильно классифицировать дождливые дни как таковые.

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

Теперь давайте рассмотрим каждый подход отдельно.

«Классический» подход к машинному обучению с использованием логистической регрессии и классификатора XGB

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

Функции конвейера и поиска по сетке Scikit-learn позволяют эффективно организовать обе задачи и выполнять их за один раз. В Блокноте 5.1 я решил сопоставить модель логистической регрессии с классификатором XGB.

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

Модель LogReg заняла всего несколько секунд для приличного поиска по сетке, в то время как классификатор XGB занял 7 часов (на 6-ядерном Mac Mini 2018) для поиска по сетке по 5 гиперпараметрам.

Модель XGB дала немного лучшие результаты и, по-видимому, может быть улучшена с помощью более полного поиска по сетке. Но стоит ли увеличение баллов на 0,02 дополнительных усилий? В данном случае это весьма спорно.

В любом случае я выбрал модель XGB, хотя ее производительность была лишь немного лучше, чем у модели LogReg. Давайте посмотрим на матрицу путаницы для прогнозов XGB на декабрь 2019 года:

Модель XGB правильно классифицирует 25 дождливых / засушливых дней из 31, давая ей оценку точности 0,8.

Модель ошибочно предсказала, что дождь будет идти 2 дня, хотя на самом деле они были солнечными (ложные срабатывания). Он также ошибочно предсказал 4 солнечных дня, когда на самом деле в те дни шел дождь (ложноотрицательные результаты).

Модель XGB является самой слабой с точки зрения ее отзыва, в данном случае это означает ее способность правильно определять дождливые дни как таковые (10 из 14). Может ли модель глубокого обучения работать лучше?

Классификатор Keras с поиском по сетке

Существует множество способов начать экспериментировать с моделями глубокого обучения. Я хотел начать с малого и посмотреть, смогу ли я интегрировать то, что я узнал в Scikit-learn, с новыми методами.

Keras быстро стал хорошим вариантом, учитывая наличие двух оболочек для Scikit-learn API (для классификации и регрессии). Я также полагался на два отличных онлайн-сообщения (здесь и здесь), чтобы составить руководство для моего кода для notebook 5.2.

Рабочий процесс по существу аналогичен стандартным подходам Scikit-learn, хотя один новый шаг потребовал немного проб и ошибок: определение функции, которая создает и возвращает последовательную модель Keras.

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

Конструкция конвейера / gridsearch по существу такая же, за исключением необходимости передать функцию Keras, которую вы определили, аргументу build_fn классификатора Keras.

Поиск по сетке с этими настройками на моем компьютере занял более 18 часов (только процессор). Отрегулируйте соответствующим образом, если вы хотите более быструю пробную версию. Давайте посмотрим на матрицу ошибок для прогнозов оптимизированного классификатора Keras:

Модель Keras показала лучшие результаты, чем модель XGB, правильно предсказав еще один день с дождливой погодой, то есть она правильно классифицировала 26 дождливых / засушливых дней из 31 по сравнению с 25 для модели XGB.

Модель ошибочно предсказала, что дождь будет идти 2 дня, хотя на самом деле они были солнечными (ложные срабатывания). Он также ошибочно предсказал 3 солнечных дня, когда на самом деле в те дни шел дождь (ложноотрицательные результаты).

Как и модель XGB, модель Keras также является самой слабой с точки зрения оценки запоминаемости, что в данном случае означает ее способность правильно определять дождливые дни как таковые (11 из 14). Давайте сравним метрики для прогнозов моделей XGB и Keras на проверочном наборе (данные о погоде за декабрь 2019 года):

Модель Keras явно превзошла версию XGB, но потребовала более чем в два раза больше времени для поиска по сетке. В реальных условиях повышение производительности привело к одному дополнительному дню правильного прогноза погоды из 31 дня в этом месяце.

Недавно я узнал о Keras Tuner и очень хотел посмотреть, может ли он дать лучшие результаты, чем подход Scikit-learn / grid search.

Керас тюнер

Есть как минимум 4 тюнера на выбор, но я решил попробовать только тюнеры Hyperband и RandomSearch. Я также решил использовать метод подкласса HyperModel, который сделал тестирование двух тюнеров более эффективным.

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

Keras Tuner был невероятно быстрым по сравнению с процессом поиска по сетке через Scikit-learn. К сожалению, мне не удалось добиться уровня точности выше 0,7, несмотря на несколько раундов проб и ошибок.

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

Конец примечания

Как ясно сказано во многих онлайн-статьях, именно характер и объем данных, с которыми вы имеете дело, в значительной степени определяют, будете ли вы использовать «классические» модели машинного обучения или подход глубокого обучения.

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

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

Как всегда, если вы заметите какие-либо ошибки в коде, напишите мне на @

Twitter: @chinhon

LinkedIn: www.linkedin.com/in/chuachinhon

Если вы заинтересованы в работе с набором данных о погоде в Сингапуре, вот мои предыдущие проекты, использующие те же записи: