Data Wins Argument

データは議論を制する

XGboostをIris datasetを使ってJupyter notebookで回す

XGBoostのインストール及びirisデータセットの読み込み

import xgboost as xgb
from sklearn import datasets

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

説明変数と目的変数を交差検証のために、テストデータと訓練データに分割

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Xgboostを使うためにはDMatrix data formatという特定のフォーマットに変換する必要があります。Xgboostはnumpy arraysやsvmligntやその他のフォーマットでも動きますが、ここではNumpy arrayで読み込みます

dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

パラメータの設定を行います

param = {
    'max_depth': 3,  # それぞれの木に対しての最大深度
    'eta': 0.3,  # 各イタレーションん対するトレーニングステップ
    'silent': 1,  # ログモード quiet
    'objective': 'multi:softprob',  # マルチクラストレーニングに対するエラー評価
    'num_class': 3}  # データセットに存在するクラス数
num_round = 20  # トレーニングイタレーションの回数

トレーニング開始!

bst = xgb.train(param, dtrain, num_round)

結果を出力して見ます

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

こんな感じの結果

booster[0]: 0:[f2<2.45] yes=1,no=2,missing=1 1:leaf=0.426036 2:leaf=-0.218845 booster[1]: 0:[f2<2.45] yes=1,no=2,missing=1 1:leaf=-0.213018 2:[f3<1.75] yes=3,no=4,missing=3 3:[f2<4.95] yes=5,no=6,missing=5 5:leaf=0.409091 6:leaf=-9.75349e-009 4:[f2<4.85] yes=7,no=8,missing=7 7:leaf=-7.66345e-009 8:leaf=-0.210219 ….

実際に予測してみます

preds = bst.predict(dtest)

アウトプットはこのようなarrayになっています

print(preds)
[[ 0.00563804  0.97755206  0.01680986]
 [ 0.98254657  0.01395847  0.00349498]
 [ 0.0036375   0.00615226  0.99021029]
 [ 0.00564738  0.97917044  0.0151822 ]
 [ 0.00540075  0.93640935  0.0581899 ]
 [ 0.98607963  0.0104128   0.00350755]
 [ 0.00438964  0.99041265  0.0051977 ]
 [ 0.0156953   0.06653063  0.91777402]
 [ 0.0063378   0.94877166  0.04489056]
 [ 0.00438964  0.99041265  0.0051977 ]
 [ 0.01785045  0.07566605  0.90648347]
 [ 0.99054164  0.00561866  0.00383973]
 [ 0.98254657  0.01395847  0.00349498]
 [ 0.99085498  0.00562044  0.00352453]
 [ 0.99085498  0.00562044  0.00352453]
 [ 0.00435676  0.98638147  0.00926175]
 [ 0.0028351   0.00545694  0.99170798]
 [ 0.00506935  0.98753244  0.00739827]
 [ 0.00435527  0.98265946  0.01298527]
 [ 0.00283684  0.00484793  0.99231517]
 [ 0.99085498  0.00562044  0.00352453]
 [ 0.01177546  0.08546326  0.90276134]
 [ 0.99085498  0.00562044  0.00352453]
 [ 0.00283684  0.00484793  0.99231517]
 [ 0.00561747  0.01081239  0.98357016]
 [ 0.00363441  0.00699543  0.98937011]
 [ 0.0036375   0.00615226  0.99021029]
 [ 0.00561747  0.01081239  0.98357016]
 [ 0.99054164  0.00561866  0.00383973]
 [ 0.99085498  0.00562044  0.00352453]]

各arrayの中で一番高い列名を抜き出します

import numpy as np
best_preds = np.asarray([np.argmax(line) for line in preds])
print(best_preds)
[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0]

precisionを計算してみましょう

from sklearn.metrics import precision_score

print(precision_score(y_test, best_preds, average='macro'))
1.0

このモデルを保存します

from sklearn.externals import joblib

joblib.dump(bst, 'bst_model.pkl', compress=True)
['bst_model.pkl']

おしまい

A Simple XGBoost Tutorial Using the Iris Dataset