Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Привет, я Дмитрий Сергеев, аналитик в Авито Доставке. Сейчас у нас на сайте доступны к продаже более 70 миллионов товаров, и не всегда понятно, какие из них продавец может положить в коробку и отправить в другой город, а какие — нет. Временами мы допускаем ошибки: предлагаем доставку там, где её быть не должно и наоборот. Расскажу немного о том, как мы с этой проблемой справляемся и каких результатов получилось достичь.
Какие проблемы с доставкой были на старте
Каждый день на Авито совершается больше миллиона сделок. Большинство из них — локальные и зачастую ограничены городом проживания покупателя и продавца. Но что делать в ситуации, когда необходимого товара нет поблизости? Этим товаром может оказаться как редкая запчасть для автомобиля, так и эксклюзивная сумочка от Gucci, выпущенная в единственном экземпляре. Также возможна ситуация, когда в вашей локации цена на необходимый товар в десятки раз выше, чем в далеком Якутске.
Мы посмотрели на это и поняли, что можем предложить продавцам и покупателям из разных городов возможность доставки. С ней покупатели получают доступ ко всем товарам Авито, а продавцы — дополнительный трафик на объявления. Такой очевидный способ сделать наших пользователей немного счастливее.
Для начала надо было посмотреть на весь наш многомиллионный ассортимент и решить, что из товаров мы можем гипотетически доставить. Ограничения от службы доставки были такие: вес не больше 15 килограмм, а габариты не превышают 120×80×50 см. Также был запрет на доставку следующих категорий товаров — оружия, лаков, красок, и всего, что может загореться или взорваться по дороге.
Мы сделали первый подход к штанге и разметили все существующие категории Авито на доставляемые и недоставляемы. Руководствовались при этом исключительно здравым смыслом и житейским опытом: телефоны, ноутбуки, детская одежда — подключаем к доставке; квартиры, резюме, животных — нет.
В таблице красным цветом выделены категории без доставки, зелёным — с доставкой. В той конфигурации, которая была при первой разметке
Кажется, что решение было достаточно логичным, но тут у него обнаружились неприятные краевые эффекты.
Есть два типа проблем с определением доставляемости на уровне категорий: обещать доставку там, где она невозможна, и не предлагать её там, где она нам по силам. Так происходит из-за того, что наши категории не всегда однородны по весо-габаритным характеристикам. Например, в «товарах для школы» могут лежать карандаши и контурные карты с одной стороны и доски с партами — с другой. Конечно же, парту мы привезти никак не сможем. А вот карандаши — запросто!
Но пока мы определяем возможность доставки на уровне категории, приходится либо подключать все товары данной категории к доставке, либо не подключать их вообще. Во время первичной разметки, категория «запчасти для автомобиля» была признана доставляемой. В результате у нас был неприятный инцидент в Липецке, когда продавец два километра нёс на себе лобовое стекло от Камаза, а в пункте приёма его развернули с комментарием, что такой негабаритный груз мы доставить никак не сможем. Это была исключительно наша ошибка, а пострадал в итоге ни в чём не повинный продавец.
Кажется, что можно отдать рычаг управления доставкой на откуп продавцам: мы расскажем про ограничения, а они сами решат, удовлетворяет их товар необходимым требованиям или нет. Мы проверяли эту гипотезу при помощи А/Б-тестирования и выяснили следующее: в момент подачи объявления пользователь редко задумывается о функции доставки. Ему важно продать товар: он готов загрузить фото, дать описание, указать цену. А на дополнительные вопросы про доставляемость товара он отвечать не хочет. Поэтому мы выбрали другой путь — подключить дата-сайентистов и посмотреть, что сможем выяснить сами.
Признак чистоты для категории
Для начала мы хотели ответить на два вопроса: как выявить «проблемные» категории и как замерить уровень их неоднородности. Нужно было выяснить, много ли заказов мы теряем, если отказываемся от доставки для некоторых из них. Поэтому мы запустили опрос на «Толоке»: пользователи отсматривали карточки с товарами и отвечали, что из этого мы можем доставить. Товары выбирали таким образом, чтобы каждая категория была репрезентативной: вероятность попадания товара в выборку была прямо пропорциональна количеству его просмотров за последние 28 дней.
Пользователи разметили все наши категории, и мы получили признак «чистоты» для каждой из них. Очевидно, что «кухонные гарнитуры» получили в данном опросе 0%, а «телефоны» что-то в районе 99,9%. Также мы смогли получить средневзвешенную оценку чистоты признака для всего Авито, исходя из представленности каждой категории на площадке.
Итоги нашего опроса можно увидеть на графике. Каждая точка — это категория:
- Красный хвост распределения — явно недоставляемые товары.
- Зелёный хвост — лёгкие и небольшие по размерам категории.
- Жёлтая середина — средоточие зла. Именно здесь располагаются самые «грязные» по версии Авито Доставки категории, в которых наиболее вероятны ошибки.
Естественно, что теперь интересно посмотреть, как наше решение по подключению Доставки к той или иной категории соотносится с её «чистотой». Для этого наложим на получившийся график цветовое обозначение: зелёные категории Авито считает доставляемыми, красные — нет.
Мы видим, что в правой — зелёной — части распределения закрались красные точки-шпионы. Почему изначально к доставке не были подключены «духовые инструменты» или «запчасти для велосипедов» остаётся загадкой по сей день. Поэтому первым нашим шагом после опроса было подключение наиболее «чистых» категорий, а также отключение наиболее «грязных». Но если для этих категорий мы могли принять небольшие риски, то над средней частью распределения пришлось поработать, ведь именно она причиняла наибольший дискомфорт нашим пользователям.
DS SWAT и их модели для распознавания товаров
Решение Авито о подключении Доставки для какого-то конкретного товара — это 0 или 1. Ответ пользователей Толоки — тоже 0 или 1. И, по сути, перед нами — простейший классификатор, который может как угадывать, так и ошибаться. У него, как у любого порядочного классификатора, можно посчитать точность и полноту. Точность в нашем случае составила 75%, а это означает, что 25% товаров на Авито были подключены к Доставке ошибочно. Полнота же составила 82%, что свидетельствует о том, что дополнительные 18% товаров могли быть подключены к Доставке, но этого не произошло.
Чтобы найти все эти товары, мы обратились к DS SWAT — команде дата-сайентистов быстрого реагирования — они всегда приходят на помощь в любых непростых ситуациях. Для первой итерации из самых неоднородных категорий мы выбрали три тестовые.
Категории для тестов были следующими:
- «Фитнес и тренажёры» → здесь был подключен сервис доставки, но оказалось много недоставочных товаров, например, велодорожек и других тренажёров.
- «Инструменты» → доставки не было, хотя результаты опросов в «Толоке» показывали здесь большой потенциал.
- «Стиральные машины» → негабаритные, совершенно недоставляемые. Но в этой категории могут быть запчасти, которые мы теоретически могли бы отправлять покупателям. Это была супертестовая категория — особых ставок на неё мы не делали, а просто хотели посмотреть, что получится.
Товары из тестовых категорий мы пропустили через сервис Libra — он умеет по названию и описанию делить товары из одной категории на разные классы. Получается более глубокий уровень разбиения, потому что товары в одной категории могут различаться по весу и габаритам, а внутри класса эти параметры близки. В итоге получилась модель, которая классифицирует объявления на однородные с точки зрения доставки классы. В основе Libra лежит двухслойная BiLSTM-нейросеть.
Сам сервис Libra делался на основе другой обученной нейросети — AvitoNet. AvitoNet определяет класс товара по фотографии. Этот сервис используется в мобильном приложении при подаче объявления, когда у товара ещё нет ни названия, ни описания. Пользователь делает фотографию, и мы показываем ему подсказку с тем, какую категорию и название можно поставить объявлению. Классы для AvitoNet мы получили в результате анализа и разметки самых популярных N-грамм, которые пользователи пишут в заголовках объявлений. Всего классов около 3000.
Так как названия товаров, размещённых в мобильном приложении Авито уже частично сгенерированы AvitoNet, то нам нужен был другой, более вариативный источник данных. Поэтому мы брали только те товары, которые были поданы с десктопной версии сайта и прогоняли их через AvitoNet. Из них мы оставляли только те, с которыми AvitoNet справилась уверенно. Получается, что у нас были товары, которые с высокой долей вероятности определялись к тому или иному классу. На названиях и описаниях этих товаров мы и обучали нашу двухслойную BiLSTM.
Категория, которая обязательна при подаче, здесь работала как дополнительный фильтр. Например, класс «чехол» может лежать как в категории «музыкальные инструменты», например, чехол для гитары, так и в аксессуарах для телефона. Так как мы используем категорию как дополнительный фильтр, то точно понимаем, в какой из чехлов попали.
Вместо разнородной категории «фитнес и тренажеры» мы получили однородные классы: эспандер, скакалка, беговая дорожка. Теперь сказать, является ли класс доставляемым, стало намного проще. После этого мы снова сделали разметку, но уже на более глубоком уровне — уровне классов. Это позволило нам значительно улучшить показатели точности определения признака.
Вместо одной категории «фитнес и тренажёры» у нас теперь 37 классов, и мы можем делать разметку на более глубоком уровне
Первые успехи и побочные эффекты
«Почистили» признак доставки и увеличили полноту в спорных категориях. Это результат для ста проблемных категорий из середины кривой, с которой мы начали работу. Чистота признака увеличилась на 10%, а полнота изменилась на 18-20%. Параллельно с работой Libra мы проводили опросы на «Толоке» — каждый раз, когда подключали новую категорию. Так было проще ориентироваться, что мы движемся в правильном направлении.
Увеличили количество сделок. Например, категория «инструменты» дала нам 2% дополнительных заказов. Сейчас доставка для этой категории подключена у трети товаров. А в суперэкспериментальной категории «стиральные машины» дела не так радужно. Мы нашли только 12% товаров, которые можем доставлять. У них всего 3% от всех просмотров в категории «стиральные машины», и результаты по сделкам не такие впечатляющие. Но изначально здесь вообще ничего нельзя было доставить!
Отключили от доставки негабаритные товары. Здесь видим интересный эффект в категории «фитнес и тренажёры». Количество объявлений с доставкой сократилось вдвое — мы больше не обещаем привезти скамью для отжиманий и другие негабаритные товары. При этом количество заказов не упало, то есть мы отключили от доставки как раз то, что и раньше нельзя было доставить. И отмен заказов продавцами по причине «неудобно нести товар в пункт приёма» стало на порядок меньше.
После раскатки Libra на категорию «фитнес и тренажёры» доля товаров с подключенной доставкой сократилась более, чем в 2 раза по просмотрам
При этом доля категории в объёме всех заказов осталась на прежнем уровне
Уточнили тарифы. Раньше цена доставки была привязана к категории. Если мы считаем, что в категории лежат в основном габаритные товары, то и стоимость будет выше. После запуска Libra мы получили разбивку на классы, и стали привязывать стоимость к ним. Так получается точнее для нас и выгоднее для покупателя. Например, в категории «охота и рыбалка» у нас есть воблеры — это такие приманки для рыбы. Они небольшие и лёгкие, а доставлялись по тарифу для габаритных товаров. Теперь мы это исправили.
P.S. «Но почему мы не можем превратить классы в категории, чтобы пользователь указывал их при размещении самостоятельно?» — такой вопрос, наверное, мог возникнуть у вас в голове. И вы совершенно правы. В не столь далеком, но прекрасном, будущем именно так и будет. Классы прорастут в дерево категорий Авито и будут доступны как в навигации на сайте, так и при подаче. Но сейчас это достаточно неповоротливый монстр, на котором завязано много других аспектов: ценообразование, лимиты размещения и так далее. И разделение категории до сих пор не такой быстрый процесс, как хотелось бы. А нам нужно было получить результат здесь и сейчас. И поэтому мы уже используем классы для определения признака доставляемости, а все остальные процессы перейдут на них некоторое время спустя.