一些關於kaggle的比賽方法

自從上次我寫了三月三次輕鬆進入kaggle比賽top20小結後,不少同學私信我詢問我方法和技巧,其實如果仔細看了我的那篇文章,就知道運氣佔了主要部分,在寫完那篇文章後,我就再也沒進過top20了...而且在榜單上比我厲害的國內大佬很多很多,我寫啥恐怕只能招致笑話...

但是如果不回復的話,又感覺不好意思,在這假期的最後一天,我把我掌握的一些共性的方法寫出來,也算對私信我的同學有個交待吧...我也沒拿過金牌,所以更高級的方法我也沒有,但是我基本保證自己知無不言言無不盡了...

文筆不好,寫的很凌亂還望見諒

另外這些方法不一定適合cv,nlp,我沒做過NN主導的比賽

1.local cv

"trust your local cv"幾乎應該是kaggle排在第一位的政治正確,local cv也決定了模型的泛化能力,所以在任何比賽第一件事就是寫好local cv代碼,千萬不要滿足於xgboost或lgb自帶的metric. 我在第一次比賽從public第4掉到private第18就吸取了教訓,但是我能看到很多新參加的選手熱衷於刷榜和開小號,其實你如果做好local cv相當於每天有無窮次提交機會了.做local cv 一定要防止data leakage,比如Porto Seguro』s Safe Driver Prediction 里有很多方法如target encoding以及GP 以及NN生成特徵的方法是存在leakage的,如果你把kfold放在生成特徵之後就會 leakage.

2.比baseline kernel好一點

17年後kaggle社區的分享越來越"過分"了,年初的時候sberbank題就在銅牌區附近了,到instacart前一周第30名自暴自棄突然開源,在到iceberg直接提交kernel結果就能到60多名(top 2%),最近日本旅館題的漏洞百出kernel居然蒙出了個90多名(4%),如果你不比這些baseline做的好一點的話,很可能被一群惡意刷分摸獎的殭屍ID給擠出獎牌區,但是如果能做到稍微比baseline 好一點,基本上就足以拿獎牌了.其實做的比baseline好有很多方法,往下看:

3.特徵工程:

我也不太會做特徵,而且網上很多分享對特徵工程思路的語焉不詳,所以這裡也說不出個所以然,我常常也在想金牌選手為什麼能做出這麼好的特徵:是經驗豐富,還是EDA厲害,還是統計知識紮實,還是有強大的特徵自動生成測試代碼呢?

如果你和我一樣缺乏想像力不知道如何想出好特徵的話,最起碼把所有kernel你能看到的特徵都抄進來,藉助local cv確定有效性.

再者,當別人都在用groupby等自帶函數創建特徵的時候,你能用lambda創建有效特徵,你就做的別人好了.

在特徵工程上我建議大家學習plantsgo 的代碼,在這裡向他表示敬意,不僅實力強還樂於分享

當然,大佬們分享了代碼,但是背後的思考還要自己揣摩了.

4.融合:

一般baseline只有一個模型,你把xgboost,lightgbm,catboost,還有NN及sklearn的重要性都來一遍,再融合一遍肯定有提升,這裡又要強調融合中local cv的重要性.

如果是solo選手,不建議在融合上花太多時間,因為現在的xgboost,lightgbm單模型在結構化數據的表現已經夠強了,融合不會有太大提升,只有特徵工程做不下去了再考慮,如果是組隊的話可以安排專人做這個.

關於NN的方法,可以看Kele Xu 最近幾次比賽開源的代碼,但是只建議組隊選手做.

關於融合,建議看Yifan Xie 的 Porto Seguro Tutorial: end-to-end ensemble 最近的比賽的金牌solution的融合基本就是這個深度,因此不建議應用太複雜的stack框架,容易data leakage.

4.調參:

GBDT對參數其實沒那麼敏感,一般我就用kernel的,一般只有沒idea的時候才會調參

如果要學的話,建議看XGBoost CV (LB .284) ,作者把調參思路寫出來了,Andy Harless也是我比較佩服的人,比起其他刷榜騙贊的人,他的kernel都是認真的心態來做的

5. finalsubmission的選擇

submission的選擇也是賭博,看你的賭性了,一般來說best local cv肯定要選一個,另外一個則要玩點騷操作,最簡單是best public score了,比如最近日本旅館題,那些把自己的結果和漏洞百出的kernel融合的就很容易進top 100或top 50,這其實也是一個對付殭屍大軍的好方法,萬一殭屍大軍選的kernel蒙對了,你也可以做的比他好一點.另外你也可以通過對數據的觀察玩點騷操作,我就有一銀一銅是靠把自己best local cv result 從獎牌區外拉到獎牌區內的.

具體可以參看

砍手豪:大家如何看待最近Kaggle的賓士比賽最後排名嚴重波動?

Recruit Restaurant Visitor Forecasting

根據我的經驗,騷操作都是刀口舔血,提升起來就一點點,掉起來就很多,所以根據自己的成績需求來決定要玩多騷

6.勤刷kernel和forum

每次比賽結束後會發現其實比賽的關鍵點早就討論了

serbank的最后冠軍在比賽前一個月就指出了outlier的特殊分布;在另一個金牌參賽者里提出了將預測目標改為單位均價,可無人問津.比賽後發現這倆就是比賽的關鍵點

Instacart里最後第二名在一開始就說了F1Score是關鍵點,但是在Faron公布開源代碼前,依然無人注意到...

Corporación很早就討論了因為數據缺失造成的bias,雖然最後起到了反作用,但是也是比賽關鍵點

日本旅館題提到了黃金周問題,相關kernel和post被點了很多贊,但沒幾個人真正觀察數據

其實勤刷kernel和forum,比悶頭做特徵提升要多了

7.保持平常心

再重提一下剛結束的Corporación,baseline存在bias,test數據存在bias,結果是認真做的都掉名次,臨時一兩周隨便搞搞,保持了baseline的bias的剛好對上了test的bias,一個個拿了金牌.

還有些比賽摸獎殭屍大軍蒙對了,霸佔了獎牌區,這時候要保持平常心,不要用比賽結果來衡量成敗,要相信自己學習到東西將來總能用的上.

8.待續...

最後告訴大家一個不幸的消息,kaggle最近已經沒有結構化數據比賽,所以上述的很多技巧可能用不上了


推薦閱讀:

泰坦尼克號倖存預測n ——Kaggle排名321名(前4%)
Python員工離職預測
Google收購Kaggle!拿下最大機器學習及數據競賽平台
如何看待Kaggle最新比赛Zillow禁止中国居民参加第二轮?

TAG:Kaggle | 機器學習 |