Повышенный спрос. Ташкент

Когда вы открываете приложение такси, вы можете видеть, что цена повысилась (или нет) и в разное время, в разных местах она по-разному себя ведёт. Почему так происходит и для чего это... объясню.

Мы в компании MyTaxi (агрегатор такси) стремимся удовлетворить клиента и водителя. Для первых одна из важных потребностей - быстрая подача машины, а для других - увеличение количества заказов (или уменьшение времени простоя) и, следовательно, заработка. Для нас это означает малое количество отмен и всё большее число пользователей захотят использовать наш сервис.

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

Что такое сурдж?

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

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

Расчёт сурджа можно реализовать путём деления количества альт-пинов (пользователь ставит точку, но ещё не заказал) на местоположение водителей.

Однако для MyTaxi такой сценарий не подходит по некоторым причинам:

  1. Скорость обработки: сурдж должен рассчитываться молниеносно для каждого района. Это можно реализовать, но сложно.

  2. Недостаток клиентов и водителей: недостаточное количество клиентов и водителей для охвата всего города в каждый момент времени.

Чтобы выйти из этой ситуации, сурдж можно прогнозировать на основе исторических данных заказов и водителей. Тут я, как ML разработчик, обучил модель сурджа, которая используется в нашем сервисе. Сбор и обучение реализовывал на R, а модель встраивал в сервис, используя python..

Подготовка и обучение модели

Процесс начинается с тщательной подготовки данных и обучения модели. Стоит добавить, что выгрузка и обработка данных занимает много времени, так как количество строк может достигать 200 миллионов за один месяц, а объём одного датасета может составлять до 20 ГБ.

Основные этапы включают:

  1. Загрузка данных

    1. Данные о местоположении водителей

    2. Данные по заказам

  2. Обработка данных

    1. Нахождение количества водителей

    2. Нахождение количества заказов

    3. Расчёт сурджа

  3. Обучение модели

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

  • Линейная регрессия (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

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

Расчёт коэффициента сурджа

После обучения модели она используется для расчёта коэффициента сурджа. Процесс определения цены по сурджу - это отдельная тема.

  1. Рассчитывается сурдж на исторических данных

  2. Сурдж подаётся модель

  3. Модель предсказывает сурдж в следующем временном интервале

  4. Низкий сурдж округляется до единицы

Дальнейшие улучшения

Для повышения точности и эффективности модели в будущем планируются следующие улучшения:

  • Разбиение на тарифы: Прогнозирование сурджа ещё и для каждого тарифа. Сейчас рассчитывается для вех общий.

  • Добавление прогноза погоды: Учёт погодных условий для более точного прогнозирования спроса на транспортные услуги.

  • Добавление событий (афиша): Включение информации о местных событиях, которые могут влиять на спрос.

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