ПОЧЕМУ неявные данные?
Поскольку мы, как ленивые пользователи, почти не выставляем оценки (явные данные) для всего, что мы делаем на любой платформе, будь то Netflix, Amazon, LinkedIn и т. Д.
Мы просто следим за фильм (неявные данные), просмотрите продукт или щелкните элемент вакансии в LinkedIn и просто двигайтесь дальше.

Предложение соответствующих рекомендаций практически каждому потребителю, с которым сталкивается бизнес, очень важно для превращения потенциальных клиентов в клиентов. А персонализация - это ключ к созданию механизма рекомендаций (RE), мы видим его на Netflix, Amazon, LinkedIn, и он даже существует на черном рынке в Интернете.
Полный код этого проекта находится в моем профиле GitHub.

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

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

Итак, имея неявные данные, вы в действительности не знаете, если покупатель нажал на товар, он ему действительно понравился или нет?

Давайте решим проблему работы с неявными данными при построении RE.
Мы разделим этот блог на 3 части:

  1. Алгоритм совместной фильтрации для создания Rec Engine
  2. Понимание того, как совместная фильтрация работает с неявными данными
  3. Давайте КОД: попрактикуйтесь в двух вышеупомянутых случаях, используя pySpark (MLlib).

1. Совместная фильтрация (CF)

Если вы уже понимаете концепцию совместной фильтрации, вы можете пропустить этот раздел.

Основная идея CF очень проста. Допустим, у вас есть пользователь «X», и вы хотите порекомендовать вакансии «X», CF поможет вам найти группу пользователей «N», чьи симпатии и антипатии аналогичны пользователю «X». Как только этот набор из N пользователей рассчитан, мы можем рекомендовать задания, которые понравились этому набору 'N', пользователю X.

Теперь вопрос в том, как CF помогает вам найти группу из «N» пользователей, похожих на «X». В основном есть два способа найти группу 'N' похожих пользователей:

  1. Подход, основанный на памяти: использует понятие косинусного сходства и находит k ближайших соседей для вычисления оценок для элементов, не оцененных пользователем (скажем, пользователь «X»).
  2. Подход на основе моделей: использует понятие матричной факторизации (SVD), кластеризации или моделей глубокого обучения (машины Больцмана с ограничениями) для прогнозирования оценок пользователей.

В этом посте мы поговорим о наиболее часто используемом методе CF:

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

Факторизация матрицы (MF):

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

Разложение по сингулярным значениям (SVD) - один из таких методов уменьшения размерности, который выполняет внутреннюю факторизацию матрицы.

Теперь, когда матрицы внедрения пользователя и фильма созданы, вектор внедрения пользователя (любая отдельная строка) любого пользователя (скажем, «X») умножается на векторы внедрения фильма, чтобы получить прогнозируемые значения рейтингов.

Прогноз модели рейтинга (3,25 в желтой ячейке) = Точечное произведение 2 зеленых векторов (векторы внедрения) + 0,14 (смещение фильма) + 0,87 (смещение пользователя) [4]

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

ПРИМЕЧАНИЕ. Мы не будем учитывать прогнозируемые рейтинги, если фактические рейтинги отсутствуют, для расчета RMSE.

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

Необязательно: чтобы больше узнать об алгоритме CF, вы можете посмотреть это видео Эндрю Нг на Coursera: Связь (подход на основе модели), а второй объясняет подход на основе памяти из класса интеллектуального анализа данных Стэнфордского университета. : "Ссылка". Для практической практики в Excel: Link и разные типы CF: Link

2. Совместная фильтрация с неявными данными

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

Большинство методологий, используемых в этом разделе, взято из этого исследования: Ссылка

Числовые значения неявной обратной связи описывают частоту действий, например сколько раз вы нажимаете на сообщения о вакансиях в Data Science, как долго вы смотрите сериал на Netflix, сколько раз вы слушаете песню и т. д. Мы используем эти неявные числа, предоставленные пользователями, чтобы подтвердить уверенность в предпочтениях пользователей или их отсутствии. Предпочтение (pui) пользователя «u» по отношению к элементу «i» определяется следующим уравнением:

где ‘rui’ - записанное значение элемента (например, количество раз, когда вы слушаете песню). Таким образом, если записанное значение больше 0, предпочтение равно 1, а если оно равно 0, предпочтение равно 0.

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

В целом, по мере роста "rui" у нас появляется все более сильное указание на то, что пользователю действительно нравится этот элемент. ‘cui’, измеряет нашу уверенность в соблюдении g ‘pui’. Мы можем заметить, что даже для пары пользовательских элементов с 0 'rui', означающим отсутствие предпочтений в отношении элемента, у нас есть связанная минимальная достоверность 1. И эта достоверность для 'pui', равная 1, увеличивается по мере того, как доказательство для положительных предпочтений увеличивается.

Скорость увеличения регулируется постоянным параметром настройки α.

Предполагается, что предпочтениями являются внутренние продукты: pui = (Transpose) U. X

Теперь мы вычислим две матрицы: матрицу встраивания пользователей ('U') и матрицу встраивания элементов ('X'), как мы делали в методе совместной фильтрации: объяснено выше только с двумя отличиями от того, что мы делали в случае явных данных:

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

Вложения / коэффициенты вычисляются путем минимизации следующей функции стоимости:

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

3. Код PySpark для создания крупномасштабных рабочих мест Rec Engine

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

Давайте приготовим некоторые данные.

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

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

Обратите внимание на 4 гиперпараметра, используемые для настройки в методе альтернативных наименьших квадратов (функция ALS.trainImplicit) в приведенном выше коде:

  1. ранг: обозначает ширину / столбцы матриц вложения
  2. iters (итерации): обозначает, сколько раз мы генерируем колебания в процессе ALS для генерации матриц вложения.
  3. альфа: относится к масштабу записей (количество раз, когда пользователь выполняет какое-либо действие: просмотр фильмов) в уравнении достоверности
  4. регуляторов (лямбда): параметр регуляризации для предотвращения чрезмерной подгонки

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

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

Чтобы увидеть полную демонстрацию проекта с готовым набором данных, используемым в этой статье, перейдите по ссылке GitHub link.

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

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

Ссылки

[1] RE Изображение: ссылка

[2] https://www.youtube.com/watch?v=h9gpufJFF-0&t=23s

[3] https://www.edx.org/course/big-data-analysis-apache-spark-uc-berkeleyx-cs110x

[4] https://towardsdatascience.com/collaborative-filtering-and-embeddings-part-1-63b00b9739ce

[5] http://yifanhu.net/PUB/cf.pdf

[6] https://databricks.com/session/building-an-implicit-recommendation-engine-with-spark

[7] https://github.com/GoogleCloudPlatform/spark-recommendation-engine/blob/master/pyspark/find_model_collaborative.py