首頁?學習  »   正文

XGBoost入門指南

這篇文章將出現樹…很多很多的樹…

XGBoost入門指南

XGBoost是一個開放源碼庫,提供了梯度增強決策樹的高性能實現。一個底層的C++代碼庫和一個Python接口組合在一起,形成了一個非常強大但易于實現的軟件包。

XGBoost的性能不是開玩笑的——它已經成為贏得Kaggle許多比賽的首選庫。它的梯度增強實現是首屈一指的,而且隨著庫不斷的獲得好評,它將還會有更多的實現。

在本文中,我們將介紹XGBoost庫的基礎知識。我們將從梯度增強實際工作原理的實際解釋開始,然后通過一個Python示例說明XGBoost是如何使它變得如此快速和容易實現的。

提升樹

對于常規的機器學習模型,比如決策樹,我們只需在數據集中訓練一個模型,并將其用于預測。我們可能會修改一些參數或增加數據,但最終我們仍然使用單個模型。即使我們構建一個集成,所有的模型都是單獨訓練并應用于我們的數據中。

另一方面,提升需要一個更迭代的方法。從技術上講,它仍然是一種集成技術,因為許多模型被組合在一起來執行最后一個模型,但是采用了更聰明的方法。

不是把所有的模型都單獨訓練,而是不斷地改進訓練模型,每個新模型都經過訓練,以糾正前一個模型所犯的錯誤。模型是按順序添加的,直到不能進行進一步的改進為止。

這種迭代方法的優點是所添加的新模型側重于糾正由其他模型引起的錯誤。在一個標準的集成方法中,模型是單獨訓練的,所有的模型最終可能會犯同樣的錯誤!

梯度提升是一種新的模型被訓練來預測先前模型的殘差(即誤差)的方法。我在下面的圖表中概述了這種方法。

XGBoost入門指南

XGBoost入門

讓我們開始使用這個龐大的庫——XGBoost。

我們要做的第一件事是安裝庫,這是最容易通過pip完成的。在Python虛擬環境中這樣做也更安全。

pip install xgboost

使用XGBoost設置數據

在本教程的其余部分中,我們將使用iris flowers數據集。我們可以使用Scikit Learn在Python中加載它。同時,我們還將導入新安裝的XGBoost庫。

from sklearn import datasets
import xgboost as xgb

iris = datasets.load_iris()
X = iris.data
y = iris.target

讓我們來設置所有的數據。我們將首先創建一個列車測試拆分,以便了解XGBoost的性能。這次我們將采取80%-20%的比例。

from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.2)

為了使XGBoost能夠使用我們的數據,我們需要將其轉換為XGBoost能夠處理的特定格式。這種格式稱為DMatrix。這是一個非常簡單的線性數字數組的數據轉換為DMatrix格式:

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

定義XGBoost模型

既然我們的數據都加載了,我們就可以定義梯度升級集成的參數。我們在下面設置了一些最重要的項目,以幫助我們開始工作。對于更復雜的任務和模型,可以在XGBoost官方網站上獲得完整的可能參數列表。

param = {
    'eta': 0.3, 
    'max_depth': 3,  
    'objective': 'multi:softprob',  
    'num_class': 3} 

steps = 20  # The number of training iterations

最簡單的參數是max_depth(正在訓練的決策樹的最大深度)、objective(正在使用的損失函數)和num_class(數據集中類的數量)。eta算法需要特別注意。

根據我們的理論,梯度提升涉及到創建決策樹并將其依次添加到一個集合模型中。創建新的樹來糾正現有集合預測中的殘余誤差。

由于合奏的本質,即將多個模型組合在一起,形成一個本質上非常大、復雜的合奏,使得這種技術容易過度擬合。ETA參數使我們有機會防止這種過度擬合。

可以更直觀地將eta視為學習率。eta不是簡單地將新樹的預測添加到整個權重中,而是將其與正在添加的殘差相乘,以減少它們的權重。這有效地降低了整個模型的復雜性。

通常在0.1到0.3范圍內具有較小的值。這些殘差的較小權重仍將有助于我們培養一個強大的模型,但不會讓該模型陷入更可能發生過度擬合的深層復雜性。

培訓和測試

我們最終可以訓練我們的模型,就像我們用Scikit Learn做的那樣:

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

現在讓我們運行一個評測。同樣,這個過程與Scikit學習中的培訓模型非常相似:

import numpy as np
from sklearn.metrics import precision_score, recall_score, accuracy_score

preds = model.predict(D_test)
best_preds = np.asarray([np.argmax(line) for line in preds])

print("Precision = {}".format(precision_score(Y_test, best_preds, average='macro')))
print("Recall = {}".format(recall_score(Y_test, best_preds, average='macro')))
print("Accuracy = {}".format(accuracy_score(Y_test, best_preds)))

太棒了!

如果您已經遵循了以上所有步驟,那么您應該獲得至少90%的準確率!

XGBoost的進一步探索

以上只是對XGBoost的基礎知識的總結。但是還有一些更酷的功能可以幫助你充分利用你的模型。

  • Gamma參數也有助于控制過擬合。它指定了在樹的葉節點上進行進一步分區所需的最小損失減少量。也就是說,如果創建一個新節點不能減少一定數量的損失,那么我們就根本不會創建它。
  • Booster參數允許您設置構建集成時將使用的模型類型。默認值是gbtree,它構建一組決策樹。如果您的數據不太復雜,您可以使用更快更簡單的gblinear選項來構建一組線性模型。
  • 設置任何ML模型的最優超參數都是一個挑戰。那么為什么不讓Scikit為你學習呢?我們可以很容易地將Scikit Learn的網格搜索與XGBoost分類器結合起來:
from sklearn.model_selection import GridSearchCV

clf = xgb.XGBClassifier()
parameters = {
     "eta"    : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30 ] ,
     "max_depth"        : [ 3, 4, 5, 6, 8, 10, 12, 15],
     "min_child_weight" : [ 1, 3, 5, 7 ],
     "gamma"            : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ],
     "colsample_bytree" : [ 0.3, 0.4, 0.5 , 0.7 ]
     }

grid = GridSearchCV(clf,
                    parameters, n_jobs=4,
                    scoring="neg_log_loss",
                    cv=3)

grid.fit(X_train, Y_train)

只有在你有時間的時候才在大數據集上做這個——做一個網格搜索實際上是多次訓練一個決策樹的集合!

一旦你的XGBoost模型被訓練好,你可以將人類可讀的描述轉儲到文本文件中:

model.dump_model('dump.raw.txt')

收工~

歡迎關注ATYUN官方公眾號,商務合作及內容投稿請聯系郵箱:[email protected]

發表評論