Наткнулся на отличную статью...

Posted on Sun 20 February 2022 • Tagged with from_telegram, in_russian

Наткнулся на отличную статью в блоге Uber о том, как они переносили оценку времени поездки на DL пайплайн, и меня захлестнуло ностальгией.

Примерно пять лет назад я работал в компании Juno - израильском райдшеринге, который оперировался в Нью-Йорке, а разрабатывался в Минске 🤯 (сейчас остатками компании владеет Lyft). И там мы, неопытные машинлернеры, делали в т.ч. робкие попытки затащить ML для той же задачи получения ETA.

Вообще, самый простой способ получить ответ на вопрос "сколько машина будет ехать из точки А в точку B" - спросить API какого-нибудь провайдера карт, например, Google, Яндекс или TomTom. Но это решение 1) быстро становится дорогим, 2) не учитывает паттерны именно в твоих поездках (например, опытные таксисты в среднем могут добираться до точки назначения быстрее среднего водителя). Следующий шаг эволюции - взять какой-нибудь open source движок типа Valhalla или OSRM и допилить его под свои нужды, например, прикрутив туда свой движок пробок. Это уменьшает счета от гугла, но все еще не делает предсказание очень точным.

Соответственно, ML решение должно уточнять предсказание вышеописанного сервиса. Мы придумали много handcrafted фичей, обучили какой-то градиентный бустинг, оффлайн метрики были хорошими - примерно на уровне данных из Google. Но вот катить в прод это было сложно по ряду причин, как технических, так и не очень. Из технических упомяну только сложность реализации всех этих фичей (включая всякие исторические агрегаты) в рантайме - в те времена простые пацаны еще не знали таких слов, как feature store.

И тогда у нас родилась безумная идея - предсказывать ETA end2end довольно простой сетью, без всяких сложных фичей и маршрутов из Valhalla. География Нью-Йорка очень простая, и, как оказалось, с датасетом в миллионы поездкок можно получить хорошую модель, используя только геокоординаты и фичи времени для учета сезонности. Впрочем, в прод это так и не доехало - приоритеты сменились. Так я впервые своими глазами увидел, как очень прямолинейный deep learning go brrr бьет куда более сложные решения.

Кстати, самый первый бейзлайн - довольно рабочий! - в этой задаче выглядел примерно так:

def get_eta(coords_from, coords_to): if is_manhattan(coords_from) and is_manhattan(coords_to): return 4 # minutes ...

source