「とりあえずこれやっとけ」で有名なXGboost。とりあえず動かす。
使用するモジュールはこちら
目次
回帰編
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
こんなデータが得られる。
訓練/テストデータに分割
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)などを選択。
さらに学習係数や木の深さなどのパラメータを設定したいときにはparamsに加える。
例
# 学習係数:0.3, 木の深さ:6 params = {'objective':'reg:squarederror', 'eta':0.3, 'max_depth':6}
学習
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
こんなデータが得られる。
訓練/テストデータに分割
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)を選択。
さらに学習係数や木の深さなどのパラメータを設定したいときにはparamsに加える。
例
# 学習係数:0.3, 木の深さ:6 params = {'objective':'multi:softmax', 'num_class':3, 'eta':0.3, 'max_depth':6}
学習
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)