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

Recombee - это платформа, с помощью которой разработчики могут легко создать механизм рекомендаций за считанные минуты. У Recombee есть навсегда бесплатный режим после окончания 30-дневной пробной версии, если вы не превысите лимит (20 000 активных пользователей в месяц, 100 000 ежемесячных рекомендаций), так что это отличный способ интегрироваться в ваш бизнес, поскольку вы можете реализовать его во многих программах. языков.

Что такое система рекомендаций?

Картина говорит тысячу слов:

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

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

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

Как работает рекомби?

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

  • Подробные просмотры (пользователь просмотрел подробную информацию об элементе)
  • Добавление корзины (Пользователь добавил товар в корзину)
  • Рейтинг (Пользователь оценил элемент)
  • Закладки (Пользователь сохранил / добавил в закладки элемент)
  • Покупки (Пользователь приобрел товар)

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

Начало работы с Recombee

Перейдите на https://admin.recombee.com/ и создайте новую учетную запись. После того, как вы успешно это сделаете, вы увидите аналогичный экран.

Установите Recombee на свой компьютер. Откройте терминал и введите:

$ pip install recombee-api-client

Откройте редактор Python. Я использую Jupyter Notebook, но вы можете использовать любой редактор, в котором вы можете запускать код Python построчно.

Начнем с импорта необходимых библиотек:

from recombee_api_client.api_client import RecombeeClient
from recombee_api_client.api_requests import *
import random
import pandas as pd

Затем мы создадим клиент Recombee:

client = RecombeeClient('ADD_YOUR_API_IDENTIFIER', 'ADD_YOUR_PRIVATE_TOKEN')

Вы можете найти и то, и другое, зайдя в настройки:

Набор данных

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



Набор данных Coursera взят из: https://www.kaggle.com/siddharthm1698/coursera-course-dataset

Итак, да, мы создадим механизм рекомендаций, который будет рекомендовать курсы пользователям. Один файл - это coursea_data.csv, а другой - cleaned_user_data.xlsx, чтобы вы могли увидеть, как мы можем работать с разными форматами.

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

course_df = pd.read_csv("coursea_data.csv", index_col=0)
user_df = pd.read_excel (r'user.xlsx')

Если вы выберете элементы на панели инструментов Recombee, вы увидите, что есть свойства np.

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

client.send(AddItemProperty('course_title', 'string'))
client.send(AddItemProperty('course_organization', 'string'))
client.send(AddItemProperty('course_certificate_type', 'string'))
client.send(AddItemProperty('course_rating', 'double'))
client.send(AddItemProperty('course_difficulty', 'string'))
client.send(AddItemProperty('course_students_enrolled', 'string'))

Если приведенный выше код работает успешно, вы получите взамен ok. Теперь, если вы вернетесь к элементам и обновите страницу, вы увидите:

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

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

client.send(AddUserProperty('citizenship', 'string'))
client.send(AddUserProperty('email', 'string'))
client.send(AddUserProperty('full_name', 'string'))
client.send(AddUserProperty('gender', 'string'))

То же, что и элементы Recombee, добавляемые самим userId, и мы будем использовать это, чтобы определить, какие userId с какими itemId взаимодействовали.

Теперь заполним элементы с помощью нашего course_df

requests = [SetItemValues(
    course_df.index[i], #itemId
    #values:
    {
        "course_title": course_df['course_title'][i],
        "course_organization":  course_df['course_organization'][i],
        "course_certificate_type": course_df['course_Certificate_type'][i],
        "course_rating": course_df['course_rating'][i],
        "course_difficulty": course_df['course_difficulty'][i],
        "course_students_enrolled": course_df['course_students_enrolled'][i]
    },
    cascade_create=True   # Use cascadeCreate for creating item
                          # with given itemId if it doesn't exist
  ) for i in range(len(course_df))]
# Send catalog to the recommender system
client.send(Batch(requests))

Вы получите статус ОК для каждой записи, добавляемой в элементы рекомбинации. Если вы посмотрите на элементы, вы увидите, что они заполнены:

Теперь заполним пользователей:

user_requests = [SetUserValues(
    row['id'], #itemId
    #values:
    {
        "citizenship": row['citizenship'],
        "email":  row['email'],
        "full_name": row['first_name'],
        "gender": row['gender']
    },
    cascade_create=True   # Use cascadeCreate for creating item
                          # with given itemId if it doesn't exist
  ) for idx, row in user_df.iterrows()]
# Send catalog to the recommender system
client.send(Batch(user_requests))

Так же, как и с товарами, вы получите статус "ОК". Разница между этим кодом и кодом элементов состоит в том, что сначала мы используем SetUserValues вместо SetItemValues, а итерация (цикл for) отличается от .xlsx.

Обновите страницу пользователей, объявление теперь также будет заполнено:

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

Давайте добавим взаимодействия. Для демонстрации возьмем пять пользователей. Итак, давайте выберем пользователя с идентификатором 11, 13, 14, 15, 17 (выбран случайным образом из приведенного выше снимка экрана).

Предположим, следующие user {id} и item {id}:
user11 просмотрел item0 , item104, item107 и рейтинг item110.
user13 просмотрел item109 , item110, item0, item103, item101, item104.
user14 просмотрел item10, item11 и приобрел item115.
user15 просмотрел item113 , item111, элемент 105, item102.
user17 просмотрел item140, item142, item15, item151, item144 и приобретенный item15 .

Выше представлены 5 пользовательских случаев, в которых мы извлекали данные о действиях пользователей на нашем веб-сайте. Теперь, как мы добавим эти взаимодействия в наш механизм рекомбинации:

#user11 has viewed item0, item104, item107 and rated item110.
client.send(AddDetailView('11','0', cascade_create=True))
client.send(AddDetailView('11','104', cascade_create=True))
client.send(AddDetailView('11','107', cascade_create=True))
client.send(AddRating('11','110', 0.5, cascade_create=True))
# Rating rescaled to interval [-1.0,1.0],
# where -1.0 means the worst rating possible, 0.0 means neutral, and 1.0 means absolutely positive rating.
# For example, in the case of 5-star evaluations, rating = (numStars-3)/2 formula may be used for the conversion.
# So here user rated 4/5 to a course (4-3)/2 = 0.5
#Also the rating here will have no effect on the rating of item110 that is available in the dataset.

А теперь остальные пользователи:

#user13 has viewed item109, item110, item0, item103, item101, item104.
client.send(AddDetailView('13','109', cascade_create=True))
client.send(AddDetailView('13','110', cascade_create=True))
client.send(AddDetailView('13','0', cascade_create=True))
client.send(AddDetailView('13','103', cascade_create=True))
client.send(AddDetailView('13','101', cascade_create=True))
client.send(AddDetailView('13','104', cascade_create=True))
#user14 has viewed item10, item11 and purchased item115.
client.send(AddDetailView('14','10', cascade_create=True))
client.send(AddDetailView('14','111', cascade_create=True))
client.send(AddPurchase('14','115', cascade_create=True))
#user15 has viewed item113, item111, item 105, item102.
client.send(AddDetailView('15','113', cascade_create=True))
client.send(AddDetailView('15','111', cascade_create=True))
client.send(AddDetailView('15','105', cascade_create=True))
client.send(AddDetailView('15','102', cascade_create=True))
#user17 has viewed item140, item142, item15, item151, item144 and purchased item15.
client.send(AddDetailView('17','140', cascade_create=True))
client.send(AddDetailView('17','142', cascade_create=True))
client.send(AddDetailView('17','15', cascade_create=True))
client.send(AddDetailView('17','151', cascade_create=True))
client.send(AddDetailView('17','144', cascade_create=True))
client.send(AddPurchase('17','15', cascade_create=True))

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

Теперь, если вы вернетесь к панели инструментов, вы увидите некоторые числа, кроме всех пробелов.

А теперь давайте посоветуем курсы для пользователя. Я принимаю рекомендации для user11.

recommended = client.send(RecommendItemsToUser('11',5))
print(recommended)

Итак, мы получили следующие рекомендации:

{'recommId': 'e30ae1d99a1dae19155a6643f1214d0c', 
'recomms': [
{'id': '200'}, 
{'id': '807'}, 
{'id': '565'}, 
{'id': '871'}, 
{'id': '664'}
]}

Теперь, чтобы понять, как Recombee рекомендует их, я создал это изображение:

Если вы сравните взаимодействия с рекомендациями, вы получите некоторые наблюдения:

  • Пользователь просматривал только курсы начального или среднего уровня, и все рекомендации включены в него.
  • Рейтинг рекомендации составляет от 4,6 до 4,8 на основе четырех взаимодействий.
  • Тип сертификата тоже был только курсом и специализацией, на основании чего мы получили рекомендации.
  • Курсы, которые просматривал пользователь, обычно делятся на две категории, то есть Python и дизайн. Рекомендации, которые мы получили, относятся к этим категориям.

Основываясь на приведенном выше результате, я весьма впечатлен, так как это отличные предложения для user11, основанные на том, что user11 просматривает на моем веб-сайте.

Вы можете узнать больше о рекомендуемых элементах пользователю здесь: https://docs.recombee.com/api.html#recommend-items-to-user

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

Заключение:

Использовать рекомби очень просто, они прилично структурировали UX своей платформы и сосредоточены почти на всех доменах. Алгоритмы, которые они используют в своей платформе, являются одними из лучших, используемых для рекомендаций такими крупными компаниями, как Facebook, Youtube и даже Netflix.

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