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

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

Выбор показателя Rotten Tomato в качестве одной из переменных-предикторов был ошибкой. Значение корреляции между этим показателем и зависимой переменной, рейтингом IMDB, составило 0,86, что указывает на тесную связь между ними.

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

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

Новое определение проблемы

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

Почему это лучшее решение? Таким образом, я мог доверять своей модели, которая скажет мне, хочу ли я данный фильм или нет. Это позволило бы мне более надежно выбрать фильм, прежде чем я потрачу время на его просмотр. Люди (включая меня) проводят бесчисленные часы, просматривая фильмы на потоковых сервисах, таких как Netlflix, Amazon Prime и т. д. Цель этой новой модели - сделать этот процесс менее напряженным и трудоемким.

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

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

Сбор данных

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

  • title_basics.tsv: содержит информацию заголовка для каждого заголовка фильма (обозначенную переменной идентификатора "tconst"), такую ​​как жанр, время воспроизведения и основной заголовок.

  • data.tsv: содержит средний рейтинг и количество голосов для каждого заголовка (снова с использованием "tconst").

Подготовка данных

Уборка и препирательство

Весь набор данных содержал более 7 миллионов строк, которые занимали более 400 МБ пространства. Поэтому было важно изучить данные и удалить ненужные столбцы на раннем этапе, чтобы уменьшить размер набора данных для упрощения обработки.

Недостающие значения были удалены, и был выбран начальный период с 1990 по 2019 год. Однако размер набора данных был все еще большим, поэтому я решил еще больше уменьшить масштаб, выбрав только период с 2008 по 2019 год, поскольку я был в основном знаком с фильмами этого периода.

Еще одним важным этапом очистки было удаление документальных фильмов, короткометражных фильмов и телешоу, а также таких жанров, как спорт.

Маркировка

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

Переменная «нравится» / «не нравится» использовалась в качестве целевой переменной в задаче двоичной классификации.

Объединение наборов данных для анализа и моделирования

Все наборы данных были объединены в два этапа:

  1. Объединение очищенных, обработанных и помеченных наборов данных за разные периоды времени.
  2. Объединенный помеченный набор данных с data.tsv, который содержит рейтинги и количество голосов для каждого заголовка с использованием идентификатора tconst в качестве переменной для присоединения

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

Исследовательский анализ данных (EDA) и базовая модель на основе правил

EDA

Распределение рейтингов IMDB было немного смещено влево, при этом основная часть значений оказалась между 7 и 7,5.

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

Базовая модель на основе правил

Была создана новая переменная под названием «high_rating», которая показывала, был ли рейтинг фильма выше 7,5. Это был критический шаг в процессе разработки функций.

Затем я сравнил ручные оценки с фактическими оценками, основанными на пороге 7,5. Эта базовая модель, основанная на правилах, дала точность 59%, что было довольно низким показателем. Затем я попытался дополнительно оптимизировать эту довольно простую модель.

Функциональная инженерия

Для базовой модели я создал дополнительную переменную, которая присваивает логическое значение в зависимости от того, имеет ли конкретный фильм рейтинг выше 7,5 или нет. Этот порог (изначально 7,5) необходимо будет изменить, чтобы прийти к оптимальному решению с точки зрения моделирования. Поэтому я решил сместить этот порог и понаблюдать за точностью в разных точках.

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

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

Если мы установим наш порог на 4, все фильмы будут помечены как «похожие», и в этом случае мы, скорее всего, получим точность, которая по существу равна доле фильмов, которые мне понравились. Эта доля составляет 80/130 или 0,615. И это именно то, что мы видим в сюжете.

По мере увеличения порога мы начинаем более точно прогнозировать нелюбимые фильмы, поэтому наша общая точность возрастает. По сути, это означает, что наши истинные негативы увеличиваются, не уменьшая истинных позитивов.

Мы достигаем наилучшего показателя точности 0,75 при пороговом значении 6,4, что дает нам наилучший компромисс между смещением и дисперсией. Если после этого мы еще больше увеличим порог, мы все равно будем точно предсказывать нелюбимые фильмы, но ошибочно предсказывать понравившиеся фильмы, поэтому наши истинные положительные результаты будут уменьшаться, а ложные отрицательные - увеличиваться.

Другой график, отражающий этот компромисс, показан ниже. График объясняет разницу между порогами 7,5 и 7,1. По оси абсцисс представлены фактические значения "нравится / не нравится", тогда как в легенде показаны прогнозируемые значения.

  • Пороговое значение 7,5: лучший прогноз для фильмов, которые не понравились, но не столь точный прогноз. Больше истинных негативов, но также больше ложных негативов.
  • Пороговое значение 7,1: предсказывает, что фильмы понравились больше, но делает компромисс в отношении нелюбимых фильмов. Больше истинных срабатываний, но и больше ложных срабатываний.

Для практических целей мы выбрали пороговое значение 7,1, поскольку в целом это значение было лучше, чем значение 6,4, чтобы отделить хорошие фильмы от плохих, сохраняя при этом точность на респектабельных 70%.

Изучение переменной runtimeMinutes

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

Изучение переменной numVotes

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

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

Оказалось, что существует средняя корреляция (0,632) между количеством голосов и средней оценкой. Возможно, людям больше нравится оценивать фильмы, если они им действительно нравятся, что может привести к предвзятости при сравнении голосов и оценок. На данный момент мы также включили эту переменную в нашу базовую модель.

Изучение переменных пороговых значений рейтинга

Выше мы создали 3 графика, каждый из которых имеет разный порог рейтинга:

  • 7.5: базовый порог
  • 7.1: практический порог
  • 6.4: лучший порог на основе данных

Порог в 7,5 хорош для предсказания понравившихся фильмов, но плох для предсказания нежелательных фильмов. Рейтинг 7.1 одинаково хорошо показал себя с любимыми фильмами и немного улучшился с нелюбимыми фильмами. Порог в 6,4 действительно хорошо работает с нелюбимыми фильмами, но плохо работает с любимыми фильмами.

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

Прогнозирование с использованием дерева решений

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

Выбор функции

Обратите внимание, что мы включили только 2 переменные:

  • numVotes
  • high_rating_7p1

Мы не учли время выполнения, поскольку оно не очень хорошо отличало понравившиеся и не понравившиеся фильмы.

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

Переменная high_rating_7p1 была разделена на целые значения, а данные разделены на обучающий и тестовый наборы.

Базовая модель деревьев решений

Модель базовых деревьев решений обеспечила показатель точности 0,61 и показатель ROC AUC 0,57, что не было лучшим.

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

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

Модель с переменной AverageRating

Добавление исходной переменной среднего рейтинга вместо переменной high_rating_7p1 дало более низкую точность и оценку AUC 0,564 и 0,538 соответственно. Это было ожидаемо, поскольку последняя переменная была спроектированной (категоризированной) версией первой, что приводило к более оптимизированным прогнозам.

Оптимизация и финальная модель

Используя алгоритм поиска по сетке для оптимизации, я заметил улучшение ROC AUC с 0,57 до 0,65, но точность осталась такой же, как и в базовой модели. Возможно, это связано с тем, что мы оптимизировали модель по AUC.

Диагностика финальной модели

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

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

Поиск по сетке с использованием точности как показателя оценки

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

Предсказание невидимых фильмов

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

Показатели точности и ROC AUC составили 0,608 и 0,638 соответственно. Для сравнения, данные валидации модели дали 0,65 и 0,61 соответственно. На основе этого модель предсказывает невидимые данные, аналогичные, если не лучше, чем данные обучения.

Дальнейшие работы и улучшения

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

Сообщите мне, понравился ли вам этот пост. Если вы читаете это, скорее всего, вы читали, и я очень ценю это! Не стесняйтесь публиковать любые изменения или улучшения в анализе в комментариях ниже.

Первоначально опубликовано на http://thecraftofdata.com.