Kaip „Yandex.Taxi“ ieško automobilių, kai jų nėra

Kaip „Yandex.Taxi“ ieško automobilių, kai jų nėra

Gera taksi paslauga turi būti saugi, patikima ir greita. Vartotojas nesileis į smulkmenas: jam svarbu, kad jis paspaudęs mygtuką „Užsakyti“ kuo greičiau gautų automobilį, kuris nuvežtų iš taško A į tašką B. Jei šalia nėra automobilių, servisas turėtų nedelsdami apie tai informuokite, kad klientas neturėtų klaidingų lūkesčių. Bet jei ženklas „Automobiliams draudžiama“ pasirodo per dažnai, logiška, kad žmogus tiesiog nustos naudotis šia paslauga ir eis pas konkurentą.

Šiame straipsnyje noriu pakalbėti apie tai, kaip naudodamiesi mašininiu mokymusi išsprendėme automobilių paieškos mažo tankumo zonose (kitaip tariant, kur, iš pirmo žvilgsnio, nėra automobilių) problemą. Ir kas iš to išėjo.

priešistorė

Norėdamas išsikviesti taksi, vartotojas atlieka kelis paprastus veiksmus, bet kas nutinka paslaugos viduje?

Vartotojas Etapas Backend Yandex.Taxi
Pasirenka pradžios tašką Užmušti Pradedame supaprastintą kandidatų paiešką – smeigtukų paiešką. Pagal rastus vairuotojus numatomas atvykimo laikas – ETA kaištyje. Apskaičiuojamas didėjantis koeficientas tam tikrame taške.
Parenka kelionės tikslą, bilieto kainą, reikalavimus Pasiūlyti Nutiesiame maršrutą ir skaičiuojame kainas visiems tarifams, atsižvelgdami į didėjantį koeficientą.
Paspaudžia mygtuką „Išskviesti taksi“. Užsakymas Pradedame pilną automobilio paiešką. Parenkame tinkamiausią vairuotoją ir pasiūlome jam užsakymą.

apie ETA kaištyje, kainos apskaičiavimas и pasirinkti tinkamiausią vairuotoją jau rašėme. Ir tai yra istorija apie vairuotojų paiešką. Sukūrus užsakymą, paieška atliekama du kartus: ant PIN ir užsakymo. Užsakymo paieška vyksta dviem etapais: kandidatų įdarbinimas ir reitingavimas. Pirmiausia randami galimi kandidatai į vairuotojus, kurie yra arčiausiai kelio diagramos. Tada taikomos premijos ir filtravimas. Likę kandidatai reitinguojami, o laimėtojas gauna užsakymo pasiūlymą. Jei jis sutinka, jis yra paskiriamas užsakymui ir vyksta į pristatymo punktą. Jei jis atsisako, tada pasiūlymas ateina kitam. Jei daugiau kandidatų nėra, paieška pradedama iš naujo. Tai trunka ne ilgiau kaip tris minutes, po to užsakymas atšaukiamas ir sudeginamas.

Paieška ant PIN yra panaši į paiešką pagal užsakymą, tik užsakymas nesudaromas, o pati paieška atliekama tik vieną kartą. Taip pat naudojami supaprastinti kandidatų skaičiaus ir paieškos spindulio nustatymai. Tokie supaprastinimai yra būtini, nes kaiščių yra daugiau nei užsakymų, o paieška yra gana sudėtinga operacija. Esminis mūsų pasakojimo momentas: jei preliminarios paieškos metu ant Smeigtuko nerasta tinkamų kandidatų, mes neleidžiame pateikti užsakymo. Bent jau taip buvo.

Štai ką vartotojas pamatė programoje:

Kaip „Yandex.Taxi“ ieško automobilių, kai jų nėra

Ieškoti automobilių be automobilių

Vieną dieną iškėlėme hipotezę: galbūt kai kuriais atvejais užsakymą vis tiek galima įvykdyti, net jei ant smeigtuko nebūtų automobilių. Juk nuo smeigtuko iki užsakymo praeina šiek tiek laiko, o užsakymo paieška būna pilnesnė ir kartais kartojama kelis kartus: per šį laiką gali atsirasti laisvų tvarkyklių. Žinojome ir priešingai: jei ant smeigtuko buvo rasta vairuotojų, tai nebuvo faktas, kad užsakant jie bus rasti. Kartais jie dingsta arba visi atsisako užsakymo.

Norėdami patikrinti šią hipotezę, pradėjome eksperimentą: bandomajai vartotojų grupei, ieškodami PIN kodo, nustojome tikrinti, ar yra automobilių, t. y. jie turėjo galimybę atlikti „užsakymą be automobilių“. Rezultatas buvo gana netikėtas: jei automobilis nebuvo ant kaiščio, tai 29% atvejų jis buvo rastas vėliau - ieškant pagal užsakymą! Be to, užsakymai be automobilių ženkliai nesiskyrė nuo įprastų užsakymų atšaukimo rodikliais, įvertinimais ir kitais kokybės rodikliais. Užsakymai be automobilių sudarė 5% visų užsakymų, tačiau tik šiek tiek daugiau nei 1% visų sėkmingų kelionių.

Norėdami suprasti, iš kur kilę šių įsakymų vykdytojai, pažvelkime į jų būsenas, kai ieškosite PIN kodo:

Kaip „Yandex.Taxi“ ieško automobilių, kai jų nėra

  • Galima: buvo prieinamas, bet dėl ​​kokių nors priežasčių nebuvo įtrauktas į kandidatus, pavyzdžiui, buvo per toli;
  • Pagal užsakymą: buvo užimtas, bet sugebėjo išsilaisvinti arba tapti prieinamu grandinės tvarka;
  • Užsiėmes: galimybė priimti užsakymus buvo išjungta, bet tada vairuotojas grįžo į eilę;
  • Nepasiekiamas: vairuotojas nebuvo prisijungęs, bet pasirodė.

Pridėkime patikimumą

Papildomi užsakymai yra puikūs, tačiau 29 % sėkmingų paieškų reiškia, kad 71 % atvejų vartotojas ilgai laukė ir galiausiai niekur nenuėjo. Nors sistemos efektyvumo požiūriu tai nėra blogai, iš tikrųjų tai suteikia vartotojui klaidingą viltį ir sugaišta laiką, po kurio jis susierzina ir (galbūt) nustoja naudotis paslauga. Norėdami išspręsti šią problemą, išmokome numatyti tikimybę, kad bus rastas užsakytas automobilis.

Schema yra tokia:

  • Vartotojas įdeda smeigtuką.
  • Smeigtuko krata atliekama.
  • Jei automobilių nebus, prognozuojame: gal ir atsiras.
  • Ir priklausomai nuo tikimybės, leidžiame arba neleidžiame pateikti užsakymą, tačiau įspėjame, kad automobilių tankumas šioje srityje šiuo metu yra mažas.

Programoje tai atrodė taip:

Kaip „Yandex.Taxi“ ieško automobilių, kai jų nėra

Modelio naudojimas leidžia tiksliau kurti naujus užsakymus ir veltui nenuraminti žmonių. Tai yra, reguliuoti patikimumo santykį ir užsakymų skaičių be mašinų naudojant tikslaus atšaukimo modelį. Paslaugos patikimumas įtakoja norą ir toliau naudotis gaminiu, t.y. galiausiai viskas priklauso nuo kelionių skaičiaus.

Šiek tiek apie tikslumą - atsiminimąViena iš pagrindinių mašininio mokymosi užduočių yra klasifikavimo užduotis: objekto priskyrimas vienai iš dviejų klasių. Šiuo atveju mašininio mokymosi algoritmo rezultatas dažnai tampa skaitiniu narystės vienoje iš klasių įvertinimu, pavyzdžiui, tikimybių įvertinimu. Tačiau dažniausiai atliekami veiksmai yra dvejetainiai: jei automobilis yra, tai leisime užsisakyti, o jei ne, tai ne. Norėdami būti konkretesni, pavadinkime algoritmą, kuris sukuria skaitinį įvertinimą, modeliu, o klasifikatorių – taisykle, kuri priskiria jį vienai iš dviejų klasių (1 arba –1). Norėdami sudaryti klasifikatorių pagal modelio įvertinimą, turite pasirinkti vertinimo slenkstį. Kaip tiksliai, labai priklauso nuo užduoties.

Tarkime, atliekame testą (klasifikatorių) dėl kokios nors retos ir pavojingos ligos. Remdamiesi tyrimo rezultatais, pacientą arba siunčiame detalesniam tyrimui, arba sakome: „Gerai, eik namo“. Mums išsiųsti sergantį žmogų namo yra daug blogiau nei be reikalo apžiūrėti sveiką žmogų. Tai yra, norime, kad testas veiktų kuo daugiau tikrai sergančių žmonių. Ši reikšmė vadinama prisiminti =Kaip „Yandex.Taxi“ ieško automobilių, kai jų nėra. Idealus klasifikatorius turi 100% atšaukimą. Išsigimusi situacija yra siųsti visus tyrimui, tada atšaukimas taip pat bus 100%.

Būna ir atvirkščiai. Pavyzdžiui, studentams kuriame testavimo sistemą, kurioje yra sukčiavimo detektorius. Jei staiga patikrinimas neveikia kai kuriais sukčiavimo atvejais, tai yra nemalonu, bet ne kritiška. Kita vertus, labai blogai nesąžiningai apkaltinti studentus tuo, ko jie nepadarė. Tai yra, mums svarbu, kad tarp teigiamų klasifikatoriaus atsakymų būtų kuo daugiau teisingų, galbūt jų skaičiaus nenaudai. Tai reiškia, kad reikia maksimaliai padidinti tikslumą = Kaip „Yandex.Taxi“ ieško automobilių, kai jų nėra. Jei paleidimas įvyksta visuose objektuose, tikslumas bus lygus apibrėžtos klasės dažniui pavyzdyje.

Jei algoritmas sukuria skaitinę tikimybės reikšmę, tada pasirinkę skirtingus slenksčius galite pasiekti skirtingas tikslumo atkūrimo vertes.

Mūsų problema yra tokia. Atsiminimas – tai užsakymų, kuriuos galime pasiūlyti, skaičius, tikslumas – šių užsakymų patikimumas. Štai kaip atrodo mūsų modelio tikslumo atsiminimo kreivė:
Kaip „Yandex.Taxi“ ieško automobilių, kai jų nėra
Yra du kraštutiniai atvejai: neleisti niekam užsisakyti ir leisti visiems užsisakyti. Jei niekam neleisite, tada atšaukimas bus 0: mes nekuriame užsakymų, bet nė vienas iš jų nepavyks. Jei leisime visiems, tai atšaukimas bus 100% (gausime visus įmanomus užsakymus), o tikslumas bus 29%, t.y. 71% užsakymų bus blogi.

Kaip ženklus naudojome įvairius pradinio taško parametrus:

  • Laikas/vieta.
  • Sistemos būsena (visų tarifų ir kaiščių netoliese esančių mašinų skaičius).
  • Paieškos parametrai (spindulys, kandidatų skaičius, apribojimai).

Daugiau apie ženklus

Konceptualiai norime atskirti dvi situacijas:

  • „Gilus miškas“ - šiuo metu čia nėra automobilių.
  • „Nepasisekė“ - automobilių yra, bet ieškant tinkamų nebuvo.

Vienas iš „Nelaimingųjų“ pavyzdžių – penktadienio vakarą centre didelė paklausa. Užsakymų daug, norinčių daug, o vairuotojų visiems neužtenka. Gali pasirodyti taip: kaištyje nėra tinkamų tvarkyklių. Tačiau tiesiogine prasme jie atsiranda per kelias sekundes, nes šiuo metu šioje vietoje yra daug vairuotojų ir jų statusas nuolat keičiasi.

Todėl įvairūs sistemos indikatoriai, esantys šalia taško A, pasirodė esantys geromis savybėmis:

  • Bendras automobilių skaičius.
  • Užsakytų automobilių skaičius.
  • Automobilių, kurių negalima užsakyti būsenoje „Užimta“, skaičius.
  • Vartotojų skaičius.

Juk kuo daugiau automobilių bus aplinkui, tuo didesnė tikimybė, kad vienas iš jų atsiras.
Iš tiesų mums svarbu, kad ne tik būtų išdėstyti automobiliai, bet ir vyktų sėkmingos kelionės. Todėl buvo galima numatyti sėkmingos kelionės tikimybę. Tačiau nusprendėme to nedaryti, nes ši vertė labai priklauso nuo vartotojo ir vairuotojo.

Modelio mokymo algoritmas buvo „CatBoost“. Eksperimento metu gauti duomenys buvo panaudoti mokymui. Po įdiegimo reikėjo rinkti mokymo duomenis, kartais leidžiant nedideliam skaičiui vartotojų užsisakyti prieš modelio sprendimą.

rezultatai

Eksperimento rezultatai buvo tokie, kokių ir tikėtasi: modelio naudojimas leidžia žymiai padidinti sėkmingų kelionių skaičių dėl užsakymų be automobilių, tačiau nepakenkiant patikimumui.

Šiuo metu mechanizmas pradėtas naudoti visuose miestuose ir šalyse ir su jo pagalba įvyksta apie 1% sėkmingų kelionių. Be to, kai kuriuose miestuose, kuriuose automobilių tankumas mažas, tokių kelionių dalis siekia 15%.

Kiti įrašai apie taksi technologijas

Šaltinis: www.habr.com

Добавить комментарий