時(shí)效準(zhǔn)確率提升之承運(yùn)商路由網(wǎng)絡(luò)挖掘
1、引子
履約時(shí)長(zhǎng)是電商的生命線,直接關(guān)系到用戶的消費(fèi)體驗(yàn)。新華網(wǎng)[5]2022年雙十一的報(bào)告顯示,37.4%的受訪者希望次日達(dá),29.91%希望當(dāng)日達(dá)。相較于其他物品,受訪者對(duì)手機(jī)、電腦、數(shù)碼產(chǎn)品的物流時(shí)效要求更高,更希望當(dāng)日或1-2天內(nèi)能收到貨。
得物履約場(chǎng)景中,主要的階段包括倉(cāng)庫(kù)內(nèi)生產(chǎn)和第三方承運(yùn)商配送。在用戶支付時(shí),得物會(huì)根據(jù)倉(cāng)庫(kù)的生產(chǎn)情況和運(yùn)配資源,給用戶一個(gè)承諾時(shí)效。
1.1 為什么要預(yù)測(cè)承運(yùn)商的線路時(shí)效
在履約過(guò)程中,得物需要監(jiān)控訂單的流轉(zhuǎn),及時(shí)的發(fā)現(xiàn)可能超時(shí)的訂單(與和用戶承諾時(shí)效相比),這里包含倉(cāng)庫(kù)生產(chǎn)的監(jiān)控和三方配送的監(jiān)控。在實(shí)際過(guò)程中我們發(fā)現(xiàn):配送節(jié)點(diǎn)發(fā)生變更時(shí),承運(yùn)商給的預(yù)測(cè)偏保守的。下面例子中,到了營(yíng)業(yè)部承運(yùn)商才給到比較精準(zhǔn)的預(yù)計(jì)送達(dá)時(shí)間,故在分揀中心使用承運(yùn)商的預(yù)計(jì)送達(dá)時(shí)間容易出現(xiàn)誤報(bào)。
網(wǎng)點(diǎn) | 離開(kāi)時(shí)間 | 承運(yùn)商預(yù)計(jì)送達(dá) |
xxx網(wǎng)點(diǎn) | 2022-12-02 07:05:47 | 2022-12-10 22:00:00 |
A集貨分揀中心 | 2022-12-02 14:09:19 | 2022-12-10 22:00:00 |
B集貨分揀中心 | 2022-12-04 07:42:03 | 2022-12-10 22:00:00 |
C散貨分揀中心 | 2022-12-05 04:58:28 | 2022-12-09 22:00:00 |
D營(yíng)業(yè)部 | 2022-12-05 08:47:58 | 2022-12-05 15:00:00 |
下圖是承運(yùn)商接口返回的預(yù)計(jì)送達(dá)時(shí)效的寬松指數(shù),可以看到在接近目的地時(shí),承諾時(shí)效才比較準(zhǔn)確。
2、承運(yùn)商網(wǎng)絡(luò)是如何運(yùn)作的
在構(gòu)建承運(yùn)商網(wǎng)絡(luò)之前,需要先了解承運(yùn)商網(wǎng)絡(luò)是如何工作的。下面是從A網(wǎng)點(diǎn)到E網(wǎng)點(diǎn)的配送示意圖,分為以下內(nèi)容:
(1)節(jié)點(diǎn),包含的攬收和派送網(wǎng)點(diǎn)以及分揀中心。
(2)線路,包括干線和支線。例如從網(wǎng)點(diǎn)到分揀中心屬于支線,從分揀中心到分揀中心屬于干線。
(3)班次:承運(yùn)商為了平衡成本和時(shí)效,會(huì)設(shè)置生產(chǎn)班次。到分揀中心之后,需要根據(jù)目的地進(jìn)行分揀,當(dāng)?shù)竭_(dá)一定量的貨物之后,會(huì)從分揀中心出發(fā),前往下一個(gè)節(jié)點(diǎn)。承運(yùn)商在設(shè)置班次的時(shí)候,會(huì)考慮單量,兼顧運(yùn)輸?shù)某杀疽约皶r(shí)效。
上圖中:以紫色為例,在A網(wǎng)點(diǎn),早上8點(diǎn)截單,即8點(diǎn)之前交接給承運(yùn)商的貨物,會(huì)在8點(diǎn)20左右完成封車,然后從網(wǎng)點(diǎn)出發(fā),前往B分揀中心,到達(dá)B分揀中心的時(shí)間是11點(diǎn)40,這個(gè)時(shí)候趕上了B分揀中心截單時(shí)間為12點(diǎn)的班次,B分揀中心會(huì)在12:30完成分揀并前往下一個(gè)分揀中心,以此類推完成整個(gè)配送過(guò)程。
在構(gòu)建承運(yùn)商的網(wǎng)絡(luò)時(shí),需要進(jìn)行建模。除了節(jié)點(diǎn)、線路和班次之外,核心還包括以下兩個(gè)模型:
(5)成品線,即從A網(wǎng)點(diǎn)到E網(wǎng)點(diǎn)經(jīng)過(guò)所有節(jié)點(diǎn)。上圖中:A網(wǎng)點(diǎn)-B分揀中心-C分揀中心-D分揀中心-E網(wǎng)點(diǎn)構(gòu)成了一條成品線。
(6)成品線波次:因?yàn)楣?jié)點(diǎn)存在波次,所以成品線也存在波次,實(shí)際上成品線波次和第一個(gè)節(jié)點(diǎn)的波次數(shù)一樣。
3、如何構(gòu)建承運(yùn)商網(wǎng)絡(luò)
在了解承運(yùn)商網(wǎng)絡(luò)如何工作后,需要著手構(gòu)建承運(yùn)商的網(wǎng)絡(luò)。承運(yùn)商會(huì)將軌跡信息推送到得物,內(nèi)容類似以下的文本。
3.1 結(jié)構(gòu)化清洗
軌跡的文本,需要經(jīng)過(guò)結(jié)構(gòu)化的清洗之后,才能獲取軌跡的含義。對(duì)于每一個(gè)運(yùn)單,它的軌跡會(huì)經(jīng)過(guò)很多個(gè)節(jié)點(diǎn),而每個(gè)節(jié)點(diǎn)的數(shù)據(jù)類型如下:
3.2 軌跡里面是否真的有班次信息
承運(yùn)商網(wǎng)絡(luò)工作原理提到了承運(yùn)商會(huì)按班次進(jìn)行生產(chǎn),從軌跡的結(jié)果里面是否能找到班次生產(chǎn)的證據(jù)呢。通過(guò)分析,我們猜想:相同流向(例如從A分揀中心開(kāi)往B分揀中心)離開(kāi)某個(gè)分揀中心(例如離開(kāi)A分揀中心)的時(shí)間應(yīng)該是相對(duì)集中的。
實(shí)時(shí)上通過(guò)一些簡(jiǎn)單的聚類方法,證實(shí)了我們的猜想。下面圖中,橫軸表示的是出分揀中心的小時(shí),每一個(gè)點(diǎn)表示歷史上的某一個(gè)運(yùn)單,縱軸沒(méi)有業(yè)務(wù)含義,只是為了方便顯示。
繪制上述圖時(shí)使用的是kmeans聚類算法,kmeans聚類算法需要指定聚類的個(gè)數(shù)。故需要使用Knee/Elbow這類的算法進(jìn)行聚類數(shù)檢測(cè),同時(shí)它對(duì)異常值敏感,故在實(shí)現(xiàn)時(shí)最終使用的DBSCAN。
3.3 聚類參數(shù)該如何選取
DBSCAN雖然不需要指定聚類的個(gè)數(shù),但是需要指定點(diǎn)之間的距離以及點(diǎn)的密度,通過(guò)反復(fù)調(diào)整,最終確定這兩個(gè)核心的參數(shù)如下:
clustering = DBSCAN(eps=0.25, min_samples=max(5, int(x.size * 0.02)), metric=metric).fit(x_after_reshape)
其中eps為0.25,即15分鐘。點(diǎn)密度為5和總數(shù)的2%的最大值。
3.4 如何解決跨天的問(wèn)題
從上面聚類圖看,同一個(gè)波次的點(diǎn)可能出現(xiàn)跨天的情況,即有些點(diǎn)出分撥中心的時(shí)間可能是23:50,有些分撥中心的點(diǎn)可能是00:10。這兩個(gè)點(diǎn)的歐式距離比較大,故需要重寫距離的metrics函數(shù)。
3.5 線路是如何串聯(lián)的
分析節(jié)點(diǎn)的生產(chǎn)班次和線路的班次是不夠的,還需要將它們進(jìn)行串聯(lián),得到成品線班次,這樣才能在售前或者售中進(jìn)行應(yīng)用。這里在處理的時(shí)候進(jìn)行了一些簡(jiǎn)化,一方面是分揀中心的分揀波次是沒(méi)有辦法識(shí)別到的,另外一方面其實(shí)可以不用關(guān)注分揀中心的分揀波次。
實(shí)際上,串聯(lián)成品線班次的過(guò)程是這樣的:
核心的代碼如下:
3.6 四級(jí)地址與攬派網(wǎng)點(diǎn)的關(guān)系是如何建立的
從應(yīng)用的角度,輸入條件是買家的四級(jí)地址,但承運(yùn)商網(wǎng)絡(luò)的終點(diǎn)是派送站點(diǎn),故需要建立承運(yùn)商派送站點(diǎn)和四級(jí)地址的映射關(guān)系。映射關(guān)系的建立比較簡(jiǎn)單,取過(guò)去一段時(shí)間負(fù)責(zé)派送該四級(jí)地址的站點(diǎn)中,派送該地址單量最多的那個(gè)。
4、工程落地的挑戰(zhàn)
Part 3更像是一個(gè)理論家的滔滔不絕,那如何在工程上進(jìn)行落地呢?這里面包含了ODPS SQL的開(kāi)發(fā)、UDF的開(kāi)發(fā)以及DDD,總之需要十八般武藝。
4.1 如何在ODPS進(jìn)行簡(jiǎn)單的機(jī)器學(xué)習(xí)
在班次分析的過(guò)程中,使用到DBSCAN的聚類算法。如果在odps上使用這些算法呢?實(shí)際上python里面已經(jīng)實(shí)現(xiàn)了DBSCAN算法,而odps支持使用python編寫UDF。只是目前odps的運(yùn)行環(huán)境并沒(méi)有安裝DBSCAN相關(guān)的包,故需要手動(dòng)進(jìn)行安裝,安裝的教程可以參考阿里云的官方文檔
4.2 在線服務(wù)化的問(wèn)題
上述清洗過(guò)程需要每天或者至少一周運(yùn)行一次,選取過(guò)去一個(gè)時(shí)間窗口的數(shù)據(jù)進(jìn)行訓(xùn)練,得到承運(yùn)商的網(wǎng)絡(luò),這樣才能及時(shí)的感知承運(yùn)商網(wǎng)絡(luò)的變化。這意味著會(huì)定時(shí)的更新成品線、成品線波次以及節(jié)點(diǎn)波次的信息,在在線服務(wù)化的過(guò)程中,我們是直接將數(shù)據(jù)這些數(shù)據(jù)存放在redis里面。為了不占用太多的內(nèi)存,通過(guò)使用hash數(shù)據(jù)結(jié)構(gòu)對(duì)內(nèi)存進(jìn)行了一些優(yōu)化,當(dāng)然hash的一個(gè)缺點(diǎn)是無(wú)法為field設(shè)置超時(shí)時(shí)間,這意味著某個(gè)key的某個(gè)field數(shù)據(jù)實(shí)際已經(jīng)是過(guò)期數(shù)據(jù)了,但是它不會(huì)被刪除,進(jìn)而造成泄漏,但這種泄漏可以通過(guò)其他技術(shù)手段解決。
5、進(jìn)展與規(guī)劃
目前我們已經(jīng)構(gòu)建了第三方承運(yùn)商網(wǎng)絡(luò),首網(wǎng)點(diǎn)預(yù)測(cè)的準(zhǔn)確率在65%左右,末分揀預(yù)測(cè)的準(zhǔn)確率在85%左右。未來(lái)持續(xù)優(yōu)化點(diǎn)包括:班次聚合(對(duì)于一些數(shù)據(jù)比較稀疏線路,需要做班次的聚合)、時(shí)間衰減(清洗數(shù)據(jù)需要選取過(guò)去一段時(shí)間的數(shù)據(jù),對(duì)于太久遠(yuǎn)的數(shù)據(jù),應(yīng)該進(jìn)行衰減,使得它在結(jié)果中的貢獻(xiàn)小一些)等,相信準(zhǔn)確率能有進(jìn)一步提升。
6、參考文獻(xiàn)
[1]. Knee/Elbow Point Detection
[2]. arvkevi/kneed
[3].https://datascience.stackexchange.com/questions/46106/kmeans-vs-dbscan
[4]. https://redis.io/docs/management/optimization/memory-optimization/
[5]. 用戶調(diào)研:今年11.11消費(fèi)者最關(guān)注“確定性” 京東是八成用戶首選-新華每日電訊