Kaggle 是一個開放的機器學習比賽平台。裡面有成千上萬的機器學習相關的比賽,而比賽很常都是由大公司如: Google,Microsoft 所舉辦。如果在某個比賽得了前三名的話,你不但可以獲得獎金,甚至可以把經歷放到履歷裡面讓自己變得很香。重點是我們這群普通人還有一堆 label 過的 data 可以使用。

在過去的比賽中,最常用到的模型都是屬於 Ensembled Trees 類型,最有名的就是傳說中的 Random Forest。但在 2016 年,一個 KDDCup 大大,華盛頓大學資工系博士生,Tianqi Chen(不知道中文名)提出了 XGBoost,並且屌打了過去的演算法,並稱霸 Kaggle 的天下。雖然如今 Kaggle 也快被 Neural Network 佔領地位了,但是還是有很多人都還是會先用 XGBoost 來當成 baseline,或最終模型。

在繼續解釋前,我們要先講解一下一些決策樹基本概念。決策樹很適合用在表類數據,只要找到正確的 feature 來做 splitting, 基本上都會有很高的準確率;並且它的可譯性高,因此很受歡迎。樹長得越深,代表模型長得越複雜,這樣會降低效率,甚至可能造成這棵樹不夠 generalized,使得它很容易 overfit。反之,樹長得太淺複雜度降低,雖然會很有效率,但是會很有可能造成 variance 太大,所給的答案是亂猜的。

那我們稍微來介紹一下什麼是 XGBoost。

Define: eXtreme Gradient Boosting

正如上次的介紹,我們每次在使用一個模型前,要稍微對模型有個了解。我們在上面稍微提到了,XGBoost 為 Ensembled Trees 的一種,因此它是背後的演算法也是基於一組 Decision Tree。XGBoost所建的樹都是一個 Weak Classifier,也就是這棵樹會長得不深但,它不至於完全亂猜。每棵樹在學習的時候只會萃取 training set 的一部分資料,將剩下的拿來做 validation。XGBoost 的 Tree 在做 Classification 的時候不是直接判斷類別,而是針對每個 Feature/Attribute 設置一個權重來判斷類別。

在計算 loss 時,它也會將前一棵樹所預測錯誤的資料加權重,讓下一棵樹會再 sample data 時會優先學之前判斷錯誤的地方。建完第一棵樹並計算 loss 之後,它會再建多一棵樹(也是一個 Weak Classifier),並且這棵樹要降低前一棵樹的 loss。最後,再將所有的樹整合所產生的答案,並以眾數表決。因此 XGBoost 的學習目標函數會長得這樣。

Show me the code...

接下來我們就要用大大所開發的東西了。別忘了要安裝套件哦~

pip install xgboost

如果看過上一篇 scikit-learn 的文章。會發現其實覺得程式碼的部分還蠻相似的。我們就直接把重點放在一些細節的部分。模型對輸入資料有特定的結構要求,因此在把資料切成 training set 和 testing set 之後,我們要把它轉換成 DMatrix 的結構。再來就是模型的一些參數,主要有...

  • eta 為 feature 權重的縮小,避免模型 overfitting。也可以設想成模型的 learning rate
  • objective 是針對任務而設的目標函數。例如:reg:logistic 為 logistic regression,bin:logistic 為 binary classification,multi:softmax 為 multiclass classification 所用的目標函數
  • 若是在做多類別分類則需要傳入類別數量 num_class
import xgboost as xgb

D_train = xgb.DMatrix(X_train, label=Y_train)
D_test = xgb.DMatrix(X_test, label=Y_test)

param = {
    'eta': 0.3,                      # Step size shrinkage (a.k.a learning rate)
    'max_depth': 3,                 # Max depth of tree
    'objective': 'multi:softmax',   # Loss function
    'num_class': 3                # Number of labels
}

steps = 20  # The number of training iterations

model = xgb.train(param, D_train, steps)

y_pred = model.predict(D_test)

基本上在使用 XGBoost 這個套件時也可以同時用 scikit-learn 的一些 function 來輔助,例如做完 prediction 後要 evaluate 模型時可以用 from sklearn.metrics import classification_report 來獲得 accuracy,precision,recall。XGBoost 裡其實也有 scikit-learn 的 wrapper,所以你如果想要讓程式碼格式上看起來比較統一的話,也可以嘗試用哦~

Reference:

Leave a Reply

Your email address will not be published. Required fields are marked *