雷鋒網 AI 科技評論按:Kaggle Home Credit Default Risk 比賽日前落下帷幕,該比賽總獎金 7 萬美元,第一名獎金 35000 美元,第二名獎金 25000 美元,第三名獎金 10000 美元。該競賽從 2018 年 5 月 17 日持續到 2018 年 8 月 29 日,共吸引到 7198 支參賽隊伍,競爭異常激烈。由 Michael Jahrer 擔任隊長的 Home Aloan 隊獲得第一名。
比賽介紹
許多人由於較少甚至沒有使用過信用卡消費,因而很難獲得貸款,而且這類群體往往又被不值得信賴的借款人利用。Home Credit 希望為沒有銀行帳戶的群體提供正當且安全的貸款服務,為了判斷這類群體的貸款是否正當合理,Home Credit 利用不同來源的數據(電話和交易記錄等)來預測這些人的償債能力。基於以上原因,Home Credit 在 Kaggle 上發起了一場貸款償債能力預測的比賽,並提供了豐富的數據。
此次比賽的評測指標採用的是 AUC,要求參賽人員或隊伍對測試集的每個 SK_ID_CURR 預測 TARGET(償清貸款)的概率並以文件形式提交到 Kaggle 平臺。
冠軍團隊成員之一 Bojan Tunguz 在 Kaggle 上發表了這支團隊的具體方案,以下是雷鋒 AI 科技評論對這一方案的編譯整理。
比賽冠軍隊伍方案
引言
根據我之前信用擔保的經驗,不得不承認這個問題是應用機器學習領域中最複雜的問題之一。這個領域的數據一般非常混雜,比如數據是在不同時間段上收集的,來自不同途徑,且可能在收集數據的過程中發生改變。此外,找到一個合適的目標變量也很棘手,需要深厚的專業知識和高超的商業分析能力。
插一句,Home Credit 和 Kaggle 提供的這個數據集非常贊,既不會洩露用戶隱私,且易於進行機器學習。
基於對信用擔保的了解,通常來說,很顯然,這種類型的機器學習問題要構建一個很好的比賽模型。有兩種重要思路:1. 一個很好的特徵集合; 2. 不同的基線算法。我們主要有四個充滿多樣性的數據來源,以及少量的次要特徵數據來源。
數據和特徵工程
我們使用的第一個比較大的特徵集合是在許多 kernel 中找到的。這些特徵在多對一的表格上採用不同形式聚合,另外還有申請貸款次數特徵。我們一共使用了大約 700 個特徵。
特徵工程
跟許多人一樣,對於每個 SK_ID_CURR,我們只是基於 SK_ID_PREV 和 SK_ID_BUREAU 的特徵建立基礎模型,另外,我們還基於除法和減法從 application_train.csv 構造了許多特徵。效果最顯著的除法操作是除以 EXT_SOURCE_3,這對我們的 CV(本地做交叉驗證得到的分數)有一個小的提升,也帶來了榜單排名的提升。我們還發現通過為類別變量使用類別編碼器可以獲得相當不錯的提升,我對 application_train.csv 中所有的類別變量建立了類別編碼器,也對 previous_appplication.csv 表中 LAST application 中的所有類別變量建立了類別編碼器。除了聚合 SK_ID_PREV 和 SK_ID_BUREAU,我還使用了數據的不同部分來計算聚合特徵。
Previous_application.csv 聚合了最近的 3、5 次和起初的 2、4 次申請信息。這些申請中的每個變量都有交叉驗證過,使 CV 分數獲得了最大的提升。Installment_payments.csv 聚合了最近的 2、3、5 次的償還貸款信息。我對 NUM_INSTALLMENT_NUMER 上的 1、2、3、4 次分期進行了聚合,對從 DAYS_INSTALLMENT 中過濾出來的最近 60、90、180 和 365 天的分期做了聚合,還對所有逾期付款的分期做了聚合。如果 ENTRY_PAYMENT 的值比 DAYS_INSTALMENT 大,逾期變量就被定義為 1,否則就定義為 0。POS_CASH_balance.csv, credit_card_balance.csv 與 installment_payments.csv 採用了同樣的方法進行特徵聚合。我還使用了來自 previous_application.csv 的 lag 特徵,對於每個 SK_IDCURR,當達到了最近 5 次申請時我就使用 lag 特徵。
Oliver:我是這樣設想的,大部分競賽選手知道我的特徵和數據集。除了 public kernel,我試著計算年利率,這一特徵對模型的影響非常明顯,是促進模型獲得高分的特徵之一。我還試過在一些表(問詢表和之前的申請表)上進行預測,但是因為某些原因,我們的模型沒有像其他團隊那樣得到提升。隨著其他特徵工程經驗豐富的隊員加入,給我們的 CV/LB 帶來極大提升,我就專注於模型融合了。
Phil:我做出來的特徵按照重要性(基於對 LGBM 模型帶來的提升)由高到低排序如下:
1)neighbors_target_mean_500
2)Region_id
3)debt_credit_ratio_None
4)credit_annuity_ratio
5)prev_PRODUCT_COMBINATION
6)DAYS_CREDIT_mean
7)credit_goods_price_ratio
8)last_active_DAYS_CREDIT
9)credit_downpayment
10)AGE_INT
11)installment_payment_ratio_1000_mean_mean
12)annuity_to_max_installment_ratio
Yang:我對特殊特徵的想法是,一些來自於公開的討論方案,包括過去 3、5、10 次信用卡貸款申請、分期付款時間和 pos 機使用記錄,但是我修改了時間段以便在特徵上引入更大的差異性。同時,我應用了加權平均(使用時間段作為權重)來生成一些跟養老金、信用卡和付款相關的特徵。我認為這些特徵對提取個人的信用卡習慣非常有幫助。我想到的最後一個有趣且有用的特徵是:根據收入、付款和時間生成一些 KPI。
Bojan:特徵選擇和壓縮
這次比賽也需要進行特徵壓縮。各種各樣的特徵生成方式通常會導致特徵集合達到上千個,同時很可能大多數特徵是冗餘的、有噪聲的或既冗餘又含有噪聲。
我試了一些簡單的縮減特徵數量的方法,使用數值類型的頻率編碼分類特徵,然後使用嶺回歸跑了一個非常簡單的前向特徵選擇。我過去在元特徵(metafeatures)上使用過這個技術,但這是我第一次試著在原始特徵上使用該方法。令人驚訝的是,這一技術非常湊效。
我能夠將超過 1600 個原始特徵壓縮到大約 240 個。然後當 Oliver 添加更多的特徵到 base set 時,我只是直接將這些特徵加到 240 個特徵中,最後達到 287 個特徵。用這 287 個特徵訓練,CV 分數大約為 0.7985,LB 分數大約為 0.802 - 0.803。
當又有新的成員加入隊伍,試著將他們提供的特徵跟我們的特徵結合就變得尤為重要。Oliver 花了很大的精力來區分 Phil 的哪個特徵與我們的特徵是互補的,最後合併的特徵集合達到了 700 多個。當 Ryan 和 Yang 加入我們隊伍時,再重複那樣的工作太花時間和精力了,我們只是粗略對比哪部分特徵是不同的,然後將那些不同的特徵加入他們的特徵集。
最後,Yang 的 base set 是所有特徵集中最好的。他的一個 Kernel 就能在 private leadboard 上獲得 0.802 的分數,public leadboard 上獲得 0.803 的分數,這在最後階段是前 20 名。我們想要將所有其他特徵集合中的特殊特徵與 Yang 的 base 特徵集合組合,但由於時間關係我們就大概做了一下。我們最終共留下 1800-2000 個特徵。我們有一些合併集,在訓練自己的模型時,我們也分別進行了特徵組合。
基礎模型
我們的所有模型都是採用 5 折交叉驗證。我一開始就這樣選擇了,沒有什麼特別原因,最後也把這個作為默認值。
Oliver:我使用了 LightGBM,FastRGF,嘗試過 FFM,但是 CV 結果比預期低很多(0.76AUC)。
Bojan:我使用了 XGBoost,LightGBM,CatBoost,還有簡單的回歸模型。我在 XGB 上使用了一個超參數集合,在 LightGBMs 上使用了大約三個不同的集合。大部分 XGB 模型都是在 GPU 上使用 gpu_hist 訓練的,而 LightGBM 模型是在 CPU 上訓練的。CatBoost 模型沒有那麼好,訓練需要很久,我認為他們對元特徵的多樣性只起到一點點幫助。
Ryan 和 Yang:我們在工程數據集和工程數據集與剩下數據集的組合數據集上訓練了幾個 LightGBM 模型。Ryan 抱著碰運氣的心態試了試 FFM,但是效果不好。
Michael Jahrer(神經網絡等方面):和大多數人一樣,我閱讀了論壇中的許多討論,神經網絡模型從 AUC 方面來說效果不比集成類的樹模型(LGBM,XGB)好。在比賽過程中,使用神經網絡的話,一開始根本就達不到 0.785,但使用 LGBM 卻可以超過 0.79。當準確率達到一定程度之後,神經網絡是模型融合的熱門之選,我盡力去做好。特徵工程不是我的長項,一開始我做得很差。隊伍合併後我就可以用到大家的特徵集合,效果顯著。所有數據集上的結果都差不多,DAE+NN 效果比只用 NN 要好(差不多高 0.005)。DAE 表示降噪自編碼處理,是神經網絡的輸入,是為了實現更好的數據表達的無監督技術。原始特徵的數量在 100 - 5000 之間,這意味著 DAE 需要非常大,確保表徵是過約束的、沒有完全佔滿的。最初嘗試的幾個 DAE 模型都具有 10000-10000-10000 的拓撲,這意味著把特徵的數量擴增到 3 萬。監督式神經網絡的拓撲為 1000-1000,這是我的標準建議,在這裡也能正常使用。在試了更多神經元之後,得分反而下降了。
以下是一些參數設定:
DAE:swapnoise=0.2,1000 個 epoch。監督式神經網絡:lRate=2.5e-5,dropout=0.5,大約 50 個 epoch(直到過擬合),優化對數損失函數。隱藏單元使用 ReLU,SGD 優化器,minibatchsize=128,小 lRateDecay。完全跑完一次 5 折交叉驗證需要在 GTX 1080Ti 上花一整天,DAE 所佔的時間最多。用 rankGauss 將原始數據歸一化,缺失值用 0 代替。在競賽後期,我在 DAE 中試著減少以及增加隱藏層數目,我認為這樣會更好。在這種情況下得分最高:DAE 只包括一個隱藏層,具有 5 萬個神經元 ,然後接上一個 1000-1000 拓撲的監督式神經網絡,在我們 6 個人的所有特徵集合的併集上跑了下,分數是 CV=0.794961,public=0.80059,private=0.79433。
當不對神經網絡進行優化時,一個簡單的帶有較小學習率的 LGBM 模型優於所有神經網絡模型。LGBM 模型獲得的最高 CV 分數是 0.8039,AUC 比神經網絡大概高 0.01。我認為神經網絡在此扮演了次要角色。我認為神經網絡在這裡的得分比 LGBM 差的原因是數據歸一化問題,但在最後為了 0.0001 的提升,神經網絡還是非常重要,這就是 Kaggle。
模型集成
我們的模型集成共分為三個階段。
每天,當我們得到一個新的基線預測,就生成 L1 稠密矩陣,並輸入到第一層 stacker(NN,XGBoost,LightGBM 和 Hill Climber 線性模型)中。我們最後實現了 90 多個基線預測。隨著基線預測數量的增長,選手排行榜的排名和 CV 分數變得越來越相關。我認為 Michael 的神經網絡雖然在單獨使用時表現沒有很好,但是對 CV 分數和選手排行榜的排名之間的關係更加穩定有很大助益。
在一段時間之後,CV 分數及排名的提升變緩,很顯然,進入了下一階段。
第 2 層模型包括一個卷積神經網絡,一個 ExtraTree 和一個 Hill Climber 線性模型。這時 Silogram 建議我們應該先添加原始特徵再堆疊模型。
最後的預測是將 3 個預測做平均權重融合。
Michael:我們的神經網絡模型是一個成功的 stacker。這裡我使用了普通的監督式神經網絡,帶有一個隱藏層,500 個 ReLU 單元。這裡的技巧是找到合理的初始值:lRate=1e-3,lRateDecay=0.96(在每個 epoch 之後乘以 Irate)。dropout=0.3 也很重要。
Phil:ExtraTrees L3 模型是一個非常淺層的模型(max_depth=4),僅僅在 7 個 L2 模型中加上一個原始特徵 AMT_INCOME_TOTAL,高度正則化 (min_samples_leaf=1000) 。得分為 CV:0.80665,LB:80842,PB:80565。
其他
如上描述,我們沒有在調參上投入太多時間。我試著在 XGB 參數和 LightGBM 模型上運行 Oliver 提供的一個優化腳本,但是本地結果讓人沮喪。那時候我們一直非常依賴模型集成,我們的想法是在不同的超參數上訓練幾個不同的模型,避免生成單個高度優化的模型。
Phil 發現了一件事情,我在論壇上也看到有人提過,有可能在訓練集和測試集上把預測結果調到超過 0.98 AUC。我們在最後才發現這點,當時已經不能用到了。(一些人確信排名靠前的某些隊伍實際上在探索某種對抗驗證和偽標籤的方法)。
我們還嘗試過開發一個預測模型來分辨 EXT_* 特徵起到多大的作用,那些特徵的 AUC 達到 0.78,但是它對提升 CV 和公開 LB 榜的排名都毫無助益。基於我們的分析,我們相信可能是因為這些特徵在訓練集和測試集中比較一致,所以雖然公開排行榜上的分數高於本地 CV 模型的分數,但它在其中起到的作用並不大。
競賽結束後,我仔細看了我們的基礎模型。結果證明,我們最好的 3 個模型都能排到前 10 名,把他們平均起來也能達到第一名。在我看來,這說明了在這種類型的競賽和問題中,特徵工程和特徵選擇是最重要的。因為我們沒有對最好的特徵集合進行優化,也沒有調節訓練模型的超參數,我認為創造出一個能超過我們之前所有模型集成效果的單模型也是很有可能的。
via:Kaggle,雷鋒網 AI 科技評論編譯整理。
雷鋒網(公眾號:雷鋒網)
雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。