這是一篇筆記,課程來自Coursera上的
How to Win a Data Science Competition: Learn from Top Kagglers
python本篇能夠算是頂級Kaggler大佬們,通過上百場比賽總結的心得和技巧。對準備開始參加數據挖掘競賽的新人們極其有用,能夠爲你節省很多時間。git
大部份內容我已經經過意會翻譯成中文了,限於小編個人視野,可能會出現些誤解,有問題望指正。github
若是以爲排版不適,能夠下載notebook文件閱讀。
https://github.com/wmpscc/DataMiningNotesAndPractice數組
經驗之談,這將節省你大量時間。服務器
當咱們想參加比賽時,先肯定你的目標和試着估計你的參與能夠獲得什麼。網絡
這些目標中的每個都將影響您選擇參加的競賽。
若是您想了解更多有趣的問題,您可能但願在論壇上進行普遍討論。例如,若是您對數據科學,醫學應用感興趣, 您能夠嘗試在2017年數據科學碗中預測肺癌。
若是您想熟悉新的軟件工具,您可能但願比賽有必要的教程。 例如,若是您想學習神經網絡庫。您能夠選擇任何具備天然保護特徵,有監督學習的圖像比賽。
若是你想嘗試獲得獎牌,您可能想要檢查參與者有多少次提交機會。 若是人們有超過一百個提交的點數,這多是明顯的問題或驗證困難的明顯標誌。若是排在前列的人不多,這一般意味這應該有一個非平凡的方法來參加這場比賽,或者只有少數人發現了它。除此以外,你還須要關注一下排在前列團隊的規模,若是他是一我的,那麼你要是彙集一支優秀的團隊,勝算會大一些。數據結構
一旦熟悉了數據,開始寫下你之後想要嘗試的方法。什麼東西能夠在這裏工做?你可能採起什麼方法。
完成後,去論壇閱讀帖子和話題高相關度的內容。強烈建議你參與論壇上的討論,您能夠在論壇上得到大量信息並結識新朋友。app
在初始管道準備好以後,你提出了一些想法,你可能想要開始改進你的解決方案
您可能但願將想法排序,將最重要和最有但願的首先實施。或者能夠將它們歸類到各自主題中,例如特徵生成、驗證、度量優化等。
框架
如今選擇一個想法並實施它,嘗試在途中得到一些簡介。特別是,試着理解爲何某些東西有效或無效。從某種意義上講,分析工做的能力和在你嘗試本身的想法時得出的結論將使您走上正確的軌道,去揭示隱藏的數據模式和泄露。ide
我喜歡按照這些原則對全部參數進行排序:
注意:改變一個參數可能影響整個管道
一開始就對資源作一些優化,將節省大量時間和計算資源。
我一般從基本數據預處理開始,如標籤,編碼,標籤恢復,使用額外的數據。而後,我將結果數據轉儲爲HDF5或npy格式。
HDF5是Pandas的數據幀,npy存儲非bit數組。運行試驗一般須要大量重啓內核,這將致使從新加載全部數據,加載csv文件可能須要幾分鐘,從HDF5或npy格式加載數據只需幾秒鐘便可完成。
默認狀況下,Pandas以64位陣列存儲數據,這在大多數狀況下是沒必要要的。將全部內容向下轉換爲32位將節省兩倍的內存
Pandas支持即時的數據從新連接。所以,大多數數據集能夠在沒有大量內存的狀況下處理。例如您能夠簡單的對訓練集進行拆分來驗證你的模型,而不是使用完整數據來作交叉驗證。
並不老是須要進行普遍的驗證
從最快的模型開始-LightGBM
我一般從LightGBM開始,找到一些至關不錯的參數,並評估個人特徵的性能。
不要從SVM、隨機森林、神經網絡開始,你會浪費太多時間等待它們的訓練。只有當我對特徵工程感到滿意時,纔會轉向去調整模型、採樣和stacking。
在某些方面,我將個人方法描述爲「fast and dirty」,老是更好。
關注真正重要的事——數據。作數據探索,嘗試不一樣的特徵。谷歌特定領域的知識。您的代碼是次要的。建立沒必要要的類和我的框架可能只會讓事情更難以改變,這會致使浪費你的時間,因此要保持簡單合理。
不要跟蹤每一個小變化
最後,若是您對給定的計算資源感到很是不舒服,不要掙扎數週,只需租一臺更大的服務器。
從簡單甚至原始的解決方案開始
用完整的管道調試
這種解決方案的主要目的不是創建一個好的模型,而是從數據的最開始到咱們將提交文件寫成肯定的格式,創建完整的調試管道。我建議你從構建初始管道開始,一般你能夠在kernel中找到組織者提供的baseline解決方案。我建議你仔細閱讀並本身寫。
另外,我建議你在其餘方面遵循從簡單到複雜的方法。例如我更喜歡隨機森林而不是GBDT,至少隨機森林工做得很是快,幾乎不須要調整混合參數。
不管你多麼聰明,若是你的變量名起的很差,你確定會對它感到困惑,這是早晚會發生的。
將代碼存儲在版本控制系統下,例如git。
不少時候,你須要回退你的模型到兩星期前作模型集成。
複用代碼
在訓練和測試階段使用相同的代碼很是重要。例如,爲了保證它們以一致的方式訓練,應該使用相同的代碼準備和轉換特徵。這地方通常很難察覺到,因此最好當心點。我建議將可重用代碼移動到單獨的函數中,甚至是單獨的模塊。
There are always discussions happening!
To check if validation is stable
I evaluate many features at once(not "add one and evaluate")
And then try to trim model
Keep important code clean
Long execution history leads to mistakes
s = qq.sum(1) ss = s[:,3]/qq.var() sss = ss[0]
注意代碼質量
One notebook per submission(and use git)
Use "Restart and run all" button