らんだむな記憶

blogというものを体験してみようか!的なー

勾配ブースティング木 (2)

とりあえず XGBoost を使ってみる。Kaggle 本*1と公式ドキュメントを混ぜたような内容にしつつ 決定木 (6) - らんだむな記憶 の内容を試す。

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import xgboost as xgb

# データセットのロードと訓練データと検証データとテストデータへの分割
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=1, stratify=y)

X_train, X_val, y_train, y_val = train_test_split(
    X_train, y_train, test_size=0.16, random_state=1, stratify=y_train)

# XGBoost による分類器の作成と訓練
dtrain = xgb.DMatrix(X_train, label=y_train)
dvalid = xgb.DMatrix(X_val, label=y_val)
dtest  = xgb.DMatrix(X_test)

param = {
    'objective':'multi:softprob',
    'eval_metric': 'mlogloss',
    'num_class': len(iris['target_names']),
    'max_depth': 3,
    'eta': 0.1,
    'verbosity': 1,
    'random_state': 71,
}

watchlist = {(dtrain, 'train'), (dvalid, 'eval')}

bst = xgb.train(param, dtrain, num_boost_round=10, evals=watchlist, early_stopping_rounds=10)

y_pred = bst.predict(dtest)
y_pred = np.array([np.argmax(ps) for ps in y_pred])
print(accuracy_score(y_pred, y_test))

0.9666666666666667

といった感じでなかなか精度の良い結果になった。

DecisionTree の場合の決定境界の描画ロジックをそのまま使い回して良いのか分からないが、使ったらそれっぽい結果が出ていたのでとりあえず貼っておく。

f:id:derwind:20220326205831p:plain