Как с нуля создать рекомендатель и повысить его точность, сохраняя при этом простоту
Обстоятельства 2020-2021 годов заставляют все больше и больше владельцев бизнеса думать о переводе основных коммуникаций со своими клиентами в онлайн-режим. Возможно, вы заметили, как большое количество онлайн-мероприятий, которые прогнозируют, направляют и заключают покупку (даже оффлайн), изменились в последнее время? Кажется, что любой бизнес в Интернете делает все возможное, чтобы поддерживать бесконечный диалог с клиентом. В таком диалоге клиент рассчитывает получить от продавца как минимум соответствующие персональные предложения, чтобы быстрее сделать выбор.
Так называемые рекомендательные системы являются инструментом для создания персональных предложений для клиентов. Система рекомендаций является подклассом алгоритмов машинного обучения для получения ранжированных списков товаров, в пользу которых клиент может отдать предпочтение.
Вся рекомендательная сеть может быть распределена на несколько категорий (по Rocca, 2019):
В рамках этой серии публикаций мы изучим нижеприведенные аспекты:
На этом пути мы поделимся нашим опытом в разработке так называемых мета-гибридных рекомендательных движков для решения реальных бизнес-проблем.
Введение данных
В данной публикации мы будем работать с набором данных.
В дополнение к рейтингам пользователей, набор данных содержит описательную информацию о самих фильмах (например, год выпуска, жанр, теги к контенту), которые мы будем использовать во второй части для повышения точности прогнозов нашего рекомендателя.
Чтобы понять, как работает рекомендательная система Netflix, давайте создадим набор микроданных за несколько шагов:
Таким образом осуществляется коллаборативная фильтрация. Коллаборативная фильтрация — это один из методов прогнозирования в рекомендательных системах, который основывается на известных предпочтениях группы пользователей для прогнозирования неизвестных предпочтений другого пользователя.
Полученная рейтинговая матрица представляет собой типичный контекст для эффективной рекомендательной системы: некоторые пользователи могут получить рекомендации для фильмов из нашей микробиблиотеки, которые они не видели ранее; персональные рекомендации должны быть ранжированы рекомендателем, чтобы сохранить охват пользователей, которые не видели эти фильмы.
Минимальная необходимая информация для решения этих задач находится в пределах самой рейтинговой микроматрицы — это история взаимодействия пользователей с просмотренными фильмами (т.е. все, кроме “памяти” нашего рекомендателя коллаборативной фильтрации).
Основанная на памяти рекомендательная система просто прогнозируют рейтинг Y-пользователя для непросмотренного Z-фильма, основываясь на рейтингах, присвоенных этому самому Z-фильму другим {A… Х}-набор пользователей, чьи предпочтения в киноиндустрии похожи на предпочтения Y-пользователя.
В самом простом случае, прогноз рейтинга для Y-Z пары рассчитывается как средневзвешенное значение набора доступных рейтингов Z-фильма с учётом степеней «сходства» Y-пользователя к каждому из {A… Х} пользователей.
Степень «сходства» — это расстояние между векторами оценок двух пользователей, стандартизированных (масштабируемых) путем вычитания среднего. Таким образом, среднее значение вектора масштабируемых рейтингов равно нулю, что позволяет нам безопасно заполнять все отсутствующие значения (т.е. рейтинг для непросмотренных фильмов конкретным пользователем) нулями.
Матрица косинусных расстояний между стандартизованными векторами пользовательских рейтингов.
Как и ожидалось, все элементы главной диагонали матрицы равны нулю (расстояние от пользователя до самого себя).
После удаления главной диагонали мы получим для каждого пользователя вектор расстояний от него до всех остальных пользователей в системе. Кроме того, в рамках рекомендательного механизма эти расстояния будут пересчитаны в «обратные» значения для расчета оценок в виде средневзвешенных значений.
Другими словами, наш пользовательский рекомендатель итеративно прогнозирует рейтинги для каждой пары пользователь-фильм (включая пользователь-непросмотренный-фильм! пары) как векторное произведение доступных рейтингов конкретного фильма и вектора значений, обратно пропорциональных расстояниям от конкретного пользователя к другим пользователям, чьи рейтинги рассматриваются.
Несмотря на свою простоту, наш пользовательский рекомендатель обрабатывает случаи отсутствия фактических оценок пользователей (т.е. отсутствующих ячеек в рейтинговой матрице), а также случаи противоположных кино-предпочтений пользователей (т.е. двунаправленных масштабируемых векторов оценок).
Средняя абсолютная процентная ошибка нашего пользовательского рекомендателя составляет около 15,5%.
Мы создали рекомендатель, который прогнозирует рейтинги и может составить ранжированный список рекомендаций — это так здорово, вау!
Однако скажем “как-есть”, у нашего рекомендателя есть несколько недостатков:
Все эти недостатки не имеют значения для рекомендателей, построенных с таким python-модулем, как surprise.
Например, применяя к той же самой рейтинговой микроматрице «встроенный» рекомендатель с немного более продвинутым (но в целом близким к описанному выше) алгоритмом прогнозирования из семейства surprise (а именно KNNWithMeans), вы немедленно уменьшите среднюю абсолютную процентную ошибку с 15,5% до 11,4%:
Полученные прогнозы двух демо-версий рекомендателей касаются визуализации:
Мы обычно не используем среднюю абсолютную процентную ошибку / среднюю абсолютную погрешность / среднеквадратическую ошибку для сравнения точности рекомендателей, а скорее точность и отзыв для списков товаров с оценками выше заданного порога.
Заметка из визуализации выше, как рекомендации для одних и тех же пользователей изменятся, если мы решим установить минимальный рейтинг для фильма, который будет рекомендован в нашей микробиблиотеке фильмов, на уровне 3,5 или 4,0?
В следующей части этой публикации мы покажем, как использовать соответствующие показатели и повысить эффективность «встроенного» алгоритма прогнозирования сингулярного разложения (из модуля surprise), известного как призера открытого соревнования на лучший алгоритм предсказания оценки фильмов “Netflix-prize winner”.