Хакатон Московского транспорта · 2026
Опоздание видно
за 15 минут
до того, как оно случится
Система слушает телематику автобусов в формате NDTP, сверяет каждый пинг с расписанием и предупреждает диспетчера о задержке за 10–15 минут до остановки — с причиной и рекомендацией, что делать.
Цифры идут напрямую из api.mowtransit.ru/health
01 · Горизонт
Прогноз всегда смотрит в окно (T+10, T+15] мин
Каждые 5 секунд для каждого автобуса берётся первая плановая остановка, попавшая в окно, — и ML прогнозирует задержку на ней. Время идёт, цель сдвигается, прогноз обновляется. Прогнозов «задним числом» нет: алерт поднимается только пока до остановки 10–15 минут.
horizon_ok_share в /health02 · Карточка инцидента
Не просто «опоздает», а почему и что делать
Алерт поднимается, когда модель оценивает вероятность опоздания больше чем на 2 минуты в ≥ 0.7. В карточке — прогноз с интервалом, участок маршрута, вклад каждой причины в секундах и рекомендация диспетчеру. Когда автобус доезжает, алерт сверяется с фактом.
- Интервал прогноза откалиброван: факт попадает в него в 80% случаев
- Причины — приближённый SHAP, переведённый в человеческий текст
- Рекомендация считает скорость, нужную, чтобы вернуться в график
03 · Как устроено
Поток → прогноз → дашборд, end-to-end
Три независимых сервиса в Docker Compose. Backend сам разбирает бинарный NDTP (без готовых парсеров), ML — отдельный сервис, который можно переобучить и перезагрузить без остановки backend.
NDTP-терминалы
Эмулятор организаторов с реальными треками. Бинарный TCP на ndtp.mowtransit.ru:9201
Backend · приём
Свой кодек NPL/NPH, CRC-16, handshake, ячейки G6CellNav00. asyncio + uvloop
Backend · состояние
Привязка к расписанию, прибытия по GPS, текущее отклонение, скорость на сегменте, простой
ML · CatBoost ×5
Ансамбль на 56 признаках + модели интервала и вероятностей, причины, What-if
Дашборд
MapLibre, светофор риска, лента алертов, What-if. WebSocket, обновление раз в секунду
Вся история — телеметрия, прибытия, каждый прогноз и алерт — пишется в Postgres фоном
(write-behind, COPY), так что база не может замедлить живой контур.
04 · Точность
Ошибка 40 секунд там, где бейзлайн ошибается на 93
MAE прогноза задержки на отложенной выборке. Метрика хакатона упирается в потолок: score = 1.0 и локально, и на платформе.
6 из 6 баллов за точность
Как устроен validate
5 фолдов блоками по 30 минут: соседние моменты тех же автобусов. Бейзлайн — 88.4 с.
Честно: новый автобус
Автобус отложен целиком — модель его ни разу не видела. Всё равно лучше бейзлайна (88.4 с).
AUC «опоздает ли»
Вероятность опоздания откалибрована: прогноз ~0.89 → реально 0.95. Из неё и светофор риска.
Онлайн = батч: прогноз живого сервиса совпадает с submission.csv на 151 из 151 точки,
максимальная разница — 0.00 с. Признаки считает одна и та же функция.
05 · Надёжность
Сломайте что-нибудь. Сервис не упадёт
Выберите аварию — и посмотрите, как система деградирует и восстанавливается. Всё проверено на живых контейнерах.
—
/health/predict/batch06 · Сверх ТЗ
Дополнительные фичи
What-if
Выпустить резерв, объезд — пересчёт прогнозов по маршруту до и после, с применением к симуляции.
ONNX
Экспорт модели: fp32 в 6 раз быстрее нативного CatBoost.
Ансамбль
5 моделей на разных сидах + отдельные модели квантилей и классов «рано / вовремя / поздно».
Конформные интервалы
Не одна цифра, а диапазон с гарантированным покрытием 80%.
Привязка к маршруту
Прибытия по GPS: 23 664 прибытия бит-в-бит совпадают с обучающим пайплайном.
Горячая перезагрузка
POST /reload подхватывает переобученную модель без рестарта контейнера.
07 · Команда
С
Ф
Д
В
Д