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

Цель проекта

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

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

Методология проекта

  • Сбор данных, которые мы извлекли для набора данных TMDB.
  • Исследовательский анализ данных и разработка функций исследуют и визуализируют данные, чтобы иметь представление о внутренних и промежуточных переменных.
  • Дизайн экспериментов по моделированию для оценки производительности и выбора метода машинного обучения.
  • Определение важности / веса функции.
  • наконец, оцените модель на проверочном наборе с помощью R Square.

Необходимые инструменты

  1. Записная книжка Python и Jupyter (предпочтительно анаконда)
  2. Панды, Numpy, Scikit-learn, wordcount, eli5, TFID
  3. Случайный лес, LGB и GB Regressor для прогнозирования модели.

Получение данных

Загрузка набора данных

import pandas as pd
#loading the data set
df = pd.read_csv("data/train.csv")
#displaying top 5 data set
df.head()

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

#display the columns from the data set.
df.columns

Исследовательский анализ данных

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

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

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

sns.heatmap(df.corr(), cmap='YlGnBu', annot=True, linewidths = 0.2);

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

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

Давайте изобразим распределение доходов с помощью диаграммы распределения морского происхождения.

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

Введение в преобразование журнала

Почему искаженные данные не подходят для моделирования в линейной регрессии?

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

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

#creating log transformation for reveune
df['log_revenue'] = np.log1p(df['revenue']) #we are not using log0 to avoid & and null value as there might be 0 value

Давайте сравним наше значение Revenue и преобразование выручки в журнал с помощью библиотеки seaborn.

#comapring distribution of reveune and log revune side by side with histogram
fig, ax = plt.subplots(figsize = (16, 6))
plt.subplot(1, 2, 1) 
plt.hist(df['revenue']);
plt.title('Distribution of revenue');
plt.subplot(1, 2, 2)
plt.hist(df['log_revenue']);
plt.title('Distribution of log transformation of revenue');

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

Взаимосвязь между доходом от фильмов и бюджетом.

Давайте рассмотрим взаимосвязь, используя диаграмму рассеяния.

#let's create scatter plot
plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.scatter(df['budget'], df['revenue'])
plt.title('Revenue vs budget fig(1)');
plt.subplot(1, 2, 2)
plt.scatter(df['log_budget'], df['log_revenue'])
plt.title('Log Revenue vs log budget fig(2)');

Рис (1, левая сторона): мы можем видеть, что они в некоторой степени коррелируют между бюджетом и доходами, но мы не ясно.
Рис (2, правая сторона): однако этот график показывает, что существует корреляция между обе переменные - это логарифмическое преобразование дохода и логарифмическое преобразование бюджета.
Мы также можем посмотреть много фильмов с нулевым бюджетом, поскольку мы определили, что был фильм 815 с нулевым бюджетом (что было ошибкой), и мы очистим его позже. при прогнозировании нашей модели.

Связь между главной страницей и доходом.

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

#let's creat column called has_homepage and pass two value 1,0 (1, indicates has home page, 0 indicates no page)
df['has_homepage'] = 0
df.loc[df['homepage'].isnull() == False, 'has_homepage'] = 1 #1 here means it has home page
#since has_homepage is categorical value we will be using seaborn catplot.
sns.catplot(x='has_homepage', y='revenue', data=df);
plt.title('Revenue for movie with and w/o homepage');

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

Взаимосвязь между языковым распределением (Orginal_language) и средним доходом.

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

#we will be using blox pot
plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
sns.boxplot(x='original_language', y='revenue', data=df.loc[df['original_language'].isin(df['original_language'].value_counts().head(10).index)]);
plt.title('Mean revenue per language fig_1');
plt.subplot(1, 2, 2)
sns.boxplot(x='original_language', y='log_revenue', data=df.loc[df['original_language'].isin(df['original_language'].value_counts().head(10).index)]);
plt.title('Mean log revenue per language fig_2');

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

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

Какие слова часто используются в названиях и описаниях фильмов?

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

#let's find top words from movie Titles
start = time.time()
plt.figure(figsize = (12, 12))
token_title = ' '.join(df['original_title'].values) #create split to title by sprace to extract the text.
#bg color set to white for good contrast, by default bg color is darker
wordcloud = WordCloud(max_font_size=None, background_color='white', width=1200, height=1000).generate(token_title)
plt.imshow(wordcloud)
plt.title('Top words from movie titles ')
plt.axis("off") # we dont need axes for this
plt.show()
print(" Time taken to complete this operation is", time.time() - start, 'seconds')

Мы видим, что самые популярные слова - это «человек», «Последний», «Любовь», «Ла», «Жизнь», «Смерть» и так далее. Самые популярные или часто встречающиеся слова больше по размеру.

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

Влияет ли дата выхода фильма на доход?

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

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

Что ж, похоже, есть корреляция, но она может не иметь однозначного причинного эффекта.

Прогнозирование модели

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

#selecting the numeric column
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64'] #so that easy for us to perform  train and test
df_train=df.select_dtypes(include=numerics)
df_train.drop(columns=['id'],inplace=True) #we will be dropping ID
df_train=df_train.fillna(df_train.median()) #let's film the empty value with median of the data set

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

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

"бюджет", "популярность", "время выполнения", "доход", "log_revenue", "журнал_бюджет", "has_homepage", "release_date_year", "release_date_weekday", "release_date_month", "release_date_weekofyear", "release_date_day_quarter", "release_date_date" ',' Боевик ',' Приключения ',' Анимация ',' Комедия ',' Криминал ',' Документальный ',' Драма ',' Семейный ',' Фэнтези ',' Иностранный ',' История ',' Ужасы ', «Музыка», «Мистика», «Романс», «Научная фантастика», «Телевизионный фильм», «Триллер», «Война», «Вестерн».

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

#loading the training data set
X = df_train.drop(['revenue', 'log_revenue'], axis=1)
y= df_train['revenue'] #prediction
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 1)

Давайте спрогнозируем модель с помощью линейной регрессии.

#linear regression
lm = LinearRegression() #our 6th model
lm.fit(X_train, y_train)
lm_preds = lm.predict(X_test)
print("R Square: ", r2_score(y_test, lm_preds))

Наша линейная регрессия предсказывает квадрат R2 равным 0,6202258487857504.

Давайте спрогнозируем модель с помощью случайного форреста.

import sklearn.metrics as metrics
from sklearn.ensemble import RandomForestRegressor
RF_model = RandomForestRegressor(random_state =0, n_estimators=500, max_depth=10)
RF_model.fit(X_train, y_train)
y_hat = RF_model.predict(X_test)
print ("R-Squared is:", metrics.r2_score(y_hat, y_test))

Наш прогноз из случайного леса: 0,5643712234342768.

Давайте спрогнозируем модель с помощью Gradient Boost Regressor.

Наш R-квадрат, предсказанный бустером GB, намного лучше, чем у других моделей с R-квадратом 67%.

Важность функции / вес функции

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

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

Давайте сравним наш прогнозируемый доход и доход от фильма в заданном году.

test_result = pd.concat([train_genres, gbr_predictions], axis = 1, sort=True)
#look at top values only
test_result = test_result[[ 'budget', 'popularity', 'release_date_year','release_date_month', 'revenue','predicted_revenue']]
test_result.head()

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

Ключевые выводы

  • Драма - самый популярный жанр, за ним следуют комедия, триллер и боевик.
  • Иностранный фильм имеет меньшую выручку среди всех жанров.
  • В 2013 году было выпущено больше всего фильмов за один календарный год.
  • «Мститель», «Форсаж 7», «Красавица и чудовище» вошли в тройку лидеров по доходам от фильма.
  • Фильмы, выпущенные во втором квартале года, принесли наибольший доход.
  • Между бюджетом фильма и доходом от фильма была высокая корреляция.
  • Фильмы с высоким бюджетом показали тенденцию к высоким доходам.

Заключение

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

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

Еще одна важная вещь, о которой следует помнить, - определение успеха фильма является относительным, некоторые фильмы называются успешными на основе их общемирового валового дохода, а некоторые фильмы могут не блистать в деловой части, но могут быть названы успешными из-за хорошей оценки критиков и популярности. . Например, бюджет «Бойцовского клуба» составлял 63 миллиона долларов, но мировой валовой доход составлял всего 100 миллионов долларов, что означает, что чистая прибыль составила всего 37 миллионов долларов, что совсем не является хорошей суммой прибыли. Но с другой стороны, это очень популярный фильм, и его любят смотреть все любители кино. Итак, если мы рассматриваем только прибыль как определение успеха, то «Бойцовский клуб» не является успешным фильмом, но если мы рассмотрим другие факты, любой может считать этот фильм успешным.

Пожалуйста, обратитесь к моему Github для полного просмотра этого кода.

Ссылка









Http://dspace.bracu.ac.bd/xmlui/bitstream/handle/10361/9015/13301028%2C13301019_CSE.pdf?sequence=1&isAllowed=y