В первой части этой серии мы изучили основы использования байесовской модели машинного обучения PyMC3 для построения простой модели линейной регрессии на данных Ford GoBike. В этом примере задачи мы стремились спрогнозировать количество гонщиков, которые будут использовать велопрокат завтра, на основе агрегированных атрибутов предыдущего дня. Этот тривиальный пример был просто холстом, на котором мы продемонстрировали наши байесовские мазки.
Подводя итог нашей предыдущей попытки: мы построили многомерную линейную модель на данных, и мы смогли понять распределение весов. Это контрастирует со стандартной моделью линейной регрессии, где вместо этого мы получаем атрибуты значений баллов. Эти дистрибутивы могут быть очень мощными! Насколько уверена ваша модель в том, что функция i управляет целевой переменной? С вероятностным программированием это упаковано внутри вашей модели. Мы сопоставили результаты нашей модели с результатами знакомой модели линейной регрессии sklearn и нашли паритет на основе метрики RMSE.
По правде говоря, мог бы я потратить на порядок больше времени и усилий на модель, которая дала бы такие же результаты? Даже при немного лучшем понимании результатов модели? Наверное, не в большинстве случаев. Я хочу понимания и результатов. Мы можем добиться этого с помощью байесовских моделей вывода, и PyMC3 хорошо подходит для этого.
Одна из функций, в которой так хорошо разбирается PyMC3, - это настраиваемые модели. Мои предыдущие знания о проблеме могут быть включены в решение. Неопределенность измерения можно оценить. Я могу объяснить многочисленные предубеждения, нелинейные эффекты, различные распределения вероятностей, и этот список можно продолжить. С такими пакетами, как sklearn или Spark MLLib, мы, энтузиасты машинного обучения, получаем молотки, и все наши проблемы выглядят как гвозди. С PyMC3 у меня есть 3D-принтер, который может создать идеальный инструмент для работы.
Один из самых простых и наглядных методов, которым вы можете научиться у PyMC3, - это иерархическая модель. Многие проблемы имеют структуру. В разные дни недели (сезоны, годы,…) люди ведут себя по-разному. Климатические модели разные. Если бы мы разрабатывали простую модель машинного обучения со стандартным подходом, мы могли бы горячо кодировать эти функции. Затем наша модель узнает эти веса. Мы также могли бы построить несколько моделей для каждой версии рассматриваемой задачи (например, зимние и летние модели).
Дело в том, что здесь мы отбрасываем некоторую информацию. Отдельные модели могут иметь общие скрытые черты. В иерархической байесовской модели мы можем изучать как грубые детали модели , так и точно настроенные параметры, относящиеся к определенному контексту. Наша проблема Ford GoBike - отличный тому пример. Если мы построим график всех данных для масштабированного количества гонщиков предыдущего дня (X) и посмотрим на количество гонщиков на следующий день (nextDay), мы увидим то, что выглядит как множественные линейные отношения. с разными уклонами. В последнем посте мы эффективно провели черту через большую часть данных, что минимизировало RMSE. Конечно, у нас была довольно хорошая модель, но похоже, что здесь не хватает важной информации.
Если мы построим данные только по субботам, мы увидим, что распределение гораздо более ограничено. Реальные данные, конечно, беспорядочные, и существует разброс в линейной зависимости. Однако сравните это с приведенным выше распределением, и между ними есть резкий контраст. Так что делать? Мы могли бы просто построить линейные модели для каждого дня недели, но это кажется утомительным для решения многих задач. Я предполагаю, что, хотя суббота и воскресенье могут иметь разные уклоны, у них есть некоторые общие черты. Умная модель могла бы извлечь некоторую пользу из их общих отношений.
Давайте построим простую иерархическую модель с одним параметром наблюдения: вчерашним числом гонщиков. Нашей целевой переменной останется прогнозируемое на сегодня количество гонщиков. Начнем с двух очень широких нормальных распределений: day_alpha и day_beta. Думайте об этом как о наших грубо настроенных параметрах, пересечениях и наклонах модели, предположениях, в которых мы не полностью уверены, но можем поделиться некоторой взаимной информацией. На основе этих широких распределений мы оценим наши точно настроенные параметры дня недели для альфа и бета. Здесь вступает в игру иерархия: day_alpha будет иметь некоторое распределение положительных наклонов, но каждый день будет немного отличаться. Наклон для понедельника (alpha [0]) будет нормальным распределением, взятым из нормального распределения day_alpha. Среда (alpha [1]) будет иметь некоторые характеристики понедельника, поэтому на нее будет влиять day_alpha, но она также будет уникальной в других отношениях. В этом магия иерархической модели.
Создав экземпляр нашей модели и обучив ее с помощью сэмплера NUTS, мы можем исследовать распределение параметров модели, которые оказались наиболее подходящими для нашей проблемы (так называемая трассировка). Мы видим, что наши day_alpha ( иерархический перехват) и day_beta (иерархический наклон) имеют довольно широкую форму и сосредоточены вокруг ~ 8.5 и ~ 0.8, соответственно. Переходя к параметрам альфа и beta для каждого отдельного дня, они однозначно распределяются в рамках апостериорного распределения иерархических параметров. Некоторые уклоны (параметры beta) имеют значения 0,45, в то время как в дни с высоким спросом наклон составляет 1,16!
Более того, параметры каждого дня выглядят достаточно хорошо установленными. Мы можем видеть это, потому что распределение имеет очень центральный пик (графики слева) и по сути выглядит как горизонтальная линия, пересекающая последние несколько тысяч записей (графики справа).
Мы также можем увидеть распределение следов в числовом виде. Иерархические значения альфа и бета, безусловно, имеют наибольшее стандартное отклонение. Для сравнения, каждый отдельный день довольно хорошо ограничен с небольшой дисперсией.
Как и в последней модели, мы можем проверить наши прогнозы с помощью RMSE. На тренировочном наборе у нас мизерная погрешность гонщика +/- 600. В Части I нашего рассказа наша 6-мерная модель имела ошибку обучения 1200 байкеров!
Наши невидимые (прогнозируемые) данные также намного лучше, чем в нашей предыдущей модели. Модели sklearn LR и PyMC3 имели среднеквадратичное значение около 1400. Эта простая модель с одной функцией в два раза мощнее нашей предыдущей версии.
Мы могли бы даже сделать это более изощренным. Что, если бы для каждой из наших 6 функций в нашей предыдущей модели у нас было иерархическое апостериорное распределение, из которого мы черпали? Мы могли добавлять слои иерархии, вкладывая данные сезонности, погодные данные и многое другое в нашу модель по своему усмотрению.
В PyMC3 вам предоставляется большая гибкость в том, как вы строите свои модели. Это абсолютно занимает больше времени, чем использование заранее подготовленного подхода, но преимущества понимания исходных данных, неопределенности модели и минимизации ошибок могут перевесить затраты.
Как всегда, не стесняйтесь проверять репозитории Kaggle и Github. Пожалуйста, добавляйте комментарии или вопросы ниже! Спасибо за чтение.