1. 程式人生 > >Kaggle爆文:一個框架解決幾乎所有機器學習問題

Kaggle爆文:一個框架解決幾乎所有機器學習問題

problem pan port 例子 過程 保持數據 檢驗 block p s

上周一個叫 Abhishek Thakur 的數據科學家,在他的 Linkedin 發表了一篇文章 Approaching (Almost) Any Machine Learning Problem,介紹他建立的一個自動的機器學習框架,幾乎可以解決任何機器學習問題,項目很快也會發布出來。

這篇文章迅速火遍 Kaggle,他參加過100多個數據科學相關的競賽,積累了很多寶貴的經驗,看他很幽默地說“寫這樣的框架需要很多豐富的經驗,不是每個人都有這樣的經歷,而很多人有寶貴的經驗,但是他們不願意分享,我呢恰好是又有一些經驗,又願意分享的人”。當然這篇文章也是受到爭議的,很多人覺得並不全面。

這篇文章,裏面提到了一些高效的方法,最幹貨的是,他做了一個表格,列出了各個算法通常需要訓練的參數。

這個問題很重要,因為大部分時間都是通過調節參數,訓練模型來提高精度。作為一個初學者,第一階段,最想知道的問題,就是如何調節參數。

因為分析的套路很簡單,就那麽幾步,常用的算法也就那麽幾個,以為把算法調用一下就可以了麽,那是肯定不行的。實際過程中,調用完算法後,結果一般都不怎麽好,這個時候還需要進一步分析,哪些參數可以調優,哪些數據需要進一步處理,還有什麽更合適的算法等等問題。

接下來一起來看一下他的框架。

據說數據科學家 60-70% 的時間都花在數據清洗和應用模型算法上面,這個框架主要針對算法的應用部分。

技術分享圖片

Pipeline

什麽是 Kaggle?

Kaggle是一個數據科學競賽的平臺,很多公司會發布一些接近真實業務的問題,吸引愛好數據科學的人來一起解決,可以通過這些數據積累經驗,提高機器學習的水平。

應用算法解決 Kaggle 問題,一般有以下幾個步驟:

  • 第一步:識別問題

  • 第二步:分離數據

  • 第三步:構造提取特征

  • 第四步:組合數據

  • 第五步:分解

  • 第六步:選擇特征

  • 第七步:選擇算法進行訓練

當然,工欲善其事,必先利其器,要先把工具和包都安好。

最方便的就是安裝 Anaconda,這裏面包含大部分數據科學所需要的包,直接引入就可以了,常用的包有:

  • pandas:常用來將數據轉化成 dataframe 形式進行操作

  • scikit-learn:裏面有要用到的機器學習算法模型

  • matplotlib:用來畫圖

  • 以及 xgboost,keras,tqdm 等。

第一步:識別問題

在這一步先明確這個問題是分類還是回歸。通過問題和數據就可以判斷出來,數據由 X 和 label 列構成,label 可以一列也可以多列,可以是二進制也可以是實數,當它為二進制時,問題屬於分類,當它為實數時,問題屬於回歸。

第二步:分離數據

技術分享圖片

為什麽需要將數據分成兩部分?

用 Training Data 來訓練模型,用 Validation Data 來檢驗這個模型的表現,不然的話,通過各種調節參數,模型可以在訓練數據集上面表現的非常出色,但是這可能會是過擬合,過擬合就是太依賴現有的數據了,擬合的效果特別好,但是只適用於訓練集,以致於來一個新的數據,就不知道該預測成什麽了。所以需要有 Validation 來驗證一下,看這個模型是在那裏自娛自樂呢,還是真的表現出色。

在 scikit learn 包裏就有工具可以幫你做到這些:

分類問題用 StrtifiedKFold

from sklearn.cross_validation import StratifiedKFold

回歸問題用 KFold

from sklearn.cross_validation import KFold

第三步:構造特征

這個時候,需要將數據轉化成模型需要的形式。數據有三種類型:數字,類別,文字。當數據是類別的形式時,需要將它的每一類提取出來作為單獨一列,然後

用二進制表示每條記錄相應的值。例如:

record 1: 性別 女
record 2:性別 女
record 3:性別 男

轉化之後就是:

女 男
record 1: 1 0
record 2:1 0
record 3:0 1

這個過程 sklearn 也可以幫你做到:

from sklearn.preprocessing import LabelEncoder

或者

from sklearn.preprocessing import OneHotEncoder

第四步:組合數據

處理完 Feature 之後,就將它們組合到一起。
如果數據是稠密的,就可以用 numpy 的 hstack:

import numpy as np

X = np.hstack((x1, x2, ...))

如果是稀疏的,就用 sparse 的 hstack:

from scipy import sparse

X = sparse.hstack((x1, x2, ...))

組合之後,就可以應用以下算法模型:

  • RandomForestClassifier

  • RandomForestRegressor

  • ExtraTreesClassifier

  • ExtraTreesRegressor

  • XGBClassifier

  • XGBRegressor

但是不能應用線性模型,線性模型之前需要對數據進行正則化而不是上述預處理。

第五步:分解

這一步是為了進一步優化模型,可以用以下方法:

技術分享圖片

PCA:Principal components analysis,主成分分析,是一種分析、簡化數據集的技術。用於減少數據集的維數,同時保持數據集中的對方差貢獻最大的特征。

from sklearn.decomposition import PCA

對於文字數據,在轉化成稀疏矩陣之後,可以用 SVD

from sklearn.decomposition import TruncatedSVD

SVD:Singular Value Decomposition,奇異值分解,是線性代數中一種重要的矩陣分解,它總能找到標準化正交基後方差最大的維度,因此用它進行降維去噪。

第六步:選擇特征

當特征個數越多時,分析特征、訓練模型所需的時間就越長,容易引起“維度災難”,模型也會越復雜,推廣能力也會下降,所以需要剔除不相關或亢余的特征。

常用的算法有完全搜索,啟發式搜索,和隨機算法。

例如,Random Forest:

from sklearn.ensemble import RandomForestClassifier

或者 xgboost:

import xgboost as xgb

對於稀疏的數據,一個比較有名的方法是 chi-2:

from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2

第七步:選擇算法進行訓練

選擇完最相關的參數之後,接下來就可以應用算法,常用的算法有:

Classification:
Random Forest
GBM
Logistic Regression
Naive Bayes
Support Vector Machines
k-Nearest Neighbors

Regression
Random Forest
GBM
Linear Regression
Ridge
Lasso
SVR

在scikit-learn裏可以看到分類和回歸的可用的算法一覽,包括它們的原理和例子代碼。在應用各算法之前先要明確這個方法到底是否合適。

為什麽那麽多算法裏,只提出這幾個算法呢,這就需要對比不同算法的性能了。

這篇神文 Do we Need Hundreds of Classifiers to Solve Real World Classification Problems 測試了179種分類模型在UCI所有的121個數據上的性能,發現Random Forests 和 SVM 性能最好。

我們可以學習一下裏面的調研思路,看看是怎麽樣得到比較結果的,在我們的實踐中也有一定的指導作用。

技術分享圖片

各算法比較

但是直接應用算法後,一般精度都不是很理想,這個時候需要調節參數,最幹貨的問題來了,什麽模型需要調節什麽參數呢?

技術分享圖片

雖然在sklearn的文檔裏,會列出所有算法所帶有的參數,但是裏面並不會說調節哪個會有效。在一些mooc課程裏,有一些項目的代碼,裏面可以看到一些算法應用時,他們重點調節的參數,但是有的也不會說清楚為什麽不調節別的。

這裏作者根據他100多次比賽的經驗,列出了這個表,我覺得可以借鑒一下,當然,如果有時間的話,去對照文檔裏的參數列表,再查一下算法的原理,通過理論也是可以判斷出來哪個參數影響比較大的。

調參之後,也並不就是大功告成,這個時候還是需要去思考,是什麽原因造成精度低的,是哪些數據的深意還沒有被挖掘到,這個時候需要用統計和可視化去再一次探索數據,之後就再走一遍上面的過程。

我覺得這裏還提到了很有用的一條經驗是,把所有的 transformer 都保存起來,方便在 validation 數據集上面應用:

技術分享圖片

Kaggle爆文:一個框架解決幾乎所有機器學習問題