RecoTour: обзор алгоритмов рекомендаций на Python

Некоторое время назад мой друг спросил меня о подходах, которые были бы полезны при оптимизации GBM. В прошлом мне несколько раз задавали этот вопрос, поэтому я подумал, что могу поделиться кодом и написать об этом пост на случай, если кто-то сочтет это полезным. В процессе переписывания кода я подумал, что могу дать ему некоторый контекст и проиллюстрировать, как можно оптимизировать GBM в процессе построения алгоритма рекомендаций. Затем я закончил сценарий и подумал, что могу также включить некоторые другие алгоритмы и методы, используемые при построении алгоритма рекомендаций. Одно привело к другому, и был создан RecoTour, (скромный) обзор некоторых рекомендательных алгоритмов на Python.

Затем, через месяц после последней фиксации! (вы прочтете, почему) вот я ... пишу пост. В этом посте я кратко ознакомлюсь с содержанием репо, чтобы вы могли выбрать, какие записные книжки могут быть вам полезны (если таковые имеются). Я говорю «кратко», потому что репо содержит много кода и текста. Поэтому, если вам нужны подробности, загляните в соответствующий блокнот и дайте мне знать, если у вас есть какие-либо комментарии.

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

Как я упоминал ранее, существует много кода и контента, поэтому я решил структурировать репо в «главах», которые представляют собой записные книжки jupyter и представляют собой ядро ​​репо. Скрипты Python, на которых основаны эти записные книжки, находятся в каталогеpy_scripts. Блокноты должны быть самодостаточными, и, как следствие, есть некоторые повторения. Код в записных книжках, конечно, «ориентирован на записную книжку». Я включил более модульную и более красивую версию возможного «реального решения» в каталог final_recommendations, который подробно описан в Chaper16_final_solution_Recommendations.ipynb.

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

Вот что вы найдете в записных книжках:

  • Главы с 0 по 4: загрузка данных, предварительная обработка и подготовка

Эти главы включают перевод данных (часть набора данных идет на японском языке), разделение на обучение / проверку / тестирование и разработку функций пользователя / элемента. Код в этих главах может быть полезен для решения ряда проблем, связанных с машинным обучением. Есть несколько моментов, на которые следует обратить внимание. Например, проблема, с которой мы сталкиваемся здесь, связана с временной составляющей, поэтому мы не можем разбить данные наугад. Хотя это не редкость, при выполнении разделения данных добавляются некоторые интересные соображения, которые могут быть полезны для некоторых специалистов по данным. Кроме того, взаимодействие между пользователями и информацией об элементах предоставляет большое количество возможностей при разработке функций. Стоит отметить, что вся функциональная инженерия в ноутбуках выполняется вручную. Часть процесса можно было бы сократить, используя такие инструменты, как, например, featuretools.

В этой главе вводится показатель, который мы будем использовать для оценки нашей производительности, а именно Средняя средняя точность (MAP). Для завершения я решил включить хотя бы еще одну метрику оценки для алгоритмов рекомендаций. Имея это в виду, есть сценарий с именем using_ncdg.py в каталоге py_scripts, который предназначен для иллюстрации того, как можно было бы использовать Нормализованный дисконтированный совокупный прирост (NDCG) для этого конкретного проекта и набора данных.

  • Глава 6: самые популярные рекомендации

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

  • Глава 7: рекомендации на основе расстояния между пользователем и предметом.

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

  • Глава 8: создание набора данных о взаимодействиях / интересах.

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

  • Глава 9: совместная фильтрация на основе элементов KNN (CF).

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

Однако, как бы прямолинейно этот подход ни звучал (и это обычно так), существует предостережение при обращении к «проблеме Понпаре» и вообще к любому сценарию, при котором элементы, которые следует рекомендовать, никогда раньше не встречались (они… холодные). Я включил в репо способ решения этой проблемы, используя меру схожести элементов.

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

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

Здесь мы просто рекомендуем элементы, основанные на регрессии с использованием GBM, в частности, lightGBM. LightGBM стал одним из моих любимых алгоритмов / библиотек в более позднее время, и я считаю, что каждый специалист по данным должен иметь его в своем репертуаре вместе с xgboost и catboost.

Репо включает полное руководство по оптимизации GBM с использованием h yperopt и код, связанный с интерпретируемостью модели с использованием LIME и SHAP . В предыдущих главах я сравнивал гиперопт с s копт. Результаты в основном идентичны, поэтому выбор того или другого, я думаю, является делом предпочтений (в наши дни появляется ряд библиотек, которые могут оказаться полезными с точки зрения оптимизации гиперпараметров. Недавно я начал использовать hyperparameter_hunter) .

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

Как и KNN CF, это хорошо известный, широко используемый алгоритм с большим количеством литературы и примеров, доступных в Интернете. Тем не менее, я включил объяснение с математикой в ​​записную книжку и ссылку на хороший учебник.

Этот метод страдает теми же «ограничениями», что и описанные в главе 9, и может быть не лучшим решением для этой конкретной проблемы. Тем не менее, этот алгоритм должен быть включен в любой исчерпывающий список алгоритмов рекомендаций.

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

Это расширение FM, описанных в записной книжке Главы 12. Здесь также изучаются скрытые факторы относительно поля, соответствующего данной характеристике. Например, у вас может быть функция под названием Рекламодатель, и значение этой функции может быть Adidas. При вычислении скрытых факторов тот факт, что Adidas является значением функции Рекламодатель, кодируется в данных. Это может показаться сложным, но бумага вполне доступна и после прочтения все станет яснее. Кроме того, я также включил в записную книжку объяснение с кодом о том, как создать набор данных. В целом, я надеюсь, что это поможет понять, как информация о поле включается при подготовке данных.

Это первый алгоритм глубокого обучения, который я включил. Здесь серия плотных слоев (глубоких) сочетается с линейной моделью (широкая) в упражнении регрессии или классификации. Учитывая характер и размер данных, этот метод, безусловно, не подходит для этой конкретной проблемы, как я обсуждаю в блокноте. Однако я подумал, что было бы полезно включить его и сравнить, как относительно простой подход глубокого обучения сравнивается с другими более «традиционными подходами».

Раньше я пробовал эту технику на больших, «реальных» наборах данных, и могу сказать, что это был единственный метод, который работал лучше, чем подход GBM, описанный ранее. Учитывая относительную простоту модели и доступность построения моделей DL в наши дни, я бы рекомендовал попробовать, если ваш набор данных подходит.

Обратите внимание, что хотя я описал «глубокую сторону» модели как серию плотных слоев, это может быть что угодно, например сверточная или рекуррентная нейронная сеть, если это необходимо. Я считаю эту технику действительно гибкой и, при наличии адекватных данных, довольно мощной.

  • Глава 16: возможное окончательное решение

После использования всех предыдущих алгоритмов мы должны выбрать один из них в качестве «победителя» (неожиданность, неожиданность, lightGBM) и построить то, что могло бы стать потенциальным окончательным решением. Подробные сведения о решении и обоснование процесса построения алгоритма рекомендаций можно найти в записной книжке Главы 16. Сопутствующая модульная версия такого решения находится в каталоге final_recommendations.

Одна из причин, по которой мне потребовалось некоторое время, чтобы написать этот пост, заключается в том, что я хотел включить некоторый контент в NCF. Когда я впервые прочитал газету, я подумал, что это естественное продолжение Wide and Deep. Кроме того, учитывая относительную простоту модели, я подумал, что смогу проиллюстрировать использование различных кадров DL, а именно Keras (код Keras в основном основан на коде, выпущенном в исходной статье, поэтому полный кредит авторов), Gluon и Pytorch. Постепенно размер кода увеличивался, поэтому я решил проиллюстрировать использование 3 кадров DL с хорошо известным набором данных Movielens и сравнить результаты с результатами в исходной статье в отдельном репо.

РЕДАКТИРОВАТЬ (28 июня 2019 г.): NCF для набора данных Amazon Reviews теперь включен в репо RecoTour.

Будущая работа"

Как я упоминал ранее, одна из причин, по которой мне потребовалось некоторое время, чтобы сесть и написать этот пост, заключается в том, что я хотел включить NCF. С тех пор, около 6 недель назад, я путешествую по миру, и еще некоторое время буду путешествовать. Поэтому, хотя маловероятно, что я добавлю какой-либо контент в ближайшее время, вот что я собираюсь добавить, как только у меня будет время:

  • Другие наборы данных: я хочу добавить наборы данных, которые лучше подходят для методов DL, например наборы данных, включая текст и / или изображения.
  • Рекомендации на основе RNN: многие алгоритмы рекомендаций можно представить в виде последовательности шагов, которым следуют пользователи при навигации по веб-сайтам или приложениям. Такое представление хорошо подходит для рекомендаций на основе RNN.

А пока это все. В общем, надеюсь, кому-то будет полезно содержание репозиториев.

Весь код, упомянутый в этом посте, можно найти здесь и здесь. Если у вас есть комментарии, напишите мне: [email protected]