Kaggle 数据挖掘比赛经验分享(转)
簡(jiǎn)介?
Kaggle?于?2010?年創(chuàng)立,專注數(shù)據(jù)科學(xué),機(jī)器學(xué)習(xí)競(jìng)賽的舉辦,是全球最大的數(shù)據(jù)科學(xué)社區(qū)和數(shù)據(jù)競(jìng)賽平臺(tái)。筆者從?2013?年開始,陸續(xù)參加了多場(chǎng)?Kaggle上面舉辦的比賽,相繼獲得了?CrowdFlower?搜索相關(guān)性比賽第一名(1326支隊(duì)伍)和?HomeDepot?商品搜索相關(guān)性比賽第三名(2125支隊(duì)伍),曾在?Kaggle?數(shù)據(jù)科學(xué)家排行榜排名全球第十,國(guó)內(nèi)第一。筆者目前在騰訊社交與效果廣告部任職數(shù)據(jù)挖掘工程師,負(fù)責(zé)?Lookalike?相似人群擴(kuò)展相關(guān)工作。此文分享筆者在參加數(shù)據(jù)挖掘比賽過程中的一點(diǎn)心得體會(huì)。
1.Kaggle?基本介紹
Kaggle?于?2010?年創(chuàng)立,專注數(shù)據(jù)科學(xué),機(jī)器學(xué)習(xí)競(jìng)賽的舉辦,是全球最大的數(shù)據(jù)科學(xué)社區(qū)和數(shù)據(jù)競(jìng)賽平臺(tái)。在?Kaggle?上,企業(yè)或者研究機(jī)構(gòu)發(fā)布商業(yè)和科研難題,懸賞吸引全球的數(shù)據(jù)科學(xué)家,通過眾包的方式解決建模問題。而參賽者可以接觸到豐富的真實(shí)數(shù)據(jù),解決實(shí)際問題,角逐名次,贏取獎(jiǎng)金。諸如?Google,Facebook,Microsoft?等知名科技公司均在?Kaggle?上面舉辦過數(shù)據(jù)挖掘比賽。2017年3月,Kaggle?被?Google?CloudNext?收購(gòu)。?
1.1 參賽方式
可以以個(gè)人或者組隊(duì)的形式參加比賽。組隊(duì)人數(shù)一般沒有限制,但需要在?Merger?Deadline?前完成組隊(duì)。為了能參與到比賽中,需要在?Entry?Deadline?前進(jìn)行至少一次有效提交。最簡(jiǎn)單地,可以直接提交官方提供的?Sample?Submission。關(guān)于組隊(duì),建議先單獨(dú)個(gè)人進(jìn)行數(shù)據(jù)探索和模型構(gòu)建,以個(gè)人身份進(jìn)行比賽,在比賽后期(譬如離比賽結(jié)束還有?2~3?周)再進(jìn)行組隊(duì),以充分發(fā)揮組隊(duì)的效果(類似于模型集成,模型差異性越大,越有可能有助于效果的提升,超越單模型的效果)。當(dāng)然也可以一開始就組好隊(duì),方便分工協(xié)作,討論問題和碰撞火花。?
Kaggle?對(duì)比賽的公正性相當(dāng)重視。在比賽中,每個(gè)人只允許使用一個(gè)賬號(hào)進(jìn)行提交。在比賽結(jié)束后?1~2?周內(nèi),Kaggle?會(huì)對(duì)使用多賬號(hào)提交的?Cheater?進(jìn)行剔除(一般會(huì)對(duì)?Top?100?的隊(duì)伍進(jìn)行?Cheater?Detection)。在被剔除者的?Kaggle?個(gè)人頁(yè)面上,該比賽的成績(jī)也會(huì)被刪除,相當(dāng)于該選手從沒參加過這個(gè)比賽。此外,隊(duì)伍之間也不能私自分享代碼或者數(shù)據(jù),除非在論壇上面公開發(fā)布。?
比賽一般只提交測(cè)試集的預(yù)測(cè)結(jié)果,無需提交代碼。每人(或每個(gè)隊(duì)伍)每天有提交次數(shù)的限制,一般為2次或者5次,在?Submission?頁(yè)面會(huì)有提示。?
1.2 比賽獲獎(jiǎng)
Kaggle?比賽獎(jiǎng)金豐厚,一般前三名均可以獲得獎(jiǎng)金。在最近落幕的第二屆?National?Data?Science?Bowl?中,總獎(jiǎng)金池高達(dá)?100W?美刀,其中第一名可以獲得?50W?美刀的獎(jiǎng)勵(lì),即使是第十名也能收獲?2.5W?美刀的獎(jiǎng)金。?
獲獎(jiǎng)的隊(duì)伍需要在比賽結(jié)束后?1~2?周內(nèi),準(zhǔn)備好可執(zhí)行的代碼以及?README,算法說明文檔等提交給?Kaggle?來進(jìn)行獲獎(jiǎng)資格的審核。Kaggle?會(huì)邀請(qǐng)獲獎(jiǎng)隊(duì)伍在?Kaggle?Blog?中發(fā)表?Interview,來分享比賽故事和經(jīng)驗(yàn)心得。對(duì)于某些比賽,Kaggle?或者主辦方會(huì)邀請(qǐng)獲獎(jiǎng)隊(duì)伍進(jìn)行電話/視頻會(huì)議,獲獎(jiǎng)隊(duì)伍進(jìn)行?Presentation,并與主辦方團(tuán)隊(duì)進(jìn)行交流。?
1.3 比賽類型
從?Kaggle?提供的官方分類來看,可以劃分為以下類型(如下圖1所示):
◆?Featured:商業(yè)或科研難題,獎(jiǎng)金一般較為豐厚;
◆?Recruitment:比賽的獎(jiǎng)勵(lì)為面試機(jī)會(huì);
◆?Research:科研和學(xué)術(shù)性較強(qiáng)的比賽,也會(huì)有一定的獎(jiǎng)金,一般需要較強(qiáng)的領(lǐng)域和專業(yè)知識(shí);
◆?Playground:提供一些公開的數(shù)據(jù)集用于嘗試模型和算法;
◆?Getting?Started:提供一些簡(jiǎn)單的任務(wù)用于熟悉平臺(tái)和比賽;
◆?In?Class:用于課堂項(xiàng)目作業(yè)或者考試。
圖1.?Kaggle?比賽類型?
從領(lǐng)域歸屬劃分:包含搜索相關(guān)性,廣告點(diǎn)擊率預(yù)估,銷量預(yù)估,貸款違約判定,癌癥檢測(cè)等。
從任務(wù)目標(biāo)劃分:包含回歸,分類(二分類,多分類,多標(biāo)簽),排序,混合體(分類+回歸)等。
從數(shù)據(jù)載體劃分:包含文本,語音,圖像和時(shí)序序列等。
從特征形式劃分:包含原始數(shù)據(jù),明文特征,脫敏特征(特征的含義不清楚)等。?
1.4 比賽流程
一個(gè)數(shù)據(jù)挖掘比賽的基本流程如下圖2所示,具體的模塊我將在下一章進(jìn)行展開陳述。
圖2.?數(shù)據(jù)挖掘比賽基本流程
?
這里想特別強(qiáng)調(diào)的一點(diǎn)是,Kaggle?在計(jì)算得分的時(shí)候,有Public?Leaderboard?(LB)和?Private?LB?之分。具體而言,參賽選手提交整個(gè)測(cè)試集的預(yù)測(cè)結(jié)果,Kaggle?使用測(cè)試集的一部分計(jì)算得分和排名,實(shí)時(shí)顯示在?Public?LB上,用于給選手提供及時(shí)的反饋和動(dòng)態(tài)展示比賽的進(jìn)行情況;測(cè)試集的剩余部分用于計(jì)算參賽選手的最終得分和排名,此即為?Private?LB,在比賽結(jié)束后會(huì)揭曉。用于計(jì)算?Public?LB?和?Private?LB?的數(shù)據(jù)有不同的劃分方式,具體視比賽和數(shù)據(jù)的類型而定,一般有隨機(jī)劃分,按時(shí)間劃分或者按一定規(guī)則劃分。
?
這個(gè)過程可以概括如下圖3所示,其目的是避免模型過擬合,以得到泛化能力好的模型。如果不設(shè)置?Private?LB(即所有的測(cè)試數(shù)據(jù)都用于計(jì)算?Public?LB),選手不斷地從?Public?LB(即測(cè)試集)中獲得反饋,進(jìn)而調(diào)整或篩選模型。這種情況下,測(cè)試集實(shí)際上是作為驗(yàn)證集參與到模型的構(gòu)建和調(diào)優(yōu)中來。Public?LB上面的效果并非是在真實(shí)未知數(shù)據(jù)上面的效果,不能可靠地反映模型的效果。劃分?Public?LB?和?Private?LB?這樣的設(shè)置,也在提醒參賽者,我們建模的目標(biāo)是要獲得一個(gè)在未知數(shù)據(jù)上表現(xiàn)良好的模型,而并非僅僅是在已知數(shù)據(jù)上效果好。
圖3.?劃分?Public?LB?和?Private?LB的目的
(圖參考?Owenzhang?的分享?[1])
?
?2.數(shù)據(jù)挖掘比賽基本流程?
從上面圖2可以看到,做一個(gè)數(shù)據(jù)挖掘比賽,主要包含了數(shù)據(jù)分析,數(shù)據(jù)清洗,特征工程,模型訓(xùn)練和驗(yàn)證等四個(gè)大的模塊,以下來一一對(duì)其進(jìn)行介紹。?
2.1 數(shù)據(jù)分析
數(shù)據(jù)分析可能涉及以下方面:
◆?分析特征變量的分布
◇?特征變量為連續(xù)值:如果為長(zhǎng)尾分布并且考慮使用線性模型,可以對(duì)變量進(jìn)行冪變換或者對(duì)數(shù)變換。
◇?特征變量為離散值:觀察每個(gè)離散值的頻率分布,對(duì)于頻次較低的特征,可以考慮統(tǒng)一編碼為“其他”類別。
◆?分析目標(biāo)變量的分布
◇?目標(biāo)變量為連續(xù)值:查看其值域范圍是否較大,如果較大,可以考慮對(duì)其進(jìn)行對(duì)數(shù)變換,并以變換后的值作為新的目標(biāo)變量進(jìn)行建模(在這種情況下,需要對(duì)預(yù)測(cè)結(jié)果進(jìn)行逆變換)。一般情況下,可以對(duì)連續(xù)變量進(jìn)行Box-Cox變換。通過變換可以使得模型更好的優(yōu)化,通常也會(huì)帶來效果上的提升。
◇?目標(biāo)變量為離散值:如果數(shù)據(jù)分布不平衡,考慮是否需要上采樣/下采樣;如果目標(biāo)變量在某個(gè)ID上面分布不平衡,在劃分本地訓(xùn)練集和驗(yàn)證集的時(shí)候,需要考慮分層采樣(Stratified?Sampling)。
◆?分析變量之間兩兩的分布和相關(guān)度
◇?可以用于發(fā)現(xiàn)高相關(guān)和共線性的特征。?
通過對(duì)數(shù)據(jù)進(jìn)行探索性分析(甚至有些情況下需要肉眼觀察樣本),還可以有助于啟發(fā)數(shù)據(jù)清洗和特征抽取,譬如缺失值和異常值的處理,文本數(shù)據(jù)是否需要進(jìn)行拼寫糾正等。?
2.2 數(shù)據(jù)清洗
數(shù)據(jù)清洗是指對(duì)提供的原始數(shù)據(jù)進(jìn)行一定的加工,使得其方便后續(xù)的特征抽取。其與特征抽取的界限有時(shí)也沒有那么明確。常用的數(shù)據(jù)清洗一般包括:
◆?數(shù)據(jù)的拼接
◇ 提供的數(shù)據(jù)散落在多個(gè)文件,需要根據(jù)相應(yīng)的鍵值進(jìn)行數(shù)據(jù)的拼接。
◆?特征缺失值的處理
◇?特征值為連續(xù)值:按不同的分布類型對(duì)缺失值進(jìn)行補(bǔ)全:偏正態(tài)分布,使用均值代替,可以保持?jǐn)?shù)據(jù)的均值;偏長(zhǎng)尾分布,使用中值代替,避免受?outlier?的影響;
◇?特征值為離散值:使用眾數(shù)代替。
◆?文本數(shù)據(jù)的清洗
◇?在比賽當(dāng)中,如果數(shù)據(jù)包含文本,往往需要進(jìn)行大量的數(shù)據(jù)清洗工作。如去除HTML?標(biāo)簽,分詞,拼寫糾正,?同義詞替換,去除停詞,抽詞干,數(shù)字和單位格式統(tǒng)一等。?
2.3 特征工程
有一種說法是,特征決定了效果的上限,而不同模型只是以不同的方式或不同的程度來逼近這個(gè)上限。這樣來看,好的特征輸入對(duì)于模型的效果至關(guān)重要,正所謂”Garbage?in,?garbage?out”。要做好特征工程,往往跟領(lǐng)域知識(shí)和對(duì)問題的理解程度有很大的關(guān)系,也跟一個(gè)人的經(jīng)驗(yàn)相關(guān)。特征工程的做法也是Case?by?Case,以下就一些點(diǎn),談?wù)勛约旱囊恍┛捶ā?
2.3.1 特征變換
主要針對(duì)一些長(zhǎng)尾分布的特征,需要進(jìn)行冪變換或者對(duì)數(shù)變換,使得模型(LR或者DNN)能更好的優(yōu)化。需要注意的是,Random?Forest?和?GBDT?等模型對(duì)單調(diào)的函數(shù)變換不敏感。其原因在于樹模型在求解分裂點(diǎn)的時(shí)候,只考慮排序分位點(diǎn)。?
2.3.2 特征編碼
對(duì)于離散的類別特征,往往需要進(jìn)行必要的特征轉(zhuǎn)換/編碼才能將其作為特征輸入到模型中。常用的編碼方式有?LabelEncoder,OneHotEncoder(sklearn里面的接口)。譬如對(duì)于”性別”這個(gè)特征(取值為男性和女性),使用這兩種方式可以分別編碼為{0,1}和{[1,0],?[0,1]}。
?
對(duì)于取值較多(如幾十萬)的類別特征(ID特征),直接進(jìn)行OneHotEncoder編碼會(huì)導(dǎo)致特征矩陣非常巨大,影響模型效果。可以使用如下的方式進(jìn)行處理:
◆ 統(tǒng)計(jì)每個(gè)取值在樣本中出現(xiàn)的頻率,取?Top?N?的取值進(jìn)行?One-hot?編碼,剩下的類別分到“其他“類目下,其中?N?需要根據(jù)模型效果進(jìn)行調(diào)優(yōu);
◆?統(tǒng)計(jì)每個(gè)?ID?特征的一些統(tǒng)計(jì)量(譬如歷史平均點(diǎn)擊率,歷史平均瀏覽率)等代替該?ID?取值作為特征,具體可以參考?Avazu?點(diǎn)擊率預(yù)估比賽第二名的獲獎(jiǎng)方案;
◆?參考?word2vec?的方式,將每個(gè)類別特征的取值映射到一個(gè)連續(xù)的向量,對(duì)這個(gè)向量進(jìn)行初始化,跟模型一起訓(xùn)練。訓(xùn)練結(jié)束后,可以同時(shí)得到每個(gè)ID的Embedding。具體的使用方式,可以參考?Rossmann?銷量預(yù)估競(jìng)賽第三名的獲獎(jiǎng)方案,https://github.com/entron/entity-embedding-rossmann。?
對(duì)于?Random?Forest?和?GBDT?等模型,如果類別特征存在較多的取值,可以直接使用?LabelEncoder?后的結(jié)果作為特征。?
2.4 模型訓(xùn)練和驗(yàn)證
2.4.1 模型選擇
在處理好特征后,我們可以進(jìn)行模型的訓(xùn)練和驗(yàn)證。
◆ 對(duì)于稀疏型特征(如文本特征,One-hot的ID類特征),我們一般使用線性模型,譬如?Linear?Regression?或者?Logistic?Regression。Random?Forest?和?GBDT?等樹模型不太適用于稀疏的特征,但可以先對(duì)特征進(jìn)行降維(如PCA,SVD/LSA等),再使用這些特征。稀疏特征直接輸入?DNN?會(huì)導(dǎo)致網(wǎng)絡(luò)?weight?較多,不利于優(yōu)化,也可以考慮先降維,或者對(duì)?ID?類特征使用?Embedding?的方式;
◆ 對(duì)于稠密型特征,推薦使用?XGBoost?進(jìn)行建模,簡(jiǎn)單易用效果好;
◆ 數(shù)據(jù)中既有稀疏特征,又有稠密特征,可以考慮使用線性模型對(duì)稀疏特征進(jìn)行建模,將其輸出與稠密特征一起再輸入?XGBoost/DNN?建模,具體可以參考2.5.2節(jié)?Stacking?部分。?
2.4.2 調(diào)參和模型驗(yàn)證
對(duì)于選定的特征和模型,我們往往還需要對(duì)模型進(jìn)行超參數(shù)的調(diào)優(yōu),才能獲得比較理想的效果。調(diào)參一般可以概括為以下三個(gè)步驟:
1.?訓(xùn)練集和驗(yàn)證集的劃分。根據(jù)比賽提供的訓(xùn)練集和測(cè)試集,模擬其劃分方式對(duì)訓(xùn)練集進(jìn)行劃分為本地訓(xùn)練集和本地驗(yàn)證集。劃分的方式視具體比賽和數(shù)據(jù)而定,常用的方式有:
a)?隨機(jī)劃分:譬如隨機(jī)采樣?70%?作為訓(xùn)練集,剩余的?30%?作為測(cè)試集。在這種情況下,本地可以采用?KFold?或者?Stratified?KFold?的方法來構(gòu)造訓(xùn)練集和驗(yàn)證集。
b)?按時(shí)間劃分:一般對(duì)應(yīng)于時(shí)序序列數(shù)據(jù),譬如取前?7?天數(shù)據(jù)作為訓(xùn)練集,后?1?天數(shù)據(jù)作為測(cè)試集。這種情況下,劃分本地訓(xùn)練集和驗(yàn)證集也需要按時(shí)間先后劃分。常見的錯(cuò)誤方式是隨機(jī)劃分,這種劃分方式可能會(huì)導(dǎo)致模型效果被高估。
c)?按某些規(guī)則劃分:在?HomeDepot?搜索相關(guān)性比賽中,訓(xùn)練集和測(cè)試集中的?Query?集合并非完全重合,兩者只有部分交集。而在另外一個(gè)相似的比賽中(CrowdFlower?搜索相關(guān)性比賽),訓(xùn)練集和測(cè)試集具有完全一致的?Query?集合。對(duì)于?HomeDepot?這個(gè)比賽中,訓(xùn)練集和驗(yàn)證集數(shù)據(jù)的劃分,需要考慮?Query?集合并非完全重合這個(gè)情況,其中的一種方法可以參考第三名的獲獎(jiǎng)方案,https://github.com/ChenglongChen/Kaggle_HomeDepot。
2.?指定參數(shù)空間。在指定參數(shù)空間的時(shí)候,需要對(duì)模型參數(shù)以及其如何影響模型的效果有一定的了解,才能指定出合理的參數(shù)空間。譬如DNN或者XGBoost中學(xué)習(xí)率這個(gè)參數(shù),一般就選?0.01?左右就?OK?了(太大可能會(huì)導(dǎo)致優(yōu)化算法錯(cuò)過最優(yōu)化點(diǎn),太小導(dǎo)致優(yōu)化收斂過慢)。再如?Random?Forest,一般設(shè)定樹的棵數(shù)范圍為?100~200?就能有不錯(cuò)的效果,當(dāng)然也有人固定數(shù)棵數(shù)為?500,然后只調(diào)整其他的超參數(shù)。
3.?按照一定的方法進(jìn)行參數(shù)搜索。常用的參數(shù)搜索方法有,Grid?Search,Random?Search以及一些自動(dòng)化的方法(如?Hyperopt)。其中,Hyperopt?的方法,根據(jù)歷史已經(jīng)評(píng)估過的參數(shù)組合的效果,來推測(cè)本次評(píng)估使用哪個(gè)參數(shù)組合更有可能獲得更好的效果。有關(guān)這些方法的介紹和對(duì)比,可以參考文獻(xiàn)?[2]。?
2.4.3 適當(dāng)利用?Public?LB?的反饋
在2.4.2節(jié)中我們提到本地驗(yàn)證(Local?Validation)結(jié)果,當(dāng)將預(yù)測(cè)結(jié)果提交到?Kaggle?上時(shí),我們還會(huì)接收到?Public?LB?的反饋結(jié)果。如果這兩個(gè)結(jié)果的變化趨勢(shì)是一致的,如?Local?Validation?有提升,Public?LB?也有提升,我們可以借助?Local?Validation?的變化來感知模型的演進(jìn)情況,而無需靠大量的?Submission。如果兩者的變化趨勢(shì)不一致,需要考慮2.4.2節(jié)中提及的本地訓(xùn)練集和驗(yàn)證集的劃分方式,是否跟訓(xùn)練集和測(cè)試集的劃分方式一致。?
另外,在以下一些情況下,往往?Public?LB?反饋亦會(huì)提供有用信息,適當(dāng)?shù)厥褂眠@些反饋也許會(huì)給你帶來優(yōu)勢(shì)。如圖4所示,(a)和(b)表示數(shù)據(jù)與時(shí)間沒有明顯的關(guān)系(如圖像分類),(c)和(d)表示數(shù)據(jù)隨時(shí)間變化(如銷量預(yù)估中的時(shí)序序列)。(a)和(b)的區(qū)別在于,訓(xùn)練集樣本數(shù)相對(duì)于?Public?LB?的量級(jí)大小,其中(a)中訓(xùn)練集樣本數(shù)遠(yuǎn)超于?Public?LB?的樣本數(shù),這種情況下基于訓(xùn)練集的?Local?Validation?更可靠;而(b)中,訓(xùn)練集數(shù)目與?Public?LB?相當(dāng),這種情況下,可以結(jié)合?Public?LB?的反饋來指導(dǎo)模型的選擇。一種融合的方式是根據(jù)?Local?Validation?和?Public?LB?的樣本數(shù)目,按比例進(jìn)行加權(quán)。譬如評(píng)估標(biāo)準(zhǔn)為正確率,Local?Validation?的樣本數(shù)為?N_l,正確率為?A_l;Public?LB?的樣本數(shù)為?N_p,正確率為?A_p。則可以使用融合后的指標(biāo):(N_l?*?A_l?+?N_p?*?A_p)/(N_l?+?N_p),來進(jìn)行模型的篩選。對(duì)于(c)和(d),由于數(shù)據(jù)分布跟時(shí)間相關(guān),很有必要使用?Public?LB?的反饋來進(jìn)行模型的選擇,尤其對(duì)于(c)圖所示的情況。
圖4.?適當(dāng)利用?Public?LB?的反饋
(圖參考?Owenzhang?的分享?[1])
?
2.5 模型集成
如果想在比賽中獲得名次,幾乎都要進(jìn)行模型集成(組隊(duì)也是一種模型集成)。關(guān)于模型集成的介紹,已經(jīng)有比較好的博文了,可以參考?[3]。在這里,我簡(jiǎn)單介紹下常用的方法,以及個(gè)人的一些經(jīng)驗(yàn)。?
2.5.1 Averaging 和 Voting
直接對(duì)多個(gè)模型的預(yù)測(cè)結(jié)果求平均或者投票。對(duì)于目標(biāo)變量為連續(xù)值的任務(wù),使用平均;對(duì)于目標(biāo)變量為離散值的任務(wù),使用投票的方式。?
2.5.2 Stacking
圖5.?5-Fold?Stacking
(圖參考?Jeong-Yoon?Lee?的分享?[4])
?
圖5展示了使用?5-Fold?進(jìn)行一次?Stacking?的過程(當(dāng)然在其上可以再疊加?Stage?2,?Stage?3?等)。其主要的步驟如下:
1.?數(shù)據(jù)集劃分。將訓(xùn)練數(shù)據(jù)按照5-Fold進(jìn)行劃分(如果數(shù)據(jù)跟時(shí)間有關(guān),需要按時(shí)間劃分,更一般的劃分方式請(qǐng)參考3.4.2節(jié),這里不再贅述);
2.?基礎(chǔ)模型訓(xùn)練 I(如圖5第一行左半部分所示)。按照交叉驗(yàn)證(Cross?Validation)的方法,在訓(xùn)練集(Training?Fold)上面訓(xùn)練模型(如圖灰色部分所示),并在驗(yàn)證集(Validation?Fold)上面做預(yù)測(cè),得到預(yù)測(cè)結(jié)果(如圖黃色部分所示)。最后綜合得到整個(gè)訓(xùn)練集上面的預(yù)測(cè)結(jié)果(如圖第一個(gè)黃色部分的CV?Prediction所示)。
3.?基礎(chǔ)模型訓(xùn)練 II(如圖5第二和三行左半部分所示)。在全量的訓(xùn)練集上訓(xùn)練模型(如圖第二行灰色部分所示),并在測(cè)試集上面做預(yù)測(cè),得到預(yù)測(cè)結(jié)果(如圖第三行虛線后綠色部分所示)。
4.?Stage?1 模型集成訓(xùn)練 I(如圖5第一行右半部分所示)。將步驟?2?中得到的?CV?Prediction?當(dāng)作新的訓(xùn)練集,按照步驟?2?可以得到?Stage?1模型集成的?CV?Prediction。
5.?Stage?1 模型集成訓(xùn)練 II(如圖5第二和三行右半部分所示)。將步驟?2?中得到的?CV?Prediction?當(dāng)作新的訓(xùn)練集和步驟?3?中得到的?Prediction?當(dāng)作新的測(cè)試集,按照步驟?3?可以得到?Stage?1?模型集成的測(cè)試集?Prediction。此為?Stage?1?的輸出,可以提交至?Kaggle?驗(yàn)證其效果。
在圖5中,基礎(chǔ)模型只展示了一個(gè),而實(shí)際應(yīng)用中,基礎(chǔ)模型可以多種多樣,如SVM,DNN,XGBoost?等。也可以相同的模型,不同的參數(shù),或者不同的樣本權(quán)重。重復(fù)4和5兩個(gè)步驟,可以相繼疊加?Stage?2,?Stage?3?等模型。
?
2.5.3 Blending
Blending?與?Stacking?類似,但單獨(dú)留出一部分?jǐn)?shù)據(jù)(如?20%)用于訓(xùn)練?Stage?X?模型。?
2.5.4 Bagging?Ensemble?Selection
Bagging?Ensemble?Selection?[5]?是我在?CrowdFlower?搜索相關(guān)性比賽中使用的方法,其主要的優(yōu)點(diǎn)在于可以以優(yōu)化任意的指標(biāo)來進(jìn)行模型集成。這些指標(biāo)可以是可導(dǎo)的(如?LogLoss?等)和不可導(dǎo)的(如正確率,AUC,Quadratic?Weighted?Kappa等)。它是一個(gè)前向貪婪算法,存在過擬合的可能性,作者在文獻(xiàn)?[5]?中提出了一系列的方法(如?Bagging)來降低這種風(fēng)險(xiǎn),穩(wěn)定集成模型的性能。使用這個(gè)方法,需要有成百上千的基礎(chǔ)模型。為此,在?CrowdFlower?的比賽中,我把在調(diào)參過程中所有的中間模型以及相應(yīng)的預(yù)測(cè)結(jié)果保留下來,作為基礎(chǔ)模型。這樣做的好處是,不僅僅能夠找到最優(yōu)的單模型(Best?Single?Model),而且所有的中間模型還可以參與模型集成,進(jìn)一步提升效果。
?
2.6 自動(dòng)化框架
從上面的介紹可以看到,做一個(gè)數(shù)據(jù)挖掘比賽涉及到的模塊非常多,若有一個(gè)較自動(dòng)化的框架會(huì)使得整個(gè)過程更加的高效。在?CrowdFlower?比賽較前期,我對(duì)整一個(gè)項(xiàng)目的代碼架構(gòu)進(jìn)行了重構(gòu),抽象出來特征工程,模型調(diào)參和驗(yàn)證,以及模型集成等三大模塊,極大的提高了嘗試新特征,新模型的效率,也是我最終能斬獲名次的一個(gè)有利因素。這份代碼開源在?Github?上面,目前是?Github?有關(guān)?Kaggle?競(jìng)賽解決方案的?Most?Stars,地址:https://github.com/ChenglongChen/Kaggle_CrowdFlower。
其主要包含以下部分:
1.?模塊化特征工程
a)?接口統(tǒng)一,只需寫少量的代碼就能夠生成新的特征;
b)?自動(dòng)將單獨(dú)的特征拼接成特征矩陣。
2.?自動(dòng)化模型調(diào)參和驗(yàn)證
a)?自定義訓(xùn)練集和驗(yàn)證集的劃分方法;
b)?使用?Grid?Search?/?Hyperopt?等方法,對(duì)特定的模型在指定的參數(shù)空間進(jìn)行調(diào)優(yōu),并記錄最佳的模型參數(shù)以及相應(yīng)的性能。
3.?自動(dòng)化模型集成
a)?對(duì)于指定的基礎(chǔ)模型,按照一定的方法(如Averaging/Stacking/Blending?等)生成集成模型。
?
3.Kaggle競(jìng)賽方案盤點(diǎn)
到目前為止,Kaggle?平臺(tái)上面已經(jīng)舉辦了大大小小不同的賽事,覆蓋圖像分類,銷量預(yù)估,搜索相關(guān)性,點(diǎn)擊率預(yù)估等應(yīng)用場(chǎng)景。在不少的比賽中,獲勝者都會(huì)把自己的方案開源出來,并且非常樂于分享比賽經(jīng)驗(yàn)和技巧心得。這些開源方案和經(jīng)驗(yàn)分享對(duì)于廣大的新手和老手來說,是入門和進(jìn)階非常好的參考資料。以下筆者結(jié)合自身的背景和興趣,對(duì)不同場(chǎng)景的競(jìng)賽開源方案作一個(gè)簡(jiǎn)單的盤點(diǎn),總結(jié)其常用的方法和工具,以期啟發(fā)思路。?
3.1 圖像分類
3.1.1 任務(wù)名稱
National?Data?Science?Bowl
3.1.2 任務(wù)詳情
隨著深度學(xué)習(xí)在視覺圖像領(lǐng)域獲得巨大成功,Kaggle?上面出現(xiàn)了越來越多跟視覺圖像相關(guān)的比賽。這些比賽的發(fā)布吸引了眾多參賽選手,探索基于深度學(xué)習(xí)的方法來解決垂直領(lǐng)域的圖像問題。NDSB就是其中一個(gè)比較早期的圖像分類相關(guān)的比賽。這個(gè)比賽的目標(biāo)是利用提供的大量的海洋浮游生物的二值圖像,通過構(gòu)建模型,從而實(shí)現(xiàn)自動(dòng)分類。
3.1.3 獲獎(jiǎng)方案
●?1st?place:Cyclic?Pooling?+?Rolling?Feature?Maps?+?Unsupervised?and?Semi-Supervised?Approaches。值得一提的是,這個(gè)隊(duì)伍的主力隊(duì)員也是Galaxy?Zoo行星圖像分類比賽的第一名,其也是Theano中基于FFT的Fast?Conv的開發(fā)者。在兩次比賽中,使用的都是?Theano,而且用的非常溜。方案鏈接:http://benanne.github.io/2015/03/17/plankton.html
●?2nd?place:Deep?CNN?designing?theory?+?VGG-like?model?+?RReLU。這個(gè)隊(duì)伍陣容也相當(dāng)強(qiáng)大,有前MSRA?的研究員Xudong?Cao,還有大神Tianqi?Chen,Naiyan?Wang,Bing?XU等。Tianqi?等大神當(dāng)時(shí)使用的是?CXXNet(MXNet?的前身),也在這個(gè)比賽中進(jìn)行了推廣。Tianqi?大神另外一個(gè)大名鼎鼎的作品就是?XGBoost,現(xiàn)在?Kaggle?上面幾乎每場(chǎng)比賽的?Top?10?隊(duì)伍都會(huì)使用。方案鏈接:https://www.kaggle.com/c/datasciencebowl/discussion/13166
●?17th?place:Realtime?data?augmentation?+?BN?+?PReLU。方案鏈接:https://github.com/ChenglongChen/caffe-windows
3.1.4 常用工具
▲?Theano:?http://deeplearning.net/software/theano/
▲?Keras:?https://keras.io/
▲?Cuda-convnet2:?https://github.com/akrizhevsky/cuda-convnet2
▲?Caffe:?http://caffe.berkeleyvision.org/
▲?CXXNET:?https://github.com/dmlc/cxxnet
▲?MXNet:?https://github.com/dmlc/mxnet
▲?PaddlePaddle:?http://www.paddlepaddle.org/cn/index.html
?
3.2 銷量預(yù)估
3.2.1 任務(wù)名稱
Walmart?Recruiting?-?Store?Sales?Forecasting
3.2.2 任務(wù)詳情
Walmart?提供?2010-02-05?到?2012-11-01?期間的周銷售記錄作為訓(xùn)練數(shù)據(jù),需要參賽選手建立模型預(yù)測(cè)?2012-11-02?到?2013-07-26?周銷售量。比賽提供的特征數(shù)據(jù)包含:Store?ID,?Department?ID,?CPI,氣溫,汽油價(jià)格,失業(yè)率,是否節(jié)假日等。
3.2.3 獲獎(jiǎng)方案
●?1st?place:Time?series?forecasting?method:?stlf?+?arima?+?ets。主要是基于時(shí)序序列的統(tǒng)計(jì)方法,大量使用了?Rob?J?Hyndman?的?forecast?R?包。方案鏈接:https://www.kaggle.com/c/walmart-recruiting-store-sales-forecasting/discussion/8125
●?2nd?place:Time?series?forecasting?+?ML:?arima?+?RF?+?LR?+?PCR。時(shí)序序列的統(tǒng)計(jì)方法+傳統(tǒng)機(jī)器學(xué)習(xí)方法的混合;方案鏈接:https://www.kaggle.com/c/walmart-recruiting-store-sales-forecasting/discussion/8023
●?16th?place:Feature?engineering?+?GBM。方案鏈接:https://github.com/ChenglongChen/Kaggle_Walmart-Recruiting-Store-Sales-Forecasting
3.2.4 常用工具
▲?R?forecast?package:?https://cran.r-project.org/web/packages/forecast/index.html
▲?R?GBM?package:?https://cran.r-project.org/web/packages/gbm/index.html
?
3.3 搜索相關(guān)性
3.3.1 任務(wù)名稱
CrowdFlower?Search?Results?Relevance
3.3.2 任務(wù)詳情
比賽要求選手利用約幾萬個(gè)?(query,?title,?description)?元組的數(shù)據(jù)作為訓(xùn)練樣本,構(gòu)建模型預(yù)測(cè)其相關(guān)性打分?{1,?2,?3,?4}。比賽提供了?query,?title和description的原始文本數(shù)據(jù)。比賽使用?Quadratic?Weighted?Kappa?作為評(píng)估標(biāo)準(zhǔn),使得該任務(wù)有別于常見的回歸和分類任務(wù)。
3.3.3 獲獎(jiǎng)方案
●?1st?place:Data?Cleaning?+?Feature?Engineering?+?Base?Model?+?Ensemble。對(duì)原始文本數(shù)據(jù)進(jìn)行清洗后,提取了屬性特征,距離特征和基于分組的統(tǒng)計(jì)特征等大量的特征,使用了不同的目標(biāo)函數(shù)訓(xùn)練不同的模型(回歸,分類,排序等),最后使用模型集成的方法對(duì)不同模型的預(yù)測(cè)結(jié)果進(jìn)行融合。方案鏈接:https://github.com/ChenglongChen/Kaggle_CrowdFlower
●?2nd?place:A?Similar?Workflow
●?3rd?place:?A?Similar?Workflow
3.3.4 常用工具
▲?NLTK:?http://www.nltk.org/
▲?Gensim:?https://radimrehurek.com/gensim/
▲?XGBoost:?https://github.com/dmlc/xgboost
▲?RGF:?https://github.com/baidu/fast_rgf
?
3.4 點(diǎn)擊率預(yù)估 I
3.4.1 任務(wù)名稱
Criteo?Display?Advertising?Challenge
3.4.2 任務(wù)詳情
經(jīng)典的點(diǎn)擊率預(yù)估比賽。該比賽中提供了7天的訓(xùn)練數(shù)據(jù),1?天的測(cè)試數(shù)據(jù)。其中有13?個(gè)整數(shù)特征,26?個(gè)類別特征,均脫敏,因此無法知道具體特征含義。
3.4.3 獲獎(jiǎng)方案
●?1st?place:GBDT?特征編碼?+?FFM。臺(tái)大的隊(duì)伍,借鑒了Facebook的方案?[6],使用?GBDT?對(duì)特征進(jìn)行編碼,然后將編碼后的特征以及其他特征輸入到?Field-aware?Factorization?Machine(FFM)?中進(jìn)行建模。方案鏈接:https://www.kaggle.com/c/criteo-display-ad-challenge/discussion/10555
●?3rd?place:Quadratic?Feature?Generation?+?FTRL。傳統(tǒng)特征工程和?FTRL?線性模型的結(jié)合。方案鏈接:https://www.kaggle.com/c/criteo-display-ad-challenge/discussion/10534
●?4th?place:Feature?Engineering?+?Sparse?DNN
3.4.4 常用工具
▲?Vowpal?Wabbit:?https://github.com/JohnLangford/vowpal_wabbit
▲?XGBoost:?https://github.com/dmlc/xgboost
▲?LIBFFM:?http://www.csie.ntu.edu.tw/~r01922136/libffm/
?
3.5 點(diǎn)擊率預(yù)估 II
3.5.1 任務(wù)名稱
Avazu?Click-Through?Rate?Prediction
3.5.2 任務(wù)詳情
點(diǎn)擊率預(yù)估比賽。提供了?10?天的訓(xùn)練數(shù)據(jù),1?天的測(cè)試數(shù)據(jù),并且提供時(shí)間,banner?位置,site,?app,?device?特征等,8個(gè)脫敏類別特征。
3.5.3 獲獎(jiǎng)方案
●?1st?place:Feature?Engineering?+?FFM?+?Ensemble。還是臺(tái)大的隊(duì)伍,這次比賽,他們大量使用了?FFM,并只基于?FFM?進(jìn)行集成。方案鏈接:https://www.kaggle.com/c/avazu-ctr-prediction/discussion/12608
●?2nd?place:Feature?Engineering?+?GBDT?特征編碼?+?FFM?+?Blending。Owenzhang(曾經(jīng)長(zhǎng)時(shí)間雄霸?Kaggle?排行榜第一)的競(jìng)賽方案。Owenzhang?的特征工程做得非常有參考價(jià)值。方案鏈接:https://github.com/owenzhang/kaggle-avazu
3.5.4 常用工具
▲?LIBFFM:?http://www.csie.ntu.edu.tw/~r01922136/libffm/
▲?XGBoost:?https://github.com/dmlc/xgboost
?
?4.參考資料
[1]?Owenzhang?的分享: Tips?for?Data?Science?Competitions
[2]?Algorithms?for?Hyper-Parameter?Optimization
[3]?MLWave博客:Kaggle?Ensembling?Guide
[4]?Jeong-Yoon?Lee?的分享:Winning?Data?Science?Competitions
[5]?Ensemble?Selection?from?Libraries?of?Models
[6]?Practical?Lessons?from?Predicting?Clicks?on?Ads?at?Facebook
轉(zhuǎn)載于:https://www.cnblogs.com/gczr/p/6943617.html
總結(jié)
以上是生活随笔為你收集整理的Kaggle 数据挖掘比赛经验分享(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 28 数组中出现次数超过一半的数字
- 下一篇: bzoj 3594: [Scoi2014