Мотивация

Полет по делам полон неопределенности. Для путешественников, у которых мало времени для пересадки или приближается время прибытия к важной встрече, даже небольшая задержка рейса может вызвать серьезное беспокойство. Почти треть деловых путешественников Апсайда столкнулись с задержкой рейсов только за последние 30 дней. Из всех задержанных рейсов 11% были задержаны более чем на час, а 4% - более чем на два! Задержки - это не только неудобства для путешественников - с точки зрения потери производительности компании могут потерять сотни тысяч, если не миллионы долларов в год.

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

По данным Бюро транспортной статистики, внутренние авиалинии сообщили о своевременности прибытия около 80% за 2015–2016 годы. Из всех задержанных рейсов примерно 25–35% этих рейсов (в зависимости от месяца года) были задержаны из-за плохой погоды. Еще 5–10% задержек рейсов произошло из-за опоздавших самолетов. Если мы сможем точно смоделировать эти задержки, на нас будет приходиться почти половина всех задержек рейсов в год!

Так появился предсказатель задержки.

Сбор данных

Для получения ежемесячных и годовых показателей авиакомпаний Бюро транспортной статистики также публикует базовые данные, которые отслеживают эффективность каждого внутреннего рейса, выполняемого крупными авиаперевозчиками. Мы загрузили этот набор данных для исторических рейсов, начиная с 2012 года, и постоянно добавляем новые данные по мере их появления для более поздних рейсов. Аналогичный набор данных был опубликован Kaggle для всех рейсов в 2015 году. По последним подсчетам, у нас есть более 40 миллионов строк своевременных данных о производительности, хранящихся в таблице Snowflake, доступной для всей нашей команды по анализу данных.

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

Очевидным местом для начала моделирования было прогнозирование задержек рейсов, вызванных погодными условиями. Для этого мы решили использовать API Dark Sky, потому что он предоставляет как исторические , так и прогнозируемые погодные условия с использованием одной и той же конечной точки REST. На этом этапе я хотел бы остановиться и поклониться тому, кто построил конечную точку / прогноз в Dark Sky. Он очень простой в использовании, относительно недорогой и почти всегда дает верный ответ. Кроме того, наша команда в Upside одержима приложением для смартфонов Dark Sky, и я призываю всех загрузить и использовать его!

Построение модели

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

Выбор классов задержки был немного сложным, но с помощью гистограммы ниже мы решили выбрать 0–30 минут, 30–60 минут, 60–120 минут и 120+ минут, где класс 0–30 минут по сути «вовремя». Интересно, что на гистограмме есть явные провалы на 30, 45, 60, 80 и 110 минутах, что может свидетельствовать о том, что авиакомпании делают что-то, чтобы не опоздать на эти точные сроки. Мы точно знаем, что большинство авиакомпаний выдают отказ на проезд (в соответствии с которым вы можете изменить свой рейс без уплаты сбора за изменение), если ваш рейс задерживается более более чем на один час. Таким образом, включение 60 минут в качестве одной из границ класса имело смысл. Кроме того, стоит отметить, что нет сообщений о задержках прибытия менее 15 минут, что оправдывает первый класс задержки как «вовремя».

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

  1. Устраните влияние сезонности. Задержки авиакомпаний, вызванные погодными условиями, в значительной степени зависят от сезонности; например, ураганы осенью (ч / т Флоренция) и метели зимой приводят к более частым задержкам. Модели машинного обучения, как правило, работают лучше, если вы убираете эти эффекты и тренируетесь только на однородных данных. Для рассматриваемой проблемы это означает использование небольшого окна с датами полета для обучения модели, а затем повторное обучение и обновление модели в процессе производства. Подробнее о том, как мы это делаем, читайте в следующем разделе.
  2. Соберите несколько образцов сигналов, зависящих от времени. Поскольку погода является динамической, мы хотим включить эти эффекты в нашу модель в качестве функций. Например, для каждого полета мы запрашиваем конечную точку Dark Sky несколько раз (например, прямо при взлете и за 3 часа до взлета) и получаем характеристики на основе временных производных сигналов погоды. К счастью, это было легко сделать, потому что Dark Sky API такой классный (я уже упоминал об этом?).
  3. Сбалансируйте занятия. Модели машинного обучения очень подвержены смещению, и одна из основных причин смещения в модели связана с балансом (или дисбалансом) классов. Как сбалансировать классы в ваших тренировочных данных, нужно делать в каждом конкретном случае, чтобы уменьшить систематическую ошибку и переобучение. Отличный инструмент, который я в последнее время использую для баланса в классе, называется неуравновешенное обучение.

Чтобы дать некоторое представление о том, как работает наша модель, на рисунке ниже показаны результаты производительности тестовых данных модели, которая была обучена с использованием полетов с конца августа. В матрице путаницы метки 0–3 соответствуют нашим классам задержки в порядке возрастания длительности задержки; т.е. 0 = 0–30 минут. Взвешенный показатель f1, равный 0,62, достаточно хорош для задачи с 4 классами, поскольку случайное угадывание даст результат около 0,25.

Приведенные выше метрики дают представление о том, насколько хороша модель для прогнозирования величины задержки. Если мы свернем классы задержки (1–3) в один класс задержки и представим приведенные выше результаты, как если бы они были получены из бинарного классификатора, мы можем проверить способность модели предсказывать любую задержку. Оценка ROC-AUC 0,83 для задачи бинарной классификации такой сложности - это очень хорошо! Однако, глядя на матрицу путаницы, ложноотрицательных результатов гораздо больше, чем ложных срабатываний. Это может быть не идеально, когда дело доходит до прогнозирования задержек рейсов, поскольку мы хотели бы быть чрезмерно агрессивными, уведомляя клиента о возможной задержке (склоняясь к большему количеству ложных срабатываний). В будущем, возможно, будет иметь смысл оптимизировать модель для взвешенного отзыва, который налагает более высокие штрафы за неправильные рейсы вовремя.

При тестировании модели на данных в реальном времени, когда мы не знаем точную причину задержки, мы обнаружили, что точность и отзывчивость оцениваются в районе 0,4–0,5. Кроме того, мы смогли предсказать задержки за 24 часа до запланированного времени отправления! Это потому, что мы полагаемся на способность Dark Sky предсказывать погоду, которая часто бывает очень точной.

Трубопровод переподготовки

Как упоминалось ранее, мы справляемся с сезонными эффектами задержек рейсов, вызванных погодными условиями, путем обучения модели только на небольших окнах дат полета. Таким образом, модель, которая используется в нашем производственном API для прогнозирования задержек рейсов, должна постоянно переобучаться. С помощью нашей замечательной команды SRE мы создали воркера, который запланирован с использованием задания cron для автоматического переобучения модели и сохранения лучшего результата в виде файла pickle в корзине AWS S3. Рабочий процесс переобучения и API модели выглядят примерно как блок-схема, изображенная ниже.

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

Продолжающаяся работа

Мы активно работаем над улучшением модели задержки рейсов, чтобы включить другие типы задержек. Задержки прилетающих с опозданием самолетов и Задержки Национальной системы воздушного пространства (NAS) - это два типа задержек, которые, по нашему мнению, могут иметь большое влияние на характеристики нашей модели. Объединение своевременных данных о производительности с FlightAware API - это подход, который мы применяем для создания отдельных моделей для прогнозирования таких типов задержек. После создания мы планируем объединить их с погодной моделью с целью не только прогнозирования величины задержки, но и объяснения причины прогнозируемой задержки.

Хотите попробовать Delay Predictor? Оцените его здесь и поделитесь с нами своим мнением!

Если вы хотите узнать больше о Upside Corporate, нажмите здесь! Еще лучше, если вы хотите поработать с Яном и присоединиться к нашей команде, посетите страницу нашей команды здесь.