В настоящее время мы очень часто слышим слова «Рекомендательные системы», и в основном потому, что они довольно часто используются компаниями для различных целей, например, для увеличения продаж (предложение товаров при покупке → Amazon: пользователи, у которых есть купил это, также купил это) или в предложениях для клиентов, чтобы улучшить качество обслуживания клиентов (предложение фильма → Netflix), или также в рекламе для таргетинга на нужных людей на основе сходства предпочтений.

Рекомендательные системы - это в основном системы, которые могут рекомендовать людям вещи на основе того, что делали все остальные.

Вот пример предложения фильма, взятого из онлайн-курса. Я хочу поблагодарить Фрэнка Кейна за этот очень полезный курс по науке о данных и машинному обучению с помощью Python. Здесь есть ссылка на курс, если вы хотите углубиться в науку о данных.

Мы сделаем пример, взяв базу данных, представленную в курсе, потому что она не слишком велика, и это поможет ускорить вычисления. В любом случае в сети много ресурсов, таких как База данных MovieLens с рейтингом 20 млн, тегами 465 тыс, фильмами 27 тыс и пользователями 138 тыс.

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

Рекомендательные системы, как мы уже говорили ранее, полезны, чтобы рекомендовать товары пользователям. У нас есть 2 типа рекомендательных систем:

  • На основе пользователей: модели позволяют найти сходство между пользователями.
  • На основе элементов: модель находит сходство между элементами.

У них обоих есть ЗА и ПРОТИВ, здесь есть статья, если вы хотите почитать дальше по этой теме.

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

Корреляция - это числовое значение от -1 до 1, которое указывает, насколько две переменные связаны друг с другом. Корреляция = 0 означает отсутствие корреляции, ›0 - положительная корреляция, а‹ 0 - отрицательная корреляция.

Вот графическая визуализация (шрифт wikipedia) соответствующего коэффициента корреляции 2 переменных (x, y):

Мы можем видеть, что корреляция = 1 или -1 относится не к наклону данных, а только к тому, как данные связаны друг с другом. Существуют разные методы расчета коэффициента корреляции, один из которых - метод Пирсона:

Таким образом, корреляция - это ковариация между двумя переменными, X и Y, и умножение их дисперсии.

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

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

Приступим к импорту нашего набора данных. Нашей отправной точкой будет объединенный набор данных (давайте посмотрим только первые 2 строки с «.head ()»):

Как мы видим, набор данных содержит 100 тыс. Строк, соответствующих имеющимся у нас рейтингам. Информация в таблице:

  • movie_id
  • заглавие
  • ID пользователя
  • рейтинг

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

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

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

Получив эту новую таблицу, мы можем рассчитать корреляцию столбца Star Trek со всеми остальными, и для этого мы можем использовать функцию corrwith

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

Попробуем отфильтровать фильмы по количеству оценок ›100 и посмотрим, что получится:

Теперь результат выглядит более реалистичным, поскольку мы видим, что в результате есть и другие эпизоды сериала «Звездный путь». Итак, мы могли бы также попытаться провести некоторые другие тесты с другим фильмом, но давайте посчитаем, что результат хороший, и давайте теперь реализуем его на всем наборе данных.

Pandas упрощает нам задачу, учитывая, что мы будем использовать более короткую функцию, чем раньше :) corr вместо corrwith.

Мы будем использовать фильтр min_periods = 100, он сделает всю работу за нас, и нам больше не нужно фильтровать; мы также можем указать, какую функцию корреляции использовать, и в этом случае мы будем использовать формулу Пирсона.

Вот результат:

Итак, мы рассчитали матрицу корреляции для всей пленки, получив в результате матрицу 1664x1664, где столбцы и строки являются пленками, а диагональ матрицы будет равна 1, потому что каждый фильм связан с самим собой или с Nan, если пленка была отфильтрована. со 100 рейтингами.

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

Итак, начиная с матрицы корреляции, мы рассмотрим все столбцы, соответствующие фильму, который пользователь уже смотрел, для каждого столбца мы отбросим значения Nan. Когда у нас есть значения, мы можем рассмотреть возможность умножения каждого значения для рейтинга, считая его весом (мы увеличим корреляцию, которая больше не будет между -1 и 1 для фильма, который понравился пользователю с более высоким рейтингом) и после мы добавим все значения всех столбцов, рассматриваемых в серии «user_corr».

В Серии нам нужно проделать еще несколько операций:

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

Когда у нас есть последняя серия, мы можем упорядочить значения в порядке убывания (ascending = False) и предложить первые 5 фильмов или сколько фильмов мы хотим.

Давайте посмотрим, как кодировать, применяя то, что мы сказали для пользователя 0. Это список фильмов, которые смотрел пользователь:

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

Мы делаем группы, чтобы не было дубликатов фильмов, а также суммируем их рейтинг:

Мы создаем список просмотренных нами фильмов (предварительно проверяя, входят ли они в серию всех корреляций), а затем отбрасываем их:

После того, как мы упорядочили окончательный список, мы можем распечатать результат нашему пользователю, надеясь, что ему понравятся предложения :)

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

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

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

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

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

И если вы хотите поддержать меня в написании других подобных статей, купи мне кофе :)

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик