Это мой второй проект в Istanbul Data Science Academy. Моя команда и я использовали методы веб-скрапинга и машинного обучения для создания проекта. В этом проекте вместо использования уже подготовленных данных мы использовали веб-скрапинг для сбора данных с веб-сайтов imdb и boxofficemojo. Целью здесь является оценка кассовых сборов фильмов. Однако нам может понадобиться больше методов, таких как применение обработки естественного языка в соответствии с комментариями аудитории, чтобы сделать наиболее точный прогноз. Вы можете посетить репозиторий проекта здесь. Ниже представлена ​​методология проекта.

· Веб-скрапинг и извлечение данных с boxofficemojo.com и imdb.com (200 лучших фильмов с 2011 по 2018 год)

· Определение наших особенностей.

· Выяснение того, что делать со значениями NaN.

· Окончательная регрессионная модель.

От первого до последнего, я постараюсь объяснить каждый шаг.

1) Веб-парсинг и определение функций

Для этого шага нам понадобится несколько библиотек Python, таких как pandas, numpy, request, Beautifulsoup. Во-первых, нам нужно отправить запрос на сайт Box Office Mojo, чтобы получить URL-адреса фильмов. Мы должны сделать этот шаг на следующей странице.

Если мы щелкнем правой кнопкой мыши и выберем опцию проверки, мы увидим html-коды сайта. С помощью библиотеки Beautifulsoup мы можем взять раздел href и таким образом получить URL-адреса. Вы можете увидеть код парсинга веб-страниц в моем репозитории GitHub, если хотите посмотреть поближе. Поскольку у нас есть все URL-адреса, мы можем отправить запрос на страницы этих фильмов и удалить с них некоторые данные. Возьмем следующие данные.

Получив эти данные, мы можем автоматизировать процесс, изменив год и URL-адреса. Достаточно изменить год URL-адреса первой страницы, чтобы изменить год. Для этого мы можем изменить 2018 год на любой другой год в этом URL-адресе https://www.boxofficemojo.com/year/2018/?ref_=bo_yl_table_4 с помощью этого кода:

Год за годом мы автоматизировали метод парсинга веб-страниц. Мы также можем захотеть сохранить заголовок в URL-адресе, потому что с этими заголовками мы также можем очищать данные от imdb, поскольку они используют ту же инфраструктуру. Итак, https://www.imdb.com/title/tt10293406/?ref_=adv_li_tt и https://www.boxofficemojo.com/title/tt10293406/ дают нам один и тот же фильм.

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

Как видите, у нас есть 8 столбцов и 1600 фильмов, так как мы собрали данные с 2011 по 2018 год. Важно то, что столбец бюджета заполнен значениями NaN, и мы должны заполнить их из-за того, что мы не можем указать значения NaN. к модели машинного обучения. Если мы отбросим их, мы упадем до 1000 строк, а это означает, что мы сотрем 37,5% данных. Это неприемлемо, так как 37,5% — большое число. Помня об этом, мы постарались максимально точно заполнить значения NaN.

2) Выяснение того, что делать со значениями NaN, и подготовка данных для машинного обучения

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

· Удаление значений NaN столбца бюджета

· Заполнение значений NaN столбца бюджета средними значениями.

· Заполнение значений NaN столбца бюджета медианным значением

· Оценка значений NaN в столбце бюджета с помощью регрессии и заполнение значений NaN этими новыми оценочными значениями.

Во-первых, я хочу еще раз объяснить. Что мы сделали здесь, так это выяснили, какой метод является наиболее точным, когда мы применяем модель машинного обучения, в то время как значения кассовых сборов (столбец Worldwide в нашем фрейме данных) являются нашим выходом. Мы применили эти методы к столбцу «Бюджет», поскольку в этом столбце содержится огромное количество значений NaN. Я дам результаты в следующей главе.

Во-вторых, поскольку в нашем фрейме данных есть категориальные столбцы, мы должны подготовить наши данные для регрессионной модели. Машины не могут понимать категориальные значения, такие как жанры, MPAA или внутренний дистрибьютор, поэтому мы должны использовать get_dummies() или аналогичную функцию для преобразования этих категориальных значений в единицы и нули. Проблема здесь в том, что значения жанра перечислены в одной ячейке. Поэтому, если мы используем get_dummies() для этого столбца, мы получаем единицы и нули только для одного списка (1 столбец как столбец Adventure-Mystery-Fantasy), а не 1 или 0 в столбце приключения или фэнтези. Поэтому мы должны брать значения списка одно за другим в строках жанров. Мы можем взять первые 2 жанра и сделать из них 2 отдельных столбца. Если есть один жанр, то второй жанр делаем NaN.

3) Применение множественной линейной регрессии

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

Если вы хотите посмотреть поближе, вы можете посетить файл «LinearRegressionMainCode_CerenAlkan.ipynb» в моем репозитории GitHub. Мы использовали библиотеку sci-kit learning для машинного обучения и получили следующие результаты:

0,67900 было недостаточно, поэтому мы попытались повысить точность, попробовав другие методы. Второй метод — заполнить значения NaN в столбце «Бюджет» средними значениями. С помощью этого метода мы получили следующие результаты:

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

Как видите, результаты слишком близки друг к другу и недостаточны для окончательного результата. Итак, мы хотели попробовать последний метод: мы взяли все значения NaN в столбце «Бюджет» и создали новый фрейм данных со всеми остальными функциями. Чтобы еще раз подчеркнуть, мы только что взяли 585 строк со значениями NaN в столбце «Бюджет». После этого мы попытались оценить значения бюджета. Таким образом, столбец «Бюджет» стал выходом, а другие столбцы, включая кассовые сборы по всему миру, стали входом. После разделения данных на тестовые и обучающие данные мы снова применили линейную регрессию. Наш тестовый балл R² оценки бюджета составил 0,68. Это означает, что мы можем оценить значения бюджета NaN с точностью 0,68. Мы подумали, что этого достаточно для бюджетных значений, и продолжили основную регрессию. Чтобы вернуться к основному фрейму данных с оценочными значениями бюджета, мы объединили фрейм данных с 585 строками и старым основным фреймом данных. И мы удалили значения NaN в столбце «Бюджет», потому что это была дублирующаяся информация о наших фильмах.

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

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

4) Заключение и будущая работа

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

Надеюсь увидеть вас в моей следующей статье…

Серен Алкан