Предсказание победителей 92-й церемонии вручения премии "Оскар" на основе данных о популярности, производстве и родословной

Прогнозирование победителей премии «Оскар» уже давно стало популярным видом спорта среди фанатов и кинокритиков. Однако прогнозы экспертов основаны не столько на объективной оценке, сколько на личных вкусах и предпочтениях. «Конечно, — возразят критики, — как же иначе? Фильмы — это произведения искусства, которые заслуживают того, чтобы их оценивали на основе чувств, а не фактов и статистики». Было бы глупо утверждать обратное.

Но выборы, спортивные соревнования и фондовый рынок, управляемые факторами столь же туманными, как и человеческие чувства, подверглись инструментам аналитики. Так почему бы не получить кинонаграды? Чтобы выяснить, есть ли какая-то реальная сила в числах, когда дело доходит до предсказания победителей на церемонии вручения премии «Оскар», я решил построить прогностическую модель, которая обрабатывает числа, чтобы предсказать, кто станет победителем. Когда, к моему удивлению, модель смогла предсказать 7 из 9 номинантов в категории «Лучший фильм» в этом году, я был ошеломлен! Этот пост в блоге — тот же проект, доведенный до логического завершения путем предсказания наиболее вероятных победителей «Оскара» в этом году.

Я рассматривал только основные категории, по которым я мог получить надежные данные начиная с 1960 года. Эти категории: Лучший фильм, Лучший режиссер, Лучшая мужская роль, Лучшая женская роль, Лучшая мужская роль второго плана и Актриса. Прогнозы основаны исключительно на общедоступных данных: актерский состав фильма, режиссер, продюсеры, бюджет, кассовые сборы, жанр и рейтинги фанатов. Для составления прогнозов были объединены три типа информации:

  1. Подробности о производстве фильма: актерский состав, съемочная группа, жанр, продолжительность, размер актерского состава.
  2. Мудрость публики, измеряемая рейтингами фильмов, размещенными аудиторией на гнилых помидорах, мета-критике и IMDB.
  3. родословная каждого фильма, рассчитанная на основе прошлых достижений его актеров, съемочной группы, сценариста и режиссера на предыдущих премиях Академии.

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

Жизнь коротка, сначала давайте спойлеры

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

[Отказ от ответственности: эта модель была построена в рамках проекта по исследованию персональных данных и не отражает мои личные предпочтения или вердикт о достоинстве и рейтинге какого-либо фильма.]

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

  1. Лучший фильм:награда достается Джокеру,с Ford против Ferrari на втором месте .
  2. Лучшая режиссура: режиссер Джокера Тодд Филлипс получает награду за лучшую режиссуру
  3. Лучшая женская роль: между Синтией Эриво (Гарриет) и Сиршей Ронан (Маленькие женщины >), где Эриво вышел победителем.
  4. Лучшая мужская роль: Хоакин Феникс получает награду за роль зловещего безумного заклятого соперника Бэтмена в Джокере.
  5. Лучшая женская роль второго плана: Марго Робби(Bombshell) получает награду в тесном состязании с Кэти Бейтс (Ричард Джуэлл >)
  6. Лучшая мужская роль второго плана: Том Хэнкс убедительно выходит на первое место за роль Фреда Роджерса в Прекрасном дне по соседству, обойдя Энтони Хопкинса, который занимает второе место за роль Папы Бенедикта XVI в Два Папы

Относительные вероятности выигрыша.

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

Конвейер аналитики

Широкая стратегия состоит из следующих шагов:

  1. Сбор и очистка данных (с использованием API и веб-скрапинга)
  2. Обработка данных и визуализация прошлых тенденций
  3. Прогнозирование номинаций (только за лучший фильм)
  4. Прогнозирование победителей (для всех категорий)

Сбор и очистка данных

Часто подчеркивается, что предсказания хороши ровно настолько, насколько хороши данные. Поэтому моей первой задачей было получить чистые, надежные, точные и самые свежие данные о фильмах, доступных в Интернете. В частности, поскольку я пытался предсказать победителя «Оскара» 2020 года, мне нужна была достоверная информация о фильмах, выпущенных в 2019 году.

Общая стратегия прогнозирования номинантов и победителей 92-й церемонии вручения премии «Оскар» включала в себя сбор трех категорий информации:

  1. Основная информация о фильме, такая как продолжительность фильма (продолжительность), размер актерского состава и жанр.
  2. Рейтинги фильмов, данные фанатами на IMDB, гнилые помидоры и метакритики
  3. Оскаровая родословная фильма и задействованных артистов, основанная на прошлых выступлениях его режиссера, актеров, сценариста и продюсеров на предыдущих премиях Оскар.

Получение информации о фильме

Хотя в Интернете на таких сайтах, как Kaggle и Dataworld, доступно несколько различных наборов данных о фильмах, мне пришлось получить собственную информацию о фильмах по нескольким причинам. Кураторские наборы данных, хотя их легко получить и с ними приятно работать в личных проектах, обычно часто устаревают или содержат недостающую информацию. Поскольку я намеревался решить настоящую проблему — предсказать победителя Оскара 2020 года, — я хотел работать с чистыми, надежными и самыми последними доступными данными. Мне не удалось найти набор данных, который содержал бы всю информацию, необходимую для построения прогностической модели, которую я имел в виду. Мне нужна была не только информация об актерском составе, съемочной группе, режиссере и сценаристе каждого фильма, которую я не смог найти в Интернете, мне также нужна была информация о премиях Оскар прошлых лет в каждой отдельной категории для обоих фильмов и личностях, которые выиграли. их. Хотя поначалу это пугало, оказалось, что получать собственную информацию гораздо проще и приятнее. Кроме того, есть что-то очень приятное и обнадеживающее в работе с вашими собственными данными, уверенность, которую вы никогда не почувствуете, работая с чужим набором данных.

Поэтому я решил собрать все данные из Википедии и IMDB, используя такие пакеты, как модуль запросов Python, BeautifulSoup() и API OMDB. Я собрал информацию о более чем 16000 фильмов с 1960 по 2019 год.

Я также получил информацию о фильмах, которые были номинированы или получили награду на «Оскаре» с 1960 по 2019 год, в том числе о лицах, которые были номинированы в таких категориях, как «Лучшая мужская роль», «Актриса», «Режиссер» и т. д. Эта информация позволила бы мне оценить каждый фильм на основе о прошлых выступлениях на «Оскаре» актеров, съемочной группы, сценариста и режиссера. Эта оценка была мерилом Оскаровой родословной фильма и использовалась в качестве предиктора для модели.

В конце процесса сбора данных были получены 3 первичных набора данных.

  1. Информация о фильмах: режиссер, актеры, сценарист, продюсер, продолжительность, жанр, рейтинги imdb, гнилые помидоры и метакритики.
  2. Информация о победах и номинациях на премию Оскар для каждого фильма, номинированного с 1955 года.
  3. Информация о победах в премии «Оскар» и номинациях отдельных победителей в каждой категории с 1955 года.

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

Эти наборы данных были загружены здесь.

Очистка данных

Данные были получены из Википедии и IMDB с помощью инструментов веб-скрейпинга, таких как модуль запросов Python, BeautifulSoup() для анализа html-данных и регулярных выражений (re). Несоответствия и недостающая информация в данных были исправлены. Информация о бюджете и кассовых сборах стандартизирована для выражения в миллионах долларов, а продолжительность - в минутах. Эта информация была сохранена в словаре Python.

Типичный словарь фильмов выглядит следующим образом:

Информация была организована в 3 первичных фреймах данных.

  1. Кадр данных фильма со столбцами, соответствующими названию, году, размеру касты, времени выполнения, информации о жанре.
  2. Оскар DataFrame на уровне фильмов, означающий для каждой категории победу (W), номинацию (N) или ничего (O). Некоторые фильмы, получившие несколько номинаций в одном и том же году и в одной категории, были обозначены как выигравшие и номинированные («WN»).
  3. Второй кадр данных Оскара, содержащий имена людей, которые получат награду или номинацию в таких категориях, как «Лучший актер», «Режиссер» и т. д.

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

Обработка данных

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

Оценка родословной

Для каждой категории (скажем, «Лучший режиссер»), фильма (скажем, «Линкольн», 2012) все победы и номинации на премию «Оскар» из прошлого учитывались для подсчета количества побед и номинаций режиссера (Стивен Спилберг) и сохранялись в кадре данных. . Для нашего примера фильма (Линкольн, 2012) таблица будет выглядеть примерно так:

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

Таким образом, до Стивен Спилберг получил «Оскар» за режиссуру «Списка Шиндлера», он еще не получил свою первую награду, но имел 3 номинации на свое имя.

Оценка родословной стала важной переменной для моей прогностической модели.

Для тех, кому интересно, как рассчитывается оценка родословной, вот код:

df_oscars['past_wins'] = 0
df_oscars['past_noms'] = 0
for row in df_oscars.iterrows():
    
    # each row is a film
    idx = row[0]
    print(idx, 'of', len(df_oscars))
    if idx%10 == 0:
        clear_output()
    
    name = row[1].individual
    year = row[1].year
# Look at past year for that individual (actor, director etc.)
    temp = df_oscars[(df_oscars['year'] < year)&(df_oscars['individual'] == name)]
    num_wins = 0
    num_noms = 0
    # Count W's and N's
    if 'W' in temp.result.value_counts().index:
        num_wins = temp.result.value_counts()['W']
    if 'N' in temp.result.value_counts().index:
        num_noms = temp.result.value_counts()['N']
    df_oscars.loc[idx,'past_wins'] = num_wins
    df_oscars.loc[idx,'past_noms'] = num_noms

Визуализация данных

Затем я попытался визуализировать данные несколькими различными способами, чтобы понять, что отличает победителей Оскара от номинантов и тех, кто вообще не получает никаких номинаций. В частности, мне было интересно понять, какие жанры наиболее важны для определения победителя. Оказывается, Академия отдает предпочтение драмам той или иной формы, таким как историческая драма, эпическая драма, спортивная драма и т. д.

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

Например, вероятность того, что фильм-победитель окажется «ужастиком», почти равна нулю, а вероятность того, что «драма» окажется чрезвычайно высокой (почти 1). Такие жанры, как «история», «романс» и «биография» имеют высокие шансы на победу, но только в том случае, если они объединены с категорией «драма». Действительно, некоторые из самых известных фильмов, получивших награды, соответствуют наблюдательности: «Линкольн» — «биографическая драма», «Список Шиндлера» — «историческая драма», «Форрест Гамп» — «комедийная драма», а «Пролетая над гнездом кукушки» — « психологическая драма».

Некоторые другие тенденции, которые я пытался понять во время визуализации данных, заключаются в том, имеют ли фильмы, получившие «Оскар», более высокие рейтинги IMDB. Это действительно оказалось так, но незначительно, как показывают графики ниже. Мы видим, что фильмы, выигравшие (W), как правило, имеют немного более высокие рейтинги по сравнению с фильмами, которые были номинированы (N), которые, в свою очередь, имеют несколько более высокие оценки, чем фильмы, не получившие ни одной номинации (O).

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

И наконец, в качестве интересного дополнения, я хотел посмотреть, как совокупные оценки родословных и рейтинги IMDB отражаются в данных. Я объединил информацию и составил список лучших фотографий за последние 6 десятилетий. Баллы были рассчитаны путем умножения чистого балла IMDB для каждого фильма на количество побед и номинаций. Ниже представлены лучшие фильмы с 1960 года, получившие как награды «Оскар», так и рейтинги фанатов. Размер пузырьков соответствует кассовым сборам фильмов.

Прогноз

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

Еще раз напоминаем, что предикторы, которые использовались для прогностической модели, следующие:

  1. Основная информация о размере актерского состава каждого фильма, продолжительности, жанре
  2. Оценка родословной каждого фильма, основанная на прошлых выступлениях его актеров и съемочной группы.
  3. Рейтинги фанатов от IMDB, метакритика и тухлые помидоры

Несколько слов о нормализации

Известно, что большинство алгоритмов машинного обучения работают лучше, если входные данные нормализованы до таких интервалов, как (-1,1) или (0,1)

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

def normalize_by_year(df, columns, _how = 'max'):
    """Function normalizes the entries of specified column for each year
    """
    
    if type(columns)!= list:
        print("columns must be list")
        return dict()
    years = list(set(df.year))
print(years)
    
    if _how == 'pctile':
        df = convert_to_pctile(df, columns)
        return df
for column in columns:
        cols = ['year'] + [column]
        for year in years:
            if year%10 == 0:
                clear_output() 
            print(year, column)
            temp_df = df[(df.year == year)]
            temp_df = temp_df[column]
            ids = temp_df.index
            
            if _how == 'max':
                df.loc[ids,column] =     df.loc[ids,column]/temp_df.max()
            if _how == 'minmax':
                min_max_scaler = preprocessing.MinMaxScaler()
                vals = df.loc[ids,column].values
                # vals.shape = (len(vals),1)
                print(vals.shape)
                vals = vals[:,np.newaxis]
                print(vals.shape)
                scaled_array = min_max_scaler.fit_transform(vals)
                df.loc[ids,column] = scaled_array
            
                
    return df
##### Function for percentile normalization #######
def convert_to_pctile(X, columns):
    """Normlization by calculating percentile:
    Converts array of numbers and converts them into percentile
    between 0 (0 percentile) and 1 (100 percentile).
    """
    
    for col in columns:
        x = np.array(X[col])
        X[col] = [(len(np.where(x<=y)[0])/len(x)) for y in x]
    return X

Какая модель?

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

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

Прогнозирование номинантов в категории "Лучший фильм"

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

Прогнозирование победителей и номинантов в основных категориях

Чтобы предсказать финального победителя в каждой из основных категорий — «Картина», «Режиссёр», «Актёр», «Актриса», «Актер второго плана» и «Актриса второго плана» — я использовал набор логистических регрессий (n = 50 оценщиков). Модели логистической регрессии просты в реализации, дают оценки вероятности в качестве своих естественных результатов и впечатляюще работают при прогнозировании кандидатов. Эти причины были достаточно хороши для меня.

Чтобы предсказать окончательных победителей, я отфильтровал только номинантов в каждой категории с 1960 по 2020 год и загрузил их в классификатор (набор моделей логистической регрессии). Окончательные результаты показаны ниже.

Итак, еще раз, вот мои окончательные прогнозы.

Ну, это все, что у меня есть. Имеют ли данные ответы на все вопросы? Нам придется подождать и посмотреть, когда 9 февраля 2020 года будут объявлены окончательные награды. Будет интересно посмотреть, сколько модель получит права.

Весь код и данные загружены на Github. Вы можете получить доступ к ним здесь".

Спасибо за чтение.