Привет! Меня зовут Илья Комутков, я старший аналитик в Автотеке — сервисе по проверке истории автомобилей с пробегом. В статье расскажу, как мы улучшаем проверку машин и создаём алгоритм рекомендаций по дальнейшим действиям для покупателей. 

Текст будет интересен начинающим или middle-аналитикам, которые уже умеют работать с SQL, python, ML, но ещё не решали многоэтапные задачи, влияющие на бизнес, и ищут способы применить свои навыки в работе.

Содержание:

Что такое «отчёт Автотеки» и почему мы решили делать в нём рекомендации

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

Основной продукт Автотеки — отчёт. В нём содержится информация о юридической чистоте, происшествиях, истории эксплуатации и другие данные о машине, позволяющие снизить риски при покупке.

Долгое время мы фокусировались на наполнении Автотеки новыми данными об автомобилях. За тот период нам удалось собрать самую полную базу данных о машинах с пробегом в России. При этом не было уверенности, что увеличение полноты помогает покупателям более осознанно выбирать машины для покупки и влияет на бизнес-метрики. 

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

Первая фича, которую решили реализовать, называется «Серьёзные недостатки». Это блок, который мы интегрировали в отчёт об авто. Он строится на эвристиках, основанных на UX-опросах и общении с профессиональными подборщиками машин. Серьёзными недостатками могут быть, например: ограничения на регистрацию или данные об участии машины в аукционе аварийных автомобилей.

Вот как выглядит информация о проблемах с авто в отчёте:

Блок «Серьёзные недостатки» в отчёте
Блок «Серьёзные недостатки» в отчёте

После запуска мы провели A/B-тест и увидели статистически значимый рост покупок отчётов. Успех подсказок на основе эвристик подтвердил — нужно и дальше создавать более сложный инструмент по классификации машин, который бы учитывал совокупность факторов из отчёта, и покрывал весь рынок, а не только самые плохие автомобили. 

Тут еще больше контента

Начали с поиска таргетной переменной

Для построения алгоритма классификации каждого отчёта нужно было выбрать таргет, разделяющий машины на плохие и хорошие. Для нас это нетривиальная задача, потому что сделки проходят офлайн, за рамками площадки, и мы не знаем однозначно — купил человек машину у конкретного продавца на Авито или нет. Но мы можем отслеживать контакты по объявлениям и считаем это действие наиболее близким к сделке. Контакт в нашем случае — любая форма связи покупателя с продавцом. 

После каждого просмотра отчёта мы можем проверять — совершался контакт по машине из отчёта или нет. Решили, что если научимся предсказывать контакт в таком случае — то сможем выделять привлекательные для покупки машины. 

Вот из каких действий мы выбирали:

1. Контакт по объявлению после просмотра отчёта. Условия задачи для ML-алгоритма были формализованы следующим образом:

Наблюдение 

Целевая переменная 

Фичи

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

Другими словами, наблюдением является пара «пользователь-автомобиль»

1 — в случае не мусорного контакта после просмотра отчёта. То есть когда обсуждался факт встречи продавца и покупателя

0 — иначе

Признаки из отчёта. Например: количество ДТП, факт скрутки пробега, количество владельцев

Ликвидность автомобиля: контакты, просмотры, добавление в избранное

Цена, регион из объявления о продаже

Отношение цены из объявления к Авито оценке

Авито оценка — это предсказание цены сделки по автомобилю с учётом средней цены похожих автомобилей и особенностей конкретной машины

Во всех экспериментах мы использовали модель — CatBoostClassifier. В качестве целевой метрики взяли ROC-AUC, поскольку ценность модели в способности разделять машины с контактом и без.

Построение датасета для предсказания контакта конкретного пользователя по конкретному объявлению о продаже авто
Построение датасета для предсказания контакта конкретного пользователя по конкретному объявлению о продаже авто

После обучения модели метрики на тестовой выборке оказались очень низкими, показатель recall был практически равен нулю:

Модель

accuracy

precision

recall

ROC-AUC

CatBoostClassifier

0.97

0.18

0.0001

0.7

Матрица ошибок модели предсказания контакта конкретным пользователем по конкретному автомобилю 
Матрица ошибок модели предсказания контакта конкретным пользователем по конкретному автомобилю 

Результаты: решили изменить постановку задачи. Вот почему:

Сильный дисбаланс классов. Пользователи совершили целевое действие менее, чем в 4% наблюдений. Этот показатель кратно меньше доли «зелёных» отчётов, то есть отчётов без явных проблем.

Самые сильные фичи по SHAP:

  • цена (price); 

  • разница цены с оценкой Авито (imv_diff); 

  • разница цены с верхней (imv_high_diff) и нижней (imv_low_diff) границами оценки. 

Фактор цены влияет на целевое действие сильнее, чем данные из отчёта. То есть решение покупателя связаться с продавцом субъективно, а не основано на состоянии автомобиля.

Значимость фичей модели предсказания контакта конкретного покупателя по конкретному автомобилю
Значимость фичей модели предсказания контакта конкретного покупателя по конкретному автомобилю

2. Контакт с продавцом по машине после просмотра отчёта. Так как желание каждого покупателя связаться с продавцом по объявлению может быть основано на личных предпочтениях, мы решили рассматривать все контакты по машине. 

Результаты. Проблема с дисбалансом классов осталась и в выборке агрегированной до машины. Доля наблюдений с хотя бы одним контактом составляла 8.4%, а больше одного контакта было менее, чем в 1% выборки. Поэтому в качестве таргета мы взяли объявления, по которым был хотя бы один контакт.

Новую задачу классификации формализовали так:

Наблюдение

Целевая переменная

Фичи

Уникальная машина с хотя бы одним просмотром отчёта по ней. При этом по машине не должно было быть ни одного контакта до покупки отчёта 

1 — если после просмотра отчёта был хотя бы один контакт по машине

0 — иначе

Как и в предыдущий раз использовали модель CatBoostClassifier, целевая метрика — ROC-AUC

Построение датасета для предсказания контакта по объявлению
Построение датасета для предсказания контакта по объявлению

Результаты: оказались аналогично не очень хорошими, хотя метрики немного выросли.

Модель

accuracy

precision

recall

ROC-AUC

CatBoostClassifier

0.92

0.53

0.02

0.74

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

После этой модели мы построили мультиклассовый классификатор с предсказанием одного контакта и >1 контактов по машине, ROC-AUC с макроусреднением был равен — 0.72.

3. Прекращение общения по объявлению после просмотра отчёта. Дальше мы проверяли гипотезу о том, что после просмотра отчёта, покупатель не совершит контакт по объявлению, если до этого контакт уже совершался. 

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

Наблюдение

Целевая переменная

Машина, по которой покупатель совершал контакт с продавцом до просмотра отчёта

1 — в случае отсутствия контактов у всех пользователей после просмотра отчёта

0 — иначе

Построение датасета для предсказания отсутствия контакта после покупки отчёта
Построение датасета для предсказания отсутствия контакта после покупки отчёта

Результаты: классификатор в такой задаче показал неплохие precision и recall, хотя метрика ROC-AUC оставалась низкой.

Модель

accuracy

precision

recall

ROC-AUC

CatBoostClassifier

0.63

0.64

0.89

0.62

4. Закрытие объявления с фактом «Продано на Авито». Последняя идея идеального целевого действия была такая — мы хотели пытаться предсказывать, что объявление будет закрыто с флагом «продано на Авито». 

Как это работает

После того как продавцы снимают объявления с публикации на площадке, мы отправляем им опросы и уточняем — почему закрыли объявление и где продали товар. Один из вариантов ответа на вопрос — «Продал на Авито».

Сформулировали новые вводные для модели:

Наблюдение 

Целевая переменная

Объявление с хотя бы одним просмотренным отчётом

1 — в случае причины закрытия «продано на Авито»

0 — иначе

Результаты: метрики оставались не очень высокими.

Модель

accuracy

precision

recall

ROC-AUC

CatBoostClassifier

0.67

0.54

0.26

0.69

Что в итоге. Все модели по предсказанию пользовательского действия на Авито показали не очень высокие метрики качества. Такие действия, как контакт пользователя, лучше объяснялись не содержимым отчёта, а ценой машины и разницей цены с рыночной оценкой.

Жми сюда!

Попросили диагностов и перекупщиков разметить выборку объявлений

Мы решили обратиться к экспертам рынка — диагностам и перекупщикам — чтобы проверить обученные модели и, возможно, изменить подход к построению алгоритма. Автотека сотрудничает с компаниями по диагностике автомобилей. Работники этих компаний профессионально занимаются подбором машин, и у них точно есть насмотренность в этом деле. 

Я составил выборку из двухсот случайных отчётов и попросил коллег из компаний по диагностике разметить выборку бинарно — поехали бы они на осмотр или нет, и оставить комментарии к своим решениям. 

Начали с двухсот отчётов, потому что диагностов было всего два — не хотелось сильно нагружать их и при этом получить решения как можно скорее. 

Ответы перекупщиков расходились: по 52% отчётов у перекупщиков были разные мнения, а 25% ответов были без комментариев. К тому же их решения были субъективными и основывались на индивидуальных предпочтениях, например:

  • «не симпатизируют авто из далёких регионов»;

  • «не мой ценовой диапазон, я занимаюсь машинами от 18г, от 2.5млн»;

  • «вдруг окажется более-менее живая».

Ответы диагностов были более объективными, поскольку основывались на фактах из отчёта. Например:

  • «залог, лизинг, юрлицо, расчёты ремонта. При этих обстоятельствах можно найти лучшие варианты с такой ценой»;

  • «большой пробег и ошибка по АБС на приборной панели на фото. Было ДТП с грузовиком DAF».

Все ответы диагностов содержали комментарии, поэтому мы использовали выборку из их опроса для валидации. Модель на основе контактов показала ROC-AUC 0.52, лучший результат был у модели рекомендации не ехать на осмотр с ROC-AUC 0.61. 

Обучили модель на экспертной выборке и разделили авто на классы

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

К этим параметрам относятся:

  • участие в аукционах аварийных автомобилей;

  • угон;

  • ограничения на регистрацию;

  • повреждения безопасности или критичных элементов автомобиля.

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

Машины без явных недостатков мы считаем хорошими или «зелёными». В выборе «зелёных» автомобилей диагносты были единогласны, но по одному автомобилю их мнения разошлись — кто-то готов был ехать на осмотр, а кто-то — нет. Они аргументировали это низкой ликвидностью и малым количеством фотографий. В итоге мы решили разделить категорию «зелёных» на: идеальные и просто хорошие машины с точки зрения параметров отчёта.

«Зелёные» и «красные» машины составляют чуть меньше 40% отчётов, а у остальных машин есть недостатки разной степени критичности. На основании них нельзя однозначно ставить крест на машине, однако по одним из таких средних автомобилей эксперты поехали бы на осмотр, а по другим — нет. 

Для разделения таких машин на «скорее плохие» и «скорее хорошие» мы применили бинарный классификатор. Задачу классификации формализовали следующим образом:

Наблюдение

Целевая переменная

Фичи

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

1 — специалист диагностики поехал бы на осмотр 

0 — иначе

Цена и признаки из отчёта. Например: количество ДТП, факт скрутки пробега, количество владельцев

Модели

Из-за малого объёма данных основным вариантом была логистическая регрессия, также мы рассматривали SVC и дерево с небольшой глубиной

Целевая метрика

ROC-AUC

Перед обучением мы получили дополнительные наблюдения, чтобы в выборке средних автомобилей в итоге было 200 наблюдений. Эвристики отсекли часть изначальной выборки. Результаты на тестовой выборке оказались неплохими — модель не случайно разделяла нолики и единички:

Модель

accuracy

precision

recall

ROC-AUC

Логистическая регрессия

0.65

0.66

0.44

0.72

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

В дальнейшем метрики оценивались на кросс-валидации, так как при выборе различных значений параметра random_date ROC-AUC на тестовой выборке мог отличаться более чем на 0.1. 

Улучшили модель

1. В качестве скейлера выбрали StandardScaler. Он показал лучшие значения ROC-AUC:

Скейлер

ROC-AUC

StandardScaler

0.77

RobustScaler

0.63

Normalizer

0.75

2. Отобрали наиболее важные признаки. Для этого применяли следующие методы:

  • 50 самых важных фичей на основе F-критерия и хи-квадрат;

  • 50 самых коррелирующих фичей с таргетом;

  • статистически значимые фичи при помощи логистической регрессии в пакете statsmodels;

  • Recursive Feature Elimination (RFE).

Я оставил признаки, которые оказались значимыми во всех методах и жадным перебором всех вариантов выбрал оптимальный набор фичей. В итоге ROC-AUC вырос до 0.86.

3. Отфильтровали наблюдения, создающие шум. Мы разобрали ошибки модели и выявили кейсы, когда данными невозможно было объяснить принятие решения. 

Например, диагносты по фото могли заметить незаконное переоборудование транспортного средства, которое бы не позволяло поставить машину на учёт. Такие особенности можно было определить только при помощи computer vision модели, поэтому, для быстрого решения, наблюдения были удалены из датасета. Вернём их уже после внедрения соответствующих CV моделей. 

Это привело к росту ROC-AUC до 0.95.

После проделанной работы с датасетом и фичами захотелось проверить качество классификации на других моделях, не требующих большого объёма данных. И вот какие результаты мы получили:

Модель

accuracy

precision

recall

ROC-AUC

Дерево

0.8

0.66

0.75

0.79

SVC

0.88

0.8

0.79

0.95

Логистическая регрессия

0.88

0.88

0.71

0.95

В качестве финальной модели мы решили оставить логистическую регрессию. Нам не хотелось жертвовать precision, так как рекомендовать плохую машину опасно с точки зрения репутации сервиса. А это значит, что мы будем показывать пользователям действительно хорошие авто. 

На последнем этапе улучшения модели диагносты разметили ещё отчёты, так как из-за скачков ROC-AUC в зависимости от random_state мы начали сомневаться в устойчивости модели. В финальной выборке мы собрали 650 наблюдений. Результаты модели оказались следующими:

Модель

accuracy

precision

recall

ROC-AUC

Логистическая регрессия

0.86

0.82

0.88

0.93

Модель стала более устойчивой, ROC-AUC отдельных фолдов при кросс-валидации отличался не более чем на 0.04.

В итоге алгоритм разделял все отчёты на 5 классов:

1. «Не стоит рисковать» — в отчёте встретились критичные проблемы.

​​

Отчёт о машине из категории: «Не стоит рисковать» 
Отчёт о машине из категории: «Не стоит рисковать» 

2. Оранжевый — «Вряд ли стоит осматривать». Эксперты бы не поехали на осмотр такого авто, но у машины нет критичных недостатков.

Отчёт об автомобиле из категории: «Вряд ли стоит осматривать». В эту категорию попало больше всего объявлений
Отчёт об автомобиле из категории: «Вряд ли стоит осматривать». В эту категорию попало больше всего объявлений

3. «Можно осмотреть со специалистом» — у таких машин есть некоторые недостатки, например, большой пробег или не очень серьёзные ДТП.

Отчёт об автомобиле из категории: «Можно осмотреть со специалистом»
Отчёт об автомобиле из категории: «Можно осмотреть со специалистом»

4. «Выезжайте на осмотр» — у машины нет явных недостатков, но есть неоднозначные моменты, которые надо уточнить у продавца. Например, в отчёте мало фотографий и лучше перед осмотром попросить дополнительные.

Отчёт о машине из категории: «Выезжайте на осмотр»
Отчёт о машине из категории: «Выезжайте на осмотр»

5. Идеальный — «Срочно на осмотр». К машине нет никаких вопросов, нужно срочно ехать, осматривать и после этого принимать решение о покупке.

Отчёт об авто из категории: «Срочно на осмотр»
Отчёт об авто из категории: «Срочно на осмотр»

Провели валидацию внутри команды

Перед тестированием модели на пользователях мы с командой оценили несколько сотен примеров рекомендаций, в результате приняли решение о следующих изменениях: 

Эвристики: залог, лицензию на такси и каршеринг мы перенесли из класса «Не стоит рисковать» в «Вряд ли стоит осматривать». Эти эвристики были наследием «серьёзных недостатков», но они не влияют на безопасность и не блокируют легальное использование машины, поэтому не подходят для самого плохого класса.

Добавили дополнительные условия для идеального класса «Срочно на осмотр», например, параметр — «Отсутствие длительных пробелов в истории эксплуатации».

После всех доработок алгоритм стал выглядеть так: 

Упрощённая схема алгоритма, который определяет категорию авто
Упрощённая схема алгоритма, который определяет категорию авто

Также мы провели опрос в команде. Попросили коллег оценить, к какому из пяти классов они отнесли бы отчёты, в которых не было рекомендаций. Вопросы специально выбрали таким образом, чтобы несколько человек оценили каждый отчёт. В результате мнения коллег совпали только в 23% случаев. 

В 58% случаев с моделью был согласен хотя бы кто-то из опрошенных и объективных причин для изменения эвристик или переобучения на основе комментариев к ответам от коллег не нашлось.

Кликни здесь и узнаешь

Финальное решение и результаты

После решения всех корнер кейсов коллеги из разработки написали код для real-time расчёта фичей или эвристик на основе данных конкретного отчёта, я подготовил pickle файл с моделью, дизайнеры подготовили макеты:

Протестировали фичу в А/Б. Наша гипотеза заключалась в том, что рекомендация принесёт непрофессиональным пользователям дополнительную ценность и они станут чаще возвращаться в продукт. 

Проверить гипотезу мы решили при помощи метрики количества использованных отчётов. Контрметриками были контакты по машинам и обратная связь от профессиональных пользователей, которую мы отслеживаем через опрос NPS.

Результаты теста (alpha=0.001):

Метрика

lift

MoE (margin of error)

Количество использованных отчётов

+3.2%

3%

Количество купленных отчётов

+3.2%

3.2%

Количество пользователей с контактом

-1%

2.8%

NPS профессиональных пользователей

+1.3%

13.84%

Количество пользователей с контактом после просмотра отчёта «Вряд ли стоит осматривать»

-2.84%

4.24%

Количество использованных и купленных отчётов статистически значимо выросло, а число пользователей с контактом и NPS — не упало. Тест оказался успешным, однако, в сегменте пользователей, которые видели отчёты: «Вряд ли стоит осматривать» наблюдалось статистически значимое падение на уровне alpha=0.05. 

Мы решили, что текущий нейминг категорий авто звучит слишком категорично, и изменили два названия класса, чтобы они лучше отражали машины, которые в них входят:

  • «Вряд ли стоит осматривать» → «Нужен взгляд эксперта»;

  • «Можно осмотреть со специалистом» → «Можно осмотреть».

Вся статья кратко

  1. В Авито есть сервис Автотека. Мы предоставляем пользователям отчёты, в которых они могут смотреть историю использования автомобиля и на основе него принимать решение — ехать на осмотр или изучить ещё варианты. 

  2. Раньше мы фокусировались на том, чтобы наполнять Автотеку новыми данными относительно авто, но потом решили, что важнее интерпретация этих данных. Так пользователи смогут более осознанно подходить к выбору машин и лучше понимать, на какие критерии обращать внимание.

  3. Первым делом мы искали таргетную переменную, которая помогла бы лучше понимать — хорошее авто или не очень. Перебирали разные варианты действий пользователей:

    • контакт по объявлению после просмотра отчёта конкретным покупателем;

    • контакт по объявлению после просмотра отчёта хотя бы одним покупателем;

    • прекращение общения продавца с покупателем по объявлению после просмотра отчёта; 

    • закрытие объявления с фактом «Продано на Авито».

  4. Сделали экспертную разметку выборки — в этом помогли профессиональные перекупщики и автодиагносты. Они посмотрели 200 объявлений и дали свои комментарии по ним.

  5. Для построения более точного алгоритма мы взяли выборку диагностов. Добавили критерии и разделили автомобили на классы: «красные» и «зелёные».

  6. Улучшили модель: отобрали наиболее важные характеристики, отфильтровали наблюдения, которые создавали шум, попросили диагностов разметить ещё 500 отчётов, так как из-за скачков ROC-AUC мы начали сомневаться в устойчивости модели. 

  7. В итоге алгоритм научился разделять машины на 5 классов, к которым мы придумали такие текстовые обозначения: «Не стоит рисковать», «Вряд ли стоит осматривать», «Можно осмотреть со специалистом», «Выезжайте на осмотр», «Срочно на осмотр».

  8. Провели валидацию внутри команды и заменили несколько формулировок на более спокойные. 

  9. В результате: количество использованных и купленных отчётов статистически значимо выросло, а число пользователей с контактом и NPS — не упало.

Больше мыслей и кейсов из работы аналитиков есть в телеграм-канале: «Коммуналка аналитиков». Заходите читать про нашу работу и общаться в комментариях.

Как вам улучшения? Что ещё, на ваш взгляд, можно доработать? Делитесь мнением в комментариях!

А если хотите вместе с нами помогать людям и бизнесу через технологии — присоединяйтесь к командам. Свежие вакансии есть на нашем карьерном сайте.

Комментарии (3)


  1. azzas
    01.09.2025 11:00

    Все авитовские помощники, ассистенты, и вся другая хрень, которая должна помогать, делает использование сайта/приложения все более неудобным с каждым обновлением. Если я спрашиваю где и когда я могу посмотреть товар у продавца, я не хочу видеть ответ от вашего всратого неотключаемого ассистента, от которого толку ноль.


  1. max9
    01.09.2025 11:00

    господи, ну откуда этот идиотизм. "машина 2008гв была в ДТП" - ну офигеть теперь.


  1. Pelemeshka
    01.09.2025 11:00

    Может вместо рекламы нового сервиса вы разберетесь с не работающей техподдержкой, необоснованными банами без возможности восстановиться, платным продвижением, которое уменьшает просмотры до нуля, и кривым расчетом стоимости доставки?