Калькулятор
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 также проставляется в соответствии с этим списком.
Схема обучения
Схема доступна по ссылке: Calculator.drawio @Google Docs
Исходник: Calculator (1).drawio
Пояснения по пунктам схемы:
Загрузка данных из БД - все заявки BatchFraught со статусом delivered, созданные не позднее 180 дней с текущей даты.
Признак направления: состоит из 5 значений - город и регион отправления, город и регион назначения, грузоподъемность.
-
Загрузка двух датасетов: calc для собственных перевозок - все заявки BatchFraught со статусом delivered, созданные не позднее 180 дней с текущей даты. trade для данных с торгов - тип OrderWaiting с полем external_trade = 1.
-
Окно для фильтрации оконной медианой +- 30 дней, порог 25%.
-
Препроцессинг выполняют классы Preprocessor и TradePreprocessor. Для трейн выборки из каждого направления остается K последних сэмплов. Сейчас K = 10.
-
Сплит на трейн-тест по времени создания заявки. Размер тест датасета 20%.
-
Для уверенной модели выделяются отдельные направления. Критерии: в направлении должно быть не менее N сэмплов, и должен присутствовать хотя бы один сэмпл в тестовой выборке. Сейчас N = 3.
-
Подбор гиперпараметров через optuna. Дефолтные параметры могут быть переопределены при старте обучения. Важный момент: основным признаком для этой модели должен быть признак числа дней со старта тестовой выборки (days_from_start), т.к. моделируется линейные изменения цен. Плюс несколько важных признаков, например объем и срочность. Большое количество признаков в этой модели черевато переобучением.
-
Обучается финальная уверенная модель на полном датасете train+test. В трейн берутся все направления, число сэмплов в которых не менее N (см п. 4).
-
В общую модель идет весь датасет, в т.ч. те данные, что ушли в ветку на п.4.
-
Подбор гиперпараметров через optuna. Модель использует расширенное число признаков, которое может быть изменено. Модель с подобранными гиперпараметрами также является финальной моделью, она не обучается на полных данных, т.к. необходима качественная оценка уверенности по направлениям на тестовых данных.
-
Для trade модели используется свой trade датасет. Выделение направлений аналогично п.5.
-
Обучение аналогично п.6.
-
См. п. 7.
-
Оценка направлений осуществляется на полном датасете, т.е. фактически на тренировочных данных, но с некоторыми дополнениями, которые нивелируют процесс оверфита на трейн данных и делают процесс оценки объективным.
Для уверенной и trade моделей: поскольку зависимость простая и признаков мало, то такой подход позволяет с одной стороны оценить все направления в модели (т.к. при делении на трейн-тест по признаку времени создания заявки около двух третей направлений выпадет), с другой обучить модель для работы на самых последних выполненных заявках. Поэтому важно не добавлять новые признаки в уверенную/trade модель, либо делать это очень аккуратно и имея серьезные основания, иначе оценка уверенных направлений может быть излишне оптимистичной.
Для общей модели: поскольку оценка выполняется на последних N точках, то актуальные (т.е. те по которым ездили последний месяц) направления будут определены фактически через тестовый датасет. Старые направления будут оцениваться по скорости роста цен, т.к. актуальных точек в тестовом датасете для них нет.
Оценка выполняется по среднему mape на последних трех точках каждого направления. Однако предикт делается для текущей даты. Суть в том, что все цены моделируются неотрицательным трендом (в общей модели теоретически тренд может быть отрицательным, фактически маловероятно).
Если последние точки в направлении были очень давно, а рост цен смоделировался резкий, то на текущую дату предикт может быть неадекватно завышенным. Поэтому мы сравниваем предикт на текущую дату с истинным значением на реальную дату. Если средний mape меньше порога (сейчас 0.15), то направление считается уверенным.
Метрики
Терминология:
-
Уверенная модель - ансамбль моделей по тем направлениям, для которых модели строятся индивидуально и изолированно. Эти направления предсказываются лучше всего.
-
Общая модель - ансамбль моделей по направлениям, которые не могут оцениваться изолированно. Эти направления предсказываются несколько хуже.
-
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.
No Comments