文章
Uber 說 5 分鐘到,騙人?
上哲 @nuva.ceo發布於
App 說司機 5 分鐘到,你通常會現在下樓,還是再滑一下手機?
多數人會再滑一下。結果有時司機兩分鐘就到,在門口打電話催你,你一邊穿鞋一邊衝下樓;有時你乖乖站在路邊,地圖上那台小車卻在對街繞了十分鐘,你只能在風裡看著它原地轉圈。
那個捉摸不定的「5 分鐘」到底是怎麼來的?
地圖不等於馬路
Uber 算車資、估上車時間、配對司機、規劃外送,都要用到抵達時間預測(ETA,Estimated Time of Arrival),也就是 App 上「還要多久才到」的那個數字。
傳統做法是交給路線引擎(Routing Engine),也就是導航背後負責算路的程式。它把路網切成很多小段,每段估一個通過時間,找出最好的路線,再全部加起來。就像你估通勤:走到捷運站 5 分鐘、搭車 20 分鐘、出站再走 3 分鐘,加起來 28 分鐘。
但 Uber 工程團隊 2022 年在官方部落格說:地圖只是模型,抓不到路上真實的狀況;而且也不知道司機和乘客實際會走哪條路。你的 28 分鐘也一樣,沒算到那條路塞到兩個紅綠燈也過不去。
所以 Uber 在這個加總之上又疊了一層,用機器學習(Machine Learning)預測「地圖算的時間」和「實際花的時間」差多少。機器學習的意思是,規則不是人(工程師)定出來的,而是讓電腦看大量例子,自己找出規律。這層模型叫 DeepETA,已經上線,用在全球四輪車的 ETA。
從過去,猜下一次
這裡的概念是預測模型(Predictive Model):用大量歷史資料,學會從已知條件猜出一個數字。拆開來看,有三個步驟。
第一步,決定要看哪些線索。DeepETA 收到的是:起點、終點、叫車的時間、即時路況,還有這趟是送外送還是接乘客。這些線索在機器學習裡叫特徵(Feature)。
第二步,從過去學。模型看過大量已經跑完的行程,每一趟都知道地圖當初估多少、實際花了多少。看多了,它就能學到類似「平日傍晚從這一區出發,地圖通常少估兩分鐘」的規律。這個學的過程叫訓練(Training)。
第三步,猜這一次。你按下叫車,模型拿你這趟的線索,套用學到的規律,把差距補回地圖算的時間,給出最後的 ETA。
這一步要很快。Uber 說,DeepETA 是公司裡被呼叫最頻繁的模型,每次最多只能花幾毫秒。人眨一次眼大約要一兩百毫秒,大概是你眨一次眼,它已經完成了十次計算。路況會變,模型也會定期重新訓練,用新跑完的行程再學一次。
猜得準不準,怎麼算?
猜完要打分數。Uber 看的是平均絕對誤差(MAE,Mean Absolute Error):每一趟預測差了幾分鐘,不管早到或晚到都當成正數,再平均。
舉個例子:三趟行程,第一趟比預測早到 2 分鐘,第二趟晚到 1 分鐘,第三趟晚到 3 分鐘。不分早晚,差距是 2、1、3,平均就是 2 分鐘。為什麼要不分早晚?如果早到算負、晚到算正,「早 3 分」和「晚 3 分」一加就變成 0,看起來完美,其實兩趟都不準。(沒看懂的話,再看一次 xD)
注意,這是「平均」。平均差 2 分鐘,你今天這一趟還是可能差 6 分鐘。(例如 0、6、0)
寧可說晚,還是說早?
既然一定有誤差,就得決定要錯在哪一邊。訓練模型時,要先給它一套扣分規則,告訴它猜錯多少要扣幾分,這叫損失函數(Loss Function);模型學習的目標,就是讓扣分越少越好。
Uber 的部落格提到,DeepETA 用的扣分規則可以調整「估太短」和「估太長」各罰多重,因為有些情況下,晚到一分鐘比早到一分鐘更糟。算車資要的,則是不被少數極端行程拉走的平均估計:一趟碰上車禍、多塞了四十分鐘的行程,不該把同一條路的估計整個拉長。
往「說久一點」調,你比較少在路邊乾等;調過頭,App 寫 12 分鐘、車子 5 分鐘就到,換司機在樓下等你,或你乾脆不叫了。哪一種錯比較能忍,要顧司機還是乘客,我覺得對 Uber 來說,兩邊都不能惹。
所以,剩五分鐘要不要先下樓?
App 上的 5 分鐘,是路線引擎先加總一次,預測模型再拿無數趟跑完的行程修一次,比單看地圖準得多。它做不到的,是預先知道只有這一趟才會發生的事:司機在下一個路口轉錯、你住的社區要繞到後門才進得來。這些沒出現在線索裡的事,模型就猜不到。
所以那個數字不是承諾,是一個「通常差不多這樣」的最佳猜測,背後還有人替它決定好,寧可錯在哪一邊。下次看到「5 分鐘到」,把它讀成「大概 5 分鐘,前後可能差個幾分鐘」;真的趕時間,就先把鞋穿好,到路邊邊滑邊等吧。
延伸討論
你的工作裡,有哪一個數字你最希望能事先被準確預測出來?
來源(查證日 2026/11/08):
- DeepETA: How Uber Predicts Arrival Times Using Deep Learning(Uber Blog)(在新分頁開啟)・2022/02/10
- DeeprETA: An ETA Post-processing System at Scale(arXiv)(在新分頁開啟)・2022/06/05
- 線性迴歸:損失(Google 機器學習速成課程)(在新分頁開啟)
文/上哲(ChatGPT 協力)
0 個愛心0 則留言
登入並驗證手機後就能留言。登入