Пошаговое руководство по внедрению

Этот рассказ является частью Инициативы MSP Developer Stories в рамках программы Microsoft Student Partner (Индия). Студенческие партнеры Microsoft (MSP) - это лидеры на территории кампуса, которые со страстью вносят свой вклад, создавая динамичные сообщества и делясь новейшими технологиями со своими коллегами.
Если вы считаете, что обладаете вышеуказанными качествами, подайте заявку на получение статуса MSP. на https://studentpartners.microsoft.com/

ВВЕДЕНИЕ

В этой истории мы предскажем, будет ли рейс задержан или нет, в зависимости от ранее доступного набора данных. Цель модели - предсказать, прибудет ли рейс, который вы собираетесь забронировать, вовремя? Мы будем идти поэтапно. Сначала мы узнаем, как создавать записные книжки в Azure Notebook, а затем перейдем к импорту данных в записную книжку с помощью curl. Затем научитесь использовать Pandas для очистки и подготовки данных, scikit-learn для построения модели и, наконец, научитесь использовать Matplotlib для визуализации результатов.
Начнем с создания записной книжки Azure.

Создание записной книжки Azure

Блокнот Azure - это блокнот Jupyter (ранее IPython), показывающий код Python, уценку и интерактивную графику. Более того, это бесплатный сервис для всех, кто запускает код в своем браузере с помощью Jupyter. В настоящее время доступны ядра Python 2.7, Python 3.5, Python 3.6, R 3.4.1 и F # 4.1.9.
Мы будем использовать Python повсюду. Ядро Python также включает библиотеки numpy, matplotlib, scikit-learn, pandas и bokeh помимо базового дистрибутива Python.

Если вы хотите узнать больше об утилитах ноутбуков Azure, вы можете прочитать этот блог одного из сотрудников Microsoft.

Для начала перейдите на https://notebooks.azure.com/ и войдите в систему, используя свою учетную запись Microsoft. Вы увидите что-то вроде этого:

Нажмите Мои проекты в верхнем левом углу.

На странице «Мой проект» нажмите «+ Новый проект» вверху, как показано ниже.

Назовите Новый проект «Задержка рейса» или что-нибудь подобное. Вы можете сделать свой проект общедоступным. Но вы можете изменить этот параметр позже. И, наконец, нажмите кнопку «Создать».

Наконец-то приземлился в проекте Flight Delay.

Теперь нажмите + Создать. Вы увидите такие параметры, как «Блокнот», «Папка», «Пустой файл», «Уценка».
Здесь мы будем использовать «Блокнот», поэтому нажмите «Блокнот». Для информации пустой файл дает вам возможность записать как имя файла, так и его расширение. Используйте его при необходимости.

Назовите записную книжку «Прогнозирование задержки рейса.ipynb» или что-нибудь подобное. Выберите Python 3.6 в качестве языка. Это добавит ядро ​​Python 3.6 в Notebook.

Затем нажмите на блокнот, чтобы открыть его. Это также позволит вам редактировать это.

Импорт данных для работы

Теперь мы узнали, как создать записную книжку Azure. Когда вы начнете работать с записной книжкой Azure, вы также сможете создавать дополнительные проекты и записные книжки. Вы также можете загрузить Блокноты или просто начать работать с ним с нуля.

Теперь мы начнем с импорта данных. Для этого воспользуемся командой Bash curl. Чтобы использовать команду bash, нам нужно добавить восклицательный знак к ее префиксу.

Моя записная книжка, содержащая весь код, находится в конце этой истории.

Добавьте следующую команду в первую ячейку записной книжки и нажмите Shift + Enter (или нажмите кнопку RUN), чтобы выполнить ее. Вы должны увидеть следующий результат, как показано ниже.

Теперь преобразуйте данные в Pandas Dataframe, назовите его df и отобразите с помощью dataframe.head (). Dataframe - это двумерная структура данных, как и электронная таблица.

Фрейм данных содержит информацию о своевременном прибытии основных авиакомпаний США.

В нем 26 столбцов, и отображаются первые 5 строк. Каждая строка здесь представляет информацию об одном рейсе.

Глядя на имя столбца, можете ли вы догадаться, что представляет собой каждый столбец?

Анализ данных

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

Давайте разберемся, что означает каждый столбец в фрейме данных.
ГОД - Год, в котором выполнялся полет
КВАРТАЛ - Квартал, в котором выполнялся полет (1–4)
МЕСЯЦ - Месяц, в котором выполнялся полет (1–12)
DAY_OF_MONTH - День месяца, в котором выполнялся рейс (1–31)
DAY_OF_WEEK - 1 для понедельника, 2 для вторника и т. Д. на котором выполнялся рейс
UNIQUE_CARRIER - код авиакомпании
TAIL_NUM - бортовой номер самолета
FL_NUM - номер рейса
ORIGIN_AIRPORT_ID - идентификатор аэропорта отправления
ORIGIN - код отправления аэропорт (ATL, DFW, SEA и т. д.)
DEST_AIRPORT_ID - ID аэропорта назначения
DEST - Код аэропорта назначения (ATL, DFW, SEA и т. д.)
CRS_DEP_TIME - Время отправления по расписанию
DEP_TIME - Фактическое время отправления
DEP_DELAY - Задержка отправления в минутах
DEP_DEL15 - 1, если вылет задерживается на 15 минут или более, иначе 0
CRS_ARR_TIME - Время прибытия по расписанию
ARR_TIME - Фактическое время прибытия
ARR_DELAY - Задержка прибытия в минутах
ARR_DEL15 - 1, если прибыл с опозданием на 15 минут или более, иначе 0
CANCELED - 1, если рейс был отменен, еще 0
DIVERTED - 1, если рейс был изменен иначе 0
CRS_ELAPSED_TIME - Время полета по расписанию в минутах
ACTUAL_ELAPSED_TIME - Фактическое время полета в минутах
DISTANCE - Пройденное расстояние в милях

Очистка и подготовка данных

Перед тем, как внедрить машинное обучение, нам нужно выполнить еще две задачи:

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

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

Запустите df.isnull (). Values.any (), и если результат будет True, то в наборе данных отсутствуют значения.

Следующая задача - найти недостающие значения. Запустите df.isnull (). Sum (), это покажет количество пропущенных значений в каждом столбце.

Мы видим, что в 26-й строке «Безымянный: 25» пропущено 11231 значение. Это связано с тем, что импортированный вами файл CSV содержит запятую в конце каждой строки. Давайте удалим эту строку.

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

Итак, давайте отфильтруем набор данных с необходимыми столбцами.

Теперь мы видим, что в столбце ARR_DEL15 все еще есть недостающие данные. Pandas называет отсутствующие файлы NaN - не числом. их можно увидеть, набрав df [df.isnull (). values.any (axis = 1)]. head (188).

Теперь мы воспользуемся методом filllna, чтобы сделать их равными 1. Сделайте это с помощью
df = df.fillna ({'ARR_DEL15': 1}). Это будет служить цели.
Используйте df .iloc [177: 185] для просмотра набора данных в диапазоне от 177 до 185. Вы обнаружите, что некоторые строки, показанные раньше, имели NaN, теперь имеют 1.

Обратите внимание, что CRS_DEP_TIME находится в военном времени. Давайте объединим время отправления в интервал от 0 до 23.

Теперь давайте сгенерируем индикатор столбца из столбцов ORIGIN и DEST, отбросив их.

Теперь, наконец, наш набор данных подготовлен и готов к работе над моделью.

Постройте модель

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

Здесь мы импортировали функцию train_test_split из sklearn. Затем используйте его для разделения набора данных. Кроме того, test_size = 0,2, он делает разделение на 80% как набор данных поезда и 20% как набор данных теста.

Параметр random_state инициирует генератор случайных чисел, который помогает разделить набор данных.

Функция возвращает четыре набора данных. Обозначил их как train_x, train_y, test_x, test_y. Если мы увидим форму этих наборов данных, мы увидим разделение набора данных.

Можете ли вы угадать, что произойдет, если вы вызовете shape для двух других наборов данных? Попробуйте сами!

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

Мы будем использовать RandomForestClassifier, который подгоняет несколько деревьев решений к данным. Наконец, я обучаю модель, передавая train_x, train_y методу fit.

После обучения модели нам нужно протестировать модель. Для этого мы передадим test_x методу прогнозирования.

Мы проверим точность модели, проверив оценку.

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

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

Почему показатель AUC ниже средней точности?

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

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

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

Другие меры точности моделей классификации включают точность и отзывчивость. Далее мы спрогнозируем точность модели. Scikit-learn помогает с функциями precision_score и вспомнить_score для вычисления точности.

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

Визуализация вывода модели - самая захватывающая часть, когда вы видите свою работу. Для этого мы будем использовать matplotlib.

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

Затем мы построим кривую ROC, которую мы создали ранее.

Пунктирная линия в середине показывает 50–50 шансов получить правильный ответ. Синяя кривая представляет точность модели. Если эта диаграмма появляется, это означает, что вы можете использовать matplotlib в записной книжке Jupyter.

Основная цель разработки этой модели - предсказать, будет ли рейс задержан или нет.

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

Функция принимает дату (в формате дд / мм / гггг), время, исходный код и код аэропорта назначения в качестве входных данных и возвращает значение от 0,0 до 1,0, указывающее вероятность прибытия рейса на время.

Давай проверим.

Что, если мы проверим его на следующий день или в другое время? Попробуйте сами!
Экспериментируйте, как хотите. Но используйте только ATL, DTW, JFK, MSP и SEA в качестве кодов аэропортов, поскольку это единственный аэропорт, на котором обучается модель.

Теперь, наконец, давайте изобразим вероятности вечернего перелета из JFK в ATL за недельный диапазон.

Эта история основана на модуле Microsoft Learn. Вы можете найти это здесь". Вы можете найти мою записную книжку здесь. Теперь исследуйте записные книжки Azure и экспериментируйте с ними по своему усмотрению.