Как научиться применять методы машинного обучения, поставить задачу, выбрать модель, найти данные для её обучения и упростить работу аэропортов за пару месяцев, обнаружив связь между биржевыми индексами и дневным количеством пассажиров? Проще, чем может показаться.  Наша команда более десяти лет разрабатывает приложения, которые управляют работой крупнейших аэропортов: Франкфурт, Дублин, Манила, Джакарта, Майами, Пекин. Аэропорты используют приложения для оптимального управления ресурсами, организации работы и контроля за потоками информации аэропортов, координации расписания рейсов.  Крупные аэропорты обслуживают сотни тысяч пассажиров, тысячи тонн грузов и сотни самолётов в день. Так, за 2019 год аэропорт Франкфурта обслужил более 70 миллионов пассажиров, более двух миллионов тонн грузов и более пятисот тысяч самолётов. То есть, в день аэропорт обслуживал порядка 190 тысяч пассажиров, более пяти тысяч тонн грузов, более тысячи самолётов.  Такие показатели связаны с огромным количеством человеческих и материальных ресурсов. Для типичного пассажира внутренняя работа аэропорта представляется чёрным ящиком. Мы проходим набор рутинных процедур: собственную регистрацию, регистрацию или получение багажа, трансфер до самолёта и полёт. Кажется, всё достаточно просто, однако, это лишь вершина айсберга. Каждый видимый нами процесс включает в себя десятки подпроцессов, в которых задействованы сотни людей. Логично, что задачей менеджеров аэропорта является оптимизация процессов для снижения затрат на привлечение сотрудников и других ресурсов. Мы попытались решить это задачу.  Идея звучит достаточно просто: «Если вы знаете, сколько пассажиров обслуживает аэропорт в конкретный день – вы знаете, какой набор ресурсов для этого потребуется: сколько сотрудников должно выйти на работу, сколько автобусов будет использовано для доставки пассажиров к самолётам, сколько горючего этим автобусам потребуется». Таким образом, задача сводится к определению количества пассажиров в аэропорту в конкретный день в будущем. Это позволит менеджменту привлекать заранее известное количество ресурсов, а значит, точнее рассчитывать расходы. Поставленная задача является задачей регрессии, в которой необходимо установить зависимость количества пассажиров от других параметров. Следующим шагом стал подбор параметров, которые могли бы оказать влияние на количество пассажиров. Первыми в голову пришли характеристики искомого дня:   Время года. Туристические сезоны отчётливо прослеживаются и вносят существенный вклад в количество пассажиров. В авиации принято использовать астрономические сезоны, поэтому и мы опирались именно на них.  День недели. От дня недели зависит как количество туристических рейсов, так и количество рабочих перелётов.   Праздник и его характер. Информация о том, является ли день праздничным, продолжительность праздника, характер праздника (религиозный или общественный). Череда праздников, как правило общественных, может мотивировать людей совершать перелёты.   Важнейшим же шагом на пути к решению задачи стало предположение о влияние экономической ситуации в стране на пассажиропоток. А именно о том, что экономической рост стимулирует пассажиропоток, и между двумя этими величинами существует зависимость. Для динамической оценки состояния экономики мы решили использовать DAX, а также уровень занятости населения.   Deutscher Aktienindex – German stock index – важнейший фондовый индекс Германии. Индекс вычисляется как среднее взвешенное по капитализации значение цен акций крупнейших акционерных компаний Германии.  Ежедневные значения DAX, а также процент работающих граждан Германии были взяты с Yahoo Finance. Для обучения модели использовались данные о ежедневном количестве пассажиров в аэропорте за 2018 и 2019 год, взятые на kaggle. Сезонность, день недели и характер праздничности дня мы посчитали вручную. На подготовительном этапе были использованы исключительно открытые источники, данные из которых были сгруппированы в единый датасет.  Влияние состояния экономики на пассажиропоток не носит молниеносный характер. Должно пройти время для того, чтобы люди ощутили изменения на себе. Поэтому судить о текущем дне по текущему DAX – не совсем справедливо. Нужно было найти оптимальный сдвиг DAX от текущей даты по величине коэффициента корреляции между DAX и количеством пассажиров. Такой поиск обозначил 5 различных сдвигов со схожим результатом: от 15 до 19 дней относительно текущей даты.  Следующим шагом был выбор используемой модели. Нашей целью было получение минимального значения MAE, которое говорило бы об ошибке в (количество людей / день). Были испробованы различные варианты разбиения датасета на тест и трейн, различные сдвиги DAX относительно текущего дня, различные модели и их параметры. Конкретно были рассмотрены Linear Regressor, Random Forest, Gradient Boosting, SGDRegressor. Параметры для моделей подбирались с помощью GridSearchCV.  Mean Average Error Расчёт ошибки и точности предсказания происходил отдельно для каждого сдвига DAX для каждой модели. Результатом каждого прогона были графики как на картинке ниже. На каждом из таких графиков изображено реальное количества пассажиров из данных теста (синим) и график предсказаний модели на данных того же тестового датасета (оранжевым). Для уверенности в правильном обучении модели и недопущении её переобучения также сравниваются показатели MAE для теста и трейна. Их близость говорит о корректности обучения. Решение о компетентности модели и выборе данных принимались на основе MAE, однако привычный показатель score модели для каждого набора (сдвиг DAX + модель) тоже принимался во внимание.  При построении всех возможных комбинаций стало понятно, что с использованием любой модели наилучший результат достигается при использовании DAX со сдвигом в 15 дней. Как говорилось выше, при выборе модели, мы ориентировались на минимальность MAE. На основе этого критерия была выбрана модель Gradient Boosting с ошибкой в 297 человек. Это означает, что ошибка в день в среднем составляет вместительность одного самолёта.  Следующим шагом стало сохранение обученной модели с помощью pickle, использование REST API для взаимодействия с моделью и создание Docker-образа. После контейнеризации получаем готовое приложение, которое отвечает на вопрос о количестве пассажиров в аэропорту через 15 дней, исходя из DAX, уровня безработицы и информации о том, является ли день праздничным. Данное решение может быть встроено в инфраструктуру любого аэропорта при наличии данных о пассажиропотоке в прошлом. Необходимо лишь переобучить модель на данных конкретного аэропорта.  Это был первый проект подобного рода для нашей команды. Приложение вот-вот начнёт использоваться заказчиками, но мы уже строим планы по его дальнейшему усовершенствованию и хотим продолжить использовать машинное обучение для решения других задач. Если у вас есть вопросы, пишите в комментариях, буду рад ответить на них.