1. 程式人生 > >XGBoost 分類模型的Python實現

XGBoost 分類模型的Python實現

今天我們一起來學習一下如何用Python來實現XGBoost分類,這個是一個監督學習的過程,首先我們需要匯入兩個Python庫:

import xgboost as xgb
from sklearn.metrics import accuracy_score

這裡的accuracy_score是用來計算分類的正確率的。我們這個分類是通過蘑菇的若干屬性來判斷蘑菇是否有毒的分類,這個資料集中有126個屬性,我們來看看資料集,我把資料集放到網盤上分享給大家:訓練和測試資料集,密碼:w8td。開啟資料集可以發現這其實是一組組的向量,我們來看一組資料集的截圖:訓練資料集
首先第一列表示標籤列,是每一組資料的正確分類,1表示蘑菇是有毒的,0表示蘑菇無毒的。後面的資料,我們以第一組資料為例,3:1表示資料包含了第三組特徵,其他沒有不包含的特徵的資料,我們就沒有在資料集中顯示,所以也可以把每一行看做是一個向量,這和我之前有一篇博文“SVM做文字分類詳細操作流程”處理的資料格式是一樣的。這裡有兩個資料集,一個訓練集一個測試集,接下來我們讀取資料集:

data_train = xgb.DMatrix('Desktop/dataset/agaricus.txt.train')
data_test = xgb.DMatrix('Desktop/dataset/agaricus.txt.test')

我們來看看訓練集和測試集的大小:
資料集大小
可以看出,除開第一列的標籤列,資料集一共有126組特徵,6513組訓練資料和1611組測試資料。
接下來我們來指定訓練的引數:

param = {'max_depth':2, 'eta':1, 'silent':1, 'objective':'binary:logistic'}

解釋一下,這裡max_depth: 樹的最大深度。預設值是6,取值範圍為:[1,∞];eta:為了防止過擬合,更新過程中用到的收縮步長。在每次提升計算之後,演算法會直接獲得新特徵的權重。eta通過縮減特徵的權重使提升計算過程更加保守。預設值為0.3,取值範圍為:[0,1];silent:取0時表示打印出執行時資訊,取1時表示以緘默方式執行,不列印執行時資訊,預設值為0;objective: 定義學習任務及相應的學習目標,“binary:logistic” 表示二分類的邏輯迴歸問題,輸出為概率。下面我們就可以用xgboost訓練模型了:

import time
start_time = time.clock()
bst = xgb.train(param, data_train, num_round)
end_time = time.clock()
print(end_time - start_time)

這裡的num_round表示訓練的時候迭代的次數,我們預設它是2,訓練過程是相當快的,這段程式碼輸出是訓練時長:0.015257000000000076。這個時候我們用訓練集做預測:

train_preds = bst.predict(data_train)
print ("train_preds",train_preds)

輸出是:

train_preds [0.9239239  0.28583017 0.28583017 ... 0.05169873 0.05169873 0.05169873]

這些資料輸出的是概率,表示的是每一組蘑菇有毒的概率,我們再將這些資料分類:

train_predictions = [round(value) for value in train_preds]
print ("train_predictions",train_predictions)

分類之後的輸出是:

train_predictions [1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, ... 1.0, 0.0, 0.0, 0.0]

這裡輸出全部都是0和1了,這就是我們用訓練資料集訓練出的結果,我們可以將這個結果與訓練集中的標籤作比較,來看看這個預測的準確率如何:

y_train = data_train.get_label()
print ("y_train",y_train)

這是我們獲取訓練資料集的標籤,再與我們訓練出的結果進行比較:

train_accuracy = accuracy_score(y_train, train_predictions)
print ("Train Accuary: %.2f%%" % (train_accuracy * 100.0))

結果是Train Accuary: 97.77%,準確率還可以。同理,我們可以用測試集來驗證我們的模型如何:

# make prediction
preds = bst.predict(data_test)
predictions = [round(value) for value in preds]
y_test = data_test.get_label()
test_accuracy = accuracy_score(y_test, predictions)
print("Test Accuracy: %.2f%%" % (test_accuracy * 100.0))

我們可以得到Test Accuracy: 97.83%,這可以說明我們用訓練集訓練出來的模型還是不錯的。
以上是我們用xgboost對資料進行分類模型訓練的全過程,接著,我們還可以對這個模型輸出它的決策樹:

from matplotlib import pyplot
import graphviz
xgb.plot_tree(bst, num_trees = 0,rankdir = 'LR')
pyplot.show()

這裡解釋一下,xgb.plot_tree()方法的第一個引數表示模型,第二個引數表示樹的索引是從0開始的,其實還可以填第三個引數:rankdir = ‘LR’,’LR’表示水平方向,預設的是垂直方向。
我們可以得到這個模型的決策樹:
模型決策樹
這個決策樹節點中的f29表示的是資料集中的第29個特徵。
以上就是我們用Python實現的xgboost分類模型的過程,希望對各位朋友有所幫助,本人能力有限,文中如有紕漏之處,還望各位朋友多多指教,如有轉載,也請標明出處,謝謝。