Когда вы вызываете Яндекс.Такси, еще до того, как заказ подтвержден и вам назначат машину, в приложении видно время, за которое такси может приехать. Водитель еще не выбран, посчитать его путь из точки А в точку В еще нельзя, а предположительное время ожидания уже известно. И в таком предсказании точность важна как никогда. Если объявленное время ожидания будет слишком долгим, вы просто перейдете в другой сервис, а если обещание быстрого такси не сбудется, напишете жалобу. Руководитель машинного обучения в Яндекс.Такси Виктор Кантор рассказывает, как команда сервиса научила алгоритм точно предсказывать время прибытия.
Чтобы алгоритм мог верно предсказать время прибытия, его нужно обучить на примерах, за какое время к какой точке обычно подъезжает автомобиль в зависимости от разных факторов. Изначально мы воспользовались обучающей выборкой в которой есть объекты — пользовательские сессии (заказы) и ответы — время, через которое фактически приехала машина. При этом у объекта есть параметры, известные заранее: количество водителей и пользователей приложения рядом с местом заказа, расстояние до ближайших автомобилей и другие полезные величины.
Кажется, что все несложно — нужно придумать побольше таких признаков, представить их в виде чисел, и обучить модель прогнозировать среднее время прибытия машины.
Но среднее арифметическое очень чувствительно к исключениям из правил, подобно тому, как гигантская зарплата одного миллиардера смещает показатель средней зарплаты во всем обществе. Несколько водителей могут сильно задержаться по самым разным причинам, и их случаи отразятся на всех прогнозах!
Поэтому разработчики решили высчитывать и показывать пользователю не среднюю величину, а медианную. Тогда берется значение, которое находится в середине выборки: ровно половина примеров больше него и ровно половина меньше. Медиана справляется с тем, как очень большие задержки искажают общую картину.
Благодаря желанию победить искажения возникла парадоксальная идея. После назначения такси мы оцениваем, время прибытия по Яндекс.Картам! Тогда когда водитель не назначен, надо прогнозировать именно то время, которое потом покажут Карты. Фактическое время подачи автомобиля не так уж нужно.
Казалось бы, это неправильно указывать прогноз карт вместо реального времени. Но у такого решения есть хорошая причина. Пока такси едет до пользователя, возможны непредвиденные задержки: авария, пробка, водитель остановился купить воды, и чем дольше подобные задержки, выходящие за пределы нормы, тем сильнее они влияют на результат. Выход в том, чтобы прогнозировать сглаженную целевую переменную — время, по навигатору.
Так что задача алгоритма — за несколько секунд до того, как пользователь примет решение сделать заказ, угадать, что за цифру покажут Карты. Это хороший способ победить непредвиденные задержки, потому что этот показатель их не учитывает. Тогда остановки водителя, повлияют только на него и на его клиента, который понизит ему рейтинг, но общей картине и другим пользователям это мешать не будет. К тому же задержки можно уменьшать, работая над дисциплиной водителей.
Следуя новой логике алгоритма, команда Такси занялась его обучением, используя технологию CatBoost, которая внедрена в Яндексе для решения задач ранжирования, предсказания и построения рекомендаций. И показатели заметно улучшились.
Первоначально, до уточнения машинным обучением, предположительное время прибытия рассчитывалось на основе времени, за которое может приехать ближайший автомобиль. Благодаря машинному точность прогноза увеличилась примерно на две секунды, где-то на 3,4%. Это совсем немного, но главное, что дало машинное обучение использующее данные Яндекс.Карт, сократилось количество значительных промахов, на пять минут и больше. Их стало на 19,2% меньше, а это уже серьезно, ведь именно такие задержки такси воспринимаются наиболее болезненно.
А/В-тесты показали статистически значимый рост конверсии из заказа в совершённую поездку и из пользовательской сессии в заказ. Пользователи стали реже отказываться от поездки и чаще подтверждать заказ после того, как оценили, подходит ли им предположительное время подачи авто.
Хотите узнать больше о том, как устроен Яндекс? Читайте блог компании на Habr.