Прогнозируем результаты российского кинопроката с помощью ML

Работаем c базовыми и ансамблевыми моделями машинного обучения и персептроном. Выводы: на кино можно зарабатывать , конечно, если кинопроизводители и дистрибьютеры будут эмитировать акции, облигации и иные финансовые инструменты и публиковать отчетность. Датасет и код проекта лежат в репозитории.

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

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

Если в наличии имеется «портфель» кинопроектов из 20–30 кинокартин, то его судьбу предсказать проще, пользуясь аналогией c хорошо диверсифицированным и сбалансированным портфелем инвестиционных финансовых инструментов.

Решим сперва задачу классификации: будет ли фильм успешным в прокате, соберет ли два своих бюджета?

Есть определённые признаки  успешного кино, например: комедии всегда коммерчески успешнее чем драмы, продолжительность идеального фильма стремится к 94 минутам, а если перед нами очередной «блокбастер» — риск неокупаемости повышается за счет ограниченной  емкости российского рынка. Подробнее по факторам инвестиционного успеха можно почитать здесь.

Экспериментировать мы будем на «малом» датасете российского кинопроката, включающем прокатные данные и информацию по режиссерам и сценаристам с 2004 года. Датасет содержит 1660 записей российских фильмов национального производства, начиная с фильма »72 метра» Владимира Хотиненко, вышедшего в прокат 12 февраля 2004 года, заканчивая картиной «Зоськина заправка», вышедшей в прокат 13 апреля 2023 года.

Автор вывел космический броненосец на запасную орбиту подготовил большую 146-факторную модель, охватывающую расширенную творческую группу фильма: продюсеров, монтажеров, композиторов и основных актеров, — с помощью которой уже возможно подбирать будущие характеристики кинофильма и состав творческой группы.  

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

Структура датасета

Датасет включает следующие признаки: ID_kinopoisk  -идентификационный номер кинофильма и столбцы значений:

—       week — порядковый номер недели выхода фильма с начала года,

—       month — порядковый  номер месяца выхода фильма с начала года,

—       screens — начальное количество экранов проката (экранных копий),

—       budget — бюджет фильма (в миллионах рублей),

—       age_R — возрастной рейтинг фильма от 0+ до 18+,

—       time — общая длительность фильма в минутах,

—       genre_box_buget — среднее соотношение сборы/бюджет по жанру,

—       genre_avr_kinopoisk_R — средний  зрительский рейтинг Кинопоиска по жанру,

—       genre_avr_box — средние сборы по жанру,

—       genre_avr_views — среднее количество просмотров для жанра проекта,

—       genre2_box_buget — сборы/ бюджет для поджанра проекта,

—       genre2_avr_kinopoisk_R — средний рейтинг для поджанра проекта,

—       genre2_avr_box — средние сборы для поджанра проекта,

—       genre2_avr_views — средние просмотры для поджанра проекта,  

—       dir_box_buget — среднее соотношение сборы/бюджет для режиссера,

—       dir_avr_kinopoisk_R — средний рейтинг режиссера на Кинопоиске,

—       dir_avr_box — средняя величина сборов проектов данного режиссера,  

—       dir_avr_views — средняя величина просмотров фильмов режиссера,

—       skr1_box_buget — среднее соотношение сборы/бюджет для сценариста,

—       skr1_avr_kinopoisk_R — средний зрительский рейтинг для сценариста,

—       skr1_avr_box — средняя величина сборов по проектам сценариста,

—       skr1_avr_views — среднее количество просмотров проектов сценариста,

—       skr2_box_buget — соотношение сборы/бюджет второго сценариста,  

—       skr2_avr_kinopoisk_R — средний зрительский рейтинг второго сценариста,

—       skr2_avr_box — среднее количество сборов проектов второго сценариста,

—       skr2_avr_views — среднее количество просмотров проектов второго сценариста.

Прогнозируемыми величинами у нас будут соответственно:

Для классификации:

—       rezult — фильм окупился в прокате — 1, не окупился — 0.

—       rezult4 — фильм провалился — 0, не окупился — 1, окупился — 2, принес хорошую прибыль — 3

Метрики классификации у нас будут стандартные: accuracy, ROC-AUC в добавление посмотрим на precision, recall, f1-score.

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

Регрессия и прогноз абсолютных значений по сборам, просмотрам и рейтингу «Кинопоиска» будут рассмотрены в следующей публикации.

Этап первый: базовые алгоритмы машинного обучения

Не будем пороть горячку, используем базовый алгоритм логистической регрессии. Выборку делим на тренинговую и тестовую в пропорции 70/30 и зафиксируем разделение random_state=42. Воспроизводилось результатов и расчётов — это святое для науки и для финансов!

Логистическая регрессия у нас работает только с нормализованными данными. Не забудем из sklearn.preprocessing вытащить StandardScaler и отмасштабируем признаки в диапазон от 0 до 1.

Отберем 26 признаков и целевое значение  (столбец result). Обучим и протестируем модель. 

Результат вполне неплох, мы получили точность 0,9238 и в общем-то верно предсказали прокатную судьбу 461 из 499 кинокартин.

Матрица ошибок логистической регрессии

Матрица ошибок логистической регрессии

Согласитесь, если продюсер или председатель отборочной комиссии заранее будет знать, что он может точно предсказать судьбу 92 проектов из 100 положенных ему на стол, рисуется просто идеальная картина. Ответственный сотрудник может заранее сверлить дырочки под орден «За заслуги перед бюджетом», потому что вложения окупились и принесли прибыль. За дверью кабинета стоит очередь из частных инвесторов из России и дружественных государств.

Оценка площади под кривой ROC_AUC

Оценка площади под кривой ROC_AUC

Но, увы не все так просто. В исходном датасете у нас примерно 11,5% фильмов — окупились.  Налицо явная несбалансированность в классах. Поэтому показатель accuracy для нас, увы, недостаточен. Если мы посмотрим на значения площади под кривой ROC = 0,9406 — он конечно лучше, чем гадание на кофейной гуще 0,5, но все же не так высок, как бы хотелось. Будем ориентироваться на показатели precision, recall, f1-score для класса (1) прибыльных картин.

precision

recall

f1-score

support

0

0.9352

0.9819

0.9580

441

1

0.7778

0.4828

0.5957

58

accuracy

0.9238

499

macro avg

0.8565

0.7323

0.7769

499

weighted avg

0.9169

0.9238

0.9159

499

Попробуем другой базовый метод, «машину опорных векторов».

Точность этой модели повыше 0,9359. Мы верно предсказали судьбу 467 кинокартин из 499 Это, конечно, лучше, но ненамного. Надо что-то помощнее и эффективнее.

Матрица ошибок

Матрица ошибок «машины опорных векторов»

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

Первый результат данной модели по точности не «айс» — всего 0,9158, и мы правильно определили только 457 кинокартин из 499.

Матрица ошибок

Матрица ошибок «решающих деревьев»

Впрочем, «решающие деревья» можно затюнить подбором гиперпараметров. GridSearchCV нам в помощь.  «Решёткой» мы пройдемся по criterion  («gini», «entropy», «log_loss»), splitter  («best», «random»), max_depth, min_samples_split, min_samples_leaf, max_feature и определим лучшее сочетание.

У нас получилось следующее: criterion = 'gini', max_depth =  5, max_features = 7, min_samples_leaf = 2,   min_samples_split =  15, splitter =  'best'.

При данных гиперпараметрах достигнута общая точность =  0,9419. Мы определили судьбу 470 картин из 499.

Матрица ошибок

Матрица ошибок «решающих деревьев» с подбором гиперпараметров

Не «Оскар», конечно, но по precision, recall, f1-score для положительного (прибыльного) класса уже лучше, чтобы не выбрасывать в корзину потенциально успешные  проекты.

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

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

Этап второй:  ансамбли и многоклассовая классификация

Итак, в жюри киноконкурса у нас: AdaBoostClassifier, BaggingClassifier, ExtraTreesClassifier, GradientBoostingClassifier, RandomForestClassifier, матрешки StackingClassifier и VotingClassifier с вложенными в них LogisticRegression и RandomForestClassifier, HistGradientBoostingClassifier и творение сумрачного гения и от «Яндекса» — CatBoostClassifier.

Мы создаем блок моделей, обучаем их на базовых настройках на 70%-выборке и делаем прогнозы по двум классам. И получаем соответствующее метрики качества.

Конечно можно попробовать поиграть с настройками и вложениям ансамблей серии  Bagging, Stacking и Voting, но оставим данный подход особо упоротым продвинутым специалистам — тем более GradientBoostingClassifier,   HistGradientBoostingClassifier и CatBoostClassifier показали вполне себе неплохие результаты уже в базе.

Модель

Accuracy

Precision

Recall

F1_score  

AdaBoost

0.9399

0.8043

0.6379

0.7115

Bagging

0.9479

0.8478

0.6724

0.7500

ExtraTrees

0.9339

0.9339

0.5172

0.6452

GradientBoosting

0.9519

0.8400

0.7241

0.7778

RandomForest

0.9519

0.8696

0.6897

0.7692

Stacking

0.9439

0.8750

0.6034

0.7143

Voting  

0.9098

0.8421

0.2759

0.4156

HistGradientBoosting

0.9499

0.8235

0.7241

0.7706

CatBoost

0.9559

0.8462

0.7586

0.8000

CatBoost дал нам точную оценку 478 кинокартин из 499. roc_auc_score  составил 0,9786.

Давайте для верности попробуем и HistGradientBoostingClassifier. Подберем гиперпараметры (learning_rate = 0.1, max_depth = 5, max_iter =100). Точность 0,9499. Количество верно предсказанных 474 из 499, ну и просто феноменальный roc_auc_score = 0,9801. Но этот показатель, как мы помним, для нас не так важен.

CatBoostClassifier

CatBoostClassifier

Ребята-создатели CatBoost и HistGradientBoosting — просто молодцы. Понятно, что почти четверть хороших проектов наш ИИ-отборщик может отправить в макулатуру, но на остальных проектах точно сделает прибыль. Ну, а если сценарист и заявитель принесет не один, а четыре «гениальных» проекта, шансы на успех повышаются и у него.  Ни Квентин Тарантино, ни Джордж Лукас не стартовали с первого поданного ими проекта.

HistGradientBoostingClassifier

HistGradientBoostingClassifier

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

Для этого мы воспользуемся режимом многоклассовой классификации и значениями столбца rezult4 нашего «малого» датасета. Работать мы будем с CatBoostClassifier с настройками на 4 класса.

И сразу на модели  получаем roc_auc = 0,9629 (естественно, с установкой multi_class='ovr') и общей точностью — 0,8938. Так же нам потребуется перевод меток классов в формат one-vs-all, для чего используем label_binarize. И получаем данные для всех 4-классов. Даже при первом взгляде, видим, что промежуточные классы — «провисают».

Оценка площади под кривой ROC_AUC

Оценка площади под кривой ROC_AUC

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

Лучше всего модели удается определять крайности — совсем провальные картины и очень успешные.  Рискнем также предположить, что вне зависимости от контекста — успешный фильм все-равно окупится в прокате, а неуспешный — провалится, как бы его ни «тянули за уши», предоставляя лучшие прокатные условия.

Матрица ошибок 4-классовой классификации

Матрица ошибок 4-классовой классификации

Напомним, 0 — фильм провалился в прокате, 1 — не окупился (не собрал два производственных бюджета), 2 — окупился, 3 — принес хорошую прибыль.

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

precision

recall

f1-score

support

0

0.9470

0.9825

0.9644

400

1

0.5882

0.4878

0.5333

41

2

0.5455

0.2500

0.3429

24

3

0.6923

0.7941

0.7397

34

accuracy

0.8938

499

macro avg

0.6932

0.6286

0.6451

499

weighted avg

0.8808

0.8938

0.8838

499

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

Что дальше? Подбором гиперпараметров модели можно улучшить показатели, но на считанные проценты (как правило — доли процентов). Поэтому, как бы нам ни хотелось этого избежать, — придется использовать и синтетические данные, применять сэмплировнаие для выравнивания баланса классов.

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

Этап третий:  балансировка классов и нейросеть

Увеличим выборку с использованием библиотеки imbalanced-learn. Теперь у нас примерно равное количество классов в общей выборке.  А заодно сравним как с новым датасетом справится уже хорошо знакомый CatBoostClassifier — и в пару к нему запустим обыкновенный MLP.

На увеличенной выборке со сбалансированными классами CatBoost показал феноменальные результаты по всем четырем классам с общей точностью в 0,9872. Теперь время ответить на вопрос — когда стоит «городить огород» то есть использовать другой подход к классификации?  

Используем нейросеть, построенную на архитектуре библиотеки TensorFlow — последовательную полносвязную сеть из трех слоев: 1. полносвязный слой (Dense) и функцией активации ReLU, принимающий  «на входе» входной тензор размерности 26 (по количеству признаков), полносвязный слой (Dense) с 64 нейронами и функцией активации ReLU, полносвязный слой (Dense) с 4 нейронами и функцией активации  Softmax  «на выходе». Скомпилируем ее при помощи следующих параметров: optimizer='adam' , loss='categorical_crossentropy' , metrics=['accuracy'].

График тренировки нейросети по эпохам по loss-функции

График тренировки нейросети по эпохам по loss-функции

Мы обучим данную нейросеть в течение 300 эпох. Чтобы не допустить ухудшения характеристик используем ModelCheckpoint, сохраняющую лучшие параметры настройки нейросети. Получим историю обучения и выберем эпоху обучения, где по показателю accuracy нейросеть настроена оптимально.

На графике функции потерь (loss) мы видим, что дальнейшее обучение после 200 эпохи уже бесполезно. График точности (accuracy) говорит нам, что после 170 эпохи наступает падение метрик. Но лучшее состояние модели ведь уже зафиксировали!  

График обучения нейросети по значению accuracy

График обучения нейросети по значению accuracy

По метрике точности (0,9697) на сбалансированном по классам датасете нейросеть уступила CatBoost. Единственное утешение — это тот факт, что оба подхода показали практически безошибочное определение категории окупившихся в прокате и принесших прибыль.

Матрица ошибок CatBoost на сбалансированных классах

Матрица ошибок CatBoost на сбалансированных классах

Для 4-классовой классификации на 26-факторной модели CatBoost на сбалансированных данных обогнала MLP. Что конечно не исключает возможности того, что на другом датасете, если поработать с настройками обучения MLP мы можем получить лучшие результаты. Для быстрого скорринга кинопроектов ансамблевых моделей машинного обучения вполне достаточно.

Матрица ошибок MLP на сбалансированных классах

Матрица ошибок MLP на сбалансированных классах

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

Развитие прогнозирования кинопроката

Предиктивная аналитика кинопроката очень развита в Китае, Индии и странах Азии — автор насчитал уже более 200 современных публикаций на данную тему.

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

Некоторые исследователи даже используют оценку человеческих эмоций с помощью инструментальных средств психодиагностики — от МРТ до всевозможных видов и наборов полиграфа и иных средств инструментальной психодиагнстики.

В следующей публикации планируем осветить вопросы регрессии: чтобы получить хотя бы приблизительное значение по сборам, просмотрам, а для эстетов — даже значение зрительского рейтинга «Кинопоиска». Зачем это нужно?

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

Рискнем вызвать гнев киноинквизиторов, но не блещущие 7–8-балльными оценками и золотыми статуэтками  Сарик Андреасян и Марюс Вайсберг — хорошие режиссеры с точки зрения исторической доходности и окупаемости. Жора Крыжовников, Дмитрий Дьяченко и примкнувший к ним  Клим Шипенко — очень хорошие. В России есть минимум два десятка первоклассных режиссеров-профессионалов, которым можно доверить инвестиции и рассчитывать на стабильный успех.

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

Выводы

Инвестиции в российское кино могут быть прибыльными. И для государства, и для частных инвесторов. Если использовать «портфельный принцип» инвестирования — средняя годовая доходность дает, конечно, не «иксы» прибыли как в случае с отдельными картинами, но в рисковом варианте доходить до 139% вполне возможно, как и «повторить» успех «Чебурашки».

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

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

Хороших  и успешных в прокате российских кинофильмов!

© Habrahabr.ru