[譯] 頂級 Kagglers 的心得和技巧
這是一篇筆記,課程來自Coursera上的
How to Win a Data Science Competition: Learn from Top Kagglers
本篇可以算是頂級Kaggler大佬們,經過上百場比賽總結的心得和技巧。對準備開始參加資料探勘競賽的新人們極其有用,可以為你節省不少時間。
大部分內容我已經通過意會翻譯成中文了,限於小編的視野,可能會出現些誤解,有問題望指正。
Tips and tricks
如果覺得排版不適,可以下載notebook檔案閱讀。
https://github.com/wmpscc/DataMiningNotesAndPractice
Practical guide
經驗之談,這將節省你大量時間。
Before you enter a competition
當我們想參加比賽時,先確定你的目標和試著估計你的參與可以得到什麼。
-
你可能想了解有關這個問題的更多資訊
-
你可能希望熟悉新的軟體工具包
-
你可能想要嘗試去獲取獎牌
這些目標中的每一個都將影響您選擇參加的競賽。
如果您想了解更多有趣的問題,您可能希望在論壇上進行廣泛討論。例如,如果您對資料科學,醫學應用感興趣, 您可以嘗試在2017年資料科學碗中預測肺癌。
如果您想熟悉新的軟體工具,您可能希望比賽有必要的教程。 例如,如果您想學習神經網路庫。您可以選擇任何具有自然保護特徵,有監督學習的影象比賽。
如果你想嘗試得到獎牌,您可能想要檢查參與者有多少次提交機會。 如果人們有超過一百個提交的點數,這可能是明顯的問題或驗證困難的明顯標誌。如果排在前列的人很少,這通常意味這應該有一個非平凡的方法來參加這場比賽,或者只有少數人發現了它。除此之外,你還需要關注一下排在前列團隊的規模,如果他是一個人,那麼你要是聚集一支優秀的團隊,勝算會大一些。
After you enter a competition:
-
1.組織你的想法
一旦熟悉了資料,開始寫下你以後想要嘗試的方法。什麼東西可以在這裡工作?你可能採取什麼方法。
完成後,去論壇閱讀帖子和話題高相關度的內容。強烈建議你參與論壇上的討論,您可以在論壇上獲得大量資訊並結識新朋友。
-
2.挑選一些重要的、有前途的想法
在初始管道準備好之後,你提出了一些想法,你可能想要開始改進你的解決方案
您可能希望將想法排序,將最重要和最有希望的首先實施。或者可以將它們歸類到各自主題中,例如特徵生成、驗證、度量優化等。
-
3.嘗試去理解為什麼它會或不會工作
現在選擇一個想法並實施它,嘗試在途中獲得一些簡介。特別是,試著理解為什麼某些東西有效或無效。從某種意義上講,分析工作的能力和在你嘗試自己的想法時得出的結論將使您走上正確的軌道,去揭示隱藏的資料模式和洩露。
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。
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)
-
Before creating a submission restart the kernel
-
Use “Restart and run all” button
閱讀原文,獲取jupyter notebook檔案。
長按識別二維碼
獲取更多AI資訊
