單文煜,吳垠,陳鵬
(1.成都移花互動科技有限公司,成都 610041;2.成都市委辦公廳,成都 610041;3.西華大學計算機與軟件工程學院,成都 610039)
因為民航市場的充分競爭以及航空公司相對先進的收益管理方法,機票價格時常會隨時間大幅波動。面對這種不確定性,部分消費者尤其是個旅消費者,在做購買決策時會猶豫怕買貴,而OTA(Online Travel Agency)在銷售過程中,如果能夠適當提供一些確定性,就可以打消用戶疑慮,提高購買轉化。出于這個目的,我們開始了機票價格預測的研究,并最終變成我們產品中的功能,更好地服務了用戶,為部分價格敏感型用戶提供更多選擇,也讓用戶放心下單。
價格預測本質是一個回歸問題,現在機器學習領域已經有了很多成熟方法來應對各種回歸問題,諸如線性回歸、決策樹回歸、支持向量機回歸、梯度提升回歸、隨機森林回歸、XGBoost 回歸等。
而要在實際應用中取得良好效果,主要取決與兩點:
(1)擁有足夠多高質量數據。正所謂garbage in,garbage out,一些遠離業界的研究因為客觀條件受限,往往只能得到短時間的小范圍的數據。在這樣的數據上得出的模型,很難實際應用。
(2)對所研究問題的業務有足夠深刻的理解。機器學習本身就是一項與經驗關聯十分密切的技術,我們在選擇機器學習算法時所做出的一些決定是否恰當,與算法的優化或技術層面關系并不大,有時對業務細節的掌握,才是踩準方法選擇與參數優化方向的關鍵。
之前已有不少學者進行過這方面的研究,有的采用時間序列分析[1],有的采用貝葉斯算法[2],有的使用CNN[3],都取得了不錯的效果。但他們都有上述兩方面的不足。
我們作為中國移動互聯網的早期參與者,在線旅行行業的創新型企業,自2012 年開始積累了大量的票價數據,也有能力從互聯網上獲取更多的數據。同時,我們作為旅行行業一線工作者,對整個行業,包括供應方、分銷體系、消費者和監管機構都十分了解,是最能理解機票價格是如何構成,如何變化的那群人。這些積累對我們進行這項研究起了非常積極的作用。
數據全都取自歷史業務數據。數據來源有兩方面,一是機票銷售的業務數據,這部分通過中國航信的API 接口查詢獲得,這種方式數據準確,但價格高;二是競爭對手的價格監控數據,這部分通過爬蟲從各大OTA 網站頁面上獲得,這種方式數據不完全可靠,但價格相對低。
中國現在共有超過4000 個國內定期航班,數據量十分龐大,選取其中最有代表性的一部分進行研究已經足夠。我們選取年旅客吞吐量超過100 萬人的主要機場92 個,將各主要機場之間的航班納入分析范圍,提取了2019 年全年每天每個航班未來60 天的經濟艙價格數據。
利用網絡爬蟲獲取如此大量的數據,會碰到諸多障礙:
(1)IP 限制。單IP 大量查詢很容易觸發反爬蟲機制,比較好的解決方案是使用分布式爬蟲,部署在撥號VPS 上
(2)動態頁面。現代互聯網網站大量使用前后端分離,瀏覽器頁面渲染技術,這使得純后端爬蟲得不到需要的數據,應對方案是使用Headless Browser 或瀏覽器插件
(3)驗證碼。就算繞過諸多反制,業務請求過多還是會觸發機器人檢測(驗證碼識別),為這種任務做自動圖像識別其實得不償失,人工打碼是更簡單有效的方法。
所有這些數據在公司日常業務進行的過程中,就已存入了業務數據庫,只是散落在多個數據庫與表中。在開始研究之前需要寫腳本歸集這些數據到一個表中,方便后面的使用。在這個過程中,數據格式統一、缺失數據清理就已經完成,關鍵特征缺失的數據已經被排除在外。
作為機票銷售的一線從業者,這部分更多是從業務理解出發,而不是從數據分析出發,開始就已經把想要的特征考慮好,然后去獲取的這些數據。
民用航空領域的市場化程度非常高,機票價格最終是供求關系決定的。供應端的決定因素主要有航線航司分布、航司與代理的博弈、代理之間的競爭以及主管部門的政策影響,這部分因素相對穩定,短期內不會有大的變化。所以需求端的影響更加重要,需求端的變化也更大,有熱門冷門線路的因素、有消費偏好的因素、有臨時性計劃性的因素、還有重大節假的影響因素,歸納如表1。

表1
按照上表將特征數據數值化,處理過后都是干凈的數據。還需要額外做的處理是:
(1)通過均值分析,daysToFlight 大于 45 以后對價格影響很小,故刪除daysToFlight>45 的數據。
(2)還需要額外處理的是價格。首先是異常值處理,通過查看頻數確定正常邊界,用邊界值填充異常價格。其次價格不服從正態分布,所以在進行回歸之前,必須進行轉換。嘗試用對數變換和無界約翰遜分布擬合,無界約翰遜分布擬合得更好。
我們選用了集成算法來訓練模型。集成算法可以分為bagging 和boosting 兩種集成方式。
Bagging 獨立訓練(可并行)多個基分類器,基分類器相互之間獨立,然后用方法(投票法、平均法、stack?ing)把基分類器集成起來。代表算法為隨機森林,森林的每棵樹都是隨機的。預測最終結果取N 棵樹的平均,保證不會對某些特征的依賴。
Boosting 串行訓練基分類器,基分類器之間相互依賴,每次訓練完一個分類器后調整權重,再訓練下一個分類器。代表算法XGBoost,XGBoost 更加有效應用了數值優化,Kaggle 競賽平臺上的TOP 算法一半以上使用了XGBoost 算法。
評價標準為MAE(Mean Absolute Error),使用經典的五折交叉驗劃分訓練集和測試集,多輪驗證來減小過擬合。訓練代碼如下:

測試結果如表2。

表2
相對于全部樣本712 的均價來說,這個預測精度表現比較好。
模型融合是一種能在各種的機器學習任務上提高準確率的強有力技術,Kaggle 比賽中最常用的就是Stacking 融合,基于初級學習器的概率輸出,來訓練次級學習器。一個Stacking 模型通過使用第一階段的預測作為特征,比相互獨立的訓練模型能夠得到更多的信息。Stacking 訓練過程:
(1)拆解訓練集。將訓練數據隨機且大致均勻的拆為m 份
(2)在拆解后的訓練集上訓練模型,同時在測試集上預測。利用m-1 份訓練數據進行訓練,預測剩余一份;在此過程進行的同時,利用相同的m-1 份數據訓練,在真正的測試集上預測;如此重復m 次,將訓練集上m 次結果疊加為1 列,將測試集上m 次結果取均值融合為1 列
(3)使用k 個分類器重復2 過程。將分別得到k列訓練集的預測結果,k 列測試集預測結果
(4)訓練過程3 得到的數據。將k 列訓練集預測結果和訓練集真實label 進行訓練,將k 列測試集預測結果作為測試集
具體地,我們使用Stacking 融合隨機森林和XG?Boost 構建一個新模型的過程如圖1 所示。

圖1
融合后得到的結果

相較于融合之前又有了提高。對比融合前后價格預測實驗結果,也可以觀察到明顯改進,以成都-廣州的某航班為例,預測1 月到9 月的起飛前7 天的價格,融合前后的預測效果對比如圖2。

圖2
本文基于大量的實際數據和行業知識構建了預測模型,并在經典模型上做了一定改進,在測試集上取得了良好的預測效果。該模型最終應用到實際場景后,預測效果雖不及在測試集上的表現,但MAE 仍然可以控制在50 以內,對買沒買貴的二元預測仍然有很高的準確率,達到了改進產品體驗,提高銷售轉化的目的。