Kuidas Yandex.Taxi otsib autosid, kui neid pole

Kuidas Yandex.Taxi otsib autosid, kui neid pole

Hea taksoteenus peaks olema turvaline, usaldusväärne ja kiire. Kasutaja ei lasku detailidesse: tema jaoks on oluline, et ta klõpsaks nuppu "Telli" ja saaks võimalikult kiiresti auto, mis viib ta punktist A punkti B. Kui läheduses pole ühtegi autot, peaks teenus teavitage sellest koheselt, et kliendil ei oleks olnud valesid ootusi. Aga kui silt “Autodele keelatud” ilmub liiga sageli, siis on loogiline, et inimene lihtsalt lõpetab selle teenuse kasutamise ja läheb konkurendi juurde.

Selles artiklis tahan rääkida sellest, kuidas masinõppe abil lahendasime autode otsimise probleemi madala tihedusega piirkondades (teisisõnu, kus esmapilgul autosid pole). Ja mis sellest välja tuli.

eelajalugu

Takso helistamiseks teeb kasutaja mõned lihtsad sammud, kuid mis juhtub teenuse sees?

Kasutaja Etapp Taustaprogramm Yandex.Taxi
Valib lähtepunkti Pin Käivitame kandidaatide lihtsustatud otsingu – nööpnõelaotsingu. Leitud juhtide põhjal ennustatakse saabumisaega – ETA pin. Arvutatakse suurenev koefitsient antud punktis.
Valib sihtkoha, piletihinna, nõuded Pakkumine Ehitame marsruudi ja arvutame hinnad kõikidele tariifidele, võttes arvesse kasvavat koefitsienti.
Vajutab nuppu "Kutsu takso". Tellimine Käivitame auto täieliku otsingu. Valime välja sobivaima juhi ja pakume talle tellimust.

edasi ETA tihvtis, hinna arvutamine и sobivaima draiveri valimine me juba kirjutasime. Ja see on lugu juhtide leidmisest. Tellimuse koostamisel toimub otsing kaks korda: PIN-koodil ja tellimusel. Tellimuse otsimine toimub kahes etapis: kandidaatide värbamine ja järjestamine. Esiteks leitakse saadaolevad juhikandidaadid, kes on teegraafikule kõige lähemal. Seejärel rakendatakse boonuseid ja filtreerimist. Ülejäänud kandidaadid järjestatakse ja võitja saab tellimispakkumise. Kui ta on nõus, määratakse ta tellimusele ja läheb väljastuspunkti. Kui ta keeldub, tuleb pakkumine järgmisele. Kui kandidaate enam pole, algab otsing uuesti. See ei kesta rohkem kui kolm minutit, pärast mida tellimus tühistatakse ja põletatakse.

PIN-koodi otsimine sarnaneb tellimuse järgi otsimisega, ainult tellimust ei koostata ja otsing ise sooritatakse ainult üks kord. Kasutatakse ka kandidaatide arvu ja otsinguraadiuse lihtsustatud sätteid. Sellised lihtsustused on vajalikud, sest tihvte on suurusjärgu võrra rohkem kui käske ja otsimine on üsna keeruline toiming. Meie loo võtmepunkt: kui eelotsingu käigus ei leitud Pin-le sobivaid kandidaate, siis tellimust me teha ei luba. Vähemalt vanasti oli nii.

Seda nägi kasutaja rakenduses:

Kuidas Yandex.Taxi otsib autosid, kui neid pole

Otsige autosid ilma autodeta

Ühel päeval tekkis meil hüpotees: võib-olla mõnel juhul saab tellimus siiski täidetud, isegi kui autosid tihvti peal ei olnud. Lõppude lõpuks möödub nööpnõela ja tellimuse vahel mõni aeg ning tellimuse otsimine on täielikum ja mõnikord korratakse mitu korda: selle aja jooksul võivad ilmuda saadaolevad draiverid. Teadsime ka vastupidist: kui nööpnõelalt leiti juhte, ei olnud see fakt, et neid tellides leiti. Mõnikord nad kaovad või kõik keelduvad tellimusest.

Selle hüpoteesi testimiseks käivitasime katse: lõpetasime kasutajate testrühma jaoks PIN-i otsingu ajal autode olemasolu kontrollimise, st neil oli võimalus teha tellimus ilma autodeta. Tulemus oli üsna ootamatu: kui auto ei olnud tihvti peal, siis 29% juhtudest leiti see hiljem - tellimuse pealt otsides! Pealegi ei erinenud ilma autodeta tellimused oluliselt tavatellimustest tühistamismäärade, reitingute ja muude kvaliteedinäitajate poolest. Ilma autota broneeringud moodustasid 5% kõigist broneeringutest, kuid veidi üle 1% kõigist õnnestunud reisidest.

Et mõista, kust nende korralduste täitjad pärit on, vaatame nende olekuid PIN-koodi otsimise ajal:

Kuidas Yandex.Taxi otsib autosid, kui neid pole

  • Saadaval: oli küll saadaval, kuid jäi millegipärast kandidaatide hulka arvamata, näiteks oli ta liiga kaugel;
  • Tellimusel: oli hõivatud, kuid suutis end vabastada või saada kättesaadavaks aheljärjekord;
  • Hõivatud: tellimuste vastuvõtmise võimalus keelati, kuid siis naasis juht liinile;
  • Pole saadaval: juht ei olnud võrgus, kuid ta ilmus.

Lisame usaldusväärsuse

Täiendavad tellimused on suurepärased, kuid 29% edukatest otsingutest tähendab, et 71% juhtudest ootas kasutaja kaua ja ei jõudnud kuhugi. Kuigi see pole süsteemi tõhususe seisukohast halb, annab see kasutajale tegelikult võltsi lootust ja raiskab aega, misjärel ta ärritub ja (võib-olla) lõpetab teenuse kasutamise. Selle probleemi lahendamiseks õppisime ennustama tellitud auto leidmise tõenäosust.

Skeem on järgmine:

  • Kasutaja paneb tihvti.
  • Nõelale tehakse otsing.
  • Kui autosid pole, ennustame: ehk ilmuvad.
  • Ja olenevalt tõenäosusest lubame või ei luba tellimust esitada, kuid hoiatame, et autode tihedus selles piirkonnas on hetkel madal.

Rakenduses nägi see välja selline:

Kuidas Yandex.Taxi otsib autosid, kui neid pole

Mudeli kasutamine võimaldab täpsemalt luua uusi tellimusi ja mitte asjata inimesi rahustada. See tähendab, et reguleerida töökindluse ja tellimuste arvu suhet ilma masinateta, kasutades täppis-kutsumismudelit. Teenuse usaldusväärsus mõjutab soovi toote kasutamist jätkata, st lõpuks taandub kõik reiside arvule.

Natuke täpsusest-meenutamisestÜks masinõppe põhiülesandeid on klassifitseerimisülesanne: objekti määramine ühte kahest klassist. Sel juhul muutub masinõppe algoritmi tulemuseks sageli numbriline hinnang mõnda klassi kuuluvuse kohta, näiteks tõenäosushinnang. Kuid toimingud, mida tehakse, on tavaliselt binaarsed: kui auto on saadaval, siis laseme selle tellida, ja kui mitte, siis mitte. Täpsemalt nimetagem numbrilist hinnangut andvat algoritmi mudeliks ja klassifikaatorit reegliks, mis määrab selle ühte kahest klassist (1 või –1). Mudelihinnangu põhjal klassifikaatori koostamiseks tuleb valida hindamislävi. Kuidas täpselt, sõltub suuresti ülesandest.

Oletame, et teeme mõne haruldase ja ohtliku haiguse testi (klassifikaatori). Testitulemuste põhjal saadame patsiendi kas täpsemale uuringule või ütleme: "Tore, minge koju." Meie jaoks on haige kojusaatmine palju hullem kui terve inimese asjatu läbivaatamine. See tähendab, et me tahame, et test töötaks võimalikult paljude tõeliselt haigete inimeste puhul. Seda väärtust nimetatakse tagasikutsumiseks =Kuidas Yandex.Taxi otsib autosid, kui neid pole. Ideaalsel klassifikaatoril on 100% tagasikutsumine. Mandunud olukord on saata kõik ekspertiisi, siis on ka tagasikutsumine 100%.

Juhtub ka vastupidi. Näiteks teeme õpilastele testimissüsteemi ja sellel on pettusedetektor. Kui mõne petmise korral kontroll äkki ei tööta, on see ebameeldiv, kuid mitte kriitiline. Teisest küljest on äärmiselt halb süüdistada õpilasi ebaõiglaselt milleski, mida nad ei teinud. See tähendab, et meie jaoks on oluline, et klassifikaatori positiivsete vastuste hulgas oleks võimalikult palju õigeid, võib-olla nende arvu arvelt. See tähendab, et peate maksimeerima täpsust = Kuidas Yandex.Taxi otsib autosid, kui neid pole. Kui käivitamine toimub kõikidel objektidel, on täpsus võrdne valimi määratletud klassi sagedusega.

Kui algoritm toodab arvulise tõenäosuse väärtuse, siis erinevate lävede valimisel on võimalik saavutada erinevaid täpsus-meelekutsumise väärtusi.

Meie probleemi puhul on olukord järgmine. Tagasivõtmine on tellimuste arv, mida saame pakkuda, täpsus on nende tellimuste usaldusväärsus. Selline näeb välja meie mudeli täppis-meenutuskõver:
Kuidas Yandex.Taxi otsib autosid, kui neid pole
On kaks äärmuslikku juhtumit: ära lase kellelgi tellida ja luba kõigil tellida. Kui te kedagi ei luba, on tagasikutsumine 0: me ei loo tellimusi, kuid ükski neist ei ebaõnnestu. Kui lubame kõiki, siis on tagasikutsumine 100% (saame kõik võimalikud tellimused) ja täpsus on 29%, st 71% tellimustest on halvad.

Märkidena kasutasime erinevaid lähtepunkti parameetreid:

  • Aeg/koht.
  • Süsteemi olek (kõikide tariifide ja kontaktide hõivatud masinate arv läheduses).
  • Otsinguparameetrid (raadius, kandidaatide arv, piirangud).

Märkidest lähemalt

Kontseptuaalselt tahame eristada kahte olukorda:

  • "Sügav mets" - siin pole praegu ühtegi autot.
  • “Ebaõnn” - autosid on, aga otsides sobivaid polnud.

Üks näide “Ebaõnnest” on see, kui reede õhtul on keskuses suur nõudlus. Tellimusi on palju, soovijaid palju ja juhte kõigile ei jätku. See võib selguda järgmiselt: tihvtis pole sobivaid draivereid. Kuid need ilmuvad sõna otseses mõttes mõne sekundi jooksul, sest sel ajal on selles kohas palju juhte ja nende staatus muutub pidevalt.

Seetõttu osutusid headeks omadusteks erinevad süsteeminäitajad punkti A läheduses:

  • Autode koguarv.
  • Tellitud autode arv.
  • Autode arv, mis ei ole tellimiseks saadaval olekus "Hõivatud".
  • Kasutajate arv.

Lõppude lõpuks, mida rohkem autosid on, seda tõenäolisem on, et üks neist saadavale tuleb.
Tegelikult on meie jaoks oluline, et mitte ainult autod ei paikneks, vaid tehtaks ka edukaid reise. Seetõttu oli võimalik ennustada õnnestunud reisi tõenäosust. Kuid otsustasime seda mitte teha, sest see väärtus sõltub suuresti kasutajast ja draiverist.

Mudelitreeningu algoritm oli CatBoost. Eksperimendist saadud andmeid kasutati treenimiseks. Pärast juurutamist tuli koguda koolitusandmeid, võimaldades mõnikord väikesel arvul kasutajatel tellida mudeli otsuse vastu.

Tulemused

Eksperimendi tulemused olid ootuspärased: mudeli kasutamine võimaldab oluliselt suurendada edukate sõitude arvu tänu tellimustele ilma autodeta, kuid töökindlust kahjustamata.

Hetkel on mehhanism käivitatud kõikides linnades ja riikides ning selle abiga toimub umbes 1% edukatest reisidest. Veelgi enam, mõnes väikese autotihedusega linnas ulatub selliste reiside osakaal 15% -ni.

Muud postitused Taksotehnoloogiast

Allikas: www.habr.com

Lisa kommentaar