Команда | TopGear |
Состав | Александр Рыжков Максим Хатин Иван Литвинов |
Название проекта | Улучшение оценки стоимости авто |
Оценка авто призвана сделать рынок продажи автомобилей более прозрачным и понятным:
- Указание рыночной цены позволит продавцам быстрее закрывать сделку и не упускать потенциальную выручку.
- Покупателям адекватная оценка помогает избежать переплат и быстрее найти подходящий вариант.
- Улучшение оценки должно привести к увеличению репутации сервиса, а следовательно - влияет на конверсию и количество объявлений на платформе.
Таким образом, в справедливой цене заинтересованы не только покупатели и продавцы, но и сама компания Авито.
Были выбраны следующие метрики:
- Бизнес-метрики
- Уменьшение среднего времени закрытия объявления - знак того, что оценка следует рынку.
- В случае оптимальности оценки будет расти репутация площадки, а значит и количество объявлений в разделе авто.
- Прокси-метрикой также может служить увеличение случаев, когда предлагаемая продавцу цена при подаче объявления будет совпадать с ценой в опубликованном объявлении.
- ML-метрика
- Так как цены машин разнятся от 50 т.руб. до 20 млн.руб., то для честного сравнения точности предсказаний используем процентную ошибку. Также среди очень дешёвых и очень дорогих машин наблюдается сильный разброс цен, поэтому в качестве среднего возьмём медиану, поскольку она не учитывает выбросы:
$$MedianAPE=median(\cfrac{|y_{predicted} - y_{true}|}{y_{predicted}})$$
- Так как цены машин разнятся от 50 т.руб. до 20 млн.руб., то для честного сравнения точности предсказаний используем процентную ошибку. Также среди очень дешёвых и очень дорогих машин наблюдается сильный разброс цен, поэтому в качестве среднего возьмём медиану, поскольку она не учитывает выбросы:
- 1.4 миллиона объявлений о продаже автомобилей за 2022 год
- Временная структура
- 2 источника данных - автодилеры и физические лица
- Только около 5% объявлений имеют достоверные данные о цене закрытия сделки
- 70 признаков:
- Числовые - пробег, возраст, цена в объявлении и т.д.
- Геолокация
- Даты сделки, размещения автомобиля
- Текстовое описание объявления
- Категориальные - бренд, модель, модификация и т.д.
- Мультикатегориальные - оснащение, повреждения и т.д.
- Большая часть признаков сильно разрежена
В качестве nonML-бейзлайна была выбрана группировка по основным категориям - модель, бренд, поколение, модификация. Преимуществом данного метода является его низкие накладные расходы и простота, такое решение даёт нам следующий baseline:
- упрощение пайплайна;
- применение текстовых описаний.
graph TD;
A[Описание объявления]-->B[Лемматизация];
B[Лемматизация]-->C[text_features];
D[Модификация]-->C[text_features];
E[Комплектация]-->C[text_features];
B[Лемматизация]-->F[Word2Vec, tf-idf];
D[Модификация]-->G[Word2Vec];
E[Комплектация]-->H[Word2Vec];
F[Word2Vec, tf-idf]-->I[emb_features];
G[Word2Vec]-->I[emb_features];
H[Word2Vec]-->I[emb_features];
C[text_features]-->J[catboost];
I[emb_features]-->J[catboost];
graph TD;
A[Исходный датасет]--Поиск регулярными выражениями-->B[Объявления с рекламным описанием];
A[Исходный датасет]-->С[Данные достоверных сделок];
A[Исходный датасет]--Классификатор actual_price=price-->D[Объявления похожие на достоверные сделки];
B[Объявления с рекламным описанием]-->E[Обучаем на данных за полгода];
С[Данные достоверных сделок]-->E[Обучаем на данных за полгода];
D[Объявления похожие на достоверные сделки]-->E[Обучаем на данных за полгода];
E[Обучаем на данных за полгода]-->F[Итоговый train];
graph LR;
A[EDA]-->B[Feature Extraction];
B[Feature Extraction]-->C[Расширение трейна];
C[Расширение трейна]-->D[Catboost];
graph LR;
A[POST Request]--JSON с признаками автомобиля-->B[Car Valuation Service];
B[Car Valuation Service]-->C[Response];
Технические требования к исполнению сервиса были поставлены следующие:
- 99 перцентиль времени ответа ≤150 ms при нагрузке 1500 rpm
В итоге сервис реализован с помощью FastAPI в виде endpoint "ручки":
- По POST запросу принимается запрос от пользователя на получение оценки стоимости.
- Полученный в запросе JSON обрабатывается, все необходимые признаки приводятся к требуемой для модели форме.
- Модель делает предсказание.
- Сервис возвращает отклик с предсказанной моделью ценой автомобиля.
- Параллельно statsd собирает метрики, которые передаются в graphite, откуда Grafana формирует дашборд для мониторинга.
- Запросы пользователей эмулируются с помощью locust, при нагрузке в 30 RPS (что соответствует 1860 rpm) 99% перцентиль отклика укладывается в требуемый диапазон.
git clone https://github.com/Sinus2x/CarValuationService.git
cd ./CarValuationService
docker volume create --name=grafana-volume
docker-compose up -d
Сервис доступен по http://0.0.0.0:8000/docs, где во вкладке /predict
можно протестировать запрос на оценку стоимости машины.
Примеры запросов есть в experiments/car_inference_test.txt
Название | Адрес |
---|---|
Сервис | http://0.0.0.0:8000/docs |
Локуст | http://0.0.0.0:8089 |
Графана | http://0.0.0.0:3000 |
Название папки | Значение |
---|---|
car_valuation_service | Код сервиса |
eda | Ноутбуки с EDA |
experiments | Ноутбуки с обучением модели |
metrics | Обоснование выбора метрик и схема решения |
motivation | Оценка проекта до взятия в работу |