機場擁有巨大的旅客吞吐量,與巨大的人員流動相對應的則是巨大的服務壓力。安防、安檢、突發事件應急、值機、行李追蹤等機場服務都希望能夠預測未來的旅客吞吐量,并據此提前調配人力物力,更好的為旅客服務。本次大賽以廣州白雲機場真實的客流資料為基礎,每天數萬離港旅客在機場留下百萬級的資料記錄。希望參賽隊伍通過資料算法來建構客流量預測模型。
提供的資料:
Table
連接配接WIFI AP (Access Point)的人數表 airport_gz_wifi_ap
安檢旅客過關人數表 airport_gz_security_check
旅客進入-離開機場的行程表 airport_gz_departure
航班排班表airport_gz_flights [比賽一段時間後才提供]
機場登機口區域表 airport_gz_gates [比賽一段時間後才提供]
機場WIFI接入點坐标表 airport_gz_wifi_coor [複賽提供的]
例如airport_gz_wifi_ap 表資料概覽:
wifi_ap_tag
passenger_count
time_stamp
E1-1A-1
15
2016-09-10-18-55-04
E1-1A-2
E1-1A-3
38
E1-1A-4
19
送出表格案例:
slice10min
1.1
2016-09-14-15-0
2.2
2016-09-14-15-1
3.3
2016-09-14-15-2
4.4
2016-09-14-15-3
5.5
2016-09-14-15-4
初賽提供了2016-10-09至2016-09-25的資料
<code>簡要概括:均值加趨勢</code>
資料預處理:
提供的表格中時間資料都是精确到秒,而所送出的結果要求是每10分鐘的平均情況,是以我們首先需要将資料按照每十分鐘的間隔彙總起來(詳細代碼見Github)
此處提供兩種方案:
以airport_gz_wifi_ap表為例截取time_stamp的部分字元串,然後按照截取的time_stamp和wifi_ap_tag進行aggregate
<code>t = t0[:15] # 例如将t0 = 2016-09-10-18-55-04截取為t = 2016-09-10-18-5</code>
将資料按照時間排序,然後抽出每十分鐘的資料進行處理後整合,這個方式可能會比較麻煩,但是這個方式有他的優勢,我們隻需調整一個參數,便能讓資料按照任意的時間間隔進行統計,便于以後複用函數
此處附加Python處理時間格式的一些函數
我們可以直接使用pandas中的參數解析時間資料
當然也可以自己寫函數處理
處理後可以得到如下資料,命名為<code>WIFITAPTag_Mean_All</code>
PassengerCountMean
Time
WIFIAPTag
16.2
2016/9/10 19:00
19.7
2016/9/10 19:10
2016/9/10 19:20
20.5
2016/9/10 19:30
2016/9/10 19:40
24.8
2016/9/10 19:50
問題分析:
對于這個預測問題有以下關鍵兩點:
機場每天的排班表基本穩定,使用者在機場内的行走模式也基本穩定
時間序列具有一定程度的連續性,下午三點至六點的情況會一定程度延續此前幾小時的情況
基于以上兩點想法,就得到了兩個基本模型:<code>均值模型</code>和<code>時間序列模型</code>
比賽初期隻提供了前三個表格,是以開始就注重分析了這幾個表格,例如從WIFIAPTag中可以提取出大概的位置資訊和樓層資訊,分組統計不同區域的WIFIAP是否有接近的模式,同時也可從安檢和出發表格中尋找一定的關聯等等。
但是經過分析發現,airport_gz_security_check及airport_gz_departure的資料雖然和airport_gz_wifi_ap的資料有一定的關聯,但是其本身存在較大的随機因素,用随機預測随機存在太大的變數,不如隻使用airport_gz_wifi_ap中的資料進行更穩定的預測(當然肯定也有隊伍能很好得從airport_gz_security_check及airport_gz_departure中提出很很棒的特征)。後期提供的幾個表格由于資料品質問題,經分析後發現貢獻不是特别大,故也沒有進一步利用。
因而之後要說的<code>均值模型</code>和<code>時間序列模型</code>都基于WIFITAPTag_Mean_All表格的資料,并且是以WIFIAP為對象, 每一個分開預測。
資料探索:
接下來讓我們對資料有一個大概的了解
以上函數能提取出特定WIFIAP的時間序列資料,及每10分鐘的平均連接配接數
繪圖結果如下,可以看出每天還是有一定的規律,但是有異常的日子
ts.plot()
由于我們需要預測的是特定某幾個小時的資料,是以需要如下函數提取部分的時間序列
<code>均值模型</code>需要考慮之前每一天同一時間段的情況,是以有如下函數
使用以上函數便可以得到如下結果,其中array的每一行是之前每天下午三點到下午6點的資料
但是之前這麼多天必然有比較異常的日子,是以需要寫如下函數将異常的日子過濾掉,此處的過濾政策是:
對每天特定時間段的資料求均值與标準差,然後将均值與标準差落在10%分位數以下和90%分位數以上的日子去除
例如對剛生成的ts_list處理得到
為了更直覺我們使用如下函數繪圖
DrawTsList(ts_list)
DrawTsList(ts_list[ExceptOutlier(ts_list)])
上圖左側為所有日子的時間序列,右圖為去除異常日子之後的時間序列,可以看出已經将特别異常的幾天去除了
均值模型:
每天的量值都存在一定的差異,直接将所有去除異常之後的日子取均值并不是特别好的政策,在此我們認為,機場下午3點至6點的人流總量應當與當天這個時刻之前的人流量存在一定的關系,是以我們取了上午6點到下午3點這一時間段的資料作為人流量值的參考。我們是有預測當天上午6點到下午3點的資料的,故可以依據此和之前去除異常後的多天該時間段的資料計算之前各天下午3點到下午6點資料的貢獻度。

基于以上思想,并做了一點小修改寫了如下兩個模型,兩個模型比較接近,但是在某些WIFIAP上其中一個會表現好很多,這使得我們之後利用誤差分析挑選模型時多一個候選模型。
時間序列模型:
如果隻用上文提及的均值模型,很可能在3點那個時刻出現斷點的情況,比如前一時刻是15人,後10分鐘突然變成2人,考慮到人們在機場移動具有連續性的特征,我們使用ARMA來對預測進行一定的修正,正所謂穩中求變,模型如下
試運作如下
Do_ARMA('E1-1A-1',TrainTime,PredictTime,4,2,Draw=True)
模型整合:
現在我們有了三個基本模型,單單使用一個模型去預測所有的WIFIAP效果必然不好,每個WIFIAP都有自己最适合的模型,是以我們通過對前一周每天下午3點到6點的資料進行預測,計算每個WIFIAP在每個模型上的平均誤差,讓每個WIFIAP挑選誤差最小的那個模型進行預測。資料有缺失的情況,所有模型中包含了蠻多的異常處理部分。
代碼如下
為了看下混合模型的效果,可以使用如下代碼
Imitate1 占優勢例子
Imitate2 占優勢例子
Do_ARMA 占優勢例子
基于以上元件,便可以進行開心地預測了,結果儲存為airport_gz_passenger_predict.csv
複賽提供了2016-10-09至2016-11-10的資料
<code>簡要概括:多層篩選加均值</code>
基本思路:
複賽是對未來的兩個整天進行預測,基本思路與初賽相似,但是做了如下修改
ARMA模型不再作為一天之内連續性的調整政策,而是用于預測未來兩天整體量值的趨勢
修改了資料的篩選機制
由于複賽是在天池數加平台進行,第一次接觸對于平台并不是太熟悉,是以選擇在其機器學習平台使用SQL節點編寫語句實作模型
解決方案:
首先在資料開發平台讀取資料表
然後在機器學習平台進行資料處理和模型搭建
讀入初始資料預覽如下
使用以下節點預處理資料(每個節點是一條SQL語句,将處理結果傳入下一節點)
使用了如下等語句(這些語句應該可以再精簡些,但是當初寫好了就沒再去修改了)
得到如下結果
其中一個模型大概結構如下
節點确實有點多具體細節就不在此展開,此處簡要提一下複賽中的篩選政策:
首先計算所有日子全部節點每天的平均連接配接量,進而得到一個時間序列。如下圖所示
利用這個時間序列依據ARMA模型估計出之後兩天的量值,依據這量值建立一個區間,篩選出均值落在這個區間内的所有日子,然後對這些天的資料按照初賽的思路再進一步做異常篩選,此外還要進一步加大最近幾日的資料權重,依據這些想法建立模型。最後在某些步驟上做些小修改,共建立三個候選模型,依據初賽的思路進行誤差分析整合模型進行預測。
誤差分析的的結果大概如下,基于誤內插補點可以挑選使用哪個模型
比賽初期其實提取了很多特征,然後使用一些機器學習算法去預測,但是效果卻強差人意,随後結合實際問題思考,發現其實不一定要使用各種特征,而且很多随機因素對各個特征的影響真的蠻大的。僅使用一些簡單的想法也能達到比較好的效果。
是以這次比賽後,想說的就是模型真的不是越複雜越好,也不一定要用各種現成的模型,結合實際問題背景去分析可能會比一直糾結各種特征以及模型參數獲得更大的收益。