XGboostサンプルコード解説(初心者向け、sklearn interface)

データサイエンス

機械学習アルゴリズムで、精度が出しやすく人気のXGboostのサンプルコードを解説します。初心者向けに日本語で丁寧に補足を加えつつ説明します。

XGboostとは

XGboostとは、LightGBMと並んで、精度が出しやすい機械学習のアルゴリズムです。回帰と分類ができます。複数のツリーを用いる、アンサンブル学習です。

今回説明するサンプルコードはこちらです。

Demo for accessing the xgboost eval metrics by using sklearn interface — xgboost 2.0.3 documentation

LightGBMについてはこちらで解説しています

LightGBMサンプルコードを日本語で分かりやすく解説
LightGBMのpythonサンプルコードを初心者の方向けに、日本語でわかりやすく解説します。オフィシャルページのサンプルは、初心者の方には行間を補って読む必要があり、さらに英語で記述されため、理解するのに時間がかかると思います。日本語ですっきり解説しますので、ご活用ください。

サンプルコード解説

今回紹介するサンプルコードのタイトルは、

”Demo for accessing the xgboost eval metrics by using sklearn interface” です。

xgboostのアルゴリズムを、scikit-learnのインターフェースを使って、動かします。また、様々な精度計測方法もためします。

scikit-learnは、xgboost以外にも様々なアルゴリズムが実装されていますので、xgboostを使う方は、なるべく、scikit-learnインターフェースを使うようにしましょう!

ライブラリインポートとデータセット準備

import xgboost as xgb
import numpy as np
from sklearn.datasets import make_hastie_10_2

X, y = make_hastie_10_2(n_samples=2000, random_state=42)

1行目で、xgboostをインポート、2行目でnumpyをインポート、3行目で、sikit-learnに実装されている、make_hastie_10_2というデータセットをインポートします。

4行目の、make_hastie_10_2は、正規分布の乱数を使って、10個の説明変数(特徴量)を生成します。また、目的変数(予測対象)はバイナリーデータ(-1か1)として、生成します。2分類のデータセットですね。

引数 n_samplesはデータの個数、random_stateは乱数シードとなります。

したがって、ここでは、Xが2000行10列のデータ、yが2000個のバイナリーデータとなります。

ラベル変換、学習とテストデータ作成

# Map labels from {-1, 1} to {0, 1}
labels, y = np.unique(y, return_inverse=True)

X_train, X_test = X[:1600], X[1600:]
y_train, y_test = y[:1600], y[1600:]

1行目では、-1または、1だった、バイナリデータを、0または1となるように変換しています。必須の作業となります。

2行目で、説明変数Xを学習データとテストデータに分けています。1600:400です。

3行目では同様に、目的変数yを学習データとテストデータに分けています。

学習

clf = xgb.XGBModel(**param_dist)
# Or you can use: clf = xgb.XGBClassifier(**param_dist)

clf.fit(X_train, y_train,
        eval_set=[(X_train, y_train), (X_test, y_test)],
        eval_metric='logloss',
        verbose=True)

1行目で、モデルのオブジェクトを作成し、

2行目で、パラメータをセットして、学習します。

各引数は

  • X_train :学習用説明変数
  • y_train :学習用目的変数
  • eval_set :検証データのセット 学習データとテストデータ両方をつかっている。
  • eval_metric :検証時の精度計算方法 loglossを選択
  • verbose :学習時の進捗を表示するか

ポイントは、検証データセットに、学習データセットとテストデータセットをタプルのリストで設定しているところです。

精度の表示方法1

# Load evals result by calling the evals_result() function
evals_result = clf.evals_result()
print('Access logloss metric directly from validation_0:')
print(evals_result['validation_0']['logloss'])

print('')

1行目で、結果をeval_resultに渡して、2行目以降で表示します。

eval_resultsは辞書形式なので、3行目の書き方で、精度が表示されます。結果は下記のとおりです。

一つ目がクラス0の精度、二つ目が、クラス1の精度です。

Access logloss metric directly from validation_0:
[0.6301538809016347, 0.5799622753076256]

精度の表示方法2 for分を使って全部表示

print('')
print('Access metrics through a loop:')
for e_name, e_mtrs in evals_result.items():
    print('- {}'.format(e_name))
    for e_mtr_name, e_mtr_vals in e_mtrs.items():
        print('   - {}'.format(e_mtr_name))
        print('      - {}'.format(e_mtr_vals))

for分を使ってすべて表記するコードです。

eval_resultは辞書形式なので、2行目で、 items()をつかって、keyと値を返して順番に表示しています。

表示結果は下記のようになります。validation_1がテストデータに対する精度です。

Access metrics through a loop:
- validation_0
   - logloss
      - [0.6301538809016347, 0.5799622753076256]
- validation_1
   - logloss
      - [0.6585171209275722, 0.6195553709566594]

精度の表示方法3 辞書形式をそのまま表示

print('')
print('Access complete dict:')
print(evals_result)

こちらは、そのままプリントしています。evals_resultは辞書形式なので、下記のように表示されます。

Access complete dict:
{'validation_0': OrderedDict([('logloss', [0.6301538809016347, 0.5799622753076256])]), 'validation_1': OrderedDict([('logloss', [0.6585171209275722, 0.6195553709566594])])}

まとめ

XGboostのサンプルコードを初心者の方向けに解説しました。XGboostは比較的精度の出しやすい、機械学習モデルですので、ぜひご活用ください。

タイトルとURLをコピーしました