Импортируйте данные о прибытии авиакомпаний в блокнот Google Colab и используйте Pandas для их очистки. Затем создайте модель машинного обучения с помощью Scikit-Learn и используйте Matplotlib для визуализации результатов.

Цели обучения

В этом модуле мы будем:

  • Создайте блокнот Google Colab и импортируйте данные о полетах
  • Используйте Pandas для очистки и подготовки данных
  • Используйте Scikit-learn для создания модели машинного обучения
  • Используйте Matplotlib для визуализации вывода

Введение

Python — один из самых популярных языков программирования в мире. Он широко используется в сообществе специалистов по данным для машинного обучения и статистического анализа. Одна из причин его популярности — доступность тысяч библиотек с открытым исходным кодом, таких как NumPy, Pandas, Matplotlib и scikit-learn, которые позволяют программистам и исследователям изучать, преобразовывать, анализировать и визуализировать данные.

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

В этом модуле мы импортируем набор данных, содержащий информацию о своевременном прибытии для крупной авиакомпании США, и загрузим набор данных в блокнот. Затем мы очистим набор данных с помощью Pandas, создадим модель машинного обучения с помощью scikit-learn и воспользуемся Matplotlib для визуализации результатов модели.

Создайте блокнот Google Colab и импортируйте данные

Сначала мы создаем блокнот Google Colab, затем импортируем набор данных.

Созданный нами DataFrame содержит информацию о своевременном прибытии крупной авиакомпании США. Он имеет более 11 000 строк и 26 столбцов. (В выходных данных указано «5 строк», потому что функция заголовка DataFrame возвращает только первые пять строк.) Каждая строка представляет один рейс и содержит такую ​​информацию, как пункт отправления, пункт назначения, запланированное время вылета, а также то, прибыл ли рейс вовремя или с опозданием. . Мы рассмотрим данные более подробно чуть позже в этом модуле.

Очистить и подготовить данные

Прежде чем мы подготовим набор данных, нам нужно понять его содержание и структуру. Мы импортировали набор данных, содержащий информацию о своевременном прибытии для крупной авиакомпании США. Эти данные включали 26 столбцов и тысячи строк, каждая из которых представляла один рейс и содержала такую ​​информацию, как пункт отправления, пункт назначения и время вылета по расписанию. Мы также загрузили данные в блокнот и использовали простой скрипт Python для создания из них Pandas DataFrame.

DataFrame — это двумерная помеченная структура данных. Столбцы в DataFrame могут быть разных типов, точно так же, как столбцы в электронной таблице или таблице базы данных. Это наиболее часто используемый объект в Pandas.

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

Убедитесь, что DataFrame содержит 11 231 строку и 26 столбцов.

Теперь найдите время, чтобы изучить 26 столбцов в наборе данных. Они содержат важную информацию, такую ​​как дата выполнения рейса (YEAR, MONTH и DAY_OF_MONTH), пункт отправления и назначения (ORIGIN и DEST), запланированное время вылета и прибытия (CRS_DEP_TIME и CRS_ARR_TIME), разница между запланированным прибытием time и фактическое время прибытия в минутах (ARR_DELAY), а также опоздание рейса на 15 минут и более (ARR_DEL15).

Вот полный список столбцов в наборе данных. Время выражено в 24-часовом военном времени. Например, 1130 соответствует 11:30, а 1500 — 15:00.

Набор данных включает примерно равномерное распределение дат в течение года, что важно, поскольку вероятность задержки рейса из Миннеаполиса из-за зимних штормов в июле меньше, чем в январе. Но этот набор данных далек от того, чтобы быть «чистым» и готовым к использованию. Давайте напишем код Pandas, чтобы очистить его.

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

  1. Одна из первых вещей, которую специалисты по данным обычно ищут в наборе данных, — это отсутствующие значения. В Pandas есть простой способ проверить пропущенные значения. Для демонстрации выполните следующий код в ячейке в конце записной книжки:

Убедитесь, что вывод имеет значение «Истина», что указывает на то, что где-то в наборе данных отсутствует хотя бы одно значение.

2. Следующий шаг — выяснить, где находятся пропущенные значения. Для этого выполните следующий код:

3. Любопытно, что 26-й столбец («Безымянный: 25») содержит 11 231 пропущенное значение, что равно количеству строк в наборе данных. Этот столбец был создан по ошибке, так как импортированный файл CSV содержит запятую в конце каждой строки. Чтобы удалить этот столбец, добавьте в записную книжку следующий код и выполните его:

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

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

5. Единственным столбцом, который теперь содержит отсутствующие значения, является столбец ARR_DEL15, в котором используются 0 для определения рейсов, прибывших вовремя, и 1 для рейсов, которые не прибыли. Используйте следующий код, чтобы отобразить первые пять строк с отсутствующими значениями:

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

6. Причина, по которой в этих строках отсутствуют значения ARR_DEL15, заключается в том, что все они соответствуют рейсам, которые были отменены или изменены. Мы могли бы вызвать dropna для DataFrame, чтобы удалить эти строки. Но поскольку рейс, который отменен или перенаправлен в другой аэропорт, может считаться «опоздавшим», давайте воспользуемся методом fillna, чтобы заменить пропущенные значения единицами.

Используйте следующий код, чтобы заменить отсутствующие значения в столбце ARR_DEL15 единицами и отобразить строки с 177 по 184:

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

Теперь мы будем «бинировать» время отправления в столбце CRS_DEP_TIME и использовать метод get_dummies Pandas для создания столбцов индикаторов из столбцов ORIGIN и DEST.

  1. Используйте следующую команду для отображения первых пяти строк DataFrame:

Обратите внимание, что столбец CRS_DEP_TIME содержит значения от 0 до 2359, представляющие военное время.

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

Убедитесь, что числа в столбце CRS_DEP_TIME теперь попадают в диапазон от 0 до 23.

3. Теперь используйте следующие операторы для создания столбцов индикаторов из столбцов ORIGIN и DEST, отбрасывая при этом сами столбцы ORIGIN и DEST:

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

Построить модель машинного обучения

Для создания модели машинного обучения нам нужны два набора данных: один для обучения и один для тестирования. На практике у нас часто бывает только один набор данных, поэтому мы разбиваем его на два. Теперь мы выполним разделение 80–20 на DataFrame, который мы подготовили в задаче, чтобы мы могли использовать его для обучения модели машинного обучения. Мы также разделим DataFrame на столбцы функций и столбцы меток. Первый содержит столбцы, используемые в качестве входных данных для модели, а второй содержит столбец, который модель попытается предсказать в этом случае, столбец ARR_DEL15, который указывает, прибудет ли рейс вовремя.

  1. Снова откройте эту тетрадь.
  2. В новую ячейку в конце записной книжки введите и выполните следующие операторы:

Первый оператор импортирует вспомогательную функцию train_test_split из scikit-learn. Вторая строка использует функцию для разделения DataFrame на обучающий набор, содержащий 80% исходных данных, и тестовый набор, содержащий оставшиеся 20%. Параметр random_state задает генератор случайных чисел, используемый для разделения, а первый и второй параметры — это кадры данных, содержащие столбцы функций и столбец меток.

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

4. Теперь используйте эту команду, чтобы отобразить количество строк и столбцов в DataFrame, содержащих столбцы функций, используемые для тестирования:

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

  1. Выполните следующий код в новой ячейке, чтобы создать объект RandomForestClassifier и обучить его, вызвав метод fit.

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

2. Теперь вызовите метод прогнозирования, чтобы протестировать модель, используя значения в test_x, а затем метод score для определения средней точности модели:

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

Существует несколько способов измерения точности модели классификации. Одним из лучших общих показателей для модели бинарной классификации является кривая рабочих характеристик области под приемником (иногда называемая «ROC AUC»), которая, по сути, количественно определяет, как часто модель будет делать правильный прогноз независимо от результата.

  1. Прежде чем вычислять ROC AUC, мы должны сгенерировать вероятности предсказания для тестового набора. Эти вероятности являются оценками для каждого из классов или ответов, которые модель может предсказать. Например, [0.88199435, 0.11800565] означает, что с вероятностью 89 % рейс прибудет вовремя (ARR_DEL15 = 0) и с вероятностью 12 %, что он не прибудет (ARR_DEL15 = 1). Сумма двух вероятностей в сумме составляет 100%.

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

2. Теперь используйте следующий оператор, чтобы сгенерировать оценку ROC AUC из вероятностей с помощью метода scikit-learn roc_auc_score:

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

4. Scikit-learn содержит удобный метод под названием precision_score для вычисления точности. Чтобы количественно оценить точность вашей модели, выполните следующие операторы:

5. Scikit-learn также содержит метод под названием Recall_score для вычисления отзыва. Чтобы измерить отзыв нашей модели, выполните следующие операторы:

Визуализируйте вывод модели

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

Первый оператор — это одна из нескольких волшебных команд, поддерживаемых ядром Python, которые вы выбрали при создании блокнота. Это позволяет Jupyter отображать выходные данные Matplotlib в блокноте без повторных вызовов show. И он должен появиться перед любыми ссылками на сам Matplotlib. Последний оператор настраивает Seaborn для улучшения вывода Matplotlib.

2. Чтобы увидеть работу Matplotlib, выполните следующий код в новой ячейке, чтобы построить кривую ROC для модели машинного обучения, которую мы построили в предыдущей задаче:

Пунктирная линия в середине графика представляет вероятность получения правильного ответа 50–50. Синяя кривая представляет точность нашей модели. Что еще более важно, тот факт, что эта диаграмма вообще появляется, демонстрирует, что мы можем использовать Matplotlib в блокноте.

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

  1. Введите следующее определение функции в новую ячейку, а затем запустите ячейку.

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

2. Используйте приведенный ниже код, чтобы вычислить вероятность того, что рейс из Нью-Йорка в Атланту вечером 1 октября прибудет вовремя. Год, который мы вводим, не имеет значения, потому что он не используется в модели.

3. Измените код, чтобы вычислить вероятность того, что тот же рейс днем ​​позже прибудет вовремя:

4. Теперь измените код, чтобы вычислить вероятность того, что утренний рейс того же дня из Атланты в Сиэтл прибудет вовремя:

Теперь у нас есть простой способ с помощью одной строки кода предсказать, будет ли рейс вовремя или поздно.

  1. Выполните следующий код, чтобы построить график вероятности своевременного прибытия на вечерний рейс из JFK в ATL в диапазоне дней:

Краткое содержание

В этом модуле мы научились:

  • Создайте блокнот в Google Colab
  • Импорт данных в записную книжку с помощью библиотек
  • Используйте Pandas для очистки и подготовки данных
  • Используйте scikit-learn для создания модели машинного обучения

Используйте Matplotlib для визуализации результатов

Pandas, scikit-learn и Matplotlib — одни из самых популярных библиотек Python на планете. С их помощью мы можем подготовить данные для использования в машинном обучении, построить сложные модели машинного обучения на основе данных и наметить выходные данные. Блокноты Colab предоставляют готовую среду для использования этих библиотек.

Спасибо,