Прогноз рейтинга аниме

Вода, еда, одежда и кров; основные человеческие потребности, которые необходимо удовлетворить, чтобы иметь полноценное существование. Однако в эпоху Интернета возникла другая потребность: необходимость избегать скуки. Другими словами, потребность в развлечениях. Одним из таких развлечений является аниме.

Аниме (анимационные японские телешоу и фильмы), которое началось с японской аудитории, теперь имеет поклонников по всему миру. Поначалу любой, кто хочет окунуться в мир аниме, поражен множеством тем, жанров и сюжетов, доступных на выбор.

Однако после нескольких десятков завершенных названий становится трудно найти шоу, которые отвечали бы интересам. На этом этапе веб-сайты базы данных аниме, такие как Планета аниме и Мой список аниме (например, IMDB для аниме), становятся полезными для поиска новых шоу. Однако не все шоу одинаковы. Эти веб-сайты показывают средний рейтинг шоу в своей базе данных, основанный на количестве проголосовавших пользователей.

Цель

Цель этого проекта - определить, какие факторы играют роль в общем рейтинге заголовка, и попытаться создать модель для использования этих факторов для прогнозирования рейтингов заголовка.

Сбор данных

Данные, необходимые для этого проекта, были собраны с сайта Anime Planet путем анализа более 14000 доступных наименований.

Уборка

После веб-сканирования мы получили следующие данные (первые 10 строк показаны ниже) с 14578 строками и 13 столбцами:

Чтобы сделать его более удобным, нам нужно извлечь значимую информацию из этих беспорядочных данных. Мы сделаем следующее:

  1. Из mediaTypeEpsDur мы можем извлечь 3 разных функции: mediaType, ongoing, eps и duration.
  • mediaType: формат заголовка (ТВ, Фильм, OVA и т. Д.)
  • ongoing: является ли заголовок продолжающимся или завершенным
  • eps: количество серий в названии
  • duration: продолжительность заголовка

2. Из startEnd мы можем разделить начальный и конечный годы, чтобы создать startYr и endYr

3. Из seasonWFS мы можем извлечь только время года, создав sznOfRelease

4. Из ratingVotes извлекаем rating и количество votes, которые способствовали этому.

После всей этой чистки у нас остались:

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

Анализ

mediaType: Формат заголовка (тип: категория)

Мы видим, что большая часть данных касается телешоу. Похоже, что они также имеют наиболее полные данные, и поэтому мы полностью сосредоточимся на них.

rating: Средняя оценка заголовка (тип: float)

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

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

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

Нам нужен способ количественной оценки уверенности в рейтинге на основе количества голосов, которые вносят вклад в рейтинг.

Нижний предел 95% доверительного интервала казался разумной метрикой. Однако этот метод приводит к систематическому занижению рейтинга заголовков.

После некоторого исследования я наткнулся на рейтинговую систему, используемую steamdb, веб-сайтом, который составляет рейтинги для игр, которые появляются в магазине игр Steam. Система рейтинга изложена в следующем сообщении.

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

После перехода на новую рейтинговую систему мы получим следующее распределение:

votes: Количество голосов (тип: int)

bins_list = [0.001] + [(10000 * i) for i in range(1, 15)]
df["votes"].value_counts(bins=bins_list).sort_index()

Мы видим, что большинство шоу набирают менее 10 000 голосов, а все, кроме одного, - менее 100 000 голосов.

Особняком стоит сериал под названием Тетрадь смерти, всемирно популярный криминальный триллер о сверхъестественном; имея около 131 000 голосов.

eps: Количество серий (тип: int)

Мы видим, что в большинстве шоу 12–14, 24–26 или 50–52 эпизода.

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

ongoing: Продолжается ли шоу (тип: bool)

df["ongoing"].value_counts(dropna=False)

Большинство шоу имеют значение False в функции ongoing, что означает, что подавляющее большинство шоу завершили свой просмотр. Для обеспечения честного сравнения мы оставим только завершенные шоу.

startYr: год начала трансляции шоу (тип: int)

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

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

Кажется, есть недельная корреляция между startYr и rating, но это может быть связано с изменчивостью, поскольку старых шоу гораздо меньше, чем новых.

finishYr: год окончания трансляции шоу (тип: int)

Этот дистрибутив почти идентичен раздаче startYr.

Эта функция почти идеально коррелирует с startYr, и поэтому включение обоих было бы излишним. Однако, похоже, что finishYr имеет немного более сильную корреляцию с целью, чем startYr. Таким образом, startYr можно отбросить.

sznOfRelease: Сезон года, когда шоу начали выходить в эфир (тип: категория)

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

В этих фиктивных переменных 1 означает наличие этой переменной, а 0 - ее отсутствие.

studios: Студии, ответственные за создание шоу (тип: категория)

tags: Теги, связанные с шоу (тип: категория)

contentWarn: предупреждения о содержании, связанные с шоу (тип: категория)

watched, watching, wantWatch, dropped и votes

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

title и description

Эти функции также можно отбросить, поскольку они не добавляют ценности модели.

Нормализация

Чтобы получить наилучшие результаты (часто более быструю сходимость), мы должны нормализовать наши функции. В этом случае я решил использовать максимальную-минимальную нормализацию, чтобы все функции имели значения в диапазоне от 0 до 1.

Выбор модели

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

Ридж-Регрессор

Training Score: 0.08312149251089611
Testing Score: 0.09718888987295475
Cross Validation Score: 0.09978894236195887
Holdout Score: 0.09972799261866261

Случайный лес

Training Score: 0.03898742191300693
Testing Score: 0.09945202519222628
Cross Validation Score: 0.10009737591200216
Holdout Score: 0.09858377714424342

Регрессор мешков

Training Score: 0.05793759470949656
Testing Score: 0.10010466840388169
Cross Validation Score: 0.10065505661158344
Holdout Score: 0.09950619131738145

Ada Boost

Training Score: 0.11866449959589985
Testing Score: 0.116219310141559
Cross Validation Score: 0.11946658408456397
Holdout Score: 0.12097908478782177

Градиентное усиление

Training Score: 0.0526508206689884
Testing Score: 0.09535526985100212
Cross Validation Score: 0.09798394679793124
Holdout Score: 0.09689933248882923

Мы видим, что модель Gradient Boost дает лучшие результаты.

Давайте посмотрим, насколько хорошо модель работала:

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

Вывод

Хотя этот процесс дал некоторые интересные результаты, многое можно сделать с ограниченным объемом доступных данных. Хотя мета-функции в этом наборе данных могут играть небольшую роль в определении рейтинга шоу, могут быть другие, более важные функции, которых здесь нет. Как и любая другая форма медиа, аниме-шоу имеют художественный компонент, связанный со сложными вопросами, такими как эмоции, абстрактное мышление и т. Д .; которые может быть трудно разбить на пригодные для использования данные. В будущем этот проект может быть улучшен за счет использования методов глубокого обучения, таких как распознавание изображений, обработка естественного языка и обработка звука, для получения более подробной информации о шоу, а не только мета-функций. В целом, это оказалось отличным опытом обучения, и я надеюсь вернуться к этому в будущем с надеждой на внесение улучшений.

Код: https://github.com/acmathew/anime-rating-prediction