Рекомендательная система в Python - часть 2 (контент-ориентированная система)
Добро пожаловать во вторую часть из 2-х частей. Этот пост будет посвящен разработке простой, основанной на содержании системы рекомендаций на основе ранее изученного набора данных фильмов. Все исследования и анализ данных были выполнены в первой части, поэтому вот ссылка, если вы ее пропустили:
Должен сказать, сегодняшний пост будет намного короче предыдущего. Основная причина этого в том, что в системе рекомендаций не так много (по крайней мере на этом базовом уровне). С учетом вышесказанного, сегодняшний пост объяснит вам интуицию и логику простой системы рекомендаций на основе контента (см. Часть 1, если вы не знаете, что такое системы на основе контента), и вы Вы увидите, что здесь не происходит никакого реального машинного обучения, только расширенная (своего рода) фильтрация.
Зачем вам читать этот пост?
Как и в случае с предыдущим постом, есть два основных преимущества:
- Вы окунетесь в мир рекомендательных систем и создадите свой первый (возможно)
- Вы обнаружите, что они проще, чем кажется
Как структурирован пост?
Как я уже говорил, эта часть будет намного короче предыдущей, которая охватывала процесс сбора, подготовки и исследования данных. Чтение этого сообщения является предварительным условием, потому что, если вы его не прочитаете (или хотя бы скопируете из него код), ваши данные не будут в том же формате, что и мой, и поэтому вы не сможете продолжить.
Содержание сообщения следующее:
- Создание матрицы
- Создание функции для получения рекомендаций
- Получение и проверка результатов
Прежде чем приступить к делу, вот как должен выглядеть ваш набор данных:
У вас такая форма? Можно продолжить.
Создание матрицы
Под матрицей я подразумеваю, что вы должны каким-то образом создать таблицу, в которой есть следующее:
- Каждый идентификатор пользователя в виде строки
- Каждое название фильма в виде столбца
- Оценка, которую каждый пользователь дал каждому фильму, как пересечение строки и столбца
Это легко получить с помощью функции pivot_table () Pandas:
Эта матрица по сути является объектом DataFrame Pandas, и, зная, что вы знаете, что вы можете вызвать для него .head ():
Да, я знаю, что много NaN. Найдите минутку, чтобы подумать, почему так много значений отсутствует, а затем продолжайте чтение.
Поняли?
Причина в том, что не каждый человек смотрел и оценивал каждый фильм. В этой таблице более 9700 фильмов, так что подумайте о себе. Сколько фильмов вы посмотрели? Сколько из тех, что вы смотрели, вы поставили публично? Не так много, верно?
Теперь у вас есть матрица, и вы можете переходить к следующему шагу.
Создание функции для получения рекомендаций
Это мясо и картошка поста. Если это ваша первая система рекомендаций, вы удивитесь, насколько легко ее создать, по крайней мере, на этом начальном уровне.
Вот логика, которую вам нужно реализовать:
- Рассчитайте корреляцию желаемого фильма с любым другим фильмом (используя метод .corrwith ()).
- Храните названия фильмов с корреляциями в отдельном DataFrame.
- Объедините этот DataFrame с исходным, удалите дубликаты и сохраните заголовок, корреляция и столбцы numRatings
- Сортировать по корреляции в порядке убывания (от наибольшей корреляции к наименьшей)
- Отфильтровать фильмы с низким числом оценок (эти фильмы не имеют значения, потому что их посмотрела лишь небольшая группа людей)
- Вернуться к началу n коррелированных фильмов
Звучит как большая работа, но на самом деле это всего лишь 10 строк кода.
Как видите, я установил количество фильтров и количество рекомендаций по фильму, которые будут возвращаться в качестве аргументов функции по умолчанию, чтобы вам было легче их настраивать.
И это вкратце вся логика, которую вам нужно реализовать.
Легко, правда?
Получение и проверка результатов
Процесс получения рекомендаций теперь так же прост, как вызов функции. Единственный параметр, который вам нужно передать, - это название фильма, и он должен быть таким же, как тот, который присутствует в наборе данных, каждая небольшая орфографическая ошибка сломает все. Не стесняйтесь поэкспериментировать с функцией, чтобы обойти это.
Если я сейчас получу рекомендацию по фильму Криминальное чтиво:
Первый очевиден: Криминальное чтиво идеально коррелирует с Криминальным чтивом, но взгляните на следующие за ним.
Посмотрите, какие рекомендации IMDB дал этому фильму. Круто, правда?
Теперь я могу сделать то же самое с фильмом История игрушек:
Уже понятно, что рекомендации в силе, но на всякий случай подтвердим:
Корпорация монстров и В поисках Немо входят в число первых 6 рекомендаций на IMDB, а Суперсемейка находится на следующей странице.
Заключение
Создавать рекомендательные системы очень весело, и их так легко проверить (по крайней мере в этом случае). Я надеюсь, что после прочтения этой статьи вы не будете смотреть на них как на черные ящики, поскольку они в основном сводятся к некоторым манипуляциям с данными с помощью Python (или вашего языка по выбору).
Для каких фильмов вы тестировали? Вы довольны результатом? Пожалуйста, дайте мне знать.