Skip to main content

Калькулятор

API

Калькулятор поддерживает следующие типы инференса.

Уверенные направления
API:
{
    "model_type": "confidence",
    "allowed_weights": Optional[list[int]]
}

Пример - отдать направления только для 20т:
{
    "model_type": "confidence",
    "allowed_weights": [20000]
}

Пример - отдать все направления с любой грузоподъемностью:
{
    "model_type": "confidence"
}

 

Стандартный инференс
Пример API:
{
    "model_type": "calculator",
    "pick_at": "2023-10-31 14:00",
    "from_lat": 0.0,
    "from_lon": 0.0,
    "to_lat": 0.0,
    "to_lon": 0.0,
    "weight": 20000,
    "volume": 82.0,
    "car_type_id": 1,
    "from_city_dir_id": 26,
    "to_city_dir_id": 37,
    "disable_trade": False,
    "trade_only": False
}

Параметр disable_trade отключает инференс модели с торгов. По умолчанию установлен в False (т.е. модель включена). Для нужд тестирования.

Параметр trade_only использует только модель торгов. Флаги disable_trade и trade_only не могут быть установлены одновременно. 

Векторизованный инференс
API:
{
    "model_type": "vectorized",
    "disable_trade": False,
    "trade_only": False,
    "data": [{
        "pick_at": ...,
        "from_lat": ...,
        ... (поля из стандартного инференса по каждому сэмплу)
    }, ...]
}

Параметры model_type, disable_trade вынесены по иерархии наверх, параметры каждого же сэмпла идентичны параметрам в стандартном инференсе. Векторизованный инференс позволяет обрабатывать запросы сразу большой пачкой, значительно экономя время (до 100х ускорение).

Неуверенные направления
{
    "model_type": "unconfident"
}
Содержание файла unconfident_needs.csv из архива модели, например
[
  "from_city_dir_id": ...,
  "to_city_dir_id: ...,
  "confidence": 0,
  "count": 10
]

 


Архитектура

Модель делится на три потока: уверенная модель, общая модель и модель торгов. (см схему обучения)

Уверенная модель

Состоит из N линейных регрессий с l2 регуляризацией, где N - число уверенных направлений. Т.к. каждое направление моделируется отдельным уравнением.

Общая модель

Общая модель пытается предсказать цену для любого направления.

Состоит из K-means кластеризации и K линейных моделей. K - гиперпараметр.

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

Далее обучается ансамбль регрессий K + N, в которые попадают сабсеты обучающего датасета, размер сабсета - гиперпараметр. Из K + N регрессий затем выбираются K моделей с помощью оценки на тестовом датасете. Сейчас K = 9, N = 2. Т.е. первоначально обучается 11 моделей, из которых выбирается 9 лучших. При инференсе берется средний предикт от K моделей.

Модель торгов

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

Инференс

При инференсе сначала формируется признак направления (состоящий из направления и грузоподъемности). Далее смотрим, к какой модели относится направление и отправляем сэмпл в соответствующую модель. Уверенные направления среди моделей не пересекаются - т.е. если направление A есть в уверенной модели, то его не должно быть в общей и модели торгов.

Если такого направления нет среди всех моделей, то инференс идет через общую модель, confidence ставится 0.

Запрос уверенных направлений

Эндпойнт classification/direction/confidence запрашивает список уверенных направлений. Этот список собирается при обучении (см схему обучения) и сохраняется в MLFlow вместе с моделью (файл direction_confidence.json), отдается этим эндпойнтом без изменений содержания (с изменением структуры).

Каждое направление относится к своей модели. Существует возможность отключать направления определенной модели. По умолчанию отключены направления с модели торгов.

При инференсе калькулятора признак confidence также проставляется в соответствии с этим списком.


Схема обучения

image.png

Схема доступна по ссылке:   Calculator.drawio @Google Docs

Исходник: Calculator (1).drawio

Пояснения по пунктам схемы:

Загрузка данных из БД - все заявки BatchFraught со статусом delivered, созданные не позднее 180 дней с текущей даты.

Признак направления: состоит из 5 значений - город и регион отправления, город и регион назначения, грузоподъемность.

  1. Загрузка двух датасетов: calc для собственных перевозок - все заявки BatchFraught со статусом delivered, созданные не позднее 180 дней с текущей даты. trade для данных с торгов - тип OrderWaiting с полем external_trade = 1.

  2. Окно для фильтрации оконной медианой +- 30 дней, порог 25%.

  3. Препроцессинг выполняют классы Preprocessor и TradePreprocessor. Для трейн выборки из каждого направления остается K последних сэмплов. Сейчас K = 10.

  4. Сплит на трейн-тест по времени создания заявки. Размер тест датасета 20%.

  5. Для уверенной модели выделяются отдельные направления. Критерии: в направлении должно быть не менее N сэмплов, и должен присутствовать хотя бы один сэмпл в тестовой выборке. Сейчас N = 3.

  6. Подбор гиперпараметров через optuna. Дефолтные параметры могут быть переопределены при старте обучения. Важный момент: основным признаком для этой модели должен быть признак числа дней со старта тестовой выборки (days_from_start), т.к. моделируется линейные изменения цен. Плюс несколько важных признаков, например объем и срочность. Большое количество признаков в этой модели черевато переобучением.

  7. Обучается финальная уверенная модель на полном датасете train+test. В трейн берутся все направления, число сэмплов в которых не менее N (см п. 4).

  8. В общую модель идет весь датасет, в т.ч. те данные, что ушли в ветку на п.4.

  9. Подбор гиперпараметров через optuna. Модель использует расширенное число признаков, которое может быть изменено. Модель с подобранными гиперпараметрами также является финальной моделью, она не обучается на полных данных, т.к. необходима качественная оценка уверенности по направлениям на тестовых данных.

  10. Для trade модели используется свой trade датасет. Выделение направлений аналогично п.5.

  11. Обучение аналогично п.6.

  12. См. п. 7.

  13. Оценка направлений осуществляется на полном датасете, т.е. фактически на тренировочных данных, но с некоторыми дополнениями, которые нивелируют процесс оверфита на трейн данных и делают процесс оценки объективным.
    Для уверенной и trade моделей: поскольку зависимость простая и признаков мало, то такой подход позволяет с одной стороны оценить все направления в модели (т.к. при делении на трейн-тест по признаку времени создания заявки около двух третей направлений выпадет), с другой обучить модель для работы на самых последних выполненных заявках. Поэтому важно не добавлять новые признаки в уверенную/trade модель, либо делать это очень аккуратно и имея серьезные основания, иначе оценка уверенных направлений может быть излишне оптимистичной.
    Для общей модели: поскольку оценка выполняется на последних N точках, то актуальные (т.е. те по которым ездили последний месяц) направления будут определены фактически через тестовый датасет. Старые направления будут оцениваться по скорости роста цен, т.к. актуальных точек в тестовом датасете для них нет.
    Оценка выполняется по среднему mape на последних трех точках каждого направления. Однако предикт делается для текущей даты. Суть в том, что все цены моделируются неотрицательным трендом (в общей модели теоретически тренд может быть отрицательным, фактически маловероятно).
    Если последние точки в направлении были очень давно, а рост цен смоделировался резкий, то на текущую дату предикт может быть неадекватно завышенным. Поэтому мы сравниваем предикт на текущую дату с истинным значением на реальную дату. Если средний mape меньше порога (сейчас 0.15), то направление считается уверенным.


Метрики

Терминология:

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

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

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

Метрики:

  • mape - средняя абсолютная ошибка, от 0 до 1. Показывает отклонение предсказания от истинной величины в процентах.

  • mae - абсолютная ошибка, от 0 до +∞. Среднее значение абсолютной ошибки, в рублях.

Метрики модели:

  • calc_mape - mape в тестовом датасете с confidence = 1. Используются все три модели.

  • calc_mae - mae в тестовом датасете с confidence = 1.

  • conf_ratio - доля уверенных предсказаний в тестовом датасете.

  • conf_directions - абсолютное число уникальных уверенных направлений в тестовом датасете.

  • conf_directions_ratio - доля уникальных уверенных направлений в тестовом датасете.

  • trade_mape - mape в тестовом trade датасете чисто для trade модели.

  • trade_mae - mae в тестовом trade датасете.

  • total_confident_directions - абсолютное число уникальных уверенных направлений в уверенной модели.

  • total_common_directions - абсолютное число уникальных уверенных направлений в общей модели.

  • total_trade_directions - абсолютное число уникальных уверенных направлений в trade модели.

  • impersonal_sum_conf_0 - число неуверенных направлений, взятых с confidence 0.
  • impersonal_sum_conf_1 - число потенциально неуверенных направлений, взятых с confidence 1.