XGboostとりあえず動かす

「とりあえずこれやっとけ」で有名なXGboost。とりあえず動かす。

使用するモジュールはこちら

xgboost.readthedocs.io

目次

回帰編

import

回帰では以下のモジュールを使用。

import xgboost as xgb
from sklearn import datasets
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
  • datasets, pandas: サンプルデータセット
  • train_test_split: 訓練/テストデータ分割用
  • mean_squared_error: 平均二乗誤差計算用

データセット取得

今回はBoston house pricesを使用。

boston = datasets.load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target

こんなデータが得られる。 f:id:ricrowl:20201020022107p:plainf:id:ricrowl:20201020021800p:plain

訓練/テストデータに分割

X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, shuffle=True)
  • test_size: テストデータの比率
  • shuffle: データをシャッフルして分割するかどうか

データをxgboost用のフォーマットに変換

dtrain = xgb.DMatrix(X_tr, label=y_tr)
dtest = xgb.DMatrix(X_te, label=y_te)

xgboostのパラメータ設定

params = {'objective':'reg:squarederror'}
num_round = 50
  • objective: 目的関数
  • num_round: 学習回数

普通の回帰なので目的関数に二乗誤差(reg:squarederror)を指定。
タスクによっては二乗対数誤差(reg:squaredlogerror)やロジスティック回帰誤差(reg:logistic)などを選択。

他の目的関数: https://xgboost.readthedocs.io/en/latest/parameter.html?highlight=multi%20softmax#learning-task-parameters

さらに学習係数や木の深さなどのパラメータを設定したいときにはparamsに加える。

# 学習係数:0.3, 木の深さ:6
params = {'objective':'reg:squarederror', 'eta':0.3, 'max_depth':6}

他のパラメータとか: https://xgboost.readthedocs.io/en/latest/parameter.html?highlight=multi%20softmax#parameters-for-tree-booster

学習

watchlist = [(dtrain, 'train'), (dtest, 'eval')]
bst = xgb.train(params, dtrain, num_round, evals=watchlist)

テストデータ評価

pred = bst.predict(dtest)
score = mean_squared_error(y_te, pred)  
print('score:', format(score))

重要度変数可視化

xgb.plot_importance(bst)

分類編

import

分類では以下のモジュールを使用。

import xgboost as xgb
from sklearn import datasets
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
  • datasets, pandas: サンプルデータセット
  • train_test_split: 訓練/テストデータ分割用
  • accuracy_score: クラス分類の正答率計算用

データセット取得

今回はIrisを使用。

iris = datasets.load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = iris.target

こんなデータが得られる。 f:id:ricrowl:20201020024452p:plain

訓練/テストデータに分割

X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, shuffle=True)
  • test_size: テストデータの比率
  • shuffle: データをシャッフルして分割するかどうか

データをxgboost用のフォーマットに変換

dtrain = xgb.DMatrix(X_tr, label=y_tr)
dtest = xgb.DMatrix(X_te, label=y_te)

xgboostのパラメータ設定

params = {'objective':'multi:softmax', 'num_class':3}
num_round = 50
  • objective: 目的関数
  • num_class: 分類のクラス数
  • num_round: 学習回数

普通の分類なので目的関数に交差エントロピー(multi:softmax)を指定。
さらに分類のクラス数も指定する必要がある。
二値分類の場合はロジスティック回帰誤差(binary:logistic)を選択。

他の目的関数: https://xgboost.readthedocs.io/en/latest/parameter.html?highlight=multi%20softmax#learning-task-parameters

さらに学習係数や木の深さなどのパラメータを設定したいときにはparamsに加える。

# 学習係数:0.3, 木の深さ:6
params = {'objective':'multi:softmax', 'num_class':3, 'eta':0.3, 'max_depth':6}

他のパラメータとか: https://xgboost.readthedocs.io/en/latest/parameter.html?highlight=multi%20softmax#parameters-for-tree-booster

学習

watchlist = [(dtrain, 'train'), (dtest, 'eval')]
bst = xgb.train(params, dtrain, num_round, evals=watchlist)

テストデータ評価

pred = bst.predict(dtest)
score = accuracy_score(y_te, pred)  
print('score:{0:.4f}'.format(score))

重要度変数可視化

xgb.plot_importance(bst)