Jak Yandex.Taxi wyszukuje samochody, gdy ich nie ma

Jak Yandex.Taxi wyszukuje samochody, gdy ich nie ma

Dobra taksówka powinna być bezpieczna, niezawodna i szybka. Użytkownik nie będzie wdawał się w szczegóły: ważne jest dla niego, aby kliknął przycisk „Zamów” i jak najszybciej otrzymał samochód, który zawiezie go z punktu A do punktu B. Jeżeli w pobliżu nie ma żadnego samochodu, obsługa powinna natychmiast poinformować o tym, aby klient nie miał fałszywych oczekiwań. Ale jeśli znak „Zakaz samochodów” pojawia się zbyt często, logiczne jest, że dana osoba po prostu przestanie korzystać z tej usługi i przejdzie do konkurencji.

W tym artykule chcę porozmawiać o tym, jak za pomocą uczenia maszynowego rozwiązaliśmy problem wyszukiwania samochodów w obszarach o niskim zagęszczeniu (czyli tam, gdzie na pierwszy rzut oka nie ma samochodów). I co z tego wynikło.

prehistoria

Aby wezwać taksówkę, użytkownik wykonuje kilka prostych kroków, ale co dzieje się wewnątrz usługi?

Użytkownik Etap Zaplecze Yandex.Taxi
Wybiera punkt początkowy Przypnij Uruchamiamy uproszczone wyszukiwanie kandydatów - wyszukiwarka pinów. Na podstawie znalezionych kierowców przewidywany jest czas przyjazdu - ETA w pinie. Obliczany jest współczynnik rosnący w danym punkcie.
Wybiera miejsce docelowe, taryfę i wymagania Oferta Budujemy trasę i obliczamy ceny dla wszystkich taryf, biorąc pod uwagę współczynnik rosnący.
Naciska przycisk „Zadzwoń taksówką”. Zamówienie Rozpoczynamy pełne wyszukiwanie samochodu. Wybieramy najbardziej odpowiedniego kierowcę i oferujemy mu zamówienie.

Про ETA w pinie, kalkulacja ceny и wybór najodpowiedniejszego sterownika już pisaliśmy. A to opowieść o szukaniu kierowców. Podczas tworzenia zamówienia wyszukiwanie odbywa się dwukrotnie: na Pinie oraz w zamówieniu. Poszukiwanie zamówienia odbywa się w dwóch etapach: rekrutacja kandydatów i ranking. Najpierw znajdują się dostępni kandydaci na kierowców, którzy znajdują się najbliżej wykresu drogi. Następnie stosowane są bonusy i filtrowanie. Pozostali kandydaci zostają sklasyfikowani, a zwycięzca otrzymuje ofertę zamówienia. Jeśli się zgodzi, zostaje przydzielony do zamówienia i udaje się do punktu dostawy. Jeśli odmówi, oferta trafi do następnej. Jeżeli nie ma już kandydatów, poszukiwania rozpoczynają się od nowa. Trwa to nie dłużej niż trzy minuty, po czym zamówienie zostaje anulowane i spalone.

Wyszukiwanie na Pinie jest podobne do wyszukiwania na zamówienie, z tą różnicą, że zamówienie nie jest tworzone, a samo wyszukiwanie odbywa się tylko raz. Stosowane są również uproszczone ustawienia liczby kandydatów i promienia wyszukiwania. Takie uproszczenia są konieczne, ponieważ pinów jest o rząd wielkości więcej niż porządków, a wyszukiwanie jest operacją dość trudną. Kluczowy punkt naszej historii: jeśli podczas wstępnego wyszukiwania na Pinie nie znaleziono odpowiednich kandydatów, nie zezwalamy na złożenie zamówienia. Przynajmniej tak było kiedyś.

Oto co użytkownik zobaczył w aplikacji:

Jak Yandex.Taxi wyszukuje samochody, gdy ich nie ma

Szukaj samochodów bez samochodów

Któregoś dnia postawiliśmy hipotezę: być może w niektórych przypadkach zamówienie uda się jeszcze zrealizować, nawet jeśli na pinezce nie było żadnych samochodów. Przecież między PIN-em a złożeniem zamówienia upływa trochę czasu, a wyszukiwanie zamówienia jest pełniejsze i czasami powtarzane kilka razy: w tym czasie mogą pojawić się dostępne sterowniki. Wiedzieliśmy też odwrotnie: jeśli na pinezce znalazły się sterowniki, nie było faktem, że zostaną znalezione przy zamówieniu. Czasami znikają lub wszyscy odmawiają wykonania zamówienia.

Aby przetestować tę hipotezę, przeprowadziliśmy eksperyment: przestaliśmy sprawdzać obecność samochodów podczas wyszukiwania na Pinie dla testowej grupy użytkowników, czyli mieli oni możliwość złożenia „zamówienia bez samochodów”. Wynik był dość nieoczekiwany: jeśli samochodu nie było na szpilce, to w 29% przypadków odnaleziono go później - podczas wyszukiwania na zlecenie! Co więcej, zamówienia bez samochodów nie różniły się znacząco od zamówień zwykłych pod względem wskaźników anulowania, ocen i innych wskaźników jakości. Rezerwacje bez samochodu stanowiły 5% wszystkich rezerwacji, ale nieco ponad 1% wszystkich udanych podróży.

Aby zrozumieć, skąd pochodzą wykonawcy tych zamówień, przyjrzyjmy się ich statusom podczas wyszukiwania Pina:

Jak Yandex.Taxi wyszukuje samochody, gdy ich nie ma

  • Dostępny: był dostępny, ale z jakiegoś powodu nie został uwzględniony w kandydatach, np. był za daleko;
  • Na zamówienie: był zajęty, ale udało mu się uwolnić lub stać się dostępnym kolejność łańcuchowa;
  • Zajęty: możliwość przyjmowania zleceń została wyłączona, ale potem kierowca wrócił na linię;
  • Niedostępne: kierowca nie był online, ale się pojawił.

Dodajmy niezawodność

Dodatkowe zamówienia są świetne, ale 29% udanych wyszukiwań oznacza, że ​​w 71% przypadków użytkownik czekał długo i ostatecznie donikąd nie dotarł. Chociaż nie jest to złe z punktu widzenia wydajności systemu, w rzeczywistości daje użytkownikowi fałszywą nadzieję i marnuje czas, po czym się denerwuje i (być może) przestaje korzystać z usługi. Aby rozwiązać ten problem, nauczyliśmy się przewidywać prawdopodobieństwo znalezienia zamówionego samochodu.

Schemat jest taki:

  • Użytkownik umieszcza pinezkę.
  • Wyszukiwanie odbywa się na sworzniu.
  • Jeśli nie będzie samochodów, przewidujemy: może się pojawią.
  • I w zależności od prawdopodobieństwa pozwalamy lub nie pozwalamy na złożenie zamówienia, ale ostrzegamy, że gęstość samochodów w tym obszarze w tym czasie jest niska.

W aplikacji wyglądało to tak:

Jak Yandex.Taxi wyszukuje samochody, gdy ich nie ma

Korzystanie z modelu pozwala na dokładniejsze tworzenie nowych zamówień i nie uspokaja ludzi na próżno. Oznacza to, że należy regulować stosunek niezawodności i liczby zamówień bez maszyn za pomocą modelu precyzyjnego wycofania. Rzetelność usługi wpływa na chęć dalszego korzystania z produktu, czyli ostatecznie wszystko sprowadza się do ilości przejazdów.

Trochę o precyzji przywoływaniaJednym z podstawowych zadań uczenia maszynowego jest zadanie klasyfikacyjne: przypisanie obiektu do jednej z dwóch klas. W takim przypadku wynikiem algorytmu uczenia maszynowego często staje się numeryczna ocena przynależności do jednej z klas, na przykład ocena prawdopodobieństwa. Jednak wykonywane czynności mają zazwyczaj charakter binarny: jeśli samochód jest dostępny, to pozwolimy go zamówić, a jeśli nie, to nie. Mówiąc konkretnie, algorytm generujący estymację numeryczną nazwiemy modelem, a klasyfikator regułą przypisującą go do jednej z dwóch klas (1 lub –1). Aby stworzyć klasyfikator na podstawie oceny modelu, należy wybrać próg oceny. Jak dokładnie, zależy w dużej mierze od zadania.

Załóżmy, że robimy test (klasyfikator) na jakąś rzadką i niebezpieczną chorobę. Na podstawie wyników badań albo wysyłamy pacjenta na bardziej szczegółowe badanie, albo mówimy: „Dobrze, idź do domu”. Dla nas wysłanie chorego do domu jest o wiele gorsze niż niepotrzebne badanie osoby zdrowej. Oznacza to, że chcemy, aby test zadziałał w przypadku jak największej liczby naprawdę chorych osób. Ta wartość nazywa się przypomnieniem =Jak Yandex.Taxi wyszukuje samochody, gdy ich nie ma. Idealny klasyfikator ma 100% przypominalności. Zdegenerowaną sytuacją jest wysłanie wszystkich na badanie, wtedy wycofanie również będzie 100%.

Dzieje się tak również w drugą stronę. Na przykład tworzymy system testowania dla uczniów, który ma wykrywacz oszustw. Jeśli nagle sprawdzenie nie zadziała w przypadku niektórych przypadków oszukiwania, jest to nieprzyjemne, ale nie krytyczne. Z drugiej strony niesprawiedliwe oskarżanie uczniów o coś, czego nie zrobili, jest niezwykle złe. Oznacza to, że ważne jest dla nas, aby wśród pozytywnych odpowiedzi klasyfikatora było jak najwięcej poprawnych, być może ze szkodą dla ich liczby. Oznacza to, że musisz zmaksymalizować precyzję = Jak Yandex.Taxi wyszukuje samochody, gdy ich nie ma. Jeśli wyzwolenie nastąpi na wszystkich obiektach, wówczas precyzja będzie równa częstotliwości zdefiniowanej klasy w próbie.

Jeśli algorytm generuje liczbową wartość prawdopodobieństwa, wówczas wybierając różne progi, można uzyskać różne wartości dokładności.

W naszym problemie sytuacja wygląda następująco. Renowacja to ilość zleceń jakie jesteśmy w stanie zaoferować, precyzja to rzetelność tych zleceń. Tak wygląda krzywa precyzji przypomnienia naszego modelu:
Jak Yandex.Taxi wyszukuje samochody, gdy ich nie ma
Istnieją dwa skrajne przypadki: nie pozwalaj nikomu zamawiać i pozwalaj każdemu zamawiać. Jeśli nikomu nie pozwolisz, wówczas wycofanie będzie wynosić 0: nie tworzymy zamówień, ale żadne z nich nie zakończy się niepowodzeniem. Jeśli pozwolimy wszystkim, to wycofanie wyniesie 100% (otrzymamy wszystkie możliwe zamówienia), a precyzja wyniesie 29%, czyli 71% zamówień będzie złych.

Jako znaki wykorzystaliśmy różne parametry punktu początkowego:

  • Czas/miejsce.
  • Stan systemu (liczba zajętych maszyn wszystkich taryf i pinów w okolicy).
  • Parametry wyszukiwania (promień, liczba kandydatów, ograniczenia).

Więcej o znakach

Koncepcyjnie chcemy rozróżnić dwie sytuacje:

  • „Głęboki las” - w tej chwili nie ma tu samochodów.
  • „Pechowy” - są samochody, ale podczas wyszukiwania nie było odpowiednich.

Jednym z przykładów „pecha” jest duży popyt w centrum w piątkowy wieczór. Zamówień jest dużo, chętnych dużo, a kierowców nie starczy dla wszystkich. Może się tak okazać: w pinie nie ma odpowiednich sterowników. Ale dosłownie w ciągu kilku sekund się pojawiają, ponieważ w tym czasie w tym miejscu jest wielu kierowców i ich status ciągle się zmienia.

Dlatego dobrymi cechami okazały się różne wskaźniki systemowe w pobliżu punktu A:

  • Całkowita liczba samochodów.
  • Liczba samochodów na zamówienie.
  • Liczba samochodów niedostępnych do zamówienia w statusie „Zajęty”.
  • Liczba użytkowników.

Przecież im więcej samochodów, tym większe prawdopodobieństwo, że któreś z nich będzie dostępne.
Tak naprawdę ważne jest dla nas, aby nie tylko zlokalizować samochody, ale także odbyć udane wyjazdy. Można było zatem przewidzieć prawdopodobieństwo udanej podróży. Zdecydowaliśmy się jednak tego nie robić, ponieważ wartość ta w dużej mierze zależy od użytkownika i kierowcy.

Algorytm uczenia modelu był KotBoost. Do treningu wykorzystano dane uzyskane z eksperymentu. Po wdrożeniu konieczne było zebranie danych szkoleniowych, co czasami pozwalało niewielkiej liczbie użytkowników na złożenie zamówienia wbrew decyzji modelu.

Wyniki

Wyniki eksperymentu były zgodne z oczekiwaniami: zastosowanie modelu pozwala znacząco zwiększyć liczbę udanych przejazdów w związku z zamówieniami bez samochodów, ale bez uszczerbku dla niezawodności.

Na chwilę obecną mechanizm został uruchomiony we wszystkich miastach i krajach i przy jego pomocy dochodzi do około 1% udanych wyjazdów. Co więcej, w niektórych miastach o małym natężeniu ruchu samochodowego udział takich przejazdów sięga 15%.

Inne wpisy na temat technologii taksówkowej

Źródło: www.habr.com

Dodaj komentarz