Wie Yandex.Taxi nach Autos sucht, wenn sie es nicht sind

Bild

Ein guter Taxibuchungsservice sollte sicher, zuverlĂ€ssig und schnell sein. Der Benutzer wird nicht auf Details eingehen: Es ist wichtig, dass er auf die SchaltflĂ€che Bestellen klickt und so schnell wie möglich ein Auto erhĂ€lt, das ihn von Punkt A nach Punkt B bringt. Wenn sich keine Autos in der NĂ€he befinden, sollte der Dienst dies unverzĂŒglich mitteilen, damit der Kunde dies nicht tut entwickelte falsche Erwartungen. Wenn das Schild „Keine Autos“ zu oft angezeigt wird, ist es logisch, dass eine Person diesen Dienst einfach nicht mehr nutzt und zu einem Konkurrenten geht.

In diesem Artikel möchte ich darĂŒber sprechen, wie wir mit Hilfe des maschinellen Lernens das Problem gelöst haben, Autos in einem Gebiet mit geringer Dichte zu finden (mit anderen Worten, wo es auf den ersten Blick keine Autos gibt). Und was kam daraus?

Hintergrund


Um ein Taxi zu rufen, macht der Benutzer ein paar einfache Schritte, und was passiert in den Eingeweiden des Dienstes?
BenutzerBĂŒhneBackend Yandex.Taxi
WĂ€hlt einen AusgangspunktPinWir starten eine vereinfachte Suche nach Kandidaten - Suche auf der Stecknadel. Basierend auf den gefundenen Treibern wird die Ankunftszeit vorhergesagt - ETA im Pin. Der Inkrementfaktor an einem bestimmten Punkt wird berechnet.
WĂ€hlt Ziel, Tarif, AnforderungenAngebotWir bauen eine Route und berechnen die Preise fĂŒr alle Tarife unter BerĂŒcksichtigung des steigenden Koeffizienten.
DrĂŒckt die Taste "Taxi rufen"BestellungWir starten eine vollwertige Suche nach dem Auto. Wir wĂ€hlen den am besten geeigneten Fahrer aus und bieten ihm eine Bestellung an.

Über ETA im Pin haben wir bereits die Berechnung des Preises und die Wahl des am besten geeigneten Fahrers geschrieben . Und dies ist eine Geschichte ĂŒber das Finden von Fahrern. Wenn eine Bestellung erstellt wird, erfolgt die Suche zweimal: auf der PIN und auf der Bestellung. Die Suche nach der Bestellung erfolgt in zwei Schritten: Rekrutierung von Kandidaten und Ranking. Erstens gibt es freie Kandidaten, die entlang des Straßengraphen kommen. Dann werden Boni und Filter angewendet. Die verbleibenden Kandidaten werden eingestuft und der Gewinner erhĂ€lt ein Angebot der Bestellung. Wenn er zustimmt, wird er der Bestellung zugeordnet und geht zum Lieferort. Wenn er sich weigert, kommt das Angebot zum nĂ€chsten. Wenn keine Kandidaten mehr vorhanden sind, wird die Suche erneut gestartet. Dies dauert nicht lĂ€nger als drei Minuten. Danach wird die Bestellung storniert - ausgebrannt.

Die Suche auf der PIN Ă€hnelt der Suche auf der Bestellung, nur die Bestellung wird nicht erstellt und die Suche selbst wird nur einmal durchgefĂŒhrt. Außerdem werden vereinfachte Einstellungen fĂŒr die Anzahl der Kandidaten und den Radius der Suche verwendet. Solche Vereinfachungen sind erforderlich, da es eine GrĂ¶ĂŸenordnung mehr Stifte als Ordnungen gibt und die Suche eine ziemlich schwierige Operation ist. Der entscheidende Moment fĂŒr unsere Geschichte: Wenn es bei der vorlĂ€ufigen Suche auf der Stecknadel keine geeigneten Kandidaten gab, erlauben wir keine Bestellung. Zumindest war es frĂŒher so.

Folgendes hat der Benutzer in der Anwendung gesehen:



Suche nach Autos ohne Autos


Sobald wir eine Hypothese hatten: Vielleicht kann die Bestellung in einigen FÀllen noch abgeschlossen werden, selbst wenn keine Autos auf dem Stift waren. In der Tat vergeht einige Zeit zwischen der PIN und der Bestellung, und die Suche in der Bestellung ist vollstÀndiger und wird manchmal mehrmals wiederholt: WÀhrend dieser Zeit werden möglicherweise freie Treiber angezeigt. Wir wussten auch das Gegenteil: Wenn Fahrer an einer Stecknadel gefunden wurden, ist es keine Tatsache, dass sie bei der Bestellung gefunden werden. Manchmal verschwinden sie oder alle lehnen die Bestellung ab.

Um diese Hypothese zu testen, haben wir ein Experiment gestartet: Wir haben aufgehört, wĂ€hrend einer PIN-Suche nach einer Testgruppe von Benutzern auf das Vorhandensein von Maschinen zu prĂŒfen, dh sie hatten die Möglichkeit, eine „Bestellung ohne Maschinen“ aufzugeben. Das Ergebnis war ziemlich unerwartet: Wenn das Auto nicht auf dem Stift stand, war es in 29% der FĂ€lle spĂ€ter - bei der Suche nach einer Bestellung! DarĂŒber hinaus unterschieden sich Bestellungen ohne Autos in Bezug auf Stornierungsraten, Bewertungen und andere QualitĂ€tsindikatoren nicht wesentlich von den ĂŒblichen. Die Anzahl der Bestellungen ohne Auto betrug 5% aller Bestellungen, aber etwas mehr als 1% aller erfolgreichen Reisen.

Um zu verstehen, woher die AusfĂŒhrenden dieser Befehle kommen, schauen wir uns ihren Status wĂ€hrend der Suche auf der PIN an:



  • Kostenlos: war verfĂŒgbar, kam aber aus irgendeinem Grund nicht in die Kandidaten, war zum Beispiel zu weit weg;
  • Auf Bestellung: Er war beschĂ€ftigt, konnte sich aber befreien oder fĂŒr Bestellungen entlang der Kette verfĂŒgbar werden.
  • Besetzt: Die Möglichkeit, Bestellungen entgegenzunehmen, war deaktiviert, aber der Fahrer kehrte zur Leitung zurĂŒck.
  • Nicht verfĂŒgbar: Der Fahrer war nicht online, aber er erschien.

FĂŒgen Sie ZuverlĂ€ssigkeit hinzu


ZusĂ€tzliche Bestellungen sind großartig, aber 29% der erfolgreichen Suchanfragen bedeuten, dass der Benutzer in 71% der FĂ€lle lange gewartet hat und daher nirgendwo abgereist ist. Unter dem Gesichtspunkt der Systemeffizienz ist dies zwar nicht schrecklich, aber tatsĂ€chlich erhĂ€lt der Benutzer falsche Hoffnung und verbringt Zeit, woraufhin er verĂ€rgert ist und (möglicherweise) die Nutzung des Dienstes einstellt. Um dieses Problem zu lösen, haben wir gelernt, die Wahrscheinlichkeit vorherzusagen, mit der eine Maschine in der Bestellung gefunden wird.

Das Schema ist wie folgt:

  • Der Benutzer steckt eine Stecknadel.
  • Suche auf dem Pin.
  • Wenn es keine Autos gibt, sagen wir voraus: Vielleicht erscheinen sie.
  • Und je nach Wahrscheinlichkeit geben wir einen Befehl oder geben ihn nicht, aber wir warnen, dass die Dichte der Autos in diesem Bereich derzeit gering ist.

In der Anwendung sah es so aus:



Mit dem Modell können Sie sorgfĂ€ltig neue AuftrĂ€ge erstellen und eine Person nicht umsonst beruhigen. Das heißt, das VerhĂ€ltnis von ZuverlĂ€ssigkeit und Anzahl der Bestellungen ohne Maschinen mithilfe des PrĂ€zisionsrĂŒckrufmodells anzupassen. Die ZuverlĂ€ssigkeit des Dienstes beeinflusst den Wunsch, das Produkt weiterhin zu verwenden, d. H. Letztendlich kommt es auf die Anzahl der Fahrten an.

Ein bisschen ĂŒber PrĂ€zisionsrĂŒckruf
Eine der grundlegenden Aufgaben beim maschinellen Lernen ist das Klassifizierungsproblem: Ordnen Sie ein Objekt einer von zwei Klassen zu. In diesem Fall wird das Ergebnis der Operation des Algorithmus fĂŒr maschinelles Lernen hĂ€ufig zu einer numerischen SchĂ€tzung der Zugehörigkeit zu einer der Klassen, beispielsweise einer WahrscheinlichkeitsschĂ€tzung. Die ausgefĂŒhrten Aktionen sind jedoch normalerweise binĂ€r: Wenn wir ein Auto haben, geben wir es auf Bestellung, und wenn nicht, dann nein. Der Bestimmtheit halber nennen wir das Modell einen Algorithmus, der eine numerische SchĂ€tzung erzeugt, und den Klassifikator - eine Regel, die sich auf eine von zwei Klassen bezieht (1 oder –1). Um einen Klassifikator basierend auf der Bewertung des Modells zu erstellen, mĂŒssen Sie einen Bewertungsschwellenwert auswĂ€hlen. Wie genau - hĂ€ngt stark von der Aufgabe ab.

Angenommen, wir fĂŒhren einen Test (Klassifikator) fĂŒr eine seltene und gefĂ€hrliche Krankheit durch. Basierend auf den Testergebnissen schicken wir den Patienten entweder zu einer detaillierteren Untersuchung oder sagen: „Gesund, geh nach Hause.“ FĂŒr uns ist es viel schlimmer, eine kranke Person nach Hause zu schicken, als eine gesunde Person vergeblich zu untersuchen. Das heißt, wir möchten, dass der Test fĂŒr so viele wirklich kranke Menschen wie möglich funktioniert. Dieser Wert wird als RĂŒckruf = bezeichnet  fracnumber defined classifier patientnumber all patient. Der ideale KlassifikatorrĂŒckruf ist 100%. Eine entartete Situation besteht darin, alle zur Untersuchung zu schicken, dann betrĂ€gt der RĂŒckruf ebenfalls 100%.

Es passiert und umgekehrt. Zum Beispiel stellen wir ein Testsystem fĂŒr SchĂŒler her, das ĂŒber einen Betrugsdetektor verfĂŒgt. Wenn eine ÜberprĂŒfung in einigen FĂ€llen von Betrug plötzlich nicht mehr funktioniert, ist dies unangenehm, aber nicht kritisch. Andererseits ist es Ă€ußerst schlimm, die SchĂŒler zu Unrecht fĂŒr das zu beschuldigen, was sie nicht getan haben. Das heißt, es ist fĂŒr uns wichtig, dass es unter den positiven Antworten des Klassifikators so viele richtige wie möglich gibt, möglicherweise zum Nachteil ihrer Anzahl. Sie mĂŒssen also die PrĂ€zision maximieren =  fracAnzahl true positivesAnzahl all positives. Wenn Operationen an allen Objekten beginnen, entspricht die Genauigkeit der HĂ€ufigkeit der bestimmten Klasse in der Stichprobe.

Wenn der Algorithmus einen numerischen Wahrscheinlichkeitswert angibt, können Sie durch Auswahl unterschiedlicher Schwellenwerte unterschiedliche Werte fĂŒr den PrĂ€zisionsrĂŒckruf erzielen.

In unserer Aufgabe ist die Situation wie folgt. RĂŒckruf ist die Anzahl der Bestellungen, die wir anbieten können. PrĂ€zision ist die ZuverlĂ€ssigkeit dieser Bestellungen. Hier ist die PrĂ€zisionsrĂŒckrufkurve unseres Modells:

Es gibt zwei extreme FĂ€lle: Lassen Sie niemanden bestellen und lassen Sie jeden bestellen. Wenn Sie niemandem erlauben, ist der RĂŒckruf 0: Wir erstellen keine AuftrĂ€ge, aber keiner von ihnen schlĂ€gt fehl. Wenn Sie alle zulassen, betrĂ€gt der RĂŒckruf 100% (wir erhalten alle möglichen Bestellungen) und die Genauigkeit 29%, d. H. 71% der Bestellungen werden sich als schlecht herausstellen.


Als Zeichen haben wir verschiedene Parameter des Ausgangspunkts verwendet:

  • Zeit / Ort.
  • Systemstatus (Anzahl der belegten Autos aller Tarife und Pins in der NĂ€he).
  • Suchparameter (Radius, Anzahl der Kandidaten, EinschrĂ€nkungen).

Details zu den Symptomen


Konzeptionell wollen wir zwischen zwei Situationen unterscheiden:

  • "Toter Wald" - derzeit gibt es hier keine Autos.
  • "Pech" - es gibt Autos, aber es gab keine geeigneten bei der Suche.

Ein Beispiel fĂŒr „Pech“ ist, wenn am Freitagabend im Zentrum eine hohe Nachfrage besteht. Es gibt viele AuftrĂ€ge, es gibt viele, die viel wollen, es gibt ĂŒberhaupt nicht genug Fahrer. Dies kann folgendermaßen geschehen: Der Pin enthĂ€lt keine geeigneten Treiber. Aber buchstĂ€blich in Sekunden erscheinen sie, denn zu diesem Zeitpunkt gibt es an diesem Ort viele Fahrer und ihr Status Ă€ndert sich stĂ€ndig.

Daher erwiesen sich verschiedene Merkmale des Systems in der NĂ€he von Punkt A als gute Merkmale:

  • Die Gesamtzahl der Autos.
  • Die Anzahl der bestellten Autos.
  • Die Anzahl der Maschinen, die im Status "Besetzt" nicht fĂŒr Bestellungen verfĂŒgbar sind.
  • Die Anzahl der Benutzer.

Denn je mehr Autos in der NĂ€he sind, desto wahrscheinlicher ist es, dass eines von ihnen verfĂŒgbar wird.
TatsĂ€chlich ist es fĂŒr uns wichtig, nicht nur Autos zu haben, sondern auch erfolgreiche Reisen zu unternehmen. Daher war es möglich, die Wahrscheinlichkeit einer erfolgreichen Reise vorherzusagen. Wir haben uns jedoch dagegen entschieden, da dieser Wert stark vom Benutzer und Treiber abhĂ€ngt.

CatBoost wurde als Modelllernalgorithmus verwendet. FĂŒr das Training verwendeten wir Daten aus dem Experiment. Nach der Implementierung war es notwendig, Trainingsdaten zu sammeln, damit manchmal eine kleine Anzahl von Benutzern eine Bestellung aufgeben konnte, die der Entscheidung des Modells widersprach.

Zusammenfassung


Die Ergebnisse des Experiments erwiesen sich als zu erwarten: Die Verwendung des Modells ermöglicht es, die Anzahl erfolgreicher Fahrten aufgrund von Bestellungen ohne Autos erheblich zu erhöhen und gleichzeitig die ZuverlÀssigkeit nicht zu beeintrÀchtigen.

Derzeit wird der Mechanismus in allen StĂ€dten und LĂ€ndern eingefĂŒhrt, und damit finden etwa 1% der erfolgreichen Reisen statt. DarĂŒber hinaus erreicht in einigen StĂ€dten mit einer geringen Autodichte der Anteil solcher Fahrten 15%.

Andere Taxi-Technologie-BeitrÀge


Source: https://habr.com/ru/post/de450376/


All Articles