PythonでXgboost


XGBoostは、最近人気のある機械学習アルゴリズムの1つです。 他の機械学習アルゴリズムよりも優れた結果をもたらすことはよく知られています。

XGBoostとは

複数の弱学習器を組み合わせることで強学習器を作る学習手法です。モデル結果は、前の瞬間の結果に基づいて重み付けされます。基本的に内部で行われていることは決定木を複数個作り、学習結果の修正を行っています。以前紹介したランダムフォレストとは違い、学習結果の修正が入っています。正しく分類されたインスタンスはますます重みが小さくなり、正しく分類されないインスタンスはますます重みが大きくなり続けます。最終的に、信頼度の重み付け平均の結果を用いて、最終的なモデルを作ります。

xgboost01

 

XGBoostの主な特徴

スピードとパフォーマンス:もともとC ++で書かれていて、他のアルゴリズムよりも高速です。

コアアルゴリズムは並列化可能:コアXGBoostアルゴリズムは並列化の恩恵が受けやすく、マルチコアコンピュータの能力を活用できます。 また、GPUやコンピュータのネットワークにも並列化が可能で、非常に大きなデータセットでも訓練が高速に可能です。

一貫して他のアルゴリズム手法よりも優れている事が多いです。さまざまなマシン学習ベンチマークデータセットでより優れたパフォーマンスを示しています。

幅広いチューニングパラメータ:XGBoost内部でクロスバリデーション、正則化、ユーザ定義の目的関数、欠損値、ツリーパラメータ、scikit-learn互換APIなどのパラメータがあります。

では、XGBoostで回帰問題を解きましょう。

 

サンプルデータのロード

 

from sklearn.datasets import load_boston

boston = load_boston()

print(boston.keys())

print(boston.feature_names)

print(boston.data.shape)

 

dict_keys([‘data’, ‘target’, ‘feature_names’, ‘DESCR’, ‘filename’])

[‘CRIM’ ‘ZN’ ‘INDUS’ ‘CHAS’ ‘NOX’ ‘RM’ ‘AGE’ ‘DIS’ ‘RAD’ ‘TAX’ ‘PTRATIO’

 ‘B’ ‘LSTAT’]

(506, 13)

 

import pandas as pd

data = pd.DataFrame(boston.data)

data.columns = boston.feature_names

data[‘PRICE’] = boston.target

data.head(3)

 

      CRIM    ZN  INDUS  CHAS    NOX  …    RAD    TAX  PTRATIO       B  LSTAT

0  0.00632  18.0   2.31   0.0  0.538  …    1.0  296.0     15.3  396.90   4.98

1  0.02731   0.0   7.07   0.0  0.469  …    2.0  242.0     17.8  396.90   9.14

2  0.02729   0.0   7.07   0.0  0.469  …    2.0  242.0     17.8  392.83   4.03

 

[3 rows x 13 columns]

 

import xgboost as xgb

from sklearn.metrics import mean_squared_error

import pandas as pd

import numpy as np

 

X, y = data.iloc[:,:-1],data.iloc[:,-1]

data_dmatrix = xgb.DMatrix(data=X,label=y)

 

XGBoostのハイパーパラメータ

xgboost()には多くの引数を設定することができます。引数の説明を下記にまとめました。XGBoost Parametersを参考にしています。

learning_rate:機械学習の最適化においてどのくらい値を動かすかというパラメータです。 学習率を大きくしすぎると発散し、小さくしすぎると収束まで遅くなります。

max_depth:ブースティングラウンド中に各ツリーの深さを示しています。大きいほどオーバーフィッティングしやすくなります。

subsample:ツリーごとに使用されるサンプルの割合。低い値はアンダーフィッティングに繋がり、大きいとオーバーフィッティングになります。

colsample_bytree:ツリーごとに使用される特徴量の割合です。高い値は過適合につながります。

n_estimators:構築したいツリーの数になります。

gamma:スプリット後に予想される損失の減少に基づいて、特定のノードを分割するかどうかを制御します。値が高いほど分割数は少なくなります。ツリーベースの学習者にのみサポートされています。

alpha:葉の重さに対するL1の正則化。値が大きいと正則化が進みます。

lambda:リーフウェイト上のL2正規化であり、L1正規化よりも滑らかな特徴を持ちます。

 

import xgboost as xgb

from sklearn.metrics import mean_squared_error

import pandas as pd

import numpy as np

 

X, y = data.iloc[:,:-1],data.iloc[:,-1]

data_dmatrix = xgb.DMatrix(data=X,label=y)

 

from sklearn.model_selection import train_test_split

 

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

xg_reg = xgb.XGBRegressor(objective =’reg:linear’, colsample_bytree = 0.3, learning_rate = 0.1,

                max_depth = 5, alpha = 10, n_estimators = 10)

xg_reg.fit(X_train,y_train)

 

preds = xg_reg.predict(X_test)

rmse = np.sqrt(mean_squared_error(y_test, preds))

print(“RMSE: %f” % (rmse))

RMSE: 10.231552

k-fold Cross Validation

 

params = {“objective”:”reg:linear”,’colsample_bytree’: 0.3,’learning_rate’: 0.1,

                ‘max_depth’: 5, ‘alpha’: 10}

 

cv_results = xgb.cv(dtrain=data_dmatrix, params=params, nfold=3,

                    num_boost_round=50,early_stopping_rounds=10,metrics=”rmse”, as_pandas=True, seed=123)

cv_results.head()

 

 

   train-rmse-mean  train-rmse-std  test-rmse-mean  test-rmse-std

0        21.746917        0.031586       21.765235       0.029251

1        19.777912        0.058719       19.796670       0.043442

2        18.014730        0.052289       18.050408       0.068405

3        16.440724        0.076892       16.532230       0.089925

4        15.001958        0.073236       15.163680       0.072632

 

print((cv_results[“test-rmse-mean”]).tail(1))

 

49    4.009708

Name: test-rmse-mean, dtype: float64

特徴量の重要性

 

xgb.plot_importance(xg_reg)

plt.rcParams[‘figure.figsize’] = [5, 5]

plt.show()

xgboost02

1 thought on “PythonでXgboost”

  1. Pingback: NGBoostの解説 - S-Analysis

Comments are closed.