初次機器學(xué)習(xí)比賽復(fù)盤

近幾年,機器學(xué)習(xí)的浪潮席卷了眾多行業(yè),在強(公)大(司)的求(強)知(需)欲(求)下,我開始了探索。各種比賽,無疑是練手和提高能力的好機會。于是,我參加了一個比賽,沒想到運氣不錯,拿了第二名。下面就講一下當(dāng)時的一些思路。

比賽是攜程機票航班延誤預(yù)測算法大賽。拿到賽題怎么辦,先不急,好好審題!(仿佛回到高中…)數(shù)據(jù)主要包括歷史航班動態(tài)起降數(shù)據(jù)、歷史城市天氣表、機場城市對應(yīng)表以及歷史機場特情表。目標是航班計劃起飛時間前2小時,預(yù)測航班是否會延誤3小時以上的概率。

題面很直白,航班延誤大家或多或少都了解,滑頭的點在于題目明確說明了可以利用公開的數(shù)據(jù)。這個其實是需要特別注意的,因為現(xiàn)在市面上有很多現(xiàn)成的預(yù)測服務(wù),而且給的很多數(shù)據(jù)并沒有脫敏,如果有能力完全可以從現(xiàn)成的服務(wù)中獲取很多相關(guān)的數(shù)據(jù)(比如飛行距離)和預(yù)測值,并入自己的模型中以提高成績。我個人并沒有太多空余時間來處理這部分,所以只取了一些非常官方(民航網(wǎng)站和維基百科)的外部數(shù)據(jù)。

分析和處理數(shù)據(jù)

OK,審題以后就是分析數(shù)據(jù)。

歷史航班動態(tài)起降數(shù)據(jù)

這毫無疑問是最重要的部分,是否延誤3小時,就要從這個數(shù)據(jù)表計算出。航班編號和飛機編號幾乎是決定性的,排序編號方便算法處理,起飛降落時間可以獲取非常多的時間屬性,比如小時,早中晚,星期幾,月份等,這些可能都有作用。比如,周末和非周末可能就有不同延誤。再比如節(jié)假日(外部數(shù)據(jù),自己收集)附近延誤可能會更嚴重。

# 每個tuple第一個表示起始日期,第二個表示連續(xù)的天數(shù),后來發(fā)現(xiàn)連續(xù)天數(shù)用處并不大。這個是公開數(shù)據(jù),自己收集
HOLIDAYS = [('2014-10-07', 1), ('2015-01-01', 3), ('2015-01-02', 2), ('2015-01-03', 1), ('2015-02-18', 7), ('2015-02-19', 6) ...]

城市天氣數(shù)據(jù)

最低最高溫度數(shù)據(jù)有缺失, 需要自己想辦法補全(比如靠外部數(shù)據(jù))。我用的補全方式很簡單粗暴,就是缺最低的用最高的補,缺最高的用最低的補即可。主要是因為算下來,這些因素影響不大。而天氣本身,我用了一個天氣向量表示:

WEATHER_NAMES = ['雷陣雨', '陣雨', '暴雨', '大雨', '雨', '多云', '晴', '霧']
# 下面是提取的全量,但是用處并不大。最終用的是上面的簡化版
# WEATHER_NAMES = ['雷陣雨', '雷雨', '陣雨', '暴雨', '凍雨', '大雨', '中雨', '小雨', '雨', '大雪', '陣雪', '中雪', '小雪', '冰雪', '雪', '嚴寒', '多云', '少云', '低云', '晴', '颶風(fēng)', '狂風(fēng)', '大風(fēng)', '風(fēng)', '霾', '揚沙', '冰霰', '沙塵暴', '濃霧', '霧', '浮塵', '陰']

由于天氣中會出現(xiàn)“轉(zhuǎn)”字,代表天氣的變換,可以用兩個連續(xù)的天氣向量表示, 因為最后試驗出來用處不大,我是在一個向量中表示的:

# 例如‘雷陣雨轉(zhuǎn)多云'
vector = [1, 0, 0, 0, 0, 0, 0, 0] + [0, 0, 0, 0, 0, 0, 1, 0]
# 而我實際用的類似下面的表示法
vector = [1, 0, 0, 0, 0, 0, 1, 0]

機場城市對應(yīng)數(shù)據(jù)

用來連接各個表的。無需多說。

機場特情表

基本上都是要延誤,影響起飛的意思。直接獲取對應(yīng)的開始和結(jié)束時間作為影響因素,當(dāng)然完全可以對具體特請內(nèi)容做一些簡單的文本分析,提取一些關(guān)鍵詞等。

一些非常規(guī)處理

數(shù)據(jù)初步處理后,如果回過頭檢查,會發(fā)現(xiàn)有很多缺失的??梢宰约合胄┖唵蔚霓k法補全。比如,有些機場代碼對應(yīng)出來的城市就是沒有天氣信息?;叵胄r候看中央臺的天氣預(yù)報,其實也沒有自己家鄉(xiāng)的名字,參考最近的大城市的天氣即可。所以,這里可以采取同樣的方式,進行一個簡單的替換:

CITY_NAME_MAPPING = {''三沙': '三亞', '荔波': '遵義', '甘南': '臨夏' ...}

特征

這是我個人最終用到的特征,肯定不是最優(yōu)的。

  1. 航班號被拆解成了: 航空公司, 編號本身, 是否候補。 航空公司的排序, 是根據(jù)公司的平均航班延誤從小到大排列的。具體拆解原理來自百科
  2. 預(yù)計起飛時間做了轉(zhuǎn)化,變成 小時、月份、星期等
  3. 預(yù)計結(jié)束時間只保留了小時(因為跟起飛很類似)
  4. 根據(jù)預(yù)計起飛時間,計算了距離之前、之后節(jié)假日(五一、中秋、國慶之類)的天數(shù),因為最開始認為延誤與節(jié)假日關(guān)聯(lián)比較大,后來實驗發(fā)現(xiàn)影響不大
  5. 如果出發(fā)機場在預(yù)警(特請內(nèi)容)中,記錄距離預(yù)警開始和結(jié)束的時間。同樣記錄到達機場的預(yù)警。只有預(yù)計起飛兩小時之前收到這些預(yù)警,才把預(yù)警作為考慮因為。
  6. 預(yù)計起飛前兩小時,出發(fā)機場延誤的飛機個數(shù)。因為數(shù)據(jù)缺損比較多,其實這個數(shù)不那么準確,但是我發(fā)現(xiàn)這是影響延誤的一個重要因素。
  7. 前序航班的起飛延誤時間。因為數(shù)據(jù)缺損比較多,其實這個數(shù)不那么準確,但是我發(fā)現(xiàn)這也是影響延誤的一個重要因素。
  8. 各種平均值(也就是歷史信息), 比如出發(fā)機場的平均延誤時間,平均每天延誤航班數(shù),航班平均延誤時長,飛機平均延誤時長等數(shù)據(jù)。本來我計算過每天的延誤時長等數(shù)據(jù),打算預(yù)測時加上“機場前一天的平均延誤”這樣的信息,但是發(fā)現(xiàn)預(yù)測效果并不好。[大概因為數(shù)據(jù)缺損等因素,導(dǎo)致平均值不準確]
  9. 出發(fā)地的天氣信息,最低最高溫度,以及到達地的這些信息。
  10. 標簽。 我用的不是0準時,1延誤兩個標簽, 而是多個。 0表示準點或延誤3小時以內(nèi),1表示3到4小時, 2表示4到5小時,3表示5小時以上,4表示取消。預(yù)測時,標簽1、2、3、4的可能性相加,代表延誤的可能性。

模型

模型沒太多好BB的。網(wǎng)上特別多通用的優(yōu)化方式。我在編寫過程中嘗試了多種不同的模型,最后根據(jù)實際情況(包括準確度,運行時間等)選擇了stacking。 基礎(chǔ)層中用的是sklearnrandom forest, extra treesxgboostXGBClassifier。 第二層中用的是lightgbmLGBMClassifier

訓(xùn)練、調(diào)參時, fold可以設(shè)置5, 最終預(yù)測時fold設(shè)置10。

調(diào)參過程就是RandomizedSearchCV和GridSearchCV根據(jù)情況換著用即可。

細節(jié)補充

好了, 這應(yīng)該是比較風(fēng)騷的部分了。其實大概每個比賽都有一些領(lǐng)域相關(guān)的操作吧,需要在各種嘗試中慢慢打開腦洞。

  1. 訓(xùn)練集對于缺失的數(shù)據(jù)直接丟棄, 測試集中測試數(shù)據(jù)采用默認值補全。
  2. 機場代碼,是根據(jù)2016客流量排序的,在wikipedia上可以查到。
  3. 實際試驗中,為了節(jié)省時間, 往往不會用全量的訓(xùn)練集作訓(xùn)練和調(diào)參,所以我經(jīng)常會從test ABC中取數(shù)據(jù),構(gòu)成臨時的訓(xùn)練集。后來發(fā)現(xiàn),用這種跟測試臨近的部分數(shù)據(jù),可能比用全量數(shù)據(jù)效果要好。我的理解是,大概航班延誤有一定的短期趨勢(比如可能被額外的信息影響,但比賽并未提供相應(yīng)數(shù)據(jù))。 舉個例子,為了預(yù)測8月的數(shù)據(jù),可能要5,6,7或者4, 5,6,7月的訓(xùn)練數(shù)據(jù)就行了, 用前兩年的反而效果會差。

結(jié)語

大概情況就是這樣。從比賽中學(xué)到了很多平時看教程學(xué)不到的知識點,實戰(zhàn)中提高了python編碼能力,初步了解了一些腦洞大開的操作,收獲良多。而且第一次比賽能拿到名次,還是蠻開心的~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容