Повышенный спрос в такси или как работает сурдж: от данных до моделей
Повышенный спрос. Ташкент
Мы в компании MyTaxi (агрегатор такси) стремимся удовлетворить клиента и водителя. Для первых одна из важных потребностей — быстрая подача машины, а для других — увеличение количества заказов (или уменьшение времени простоя) и, следовательно, заработка. Для нас это означает малое количество отмен и всё большее число пользователей захотят использовать наш сервис.
Важный фактор, который на это влияет — цена. Она обычно складывается из стоимости подачи, километража, времени поездки и… сурджа.
Что такое сурдж?
Сурдж — это коэффициент нагрузки района (повышенный спрос), определяемый как отношение количества клиентов к количеству водителей. Основная задача сурджа — достижение точки равновесия между спросом (клиенты) и предложением (водители). Добавочная стоимость рассчитывается как произведение коэффициента сурджа на цену за единицу сурджа.
Он, например, показывают водителю, где много клиентов, а водителей не хватает, а клиенту из-за этого не нужно долго ждать автомобиль. И наоборот, куда водителю нет смысла ехать из-за отсутствия заказов или наличия там уже других таксистов.
Расчёт сурджа можно реализовать путём деления количества альт-пинов (пользователь ставит точку, но ещё не заказал) на местоположение водителей.
Однако для MyTaxi такой сценарий не подходит по некоторым причинам:
Скорость обработки: сурдж должен рассчитываться молниеносно для каждого района. Это можно реализовать, но сложно.
Недостаток клиентов и водителей: недостаточное количество клиентов и водителей для охвата всего города.
Чтобы выйти из это ситуации, сурдж можно прогнозировать на основе исторических данных заказов и водителей. Тут я, как ML разработчик, обучил модель сурджа, которая используется в нашем сервисе. Сбор и обучение реализовывал на R, а модель встраивал в сервис, используя python.
Под районом имеется ввиду гексагон.
Подготовка и обучение модели
Процесс начинается с тщательной подготовки данных и обучения модели. Стоит добавить, что выгрузка и обработка данных занимает много времени, так как количество строк может достигать 200 миллионов за один месяц, а объём одного датасета может составлять до 20 ГБ.
Основные этапы включают:
Загрузка данных
Данные о местоположении водителей: эти данные позволяют определить количество водителей в каждом районе на каждой минуте.
Данные по заказам: определяется количество заказов в каждом районе по точкам отправления.
Обработка данных
Нахождение количества водителей: Определяется количество водителей в каждом районе за каждую минуту.
Нахождение количества заказов: Определяется количество заказов, поступивших в каждый район за каждую минуту.
Интервал: данные суммируются, чтобы отойти от минут к пятиминутным интервалам. Это нужно, чтобы уменьшить количество нулей по заказам или по водителям, а также сокращает датасет (в 5 раз).
Расчёт сурджа: отношение количества заказов + 1 к числу водителей + 1 (для предотвращения деления на ноль).
Обучение модели
Кластеризация данных: Данные по заказам и водителям группируются в кластеры для улучшения качества модели. Кластеры найдены с помощью K-means.
Вход и выход:
Входные данные для модели:
Сурдж за последние 20 минут (4 интервала)
День недели
Временной интервал, на который нужно спрогнозировать
Кластер
На выходе ожидается значение сурджа на указанный временной интервал и кластер
Создание и тестирование модели: Для прогнозирования сурджа были обучены несколько моделей (для проверки обучались на ограниченном количестве данных, чтобы ускорить процесс):
Линейная регрессия (lm)
Prophet
BSTS
Локализованная полиномиальная регрессия (loess)
Смешанные регрессионные модели (lmer)
Градиентный бустинг линейных данных
Рекуррентная нейронная сеть
Выбор лучшей модели: Методом перекрёстной валидации выбиралась лучшая модель. За базовую модель выбрана линейная регрессия.
Model MAE, surge MAPE, % RSME, surge R-square, % SMAPE, % Position
loess 0.194 53.0 0.328 51.1 40.9 1
phophet 0.219 69.9 0.347 53.8 47.2 2
lm 0.218 81.4 0.348 52.5 45.8 3
lmer 0.264 104.7 0.389 45.8 60.3 4
grad_boost 0.585 138.7 0.749 54.6 70.6 5
neuro 0.455 255.9 0.583 0.6 87.0 6
bsts 1.697 904.7 2.350 1.8 134.2 7
Очень хорошо показывает себя Локализованная полиномиальная регрессия (loess), но тут есть одно большое НО. Тут исследовали в целом сурдж, но в реальности если сурдж < 1, то мы его учитывем как 1 - т.е. сурджа нет.
Поэтому правильно анализировать, какая модель себя лучше показывает при прогнозировании сурджа >= 1.
Model MAE, surge MAPE, % RSME, surge R-square, % SMAPE, % Position
lm 0.825 42.3 1.068 8.2 19.7 1
grad_boost 0.656 35.1 0.909 3.8 58.3 2
phophet 0.837 42.9 1.081 8.0 20.9 3
lmer 0.835 42.6 1.088 6.6 23.9 4
loess 1.046 54.3 1.271 6.3 33.9 5
neuro 1.266 65.9 1.509 0.1 81.6 6
bsts 1.914 113.9 2.480 0.5 100.9 7
И тут, на удивление, лучше всего себя показала линейная регрессия, поэтому она была выбрана в качестве модели прогнозирования сурджа. Это хорошая практика тестировать несколько моделей, так как могут быть неожиданные результаты.
Расчёт коэффициента сурджа
После обучения модели она используется для расчёта коэффициента сурджа. Процесс (описан в нотации BPMN) определения цены по сурджу — это отдельная тема, тут описывается как рассчитываются эти коэффициенты для каждого гексагона.
Дальнейшие улучшения
Для повышения точности и эффективности модели в будущем планируются следующие улучшения:
Разбиение на тарифы: Прогнозирование сурджа ещё и для каждого тарифа. Сейчас рассчитывается для вех общий.
Добавление прогноза погоды: Учёт погодных условий для более точного прогнозирования спроса на транспортные услуги.
Добавление событий (афиша): Включение информации о местных событиях, которые могут влиять на спрос.
Расчёт сурджа на основе точки А и Б: Включение маршрута водителя, чтобы учитывать возможность возвращения из областей с низким сурджем в области с высоким сурджем.
Формирование сурджа на основе отказов: Учёт отказов от заказов для более точного определения загруженности.
Сурдж не только повышает качество обслуживания клиентов, но и способствует более рациональному использованию ресурсов компании и водителей. Он уже снижает время подачи, отказы клиентов из-за отсутствия рядом машины или долгого ожидания.