Реализация рекомендателя фильмов с совместной фильтрацией на основе неявной обратной связи
Практическое руководство по преобразованию набора данных MovieLens-1m в неявную обратную связь для рекомендательной системы
В этой истории мы собираемся использовать набор данных MovieLens 1m для создания рекомендателя фильмов. Мы будем использовать алгоритм матричной факторизации: метод альтернативных наименьших квадратов (ALS), который реализован в неявной библиотеке. Наша основная цель - продемонстрировать пример реализации этой модели машинного обучения на Python и использовать его, чтобы рекомендовать элементы как известным пользователям, так и новым пользователям на лету без необходимости перестраивать нашу модель целиком!
Содержание
- Совместная фильтрация
- Неявная и явная обратная связь
- Факторизация матрицы с чередованием наименьших квадратов
- Реализация на Python
- Интерактивное веб-приложение!
- использованная литература
Совместная фильтрация
Совместная фильтрация - это подход к автоматическому прогнозированию (фильтрации) интересов пользователя путем сбора предпочтений многих пользователей (совместная работа). Это может быть особенно актуально для конечных пользователей, поскольку эти рекомендации основаны на их и других взаимодействиях пользователей с приложением и могут помочь им сделать соответствующий выбор всех элементов.
Основополагающие допущения подхода совместной фильтрации заключаются в том, что «если человек A придерживается того же мнения, что и человек B по поводу элемента, A с большей вероятностью будет иметь B о другом предмете, нежели о случайно выбранном человеке ». Он доказал свою полезность в системах, реализованных Netflix, Spotify, Amazon и т. Д.
Неявная и явная обратная связь
Явные рейтинги - это рейтинги по конкретной рейтинговой шкале (например, по шкале Лайкерта от 1 до 5 звезд). Предпочтения пользователей явно указываются, когда они оценивают элемент, который им нравится, выше, чем элемент, который им не нравится. В действиях пользователя подразумеваются неявные рейтинги. Основное предположение состоит в том, что «если пользователю понравился / просмотрел / щелкнул элемент чаще, это свидетельствует о его предпочтениях в отношении этого элемента». Неявная обратная связь возникает во многих формах, просмотре, нажатии, вводе текста, тогда как явная обратная связь исходит только из какой-то шкалы оценок.
С явной обратной связью легко работать, поскольку оценки, предоставленные пользователем, можно напрямую интерпретировать как предпочтения пользователя, что делает его прогнозы, основанные на них, более актуальными. Однако это гораздо реже, чем неявная обратная связь. Неявную обратную связь легче собирать в больших количествах без каких-либо дополнительных усилий со стороны пользователя, и поэтому она происходит гораздо чаще. Простое использование вашего приложения - это форма неявной обратной связи, но это предположение намного сильнее, и на его основе труднее делать релевантные прогнозы.
Хотя эти методы сбора данных не являются взаимоисключающими, сейчас мы сосредоточимся на рекомендациях, основанных исключительно на неявных оценках.
Факторизация матрицы с чередованием наименьших квадратов
Мы используем альтернативную модель наименьших квадратов, как подробно описано в ее исходной статье. Идея матричной факторизации заключается в том, чтобы взять очень большую матрицу и разделить ее на две меньшие матрицы, произведение которых равно исходной. Альтернативный метод наименьших квадратов - это форма факторизации матрицы, которая сокращает эту матрицу пользовательских элементов до гораздо меньшего размера, называемого скрытыми или скрытыми функциями. И это очень эффективно с точки зрения вычислений. Я использовал модель для 1,1 миллиона пользователей и около 132 тысяч элементов и увидел, что общее количество уникальных рекомендаций сократилось примерно до 4500 элементов.
Если вас больше интересуют детали как матричной факторизации, так и модели чередующихся наименьших квадратов, пожалуйста, прочтите эту Среднюю статью, в которой подробно рассматриваются обе.
Набор данных MovieLens
Набор данных MovieLens 1m содержит 1 000 209 анонимных оценок от 6040 пользователей 3706 фильмов. Каждый пользователь оценил не менее 20 фильмов, и рейтинг варьируется от 1 до 5 звезд. Поскольку набор данных состоит из явных оценок, мы собираемся преобразовать их в неявные оценки, используя скалярное значение. У каждого пользователя есть пол, возраст и род занятий, у каждого фильма - название и жанр, а у каждого рейтинга есть отметка времени. Для этой реализации мы используем только файл оценок: rating.dat. Вы можете найти набор данных здесь.
Реализация на Python
Ниже вы можете увидеть фрагментированную реализацию нашего скрипта. Сначала мы импортируем наши библиотеки и загружаем данные в Pandas DataFrame
, в котором мы переименовываем столбцы и удаляем временную метку оценок.
Далее мы собираемся создать разреженную матрицу «пользователь-элемент» и «элемент-пользователь», которая будет нашими входными данными для модели машинного обучения. На этом этапе мы также преобразуем явные рейтинги в неявную обратную связь с использованием скалярного значения 40, что дало хорошие результаты в реализации, которую я построил для компании этим летом в качестве стажера.
Формат Scipy sparse matrix
равен csr_matrix((data), (rows, cols))
. Мы также собираемся сохранить эти разреженные матрицы, так как они нам понадобятся для построения нашей модели и, в конечном итоге, для оперативного пересчета векторов для пользователей.
Затем мы собираемся создать сопоставление для наших пользователей и фильмов. Мы делаем это, чтобы иметь возможность сопоставлять рейтинги с метаданными фильма title and genre
, а пользователей - с метаданными их профилей age-range, gender and occupation
. На данный момент мы выполняем это двумя функциями, но это также было бы вполне возможно с использованием схемы базы данных отношений, такой как SQL, но на данный момент это выходит за рамки нашей компетенции.
implicit library
также поставляется с двумя другими функциями для подсчета наиболее похожих пользователей и элементов, которые я нашел чрезвычайно интересными в использовании и выяснил, какие элементы коррелируют. Как видите, эти функции возвращают сопоставленных пользователей и элементы, используя функции сопоставления, которые мы создали ранее.
Теперь мы можем построить нашу модель машинного обучения, которую собираемся использовать, чтобы рекомендовать фильмы. На этом этапе мы также разделяем набор данных на поезд и набор тестов и вычисляем precision@10
и mean-average-precision@10
оценочные метрики, которые полезны для оценки производительности нашей модели. Мы используем pickle
, чтобы сохранить нашу модель, а затем и наши рекомендации для всех пользователей.
После создания модели мы можем использовать ее, чтобы рекомендовать фильмы одному или всем пользователям, найденным в нашем наборе данных. Вывод для implicit.recommend()
- это кортежи (item_ids, scores)
, но нам нужен только item_ids
, а вывод для implicit.recommend_all()
- это Numpy array
, который нам нужно добавить в пользовательский DataFrame. Я также включил закомментированный код, который использовался для объединения данных для упрощения импорта в базу данных SQL.
И последнее, но не менее важное: мы также можем использовать библиотеку, чтобы на лету рекомендовать фильмы новым пользователям, которые не включены ни в наши разреженные матрицы, ни в нашу модель. Это требует дополнительных знаний о Scipy sparse matrices
, поскольку модель требует sparse_user_item matrix
в качестве параметра, но Scipy
не позволяет добавлять к своим разреженным матрицам.
Вместо этого нам нужно загрузить разреженную матрицу в память и сложить нового неизвестного пользователя и его неявные рейтинги в data
, indices
и изменить shape
матрицы. Укладка выполняется на месте, поэтому матрица обновляется немедленно. Подробнее об этом здесь.
Таким образом, мы можем передать вновь созданную матрицу в качестве параметра модели и использовать recalculate_user=True
для пересчета векторов. Теперь мы можем демонстрировать рекомендации на лету, не перестраивая нашу модель (что занимает значительное время по мере увеличения объема данных).
Интерактивное веб-приложение!
Все вышеперечисленные функции также реализованы в созданном мной интерактивном веб-приложении:
Все о Python
Начнем с описательной статистики наших данных. В этом… www.louisdebruijn.me 6040 пользователей и 3706 фильмов.
Вы можете создать свой собственный список понравившихся фильмов и видеть, как рекомендации меняются на лету, а также просматривать топ-10 фильмов, наиболее похожих на выбранный, и просматривать рекомендации по полу, возрасту или роду занятий. Для этого интерактивного приложения я использовал другой скрипт для загрузки ссылок на постеры и URL-адресов, найденных здесь.
Найдите весь сценарий, включая все функции, представленные в этой истории, и функции, используемые в интерактивном приложении здесь. Я также включил файлы, созданные в сценарии, а также плакаты и URL-адреса в IMDB.
использованная литература
Https://www.benfrederickson.com/fast-implicit-matrix-factorization/
Https://github.com/benfred/implicit
Https://medium.com/radon-dev/als-implicit-collaborative-filtering-5ed653ba39fe