介紹
機器學習很復雜。你可能會遇到一個令你無從下手的數據集,特別是當你處於機器學習的初期。
在這個博客中,你將學到一些基本的關於建立機器學習模型的技巧,大多數人都從中獲得經驗。這些技巧由Marios Michailidis(a.k.a Kazanova),Kaggle Grandmaster在2016年3月5日現在排名第3位的在線研討會上共享的。在線研討會有三個方面:
1.視頻(需翻牆觀看)
2.幻燈片——視頻中使用的幻燈片由Marios分享。實際上,是一個豐富的機器學習知識匯編。
3.問答——本博客列出所有參與者在研討會所問的問題。
成功的關鍵是堅持不懈。
問答
1.你解決ML問題的步驟是什么?請從頭描述。
以下是解決任何ML問題時我所采取的步驟:
1.了解數據——下載數據后,開始探索功能。 查看數據類型。 檢查變量類。 創建一些單變量-雙變量圖來了解變量的性質。
2.了解度量優化——每個問題都有獨特的評估指標。你必須理解它,特別是它如何隨着目標變量的變化而變化。
3.確定交叉驗證策略——為避免過擬合,確定你在初期階段已經設置了交叉驗證策略。一個很好的CV策略將幫助你在排行榜上獲得可靠的得分。
4.啟動超參數調整——一旦CV在位,嘗試使用超參數調整來提高模型的精度。 它還包括以下步驟:
- 數據轉換:包括縮放、移除異常值、處理空值、變換分類變量、做特征選擇、創建交互等步驟。
- 選擇算法並調整其超參數:嘗試多種算法來了解模型性能的變化。
- 保存結果:從上面訓練的所有模型中,確保保存預測。 它們對於集成將是有用的。
- 組合模型:最后,集成模型,可能在多個層次上。 確保模型相關以獲得最佳效果。
2.你解決問題時所采用的模型選擇和數據處理技術是什么?
一般來說,我嘗試(幾乎)一切的大多數問題。原則上:
- 時間序列:我使用GARCH、ARCH、回歸、ARIMA模型等。
- 圖像分類:我在Python中使用深度學習(卷積網)。
- 聲音分類:普通神經網絡
- 高基數分類(如文本數據):我用線性模型、FTRL、Vowpal wabbit、LibFFM、libFM、SVD等。
對於其他一切,我使用漸變增壓機(如XGBoost和LightGBM)和深入學習(如keras、Lasagne、caffe、Cxxnet)。 我決定使用特征選擇技術來保留/刪除元模型的模型。 我使用的一些特征選擇技術包括:
- 向前(cv或否)——從空模型開始。 一次添加一個特征並檢查CV精度。 如果改進保持變量,否則丟棄。
- 向后(cv或否)——從完整模型開始,逐個刪除變量。 它通過刪除任何變量來提高CV精度,丟棄它。
- 混合(或逐步)——使用以上混合技術。
- 排列
- 使用特征的重要性 ——使用隨機森林、gbm、xgboost特征選擇特征。
- 應用一些統計學的邏輯,如卡方檢驗、方差分析。
每個問題的數據操作可能不同:
- 時間序列:你可以計算移動平均數、導數。 去除異常值。
- 文本:有用的技術是tfidf、countvectorizers、word2vec、svd(維度降低)。 詞干提取、拼寫檢查、稀疏矩陣、似然編碼、一個熱編碼(或虛擬)、散列。
- 圖像分類:你可以進行縮放、調整大小、去除噪點(平滑)、注釋等
- 聲音:計算Furrier變換,MFCC(Mel頻率倒譜系數),低通濾波器等
- 其他一切:單變量特征變換(如數值數據的日志+1),特征選擇,處理空值,去除異常值,將分類變量轉換為數字。
3.你能詳細說明交叉驗證策略嗎?
交叉驗證意味着從我的主集中隨機地創建了2個集。 我用第一個集建立(訓練)我的算法(讓我們稱之為訓練集),並用另一個評分(讓我們稱之為驗證集)。 我重復此過程多次,並始終檢查我的模型在測試集上對於我要優化的度量執行的方式。
過程可能如下所示:
- 10(你選擇多少X)次
- 在訓練中分組(原始數據的50%—90%)
- 和驗證(原始數據的10%—50%)
- 然后在訓練集上擬合算法
- 評分驗證集。
- 保存與所選指標相關的得分結果。
- 計算這10個(x)次的平均值。
- 記住使用SEED能夠復制這些X分裂
其他需要考慮的事情是KFold和KFold分層。 在這里閱讀。對於時間敏感的數據,確保你在測試時總是有過去預測未來的規則。
4.你能解釋一些用於交叉驗證的技術嗎?
- Kfold
- Kfold分層
- 隨機X%分割
- 時間分割
- 對於大數據,僅一個驗證集就足夠了(如20%的數據——你不需要多次執行)。
5.你如何提高機器學習的技能? 你使用什么訓練策略?
我在2做了資料的匯總。加上很多自己的研究。同時,編程和軟件(java)和很多kaggling。
6.哪些是數據科學家最有用的python庫?
以下是一些我發現最有用的解決問題的庫:
- 數據操作
- Numpy
- Scipy
- Pandas
- 數據可視化
- Matplotlib
- 機器學習/深度學習
- Xgboost
- Keras
- Nolearn
- Gensim
- Scikit image
- 自然語言處理
- NLTK
7.當所有的變量本質上是明確的時,什么是有用的ML技術/策略來估算缺失值或預測分類標簽。
估算缺失值是關鍵的一步。 有時你可能會發現缺失值的趨勢。 以下是我使用的一些技巧:
- 使用均值、模式、中位數進行插補
- 在變量的正常值的范圍之外使用值。如- 1,或- 9999等。
- 用一種可能性替換——例如與目標變量有關的事物。
- 用有意義的東西代替。例如:有時空可能意味着零
- 嘗試基於已知值子集來預測缺失值
- 可以考慮刪除具有許多空值的行
8.你可以詳細說明你所做的硬件投資是什么,即你自己的PC / GPU設置用於深度學習相關任務? 還是使用更多的基於雲的GPU服務?
到目前為止,我大多數使用自制解決方案(Java)。我的第一場比賽必須匯總三千萬行的交易數據,所以我不得不解析數據,而且需要將內存使用率降至最低。
不過,從那時起,我做了一些很好的投資,成為排名第一。 現在,我可以訪問linux服務器的32個內核和256 GBM內存。 我也有一個geforce 670機器(用於深度學習/ gpu任務)。 此外,我現在主要使用Python。 但是,如果你真的有興趣獲得最高的收益,你也可以考慮使用亞馬遜的AWS,因為如果你使用它很多,成本可能會很高。
9.你是否使用像GPU這樣的高性能機器。或者,例如你做關於隨機森林參數的網格搜索,這需要大量的時間,所以你使用哪台機器?
對於每個深入學習的訓練模式,我都使用GPU。 我必須指出,對於深度學習,GPU是必須的。 在CPU上訓練神經網絡需要很長時間,而普通的GPU可以使一個簡單的神經網絡(例如深度學習)快50-70倍。 我不喜歡網格搜索。 我這樣做相當於手動。 我認為在一開始它可能會很慢,但過了一會兒,你可以獲得相當好的解決方案與第一組參數! 那是因為你可以學習哪些參數最適合每一個問題,並且你可以更好地了解這些算法。
10.人們如何通過改變超參數調整建立大約80個模型?
這需要時間。我有一些過去工作的參數,我用這些值初始化,然后根據現在的問題開始調整它們。 顯然,你需要強力探索更多的領域,並豐富這個庫關於每個模型過去成功的超參數組合。 你應該考慮別人在做什么。不會只有一組最優的超參數。你可能會在完全不同的一組參數中得到一個和你所擁有的相比類似的分值。
11.如何提高Kaggle排名?
這不是一個一夜之間的事情。你只需要繼續學習。 以下是我的一些建議:
- 學習更好的編程:如果你知道R那么學習python.
- 繼續學習的工具(如下所列)
- 讀一些書
- 參加“知識”比賽
- 看看其他人在內核中做什么或在過去的比賽中尋找“獲勝解決方案”
- 與更多的有經驗的人合作,但你需要在此之前稍微提高排名
- 創建一個代碼庫
- 多多參與!
12.你能告訴我們有關機器學習中使用的一些有用的工具嗎?
以下是我最喜歡的工具的列表:
- Liblinear:線性模型
- 支持向量機的LibSvm
- 對於所有機器學習模型的Scikit Learn
- 用於快速可伸縮梯度提升的Xgboost
- LightGBM
- 用於快速記憶效率線性模型的Vowpal Wabbit
- 神經網絡 encog
- H2O在R為許多型號
- LibFm
- LibFFM
- 使用Java的Weka
- 用於因式分解的Graphchi
- 含有大量資料的GraphLab
- Cxxnet:卷積神經網絡中最好的實現之一。 難以安裝,需要使用NVDIA顯卡的GPU。
- RankLib:java中最好的適合於支持像NDCG這樣的優化功能的排序算法(例如客戶級產品)的庫。
- Keras和Lasagne用於神經網絡。前提你有Theano或Tensorflow。
13.如何從機器學習開始?
我從猶他大學的這些幻燈片中了解到有關機器學習的一些基本算法和概念。這本書關於python。不要忘記遵循scikit Learn文檔。使用anaconda的jupyter筆記本。
你可以在kaggle找到許多很好的鏈接。
另外,你應該去上Andrew Ng的機器學習課程。 除此之外,你可以瀏覽一些好的博客,如mlwave,fastml,analyticsvidhya。 但最好的辦法是親自動手。 做一些kaggle! 先解決有“知識”標志的比賽,,然后開始解決一些主要的問題。 嘗試解決一些過去的。
14.在Kaggle和一般的大數據集上哪些技術最好? 如何解決內存問題?
具有高基數的大數據集可以通過線性模型得到很好的解決。 考慮稀疏模型。像vowpal wabbit這樣的工具。 FTRL、libfm、libffm、liblinear是python中的優秀的工具矩陣(像csr矩陣)。 考慮在數據的較小部分集成(如結合)模型的訓練。
15.涉及機器學習的項目的SDLC(軟件開發生命周期)是什么?
- 在一個工業項目上展開並采取步驟,以便我們能夠了解如何使用它們。 基本上,我正在學習階段,並期待獲得行業水平的曝光。
- 商業問題:如何在線推薦產品以增加購買。
- 將其翻譯成ml問題。 在客戶可能會點擊/購買時嘗試預測顧客會買什么並給定一些可用的數據,給定一些歷史風險的建議
- 建立一個測試/驗證框架。
- 找到最佳的解決方案來預測客戶最佳選擇。
- 考慮時間/成本效率以及性能
- 導出模型參數/管道設置
- 將這些應用到聯機環境中。暴露一些客戶,但不是所有。保持測試組和對照組
- 評估算法的運行情況以及隨着時間的推移進行調整。
16.你最喜歡的機器學習算法是哪一種?
當然是梯度提升決策樹。但在不同的任務中,所有可能都是好的。
17.哪種語言最適合深入學習,R或Python?
我更喜歡Python。 我認為它更程序化。 R也很好。
18.在數據科學中轉行的人需要從技術技能中獲得什么?因為我沒有開發人員背景,個人項目是展示我的知識的最好方式嗎?
將業務問題轉化為機器學習的能力,並將其轉化為可解決的問題。
19.你是否同意在一般特征中工程(探索和重組的預測)比改進預測模型在提高准確度上更有效?
原則上是。我認為模型的多樣性比一些真正強大的模型要好。但這取決於問題。