Python – XGBoostで回帰分析(XGBoost API)

Python – XGBoostで回帰分析(XGBoost API)

今回は業務にて非常に使用する機会の多い、Python – XGBoostで回帰分析(XGBoost API)について記載していこうと思います。最近では、Causal Inferenceのmodelでもかなり頻繁に使用する機会が多いのではないでしょうか。そこで、今回は回帰/Regressionについて記載していきます。

Scikit-learn APIのXGBoostは以下をご参照ください。

1. データ準備

データ準備として、今回はsklearn.datasetsのcalifornia_housingを使用していきます。このデータは回帰用のSampleデータとして使用できますので、必要に応じて使用してみてください。また、pandas.dataframeを使用するので、pandasもimportし、sklearn.datasetsのcalifornia_housingのデータをpandas.dataframeに格納します。

In [1]: import pandas as pd
   ...: from sklearn.datasets import fetch_california_housing

In [2]: california_housing = fetch_california_housing()
   ...: df = pd.DataFrame(california_housing.data, columns=california_housing.feature_names)
   ...: df.head()

Out[2]:
   MedInc  HouseAge  AveRooms  AveBedrms  Population  AveOccup  Latitude  Longitude
0  8.3252      41.0  6.984127   1.023810       322.0  2.555556     37.88    -122.23
1  8.3014      21.0  6.238137   0.971880      2401.0  2.109842     37.86    -122.22
2  7.2574      52.0  8.288136   1.073446       496.0  2.802260     37.85    -122.24
3  5.6431      52.0  5.817352   1.073059       558.0  2.547945     37.85    -122.25
4  3.8462      52.0  6.281853   1.081081       565.0  2.181467     37.85    -122.25

california_housingのtargetデータ「MudHouseVal」をpandas.dataframeに追加してデータ準備完了です。

In [3]: df['MedHouseVal'] = pd.Series(california_housing.target)
   ...: df.head()

Out[3]:
   MedInc  HouseAge  AveRooms  AveBedrms  Population  AveOccup  Latitude  Longitude  MedHouseVal
0  8.3252      41.0  6.984127   1.023810       322.0  2.555556     37.88    -122.23        4.526
1  8.3014      21.0  6.238137   0.971880      2401.0  2.109842     37.86    -122.22        3.585
2  7.2574      52.0  8.288136   1.073446       496.0  2.802260     37.85    -122.24        3.521
3  5.6431      52.0  5.817352   1.073059       558.0  2.547945     37.85    -122.25        3.413
4  3.8462      52.0  6.281853   1.081081       565.0  2.181467     37.85    -122.25        3.422

以上でデータ準備は完了です。

2. Training / Validationデータ作成

では、TrainingデータとValidationデータを作成して、modelingの準備をしていこうと思います。

念の為、TargetデータにNaNが存在するかを確認してみます。

In [4]: df['MedHouseVal'].isnull().sum()

Out[4]:
0

特に前処理の必要はなさそうなので、そのまま変数yに代入していきます。

In [5]: y = df['MedHouseVal']

次に、Feature setを変数Xに格納し、各カラムの要約統計量を確認してみます。

In [6]: X = df.drop('MedHouseVal', axis=1)
   ...: X.describe()

Out[6]:
             MedInc      HouseAge      AveRooms     AveBedrms    Population      AveOccup      Latitude     Longitude
count  20640.000000  20640.000000  20640.000000  20640.000000  20640.000000  20640.000000  20640.000000  20640.000000
mean       3.870671     28.639486      5.429000      1.096675   1425.476744      3.070655     35.631861   -119.569704
std        1.899822     12.585558      2.474173      0.473911   1132.462122     10.386050      2.135952      2.003532
min        0.499900      1.000000      0.846154      0.333333      3.000000      0.692308     32.540000   -124.350000
25%        2.563400     18.000000      4.440716      1.006079    787.000000      2.429741     33.930000   -121.800000
50%        3.534800     29.000000      5.229129      1.048780   1166.000000      2.818116     34.260000   -118.490000
75%        4.743250     37.000000      6.052381      1.099526   1725.000000      3.282261     37.710000   -118.010000
max       15.000100     52.000000    141.909091     34.066667  35682.000000   1243.333333     41.950000   -114.310000

また、Nullチェックも行います。

In [7]: X.isnull().sum()
Out[7]:
MedInc        0
HouseAge      0
AveRooms      0
AveBedrms     0
Population    0
AveOccup      0
Latitude      0
Longitude     0
dtype: int64

Nullもなさそうなので、Training / Validationデータを作成していきます。

In [8]: from sklearn.model_selection import train_test_split
   ...:
   ...: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

今回は、7:3で作成していますが、業務に合わせて適宜変更することが必要だと思います。

3. XGBoostで回帰分析(XGBoost API)

それでは、本題の回帰分析を行なっていこうと思います。XGBoost APIのtrain()で回帰分析を行なってみます。scikit-learnでの回帰分析は別の記事にて行なってみようと思います。

3-1. DMatrix、Train実施

では、XGBoost APIでTrainingを行なってみます。まず、Core Data Structureにデータをセットしていきます。以下API docです。

https://xgboost.readthedocs.io/en/stable/python/python_api.html#module-xgboost.core

次に、XGBoostのLearning APIでtrainingを行います。また、精度向上のために、early stoppingを1000で実行していきます。なお、evaluation metricはRMSEを使用します。

https://xgboost.readthedocs.io/en/stable/python/python_api.html#module-xgboost.training

In [10]: from xgboost import DMatrix, train
    ...:
    ...: dtrain = DMatrix(X_train, label=y_train)
    ...: dtest = DMatrix(X_test, label=y_test)
    ...:
    ...: xgb_params = {
    ...:     'eval_metric': 'rmse',
    ...: }
    ...:
    ...: evals = [(dtrain, 'train'), (dtest, 'eval')]
    ...:
    ...: evals_result = {}
    ...: model = train(
    ...:             xgb_params,
    ...:             dtrain,
    ...:             num_boost_round=1000,
    ...:             evals=evals,
    ...:             evals_result=evals_result,
    ...:             verbose_eval = 100
    ...: )

[0]	train-rmse:1.44495	eval-rmse:1.45025
[100]	train-rmse:0.26120	eval-rmse:0.47802
[200]	train-rmse:0.19185	eval-rmse:0.47662
[300]	train-rmse:0.14826	eval-rmse:0.47655
[400]	train-rmse:0.11905	eval-rmse:0.47565
[500]	train-rmse:0.09425	eval-rmse:0.47566
[600]	train-rmse:0.07563	eval-rmse:0.47566
[700]	train-rmse:0.05981	eval-rmse:0.47586
[800]	train-rmse:0.04899	eval-rmse:0.47608
[900]	train-rmse:0.04038	eval-rmse:0.47636
[999]	train-rmse:0.03356	eval-rmse:0.47633

3-2. Early stoppingの学習状況

学習状況をplotしてみます。

In [11]: import matplotlib.pyplot as plt
    ...:
    ...: train_metric = evals_result['train']['rmse']
    ...: plt.plot(train_metric, label='train rmse')
    ...: eval_metric = evals_result['eval']['rmse']
    ...: plt.plot(eval_metric, label='eval rmse')
    ...: plt.grid()
    ...: plt.legend()
    ...: plt.xlabel('rounds')
    ...: plt.ylabel('rmse')
    ...: plt.show()

3-3. Prediction / Validation

では、Validationを行うために、validationデータを使用してPredictionを行い、Validation Scoreとして今回はRMSEを確認してみます。

In [12]: import numpy as np
    ...: from sklearn.metrics import mean_squared_error
    ...:
    ...: y_pred = model.predict(dtest)
    ...:
    ...: rmse = np.sqrt(mean_squared_error(y_test, y_pred))
    ...: print("RMSE : % f" %(rmse))

RMSE :  0.476332

Scatter plotを使用して分析結果を確認してみます。

In [13]: import matplotlib.pyplot as plt
    ...:
    ...: plt.scatter(y_test, y_pred, alpha=0.5)
    ...: plt.xlabel('ground truth')
    ...: plt.ylabel('prediction')
    ...: plt.show()

Outlierが存在するかもしれませんね。業務であれば、Outlierを除外するかそのまま含めるかを判断しますが、今回はそのまま含めていきます。

3-4. Feature Importance

では、Feature Importanceも確認していきます。

In [15]: from xgboost import plot_importance
    ...:
    ...: plot_importance(model)
    ...: plt.show()

今回はWeightですが、MedIncが一番多く使用されているようです。次は、Gainも確認してみようと思います。

In [16]: plot_importance(model, importance_type = "gain")
    ...: plt.show()

やはり、MedIncがKey featureなのかもしれません。

4. まとめ

ということで、今回は「Python – XGBoostで回帰分析(XGBoost API)」について記載してみました。ただ、Causal Machine Learning特にEcomMLでは、scikit-learnのXGBoostを使用する必要もあったので、次回はscikit-learnで回帰分析を行なってみようと思います。

(Visited 8 times, 1 visits today)