Як з нуля створити рекомендатор та підвищити його точність, зберігаючи при цьому простоту
Обставини 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”.
