Kiel Yandex.Taxi serĉas aŭtojn kiam ne ekzistas

Kiel Yandex.Taxi serĉas aŭtojn kiam ne ekzistas

Bona taksioservo devus esti sekura, fidinda kaj rapida. La uzanto ne eniros detalojn: gravas por li, ke li alklaku la butonon "Mendi" kaj ricevu kiel eble plej rapide aŭton, kiu kondukos lin de punkto A al punkto B. Se ne estas aŭtoj proksime, la servo devus. tuj informu pri tio, por ke la kliento ne havu, ke ekzistis falsaj atendoj. Sed se la signo "Neniu aŭtoj" aperas tro ofte, tiam estas logike, ke persono simple ĉesos uzi ĉi tiun servon kaj iros al konkuranto.

En ĉi tiu artikolo mi volas paroli pri kiel, uzante maŝinlernadon, ni solvis la problemon serĉi aŭtojn en areoj de malalta denseco (alivorte, kie, unuavide, ne estas aŭtoj). Kaj kio venis el ĝi.

antaŭhistorio

Por voki taksion, la uzanto faras kelkajn simplajn paŝojn, sed kio okazas ene de la servo?

Uzanto Scenejo Backend Yandex.Taxi
Elektas la deirpunkton Pinglo Ni lanĉas simpligitan serĉon por kandidatoj - pin serĉo. Surbaze de la ŝoforoj trovitaj, la alventempo estas antaŭvidita - ETA en la pinglo. La kreskanta koeficiento je donita punkto estas kalkulita.
Elektas celon, tarifon, postulojn Oferto Ni konstruas itineron kaj kalkulas prezojn por ĉiuj tarifoj, konsiderante la kreskantan koeficienton.
Premu la butonon "Voki Taksion". Ordo Ni lanĉas plenan serĉon por la aŭto. Ni elektas la plej taŭgan ŝoforon kaj proponas al li mendon.

pri ETA en pinglo, kalkulo de prezo и elektante la plej taŭgan ŝoforon ni jam skribis. Kaj ĉi tio estas rakonto pri trovado de ŝoforoj. Kiam ordo estas kreita, la serĉo okazas dufoje: sur la Pinglo kaj sur la ordo. La serĉado de mendo okazas en du etapoj: varbado de kandidatoj kaj rangotabelo. Unue, disponeblaj kandidatoj ŝoforoj estas trovitaj, kiuj estas plej proksimaj laŭ la vojgrafeo. Tiam gratifikoj kaj filtrado estas aplikataj. La ceteraj kandidatoj estas vicigitaj kaj la gajninto ricevas mendan oferton. Se li konsentas, li estas asignita al la mendo kaj iras al la liverpunkto. Se li rifuzas, tiam la oferto venas al la sekva. Se ne estas plu kandidatoj, la serĉo komenciĝas denove. Ĉi tio daŭras ne pli ol tri minutojn, post kiuj la mendo estas nuligita kaj bruligita.

Serĉi sur Pinglo estas simila al serĉado sur ordo, nur la ordo ne estas kreita kaj la serĉo mem estas farita nur unufoje. Simpligitaj agordoj por la nombro da kandidatoj kaj serĉradiuso ankaŭ estas uzataj. Tiaj simpligoj estas necesaj ĉar ekzistas ordo de grandeco pli da pingloj ol ordoj, kaj serĉado estas sufiĉe malfacila operacio. La ŝlosila punkto por nia rakonto: se dum la prepara serĉo neniuj taŭgaj kandidatoj estis trovitaj sur la Pinglo, tiam ni ne permesas al vi fari mendon. Almenaŭ tiel antaŭe estis.

Jen kion la uzanto vidis en la aplikaĵo:

Kiel Yandex.Taxi serĉas aŭtojn kiam ne ekzistas

Serĉu aŭtojn sen aŭtoj

Iun tagon ni elpensis hipotezon: eble en kelkaj kazoj la mendo ankoraŭ povas esti plenumita, eĉ se ne estis aŭtoj sur la pinglo. Post ĉio, iom da tempo pasas inter la pinglo kaj la ordo, kaj la serĉado de la ordo estas pli kompleta kaj kelkfoje ripetiĝas plurfoje: dum ĉi tiu tempo, disponeblaj ŝoforoj povas aperi. Ni ankaŭ sciis la malon: se ŝoforoj troviĝus sur la pinglo, ne estis fakto, ke ili troviĝus dum mendado. Kelkfoje ili malaperas aŭ ĉiuj rifuzas la ordon.

Por testi ĉi tiun hipotezon, ni lanĉis eksperimenton: ni ĉesis kontroli la ĉeeston de aŭtoj dum serĉado sur Pinglo por testa grupo de uzantoj, t.e., ili havis la ŝancon fari "mendon sen aŭtoj". La rezulto estis sufiĉe neatendita: se la aŭto ne estis sur la pinglo, tiam en 29% de kazoj ĝi estis trovita poste - dum serĉado sur la mendo! Plie, mendoj sen aŭtoj ne estis signife diferencaj de regulaj mendoj koncerne nuligajn tarifojn, rangigojn kaj aliajn kvalitajn indikilojn. Rezervoj sen aŭtoj konsistigis 5% de ĉiuj rezervoj, sed iom pli ol 1% de ĉiuj sukcesaj vojaĝoj.

Por kompreni de kie venas la ekzekutistoj de ĉi tiuj ordoj, ni rigardu iliajn statusojn dum serĉado sur Pinglo:

Kiel Yandex.Taxi serĉas aŭtojn kiam ne ekzistas

  • Disponebla: estis disponebla, sed ial ne estis inkluzivita en la kandidatoj, ekzemple, li estis tro malproksime;
  • Laŭ mendo: estis okupata, sed sukcesis liberigi sin aŭ fariĝi disponebla por ĉena ordo;
  • Okupita: la kapablo akcepti mendojn estis malebligita, sed tiam la ŝoforo revenis al la linio;
  • Ne disponebla: la ŝoforo ne estis enreta, sed li aperis.

Ni aldonu fidindecon

Pliaj mendoj estas bonegaj, sed 29% de sukcesaj serĉoj signifas, ke 71% de la tempo la uzanto atendis longe kaj finis iri nenien. Kvankam ĉi tio ne estas malbona el vidpunkto de sistema efikeco, ĝi fakte donas al la uzanto malveran esperon kaj malŝparas tempon, post kio ili ĉagreniĝas kaj (eble) ĉesas uzi la servon. Por solvi ĉi tiun problemon, ni lernis antaŭdiri la verŝajnecon, ke aŭtomobilo mendita estos trovita.

La skemo estas la sekva:

  • La uzanto metas pinglon.
  • Serĉo estas farita sur la pinglo.
  • Se ne estas aŭtoj, ni antaŭdiras: eble ili aperos.
  • Kaj depende de la probablo, ni permesas aŭ ne permesas vin fari mendon, sed ni avertas vin, ke la denseco de aŭtoj en ĉi tiu areo nuntempe estas malalta.

En la aplikaĵo ĝi aspektis jene:

Kiel Yandex.Taxi serĉas aŭtojn kiam ne ekzistas

Uzado de la modelo permesas krei novajn mendojn pli precize kaj ne trankviligi homojn vane. Tio estas, reguligi la rilatumon de fidindeco kaj la nombro da mendoj sen maŝinoj uzante la precizec-revokan modelon. La fidindeco de la servo influas la deziron daŭrigi uzi la produkton, t.e. finfine ĉio dependas de la nombro da vojaĝoj.

Iom pri precizeco-revokoUnu el la bazaj taskoj en maŝinlernado estas la klasifika tasko: atribui objekton al unu el du klasoj. En ĉi tiu kazo, la rezulto de la maŝinlernado-algoritmo ofte iĝas nombra takso de membreco en unu el la klasoj, ekzemple, probabla takso. Tamen, la agoj kiuj estas faritaj estas kutime binaraj: se la aŭto estas disponebla, tiam ni lasos vin mendi ĝin, kaj se ne, tiam ni ne faros. Por esti specifa, ni nomu algoritmon kiu produktas nombran takson modelo, kaj klasigilon regulo kiu asignas ĝin al unu el du klasoj (1 aŭ –1). Por fari klasigilon bazitan sur la modela takso, vi devas elekti taksan sojlon. Kiel precize dependas multe de la tasko.

Supozu, ke ni faras teston (klasigilon) por iu malofta kaj danĝera malsano. Surbaze de la testrezultoj, ni aŭ sendas la pacienton por pli detala ekzameno, aŭ diras: "Bone, iru hejmen." Por ni, sendi malsanulon hejmen estas multe pli malbona ol senbezone ekzameni sanan homon. Tio estas, ni volas, ke la testo funkciu por kiel eble plej multaj vere malsanaj homoj. Ĉi tiu valoro nomiĝas recall =Kiel Yandex.Taxi serĉas aŭtojn kiam ne ekzistas. Ideala klasigilo havas revokon de 100%. Degenerita situacio estas sendi ĉiujn por ekzameno, tiam la revoko ankaŭ estos 100%.

Ĝi ankaŭ okazas inverse. Ekzemple, ni faras testan sistemon por studentoj, kaj ĝi havas trompan detektilon. Se subite la ĉeko ne funkcias por iuj kazoj de trompado, tiam ĉi tio estas malagrabla, sed ne kritika. Aliflanke, estas ege malbone maljuste akuzi studentojn pri io, kion ili ne faris. Tio estas, gravas por ni, ke inter la pozitivaj respondoj de la klasigilo estas kiel eble plej multaj ĝustaj, eble malprofite de ilia nombro. Ĉi tio signifas, ke vi devas maksimumigi precizecon = Kiel Yandex.Taxi serĉas aŭtojn kiam ne ekzistas. Se ekigado okazas sur ĉiuj objektoj, tiam precizeco estos egala al la ofteco de la difinita klaso en la specimeno.

Se la algoritmo produktas nombran probablan valoron, tiam elektante malsamajn sojlojn, vi povas atingi malsamajn precizec-revokajn valorojn.

En nia problemo la situacio estas jena. Rememoro estas la nombro da mendoj, kiujn ni povas oferti, precizeco estas la fidindeco de ĉi tiuj mendoj. Jen kiel aspektas la precizec-revoka kurbo de nia modelo:
Kiel Yandex.Taxi serĉas aŭtojn kiam ne ekzistas
Estas du ekstremaj kazoj: permesu al iu ajn mendi kaj permesu al ĉiuj mendi. Se vi ne permesas iun ajn, tiam rememoro estos 0: ni ne kreas mendojn, sed neniu el ili malsukcesos. Se ni permesas ĉiujn, tiam revoko estos 100% (ni ricevos ĉiujn eblajn mendojn), kaj precizeco estos 29%, t.e. 71% de mendoj estos malbona.

Ni uzis diversajn parametrojn de la deirpunkto kiel signojn:

  • Tempo/loko.
  • Sistemstato (nombro de okupataj maŝinoj de ĉiuj tarifoj kaj pingloj en la ĉirkaŭaĵo).
  • Serĉaj parametroj (radiuso, nombro da kandidatoj, limigoj).

Pli pri la signoj

Koncipe, ni volas distingi inter du situacioj:

  • "Profunda arbaro" - ne estas aŭtoj ĉi tie nuntempe.
  • "Malbonŝanca" - estas aŭtoj, sed dum serĉado ne estis taŭgaj.

Unu ekzemplo de "Malbonŝanca" estas se estas multe da postulo en la centro vendrede vespere. Estas multaj mendoj, multaj homoj pretaj, kaj ne sufiĉaj ŝoforoj por ĉiuj. Povas rezulti jene: ne estas taŭgaj ŝoforoj en la pinglo. Sed laŭvorte ene de sekundoj ili aperas, ĉar ĉi-momente estas multaj ŝoforoj en ĉi tiu loko kaj ilia statuso konstante ŝanĝas.

Tial diversaj sistemaj indikiloj en la najbareco de la punkto A montriĝis esti bonaj trajtoj:

  • Tuta nombro da aŭtoj.
  • Nombro de aŭtoj laŭ mendo.
  • La nombro da aŭtoj nedisponeblaj por mendi en la stato "Okupita".
  • Nombro de uzantoj.

Post ĉio, ju pli da aŭtoj estas, des pli probable estas, ke unu el ili estos disponebla.
Fakte, gravas por ni, ke ne nur aŭtomobiloj troviĝas, sed ankaŭ sukcesaj vojaĝoj. Tial, eblis antaŭdiri la probablecon de sukcesa vojaĝo. Sed ni decidis ne fari tion, ĉar ĉi tiu valoro multe dependas de la uzanto kaj ŝoforo.

La modela trejnado-algoritmo estis CatBoost. Datumoj akiritaj de la eksperimento estis uzataj por trejnado. Post efektivigo, trejnaddatenoj devis esti kolektitaj, foje permesante al malmulto de uzantoj ordigi kontraŭ la decido de la modelo.

Rezultoj

La rezultoj de la eksperimento estis kiel atenditaj: uzi la modelon ebligas al vi signife pliigi la nombron de sukcesaj vojaĝoj pro mendoj sen aŭtoj, sed sen kompromiti fidindecon.

Nuntempe, la mekanismo estis lanĉita en ĉiuj urboj kaj landoj kaj kun ĝia helpo okazas ĉirkaŭ 1% de sukcesaj vojaĝoj. Krome, en iuj urboj kun malalta denseco de aŭtoj, la proporcio de tiaj vojaĝoj atingas 15%.

Aliaj afiŝoj pri Taksia teknologio

fonto: www.habr.com

Aldoni komenton