Почему алгоритм машинного обучения перешел дорогу?

Оглавление

  1. "Введение"
  2. "Источник данных"
  3. "Настраивать"
  4. Предварительная обработка данных
  5. Обучение модели
  6. "Результаты"
  7. "Вывод"
  8. "Использованная литература"

Введение

Представьте: вы сидите перед ноутбуком. Скучающий. Вы ищете анекдоты, чтобы развлечь себя, но единственное, что в них смешно, это то, насколько они плохи. Единственное решение? Взять дело в свои руки, создав себе систему рекомендаций по шуткам.

В этой статье я расскажу, как создать систему рекомендаций по шуткам с помощью библиотеки scikit-surprise!

Библиотека scikit-surprise — это библиотека Python для создания и тестирования рекомендательных систем. Вы можете прочитать больше об этом здесь:



Источник данных

Библиотека Surprise содержит несколько встроенных наборов данных, в том числе набор данных 2 из архивной базы данных Jester, но здесь я буду использовать подмножество набора данных 1.

Набор данных 1 включает 4,1 миллиона оценок от -10 до 10 для 100 шуток от 73 421 пользователя. Подмножество, которое я использовал, набор данных шута 1_1, содержит данные о 24 983 пользователях, каждый из которых оценил 36 или более шуток. Вы можете найти полную архивную базу данных Jester здесь:



Настраивать

Перво-наперво, я добавляю библиотеку Surprise и импортирую библиотеки Python, которые мне понадобятся на протяжении всего проекта:

%pip install scikit-surprise
import numpy as np
import pandas as pd
from collections import defaultdict
from surprise import Dataset, Reader, KNNWithMeans, accuracy
from surprise.model_selection import GridSearchCV
from surprise.model_selection import train_test_split
from surprise.model_selection import KFold

Затем я загружаю данные в Pandas DataFrame.

Примечание. Если вы используете Google Colab, я рекомендую загружать набор данных в виде ZIP-файла и извлекать его из блокнота.

df = pd.read_excel('/tmp/jester-data-1.xls', header=None)

Предварительная обработка данных

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

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

Затем я удалю строки, содержащие нулевые оценки, а затем отсортирую записи сначала по идентификатору пользователя, а затем по идентификатору шутки.

# dropping entries with a rating of 99.0 (within this dataset, 99.0 corresponds to a null rating where the user did not rate that joke)
df = df[df["Rating"] != 99.0]
# sorting the entries
df = df.sort_values(by=['User ID', 'Joke ID'])
df = df.reset_index(drop=True)

Наконец, я передаю фрейм данных в набор данных-сюрприз, тип данных, который требуется библиотеке Surprise при построении системы рекомендаций.

Обучение модели

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

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

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

  • Я установил для пользователя значение false, что означает, что сходство будет вычисляться между элементами, а не между пользователями.
  • Для параметров измерения сходства я использую среднеквадратичную разницу, которая вычисляет среднеквадратичную разницу сходства между всеми парами элементов, и косинус, которая вычисляет косинусное сходство между всеми парами элементов. пар предметов.
  • Минимальная поддержка — это минимальное количество обычных пользователей, при котором сходство не равно нулю. Я предоставил варианты 3, 4 и 5.
  • Для показателей производительности я использую среднеквадратичную ошибку и среднюю абсолютную ошибку.

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

Наконец, я обучаю рекомендателя, используя лучший набор параметров.

Примечание. Если вы используете Google Colab, я рекомендую использовать аппаратный ускоритель графического процессора, чтобы ускорить процесс обучения.

algo = gs.best_estimator['rmse']
trainset = data.build_full_trainset()
algo.fit(trainset)

Результаты

Теперь, когда у нас есть рекомендатель шуток, мы можем использовать его для прогнозирования рейтинга!

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

  • Для пользователя 1 и шутки 1 фактический рейтинг равен -7,82. Используя обученный алгоритм, мы получаем прогноз -3,43.
  • Для пользователя 24983 и шутки 87 фактическая оценка составляет 7,23. Используя обученный алгоритм, мы получаем прогноз 4,93.

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

Глядя на лучшие прогнозы, сделанные нашим алгоритмом, рейтинги, созданные рекомендателями, очень близки к фактическим рейтингам, а лучший прогноз имеет ошибку всего 0,000008. С другой стороны, ошибка достигает пика в 18,83 в худших прогнозах, сделанных нашим алгоритмом.

Наконец, мы можем использовать наш алгоритм для генерации рекомендаций для каждого пользователя:

Это 5 лучших рекомендаций для каждого пользователя. Многим наш рекомендатель шуток рекомендует шутку номер 89.

Заключение

Мы успешно создали рекомендателя шуток! Однако в мире рекомендательных систем еще многое предстоит изучить. Вот несколько идей для следующих шагов:

  • Сравните производительность различных алгоритмов, прежде чем создавать систему рекомендаций, используя наиболее подходящий из них, как показано здесь:


  • Вместо того, чтобы использовать библиотеку Surprise, создайте систему рекомендаций с нуля, следуя этим руководствам:




  • Примените тот же процесс, показанный в этой статье, к другим наборам данных, например, найденным здесь:


использованная литература

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

[1] Аналитика Видья | Полное руководство по созданию системы рекомендаций с нуля (на Python) Пулкита Шармы.

[2] Неожиданная документация | Анализ алгоритма KNNBasic Николя Хуг