XGBoostは、最近人気のある機械学習アルゴリズムの1つです。 他の機械学習アルゴリズムよりも優れた結果をもたらすことはよく知られています。
XGBoostとは
複数の弱学習器を組み合わせることで強学習器を作る学習手法です。モデル結果は、前の瞬間の結果に基づいて重み付けされます。基本的に内部で行われていることは決定木を複数個作り、学習結果の修正を行っています。以前紹介したランダムフォレストとは違い、学習結果の修正が入っています。正しく分類されたインスタンスはますます重みが小さくなり、正しく分類されないインスタンスはますます重みが大きくなり続けます。最終的に、信頼度の重み付け平均の結果を用いて、最終的なモデルを作ります。
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()
Pingback: NGBoostの解説 - S-Analysis