Повышенный спрос в такси или как работает сурдж: от данных до моделей

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

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

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

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

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

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

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

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

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

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

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

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

Под районом имеется ввиду гексагон.

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

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

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

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

    1. Данные о местоположении водителей: эти данные позволяют определить количество водителей в каждом районе на каждой минуте.

    2. Данные по заказам: определяется количество заказов в каждом районе по точкам отправления.

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

    1. Нахождение количества водителей: Определяется количество водителей в каждом районе за каждую минуту.

    2. Нахождение количества заказов: Определяется количество заказов, поступивших в каждый район за каждую минуту.

    3. Интервал: данные суммируются, чтобы отойти от минут к пятиминутным интервалам. Это нужно, чтобы уменьшить количество нулей по заказам или по водителям, а также сокращает датасет (в 5 раз).

    4. Расчёт сурджа: отношение количества заказов + 1 к числу водителей + 1 (для предотвращения деления на ноль).

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

    1. Кластеризация данных: Данные по заказам и водителям группируются в кластеры для улучшения качества модели. Кластеры найдены с помощью K-means.

    2. Вход и выход:

      1. Входные данные для модели:

        1. Сурдж за последние 20 минут (4 интервала)

        2. День недели

        3. Временной интервал, на который нужно спрогнозировать

        4. Кластер

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

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

      1. Линейная регрессия (lm)

      2. Prophet

      3. BSTS

      4. Локализованная полиномиальная регрессия (loess)

      5. Смешанные регрессионные модели (lmer)

      6. Градиентный бустинг линейных данных

      7. Рекуррентная нейронная сеть

    4. Выбор лучшей модели: Методом перекрёстной валидации выбиралась лучшая модель. За базовую модель выбрана линейная регрессия.

 	  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) определения цены по сурджу — это отдельная тема, тут описывается как рассчитываются эти коэффициенты для каждого гексагона.

3d6d1b9fbb881404072dde8fdc4a6e27.png

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

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

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

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

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

  • Расчёт сурджа на основе точки А и Б: Включение маршрута водителя, чтобы учитывать возможность возвращения из областей с низким сурджем в области с высоким сурджем.

  • Формирование сурджа на основе отказов: Учёт отказов от заказов для более точного определения загруженности.

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

© Habrahabr.ru