Машинное обучение — молодец

Рассказ о применении алгоритмов в «Яндекс.Такси», благодаря которым сервис следит за чистотой машин, помогает водителям планировать рабочий день, распределяет заказы — и это только начало.

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

Первое — находить в продукте зоны, которые можно улучшить при помощи больших данных и алгоритмов.

То есть задача — создать приложение, которое уже при запуске будет знать, куда отправится пользователь — в детский сад с ребёнком или в ресторан с друзьями; какая машина ему нужна — с детскими креслами или минивэн для большой компании; через какое время должен подъехать водитель — сразу или через несколько минут, пока пассажир выходит из дома. Идеальное приложение сразу подскажет, сколько предстоит ожидать машину в том или ином тарифе и откуда можно уехать дешевле.

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

Руководитель службы машинного обучения и анализа данных «Яндекс.Такси» Роман Халкечев для блога компании на vc.ru на примерах рассказал, как данные и алгоритмы помогают пользователям, водителям и внутренним службам компании.

Роман Халкечев
Роман Халкечев

Машинное обучение распределяет заказы точнее

Как только пользователь нажимает на кнопку «Заказать», алгоритм начинает решать задачу поиска водителя — этот процесс принято называть dispatch. Система ищет наиболее подходящую машину среди тех, что находятся в ближайшем окружении пользователя, учитывая множество параметров, включая вероятность того, что водитель примет заказ.

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

Для решения этой задачи мы тестируем так называемый «буферный dispatch»: если в одной геозоне находятся десять пользователей и десять водителей, то вместо того, чтобы последовательно назначать одну машину на один заказ, он одновременно анализирует десять заказов и десять водителей.

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

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

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

То же самое касается пользователей: система уже умеет предсказывать, с какой вероятностью человек, открывший приложение, в ближайшее время сделает заказ. Если вероятность того, что это произойдет в течение минуты, высокая, то его заказ учитывается в «буфере» — алгоритм фактически начинает искать машину еще до того, как нажата кнопка «Заказать».

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

Аэропорт отличается от остальных мест — здесь очень большая плотность заказов на длинные поездки из одной точки. Эти заказы появляются волнообразно в зависимости от расписания прилётов — особенно если речь идет про небольшой аэропорт.

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

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

Чтобы решить проблему, в июле «Яндекс.Такси» запустил новый алгоритм, который умеет распределять заказы (опять же, при прочих равных) в порядке очереди. Теперь водитель приезжает в геозону аэропорта, высаживает своего пассажира, нажимает на кнопку «Встать в очередь» и сразу видит своё место в ней.

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

Машинное обучение — молодец

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

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

В больших аэропортах, где у нас больше исторических данных, система предсказывает время ожидания с погрешностью в 10%. В маленьких аэропортах погрешность пока выше — до 15-17%. Такая же погрешность у новых «воздушных ворот». Например, пока что у нас недостаточно статистики по новому аэропорту в Ростове-на-Дону. Команда учится решать проблему и в условиях нехватки исторических данных.

Машинное обучение отвечает на обращения быстрее

Служба поддержки «Яндекс.Такси» распределяет запросы в зависимости от их сложности и срочности. Запрос о забытых в машине вещах нужно обработать как можно быстрее. А на жалобу о том, что водитель не прочитал сообщение в чате приложения, скорее всего, можно отреагировать чуть позже.

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

С запуском «Яндекс.Такси» в новых городах и странах росло количество пользователей сервиса и, как следствие, обращений. Поддержке требовалась автоматизация, чтобы сократить затраты на первичную рутинную обработку запросов.

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

Уже обученную нейросеть внедрили на реальном потоке обращений, и теперь в интерфейсе оператора важные и срочные тикеты всегда находятся вверху.

Следующий этап — помощь с ответами на тикеты. Операторы поддержки «Яндекс.Такси» используют около 200 шаблонов для ответов на типовые запросы, которые меняются сообразно ситуации и обстоятельствам. Для ответа на каждый запрос сотрудникам приходилось искать в списке один из подходящих шаблонов, менять его и отправлять.

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

На 20%

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

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

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

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

Да-да, мы тоже смеялись <a href="https://pikabu.ru/story/tekhpodderzhka_yandeks_taksi_6109211" rel="nofollow noreferrer noopener" target="_blank">Pikabu</a>
Да-да, мы тоже смеялись Pikabu

Машинное обучение изучает потребности водителей системнее

Недавно «Яндекс.Такси» запустил программу «Большая перемена». Её цель — наладить получение обратной связи от водителей, чтобы улучшить для них сервис и приложение «Таксометр», с помощью которого они работают. Задача — быстро узнавать, с какими реальными проблемами сталкиваются водители, и искать их решения. В рамках этой программы как раз и был создан алгоритм очередей в аэропортах.

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

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

Машинное обучение следит за качеством машин без выходных

Одна из важных задач сервиса «Яндекс.Такси» — сделать так, чтобы все автомобили, подключенные к платформе, удовлетворяли критериям качества: не битый и чистый кузов, пустой и чистый багажник, наличие детского кресла (если водитель претендует на выполнение поездок с детьми), номер и марка машины, совпадающие с тем, что указаны в приложении, и так далее.

Так как «Яндекс.Такси» работает через партнёров — таксопарки или индивидуальных предпринимателей — контролировать качество напрямую сложно. Поэтому разработчики создали дистанционный контроль качества — ДКК.

«Таксометр» с определенной периодичностью просит водителей сделать через приложение восемь фотографий своего автомобиля снаружи и внутри салона. Снимки приходят к асессорам — сотрудникам «Яндекс.Такси», которые вручную отсматривают и проверяют, совпадают ли фотографии с тем, что заявлено, и удовлетворяют ли стандартам сервиса.

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

Так водитель не пройдёт фотоконтроль
Так водитель не пройдёт фотоконтроль

В этом процессе есть простор для алгоритмов. Можно автоматически и без участия человека определять, всё ли в порядке на ДКК. У команды машинного обучения, разумеется, появилась идея создать нейросеть, которая не только могла бы по фотографиям определить, все ли в порядке, но и подсказать, что не в порядке и что надо исправить, например, правильно наклеить брендинг «Яндекса».

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

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

Затем алгоритм проверяет госномер: распознаёт его на снимке и сверяет с тем, что указан в карточке, заведённой на автомобиль в системе (это делает индивидуальный предприниматель или таксопарк-партнер). Далее — автоматическая проверка марки, модели и цвета автомобиля на совпадение с теми, что указаны в системе.

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

Машинное обучение привлекает новых пользователей

У пользователей «Яндекс.Такси» есть возможность заказать такси с детскими автокреслами. Подобное предложение — одно из конкурентных преимуществ компании перед другими сервисами. Поэтому после запуска маркетинг сервиса хотел рассказать про это пользователям — прежде всего родителям тех детей, которых нужно перевозить в креслах.

Для рекламных кампаний команда маркетинга использует множество разных каналов, в том числе «ВКонтакте», Facebook и Instagram. В таких случаях можно показывать рекламу случайным пользователям либо воспользоваться встроенным таргетингом соцсетей. Но есть и третья опция — можно подключить алгоритмы, которые помогут установить правильный таргетинг для объявлений.

С помощью сервиса «Яндекс.Аудитории» можно узнать, насколько вероятно, что у определенного пользователя есть дети или автомобиль. В дополнение к этому у «Яндекс.Такси» есть характеристики о пользователях, которые уже заказывают детские тарифы. Используя два источника данных, можно построить look-a-like-модель — найти обезличенные профили, которые не используют «Яндекс.Такси», но по аудиторномым признакам похожи на тех, кто заказывает детский тариф. На них и стоит таргетировать объявления в соцсетях.

Чтобы отслеживать эффективность алгоритма, маркетинговый отдел сравнивает работу look-a-like-модели со случайным таргетингом и таргетингом площадок. Система помогла снизить стоимость установки в три раза благодаря тому, что рекламу видели именно те пользователи, которым это было интересно.

Машинное обучение молодец, но может быть лучше

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

Для тех, кто хочет присоединиться к «Яндекс.Такси», команда подготовила небольшое тестовое задание.

Задание 1

При обучении SVM с линейным ядром на наборе данных с очень большим числом разреженных признаков точность многоклассовой классификации на тестовой выборке получилась равной 95%, а при обучении SVM с радиальным ядром — 34%. Почему SVM с более сложным ядром показал менее высокое качество? Когда можно ожидать от радиального ядра улучшения качества по сравнению с линейным?

Задание 2

В одном проекте заказчик очень хотел, чтобы исследователь решал не поставленную задачу классификации на классы 0 и 1, а задачу регрессии на тех же метках с модулем отклонения в качестве функции потерь. Замысел заказчика был в том, что оцененные числа получатся дробными, и это будет приближением для вероятности класса 1. Считая, что алгоритм старается минимизировать математическое ожидание потерь при условии известного объекта x, выясните, какими будут получаться прогнозы при такой функции потерь и насколько они будут соответствовать замыслу заказчика.

Задание 3

Какой должна быть функция потерь в предыдущей задаче, чтобы действительно оценивались вероятности? Покажите, что это так.

Присылайте свои ответы на cv_taxi@yandex-team.ru.

Открытые вакансии в службе машинного обучения «Яндекс.Такси»:

3131
22 комментария

Это конечно прекрасно. Вот только мне поездка на Яндекс Такси обошлась примерно в 30 тысяч рублей, с учетом того, что я даже никуда не ехал. https://www.facebook.com/ivanovseo/posts/10212455811252295
Вкратце:
- водитель Яндекс Такси в машине Яндекс Такси с огромным баннером Яндекс Такси выполнял заказ по адресу моего дома
- он стукнул мне машину, вышел, убедился что руки у него растут не с того места и благополучно уехал, камера наблюдения это запечатлела
- поскольку это было незадолго до моей свадьбы у меня не было времени на ГАИ и прочее
- я связался в ФБ с поддержкой, которая резонно заметила, что не может предоставить мне данные водителя (это само собой)
- в ответ я предложил сообщить мои данные водителю, чтобы тот сам выбрал - оплатить мне ремонт или потерять права и работу

Тут началось самое прекрасное. Выяснилось, что нет возможности определить было ли это Яндекс Такси с учетом того, что на видео видно огромный баннер. За рулем мог быть не только водитель Яндекс Такси, но и его брат, друг, кот. Что невозможно по точной дате, времени и геолокации определить какой это был автомобиль.После длительных разборок мне предложили решить вопрос на одной из конференций, где я выступал. Стоит ли говорить, что никто не подошел и ничего не решил =)

Поэтому о каких инновациях идет речь? Когда бигдата и машинное обучение молодец, но вы не можете решить простые человеческие проблемы.

Ремонт мне обошелся примерно в 30 тысяч рублей.

14
Ответить

Водитель Яндекса приносит Яндексу прибыль. Дмитрий Иванов Яндексу ничего не приносит кроме геморроя.
Чьи интересы будет защищать Яндекс?
Дмитрий Иванов платит налоги государству за защиту своих законных интересов. Государство принимает законы защищающие интересы Дмитрия, и содержит органы понуждающие всех к их исполнению.
Куда должен обращаться Дмитрий в случае ущерба своим законным интересам?

5
Ответить

да что-то про эффективность верится с трудом. Вы бы лучше спросили водителей о том, работает ли это, ведь вы для них делали. А я прекрасно помню, как мне водитель рассказывал об ответах службы поддержки через неделю (7 дней, карл!!!!) о неверно рассчитанных выплатах и бонусах, обещанных от перехода с убера летом 2018.

видимо, это то как раз ИИ считает неприоритетным.

4
Ответить

Да так улушают, что у меня при наличии машин и отсутствии пробок:
1. 3-4 дня в неделю показывается поездка 120-140 рублей
2. 1-2 в неделю 250-300 рублей (больше чем уверен это алгоритм «взять лоха на понт»)

Ехать мне 2 км/6 мин, и поэтому я теперь езжу за 97 рублей в СитиМобил.

И судя и по выпуску Яндекс.Радара и по тому как Яндекс.Билеты против законопроекта об именных билетах, который не даст спекулянтам продавать дороже на 100-300%: Яндекс сегодня просто за бабло, прям слышу как акционеры спрашивают «А что бы вы еще могли сделать для увеличения прибыли?»

Ответить

Прекрасная статья, но "заедающая" гифка сводит меня с ума!

3
Ответить

Научите его подбирать водителей!

3
Ответить