Что такое рекомендательные системы?

Вы видели это везде. Каждая крупная технологическая компания теперь использует какую-то систему рекомендаций на своей платформе. Facebook предлагает друзьям, Netflix рекомендует фильмы, также Youtube и видео, а Amazon рекомендует… все. Почему они это делают? Что ж, каждый случай индивидуален, но в целом хорошие рекомендации означают лучший пользовательский опыт, и они найдут новые способы, чтобы пользователи были вовлечены и были довольны услугой. Счастливые пользователи равны постоянным пользователям.

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

Внедрение рекомендательной системы

Во-первых, давайте поговорим о теории, лежащей в основе рекомендательных систем. Есть много разных подходов:

  1. На основе содержания. Как видно из названия, эти рекомендации основаны на содержании рекомендуемого нами продукта. Например, если пользователю нравятся детективы, мы собираемся порекомендовать ему больше детективов.
  2. Совместная фильтрация. В этом случае предпочтения пользователя сохраняются (например, в виде оценок), а затем мы находим пользователей, похожих на их предпочтения. Таким образом, если мы знаем, что два пользователя похожи, мы можем порекомендовать продукт, который понравился одному из них, другому.
  3. Гибрид: смесь этих двух продуктов, рекомендующая продукты на основе их содержания, а также на основе схожих предпочтений пользователей.

В этом случае я использовал подход совместной фильтрации.

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

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

Матричная факторизация спешит на помощь

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

  • Разложение по единственному значению (SVD): как для отрицательных, так и для положительных значений. Полезно для вычисления собственных векторов. Он не работает с пропущенными значениями, поэтому требуется вменение значений, которое может вызвать дополнительный шум. Классический пример - PCA.
  • Неотрицательная матричная факторизация (NMF): только положительные значения. Он отлично работает с разреженными матрицами, поскольку предположение об отсутствующем значении встроено в алгоритм.

В нашей задаче у нас большая разреженная матрица, и нам нужно предсказать пропущенные значения. Естественно, имеет смысл использовать методику NMF.

Помните, в начальной школе вы узнали об основах факторизации? Я освежу твою память. Он состоит в нахождении таких множителей числа, что при их умножении результатом будет исходное число. Например, если мы разложим на множители 15, мы получим 3 и 5.

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

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

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

Теперь более сложный пример: обогащение данных.

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

Проект: просто CSV-файл (или несколько CSV-файлов, связанных вместе), так что вы можете представить его просто как таблицу; строки и столбцы.

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

Так, например, проект может представлять собой таблицу компаний, в столбцах которой указаны имя_компании, веб-сайт, адрес и т. Д. company_name может добавлять дополнительные столбцы, такие как phone_number, business_owner и т. д.

Наши «Пользователи» будут проектами, а наши «Книги» будут фактическим обогащением данных. Мы порекомендуем дополнения к проекту, проанализировав похожие проекты и посмотрев, что в них сработало.

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

Моделирование

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

Нам нужно настроить один гиперпараметр - размер вложения (K). Это может быть любое число, но обычно число от 20 до 50 дает хорошие результаты. Если у нас есть N проектов, наш слой ProjectEmbedding будет иметь размер N x K, а если у нас есть M обогащений, наше EnrichmentEmbedding будет иметь размер M x K.

Я построил эту нейронную сеть с помощью Tensorflow, но вы также можете сделать это с помощью PyTorch, особой разницы нет.

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

Прогнозирование

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

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

Здесь вы можете видеть, что я использовал Tensorboard для визуализации обоих вещей. На графике PCA мы можем видеть, как все обогащения OSM (открытые карты улиц) сгруппированы вместе, и их косинусное сходство доказывает, что они очень похожи друг на друга.

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

  1. Выберите Проект, для которого мы хотим получить рекомендации по расширению
  2. Найдите соответствующий вектор во вкладке Проект Встроенная матрица.
  3. Выполните матричное умножение между вектором и всей матрицей вложения обогащения.
  4. Сортировать результаты
  5. Выберите 5 лучших (или желаемое количество рекомендаций)

Вывод

Рекомендательные системы невероятно полезны для улучшения пользовательского опыта и поддержания активности пользователей. Тем не менее, это не единственное применение такой системы. В этой статье я показал, как даже в ситуациях, когда рекомендации не предназначены непосредственно для пользователей, мы можем применять те же концепции для решения конкретных бизнес-проблем, с которыми мы можем столкнуться. Благодаря этой персонализированной реализации в Explorium мы можем сэкономить много времени, денег и усилий в процессе обогащения данных на его платформе. Это может поистине революционизировать способ решения подобных проблем и вывести нас на новый уровень в мире Auto-ML.

Янив Голдфрид (Yaniv Goldfrid) - эксперт в области данных и машинного обучения, член команды специалистов по анализу данных компании Explorium. Explorium предлагает первую в отрасли автоматизированную платформу внешних данных для расширенной аналитики и машинного обучения. Explorium позволяет специалистам по обработке данных и руководителям бизнеса управлять процессом принятия решений, устраняя препятствия на пути к сбору и интеграции правильных внешних данных и значительно сокращая время, необходимое для достижения превосходных возможностей прогнозирования. Узнайте больше на www.explorium.ai