頂級Kagglers的心得和技巧

這是一篇筆記,課程來自Coursera上的How to Win a Data Science Competition: Learn from Top Kagglerspython

本篇能夠算是頂級Kaggler大佬們,通過上百場比賽總結的心得和技巧。對準備開始參加數據挖掘競賽的新人們極其有用,能夠爲你節省很多時間。git

大部份內容我已經經過意會翻譯成中文了,限於小編個人視野,可能會出現些誤解,有問題望指正。github

Tips and tricks

若是以爲排版不適,能夠下載notebook文件閱讀。
https://github.com/wmpscc/DataMiningNotesAndPractice數組

Practical guide

經驗之談,這將節省你大量時間。服務器

Before you enter a competition

當咱們想參加比賽時,先肯定你的目標和試着估計你的參與能夠獲得什麼。網絡

  • 你可能想了解有關這個問題的更多信息
  • 你可能但願熟悉新的軟件工具包
  • 你可能想要嘗試去獲取獎牌

這些目標中的每個都將影響您選擇參加的競賽。

若是您想了解更多有趣的問題,您可能但願在論壇上進行普遍討論。例如,若是您對數據科學,醫學應用感興趣, 您能夠嘗試在2017年數據科學碗中預測肺癌。

若是您想熟悉新的軟件工具,您可能但願比賽有必要的教程。 例如,若是您想學習神經網絡庫。您能夠選擇任何具備天然保護特徵,有監督學習的圖像比賽。

若是你想嘗試獲得獎牌,您可能想要檢查參與者有多少次提交機會。 若是人們有超過一百個提交的點數,這多是明顯的問題或驗證困難的明顯標誌。若是排在前列的人不多,這一般意味這應該有一個非平凡的方法來參加這場比賽,或者只有少數人發現了它。除此以外,你還須要關注一下排在前列團隊的規模,若是他是一我的,那麼你要是彙集一支優秀的團隊,勝算會大一些。數據結構

After you enter a competition:

  • 1.組織你的想法

一旦熟悉了數據,開始寫下你之後想要嘗試的方法。什麼東西能夠在這裏工做?你可能採起什麼方法。

完成後,去論壇閱讀帖子和話題高相關度的內容。強烈建議你參與論壇上的討論,您能夠在論壇上得到大量信息並結識新朋友。app

  • 2.挑選一些重要的、有前途的想法

在初始管道準備好以後,你提出了一些想法,你可能想要開始改進你的解決方案

您可能但願將想法排序,將最重要和最有但願的首先實施。或者能夠將它們歸類到各自主題中,例如特徵生成、驗證、度量優化等。
框架

  • 3.嘗試去理解爲何它會或不會工做

如今選擇一個想法並實施它,嘗試在途中得到一些簡介。特別是,試着理解爲何某些東西有效或無效。從某種意義上講,分析工做的能力和在你嘗試本身的想法時得出的結論將使您走上正確的軌道,去揭示隱藏的數據模式和泄露。ide

After you enter a competition:Everything is a hyperparameter

我喜歡按照這些原則對全部參數進行排序:

  • 1.重要性
    將參數從重要到不重要排序,這些可能取決於數據結構、目標、度量等等
  • 2.可行性
    例如Rate參數很容易調整,但這可能永遠須要調整
  • 3.理解
    評價參數,我知道它在作什麼或不知道。這裏重要的是要了解每一個參數在整個管道中的變化。

注意:改變一個參數可能影響整個管道

Data loading

一開始就對資源作一些優化,將節省大量時間和計算資源。

  • 從經典的處理方法開始而後將csv/txt文件轉爲hdf5/npy文件以更快的加載

我一般從基本數據預處理開始,如標籤,編碼,標籤恢復,使用額外的數據。而後,我將結果數據轉儲爲HDF5或npy格式。
HDF5是Pandas的數據幀,npy存儲非bit數組。運行試驗一般須要大量重啓內核,這將致使從新加載全部數據,加載csv文件可能須要幾分鐘,從HDF5或npy格式加載數據只需幾秒鐘便可完成。

  • 將64位陣列轉爲32位,節省兩倍內存

默認狀況下,Pandas以64位陣列存儲數據,這在大多數狀況下是沒必要要的。將全部內容向下轉換爲32位將節省兩倍的內存

  • 大數據集能夠被分塊處理

Pandas支持即時的數據從新連接。所以,大多數數據集能夠在沒有大量內存的狀況下處理。例如您能夠簡單的對訓練集進行拆分來驗證你的模型,而不是使用完整數據來作交叉驗證。

Performance evaluation

  • 並不老是須要進行普遍的驗證

  • 從最快的模型開始-LightGBM

我一般從LightGBM開始,找到一些至關不錯的參數,並評估個人特徵的性能。
不要從SVM、隨機森林、神經網絡開始,你會浪費太多時間等待它們的訓練。只有當我對特徵工程感到滿意時,纔會轉向去調整模型、採樣和stacking。
pe.png

Fast and dirty always better

在某些方面,我將個人方法描述爲「fast and dirty」,老是更好。

  • 不要過於關注代碼質量

關注真正重要的事——數據。作數據探索,嘗試不一樣的特徵。谷歌特定領域的知識。您的代碼是次要的。建立沒必要要的類和我的框架可能只會讓事情更難以改變,這會致使浪費你的時間,因此要保持簡單合理。

  • 把事情簡單化:只保留重要的東西

不要跟蹤每一個小變化

  • 若是你對計算資源感到不爽-那就去租一臺服務器

最後,若是您對給定的計算資源感到很是不舒服,不要掙扎數週,只需租一臺更大的服務器。

Initial pipeline

  • 從簡單甚至原始的解決方案開始

  • 用完整的管道調試

這種解決方案的主要目的不是創建一個好的模型,而是從數據的最開始到咱們將提交文件寫成肯定的格式,創建完整的調試管道。我建議你從構建初始管道開始,一般你能夠在kernel中找到組織者提供的baseline解決方案。我建議你仔細閱讀並本身寫。

  • 「從見到到複雜」

另外,我建議你在其餘方面遵循從簡單到複雜的方法。例如我更喜歡隨機森林而不是GBDT,至少隨機森林工做得很是快,幾乎不須要調整混合參數。

Best Practices from Software Development

  • 使用好的變量名

不管你多麼聰明,若是你的變量名起的很差,你確定會對它感到困惑,這是早晚會發生的。

  • 讓你的研究可重複
  • 固定全部隨機種子
  • 準確記下功能的生成方式
  • 將代碼存儲在版本控制系統下,例如git。
    不少時候,你須要回退你的模型到兩星期前作模型集成。

  • 複用代碼

在訓練和測試階段使用相同的代碼很是重要。例如,爲了保證它們以一致的方式訓練,應該使用相同的代碼準備和轉換特徵。這地方通常很難察覺到,因此最好當心點。我建議將可重用代碼移動到單獨的函數中,甚至是單獨的模塊。

Read papers

  • 這能夠獲取到ML相關的電子
  • 例如,如何去優化AUC
  • 便於熟悉相關領域問題
  • 尤爲對特徵生成有用

My pipeline

  • Read forums and examine kernels first
  • There are always discussions happening!

  • Start with EDA and a baseline
  • To make sure the data is loaded correctly
  • To check if validation is stable

  • I ad features in bulks
  • At start I create all the features I can make up
  • I evaluate many features at once(not "add one and evaluate")

  • Hyperparameters optimization
  • First find the parameters to overfit train dataset
  • And then try to trim model

Code organization:keeping it clean

  • Very important to have reproducible results!
  • Keep important code clean

  • Long execution history leads to mistakes

  • Your notebooks can become a total mess
s = qq.sum(1)
ss = s[:,3]/qq.var()
sss = ss[0]

注意代碼質量

  • One notebook per submission(and use git)
    notebook.png

  • Before creating a submission restart the kernel
  • Use "Restart and run all" button

wechat.jpg

相關文章
相關標籤/搜索