Om te kunnen boeken bij sneleentaxi moet javascript aan staan.

Hoe we met behulp van machine learning Nederlanders de eerlijkste prijs gaan laten betalen voor hun taxi

sneleentaxi gebruikt machine learning voor het voorspellen van de populairteit van een geboekte rit.

Ons bedrijf heeft een complex businessmodel. We hebben op sneleentaxi een plaform waar we reizigers en vervoerders met elkaar in contact brengen. Een tweezijdige marktplaats waar we continu vraag en aanbod in evenwicht moeten houden.

Wanneer reizigers niet bij ons boeken, krijgen we teleurgestelde vervoerders die het platform verlaten. Wanneer we geen vervoerders aantrekken, krijgen we teleurgestelde reizigers van wie wij hun rit moeten annuleren. Daarnaast hebben we te maken met extreem veel regionale verschillen op gebied van aantal taxi's per inwoner, prijs per kilometer en de vraag naar taxi's per inwoner.

Juist deze complexiteit maakt het extra uitdagend om succesvol te worden. We weten dat we door deze ingewikkelde route te kiezen een platform aan het opbouwen zijn dat op een intelligente manier rekening blijft houden met regionale verschillen. In etappes willen we deze data gebruiken om uiteindelijk een ultieme prijs te kunnen bepalen die onze reiziger bij ons zal betalen. Hiervoor hebben we bij de eerste versie van ons platform gebruik gemaakt van een omgekeerd veilingmodel. Wanneer reizigers een rit boeken zetten wij deze uit in een omgekeerde veiling en sturen we notificaties naar taxibedrijven van wie wij denken dat deze rit goed in hun agenda zou passen. Hoe langer de taxibedrijven wachten, hoe hoger hun vergoeding. Wachten ze echter te lang, lopen ze de kans dat een ander taxibedrijf deze rit al heeft geaccepteerd. Hierdoor zorgen we voor zo min mogelijk loze kilometers, want juist taxibedrijven die ritten in het begin van een veiling accepteren zullen doorgaans iets kunnen combineren op hun heen- of terugweg.

Toch was dit voor ons slechts het begin. Nu we als platform steeds meer data hebben vergaard en we door onze omvang steeds meer impact ervaren van relatief 'kleine' veranderingen, werd het tijd voor de volgende stap. Het introduceren van machine learning op ons veilingmodel.

De eerste stap in een nog intelligenter platform is gezet. Geen veiling is meer hetzelfde.

Onze veilingen waren voorheen 'statisch'. Dat wil zeggen dat deze altijd 45 minuten duurden en dat wij de begin- en eindprijs altijd gelijk hielden, gebaseerd op een percentage van de ritprijs. Om écht verschil te maken in de taxiwereld moeten we in de veiling eigenlijk op zoek naar het 'pijnpunt'. Een rit die direct in een veiling geaccepteerd wordt, is eigenlijk te laag geprijsd, en een rit die niet geveild wordt (deze wordt opgevangen door onze premiumpartners) is eigenlijk te hoog geprijsd. Gezien de grote hoeveelheid variabelen waar we mee te maken hebben, is het onmogelijk hier handmatig rekening mee te houden. We moesten dus op zoek naar een intelligentere oplossing om uiteindelijk een ideale veiling tot stand te laten komen.

De eerste vraag die we moesten beantwoorden, was of wij in staat waren om te kunnen voorspellen hoe groot de kans is dat een rit aangenomen wordt. Om deze vraag te beantwoorden, dienden we eerst uitgebreid onze data te analyseren. Een geboekte rit bevat honderden gegevens. Deze zijn opgebouwd aan data over de rit zelf: het aantal personen, de hoeveelheid bagage, het tijdstip waarop de rit plaatsvindt, het type vervoer dat geboekt is (normaal/luxe/elektrisch), het traject dat afgelegd wordt, het aantal kilometers dat gereden wordt en het totaalbedrag. Daarnaast hebben we gegevens (meta informatie) over onze vervoerders, zoals hoeveel partners de veilling te zien krijgen en hoelang het duurt voor de boeking geveild is.

Hoe we met behulp van machine learning Nederlanders de eerlijkste prijs gaan laten betalen voor hun taxi

Niet alle data was direct bruikbaar. Het aantal partners in een gebied zegt niet direct iets over de kans dat zij een rit wel of niet aannemen. Het wordt pas echt interessant wanneer deze afgezet wordt tegen de hoeveelheid partners in een gebied t.o.v de grootte of het inwoneraantal. We noemen dit zelf onze 'partner-density'. We hebben gekozen om in eerste instantie het aantal postcodes dat een gemeente telt, te delen door het aantal partners. Met deze berekening kunnen we precies meten hoe groot onze 'partner-density' in iedere regio is. Deze data hebben we 'gevoed' aan ons machine learning model om zo het algoritme te kunnen laten bepalen hoe groot de invloed van deze factor is.

Ook is niet elke partner even 'actief' op ons platform. Als we iets met deze data willen doen, moeten we een 'engagement'-factor berekenen en deze als waarde meegeven in onze trainingsmodellen.

Ander uitdagingen die je tegenkomt tijdens het trainen van je machine learning model zitten hem in de manier waarop je data aan het model presenteert. Omdat we nog weinig data hebben, is het lastig om exacte tijdstippen in je model in te laden. Daarom hebben we deze opgedeeld in 'time-zones', en hebben we de 'ochtend' van 06.00 tot 10.00 het getal '1' gegeven. Het tijdstip 10.00 tot 13.00 krijgt het getal 2. Het maakt voor machine learning niet uit wat 1 of 2 inhoudt. Het zoekt continu naar logica binnen de data die het beschikbaar heeft. Dat is voor een model makkelijker dan honderden verschillende variabelen zoals 13:02:44 en 13:08:22.

Hierna is het vooral veel testen. Sommige data schrap je uit het model en andere probeer je te verbeteren zodat het model er beter mee kan werken. Uiteindelijk is elke nieuwe rit te toetsen aan dit model en kan er een voorspelling gedaan worden op welk moment in de veiling deze rit zal worden aangenomen. En op het moment dat we een soort break-through hadden, was het natuurlijk enorm gaaf (we konden met een behoorlijke waarschijnlijkheid en minieme afwijking precies voorspellen wat onze marge op de volgende geboekte rit zou worden). Maar met deze gegevens zelf konden we natuurlijk nog niets. Het gaf ons vooral inzicht, maar het spannendste gedeelte moest nog gebouwd worden. Hoe konden we deze informatie gebruiken om een betere begin- en eindprijs te bepalen voor de veiling? En was het tijdstip dat wij hanteerden voor de veiling wel ideaal?

Hoe we met behulp van machine learning Nederlanders de eerlijkste prijs gaan laten betalen voor hun taxi

We bouwden hiervoor op ons eigen platform een nieuw gedeelte. In dit gedeelte kunnen wij zelf handmatig nieuwe modellen toevoegen die rekening houden met de factoren uit onze machine learning lessen. Deze modellen kunnen we voorzien van 3 variabelen per type geboekte rit. Wij kunnen een begin- en eindpercentage van de veiling toevoegen, en bepalen hoe lang de veiling zou duren.

Hoe we met behulp van machine learning Nederlanders de eerlijkste prijs gaan laten betalen voor hun taxi

Tevens kunnen we instellen welk percentage van de ritten door dit model gebruikt worden. Om het de modellen niet te ingewikkeld te maken, hebben wij de lessen uit de machine learning opgedeeld in 4 groepen, al naar gelang hoe snel deze worden aangenomen in de veiling.

Door deze groepen te 'verkleinen' kunnen we in eerste instantie veel sneller progressie maken en de modellen later uitdiepen als we weten of een model succesvol is. Een rit die dus waarschijnlijk 'niet aangenomen' gaat worden in de veiling kunnen we nu voor een veel kleiner percentage aanbieden, of veel langer in de veiling zetten. Een rit waarvan wij voorspellen dat die direct wordt aangenomen, kunnen wij nu voor een hoger percentage wegzetten.

Daarnaast moesten we nog een gedeelte ontwikkelen dat uiteraard de resultaten van deze nieuwe veilingmodellen kon presenteren. Hiervoor maakten we wat aanpassingen in onze normale rapportage. We kunnen nu eenvoudig zien welke veilingmodel het beste presteert. We hebben nog minstens 3 maanden nodig om alle data écht significant te noemen. Toch mogen we al spreken van een voorzichtig succes: de resultaten zijn enorm verbeterd. Een tussentijdse stand laat een stijging van de marge tussen de 10% en 30% zien (elk model kent verschillende uitkomsten).

Betalen voor tarieven die écht kloppen, rekening houdend met alle lokale verschillen die Nederland rijk is.

Uiteindelijk is dit voor ons slechts een tussenstapje. Waar we nu vooral de marge aan onze kant verhogen, zit hem de echte winst in dit kunnen vertalen naar lagere consumentenprijzen. Tarieven zijn dan niet meer alleen laag doordat grote partijen 'marktaandeel' kopen door de tarieven te dumpen, maar gebaseerd op een eerlijk vraag- en aanbod economie. Sneleentaxi wil daarin bijdragen en onderdeel vormen van ieders dagelijkse reis.

Ik hoop dat jullie hebben genoten van deze vijfdelige blog over de hobbels die we tegenkwamen tijdens het ombouwen van ons oude naar het nieuwe platform. Ik heb het met enorm veel plezier opgeschreven en vond het leuk en spannend om een inkijkje te geven in onze bedrijfsgeheimen.

Wanneer je de eerdere blogs in deze serie wilt lezen kun je starten bij het eerste deel. "Over de successen en fuck-ups van sneleentaxi".