單文煜,吳垠,陳鵬
(1.成都移花互動(dòng)科技有限公司,成都 610041;2.成都市委辦公廳,成都 610041;3.西華大學(xué)計(jì)算機(jī)與軟件工程學(xué)院,成都 610039)
因?yàn)槊窈绞袌龅某浞指偁幰约昂娇展鞠鄬?duì)先進(jìn)的收益管理方法,機(jī)票價(jià)格時(shí)常會(huì)隨時(shí)間大幅波動(dòng)。面對(duì)這種不確定性,部分消費(fèi)者尤其是個(gè)旅消費(fèi)者,在做購買決策時(shí)會(huì)猶豫怕買貴,而OTA(Online Travel Agency)在銷售過程中,如果能夠適當(dāng)提供一些確定性,就可以打消用戶疑慮,提高購買轉(zhuǎn)化。出于這個(gè)目的,我們開始了機(jī)票價(jià)格預(yù)測的研究,并最終變成我們產(chǎn)品中的功能,更好地服務(wù)了用戶,為部分價(jià)格敏感型用戶提供更多選擇,也讓用戶放心下單。
價(jià)格預(yù)測本質(zhì)是一個(gè)回歸問題,現(xiàn)在機(jī)器學(xué)習(xí)領(lǐng)域已經(jīng)有了很多成熟方法來應(yīng)對(duì)各種回歸問題,諸如線性回歸、決策樹回歸、支持向量機(jī)回歸、梯度提升回歸、隨機(jī)森林回歸、XGBoost 回歸等。
而要在實(shí)際應(yīng)用中取得良好效果,主要取決與兩點(diǎn):
(1)擁有足夠多高質(zhì)量數(shù)據(jù)。正所謂garbage in,garbage out,一些遠(yuǎn)離業(yè)界的研究因?yàn)榭陀^條件受限,往往只能得到短時(shí)間的小范圍的數(shù)據(jù)。在這樣的數(shù)據(jù)上得出的模型,很難實(shí)際應(yīng)用。
(2)對(duì)所研究問題的業(yè)務(wù)有足夠深刻的理解。機(jī)器學(xué)習(xí)本身就是一項(xiàng)與經(jīng)驗(yàn)關(guān)聯(lián)十分密切的技術(shù),我們?cè)谶x擇機(jī)器學(xué)習(xí)算法時(shí)所做出的一些決定是否恰當(dāng),與算法的優(yōu)化或技術(shù)層面關(guān)系并不大,有時(shí)對(duì)業(yè)務(wù)細(xì)節(jié)的掌握,才是踩準(zhǔn)方法選擇與參數(shù)優(yōu)化方向的關(guān)鍵。
之前已有不少學(xué)者進(jìn)行過這方面的研究,有的采用時(shí)間序列分析[1],有的采用貝葉斯算法[2],有的使用CNN[3],都取得了不錯(cuò)的效果。但他們都有上述兩方面的不足。
我們作為中國移動(dòng)互聯(lián)網(wǎng)的早期參與者,在線旅行行業(yè)的創(chuàng)新型企業(yè),自2012 年開始積累了大量的票價(jià)數(shù)據(jù),也有能力從互聯(lián)網(wǎng)上獲取更多的數(shù)據(jù)。同時(shí),我們作為旅行行業(yè)一線工作者,對(duì)整個(gè)行業(yè),包括供應(yīng)方、分銷體系、消費(fèi)者和監(jiān)管機(jī)構(gòu)都十分了解,是最能理解機(jī)票價(jià)格是如何構(gòu)成,如何變化的那群人。這些積累對(duì)我們進(jìn)行這項(xiàng)研究起了非常積極的作用。
數(shù)據(jù)全都取自歷史業(yè)務(wù)數(shù)據(jù)。數(shù)據(jù)來源有兩方面,一是機(jī)票銷售的業(yè)務(wù)數(shù)據(jù),這部分通過中國航信的API 接口查詢獲得,這種方式數(shù)據(jù)準(zhǔn)確,但價(jià)格高;二是競爭對(duì)手的價(jià)格監(jiān)控?cái)?shù)據(jù),這部分通過爬蟲從各大OTA 網(wǎng)站頁面上獲得,這種方式數(shù)據(jù)不完全可靠,但價(jià)格相對(duì)低。
中國現(xiàn)在共有超過4000 個(gè)國內(nèi)定期航班,數(shù)據(jù)量十分龐大,選取其中最有代表性的一部分進(jìn)行研究已經(jīng)足夠。我們選取年旅客吞吐量超過100 萬人的主要機(jī)場92 個(gè),將各主要機(jī)場之間的航班納入分析范圍,提取了2019 年全年每天每個(gè)航班未來60 天的經(jīng)濟(jì)艙價(jià)格數(shù)據(jù)。
利用網(wǎng)絡(luò)爬蟲獲取如此大量的數(shù)據(jù),會(huì)碰到諸多障礙:
(1)IP 限制。單IP 大量查詢很容易觸發(fā)反爬蟲機(jī)制,比較好的解決方案是使用分布式爬蟲,部署在撥號(hào)VPS 上
(2)動(dòng)態(tài)頁面?,F(xiàn)代互聯(lián)網(wǎng)網(wǎng)站大量使用前后端分離,瀏覽器頁面渲染技術(shù),這使得純后端爬蟲得不到需要的數(shù)據(jù),應(yīng)對(duì)方案是使用Headless Browser 或?yàn)g覽器插件
(3)驗(yàn)證碼。就算繞過諸多反制,業(yè)務(wù)請(qǐng)求過多還是會(huì)觸發(fā)機(jī)器人檢測(驗(yàn)證碼識(shí)別),為這種任務(wù)做自動(dòng)圖像識(shí)別其實(shí)得不償失,人工打碼是更簡單有效的方法。
所有這些數(shù)據(jù)在公司日常業(yè)務(wù)進(jìn)行的過程中,就已存入了業(yè)務(wù)數(shù)據(jù)庫,只是散落在多個(gè)數(shù)據(jù)庫與表中。在開始研究之前需要寫腳本歸集這些數(shù)據(jù)到一個(gè)表中,方便后面的使用。在這個(gè)過程中,數(shù)據(jù)格式統(tǒng)一、缺失數(shù)據(jù)清理就已經(jīng)完成,關(guān)鍵特征缺失的數(shù)據(jù)已經(jīng)被排除在外。
作為機(jī)票銷售的一線從業(yè)者,這部分更多是從業(yè)務(wù)理解出發(fā),而不是從數(shù)據(jù)分析出發(fā),開始就已經(jīng)把想要的特征考慮好,然后去獲取的這些數(shù)據(jù)。
民用航空領(lǐng)域的市場化程度非常高,機(jī)票價(jià)格最終是供求關(guān)系決定的。供應(yīng)端的決定因素主要有航線航司分布、航司與代理的博弈、代理之間的競爭以及主管部門的政策影響,這部分因素相對(duì)穩(wěn)定,短期內(nèi)不會(huì)有大的變化。所以需求端的影響更加重要,需求端的變化也更大,有熱門冷門線路的因素、有消費(fèi)偏好的因素、有臨時(shí)性計(jì)劃性的因素、還有重大節(jié)假的影響因素,歸納如表1。
表1
按照上表將特征數(shù)據(jù)數(shù)值化,處理過后都是干凈的數(shù)據(jù)。還需要額外做的處理是:
(1)通過均值分析,daysToFlight 大于 45 以后對(duì)價(jià)格影響很小,故刪除daysToFlight>45 的數(shù)據(jù)。
(2)還需要額外處理的是價(jià)格。首先是異常值處理,通過查看頻數(shù)確定正常邊界,用邊界值填充異常價(jià)格。其次價(jià)格不服從正態(tài)分布,所以在進(jìn)行回歸之前,必須進(jìn)行轉(zhuǎn)換。嘗試用對(duì)數(shù)變換和無界約翰遜分布擬合,無界約翰遜分布擬合得更好。
我們選用了集成算法來訓(xùn)練模型。集成算法可以分為bagging 和boosting 兩種集成方式。
Bagging 獨(dú)立訓(xùn)練(可并行)多個(gè)基分類器,基分類器相互之間獨(dú)立,然后用方法(投票法、平均法、stack?ing)把基分類器集成起來。代表算法為隨機(jī)森林,森林的每棵樹都是隨機(jī)的。預(yù)測最終結(jié)果取N 棵樹的平均,保證不會(huì)對(duì)某些特征的依賴。
Boosting 串行訓(xùn)練基分類器,基分類器之間相互依賴,每次訓(xùn)練完一個(gè)分類器后調(diào)整權(quán)重,再訓(xùn)練下一個(gè)分類器。代表算法XGBoost,XGBoost 更加有效應(yīng)用了數(shù)值優(yōu)化,Kaggle 競賽平臺(tái)上的TOP 算法一半以上使用了XGBoost 算法。
評(píng)價(jià)標(biāo)準(zhǔn)為MAE(Mean Absolute Error),使用經(jīng)典的五折交叉驗(yàn)劃分訓(xùn)練集和測試集,多輪驗(yàn)證來減小過擬合。訓(xùn)練代碼如下:
測試結(jié)果如表2。
表2
相對(duì)于全部樣本712 的均價(jià)來說,這個(gè)預(yù)測精度表現(xiàn)比較好。
模型融合是一種能在各種的機(jī)器學(xué)習(xí)任務(wù)上提高準(zhǔn)確率的強(qiáng)有力技術(shù),Kaggle 比賽中最常用的就是Stacking 融合,基于初級(jí)學(xué)習(xí)器的概率輸出,來訓(xùn)練次級(jí)學(xué)習(xí)器。一個(gè)Stacking 模型通過使用第一階段的預(yù)測作為特征,比相互獨(dú)立的訓(xùn)練模型能夠得到更多的信息。Stacking 訓(xùn)練過程:
(1)拆解訓(xùn)練集。將訓(xùn)練數(shù)據(jù)隨機(jī)且大致均勻的拆為m 份
(2)在拆解后的訓(xùn)練集上訓(xùn)練模型,同時(shí)在測試集上預(yù)測。利用m-1 份訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練,預(yù)測剩余一份;在此過程進(jìn)行的同時(shí),利用相同的m-1 份數(shù)據(jù)訓(xùn)練,在真正的測試集上預(yù)測;如此重復(fù)m 次,將訓(xùn)練集上m 次結(jié)果疊加為1 列,將測試集上m 次結(jié)果取均值融合為1 列
(3)使用k 個(gè)分類器重復(fù)2 過程。將分別得到k列訓(xùn)練集的預(yù)測結(jié)果,k 列測試集預(yù)測結(jié)果
(4)訓(xùn)練過程3 得到的數(shù)據(jù)。將k 列訓(xùn)練集預(yù)測結(jié)果和訓(xùn)練集真實(shí)label 進(jìn)行訓(xùn)練,將k 列測試集預(yù)測結(jié)果作為測試集
具體地,我們使用Stacking 融合隨機(jī)森林和XG?Boost 構(gòu)建一個(gè)新模型的過程如圖1 所示。
圖1
融合后得到的結(jié)果
相較于融合之前又有了提高。對(duì)比融合前后價(jià)格預(yù)測實(shí)驗(yàn)結(jié)果,也可以觀察到明顯改進(jìn),以成都-廣州的某航班為例,預(yù)測1 月到9 月的起飛前7 天的價(jià)格,融合前后的預(yù)測效果對(duì)比如圖2。
圖2
本文基于大量的實(shí)際數(shù)據(jù)和行業(yè)知識(shí)構(gòu)建了預(yù)測模型,并在經(jīng)典模型上做了一定改進(jìn),在測試集上取得了良好的預(yù)測效果。該模型最終應(yīng)用到實(shí)際場景后,預(yù)測效果雖不及在測試集上的表現(xiàn),但MAE 仍然可以控制在50 以內(nèi),對(duì)買沒買貴的二元預(yù)測仍然有很高的準(zhǔn)確率,達(dá)到了改進(jìn)產(chǎn)品體驗(yàn),提高銷售轉(zhuǎn)化的目的。