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