スポンサーリンク

XGBoostの回帰モデルを作る方法

Python

XGBoostは実装が簡単なわりに精度が良いので、初心者にもおすすめなモデルです。
今回は回帰モデルの作り方を解説します。

コードをコピペするだけで誰でも実装できるので、1行ずつ試してみてください。

データセット

そもそも使えるデータを持ってない。。。

という方は、scikit-learnにあるデータを使いましょう。
Pythonを実行する環境がないなら、Google Colaboratoryがおすすめです。
>>Google Colaboratoryの使い方

import pandas as pd
from sklearn.datasets import load_diabetes

data = load_diabetes()
df = pd.DataFrame(data["data"], columns = data["feature_names"])
df["target"] = data["target"]
df
import matplotlib.pyplot as plt
plt.scatter(df["bmi"], df["target"], alpha = 0.5)
plt.xlabel("bmi")
plt.ylabel("target")
plt.show()

targetが予測したいデータです。このようにbmiと関係性が見られます。
今回はage ~ s6までの10個の列を使って学習させましょう。

データ分割

from sklearn.model_selection import train_test_split

train, test = train_test_split(df, test_size = 0.1)
print(train.shape, test.shape)

# ========== output ==========
# (397, 11) (45, 11)

train_test_splitで学習用データと検証用データとにわけます。
test_size = 0.1にすると10%が検証用になります。
【関連記事】交差検証でよく使うデータ分割法

モデルの精度を評価する際は、答えの知らない検証用データを使いましょう。

features = [c for c in df.columns if c != "target"]
print(features)

#学習用データ
X_train = train[features]
y_train = train["target"].values

#検証用データ
X_test = test[features]
y_test = test["target"].values

print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)

# ========== output ==========
# ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
# (397, 10) (397,)
# (45, 10) (45,)
X_train: 学習に使う特徴量
y_train: 教える答え
X_test: 検証に使う特徴量
y_test: 検証の答え

モデル作成

import xgboost as xgb

# データ形式の変換
dtrain = xgb.DMatrix(X_train, y_train)
dtest = xgb.DMatrix(X_test, y_test)

# パラメータ設定
# regression: 回帰, squarederror: 二乗誤差
params = {"objective": "reg:squarederror"}

# 学習
model = xgb.train(
    params = params,
    dtrain = dtrain,
    evals = [(dtrain, "train"), (dtest, "test")],
)

これだけで学習が実行できます。
ぱっと見は意味不明でも、一度作ってみたら簡単ですよ。
出力は以下のイメージです。

xgboostの学習結果

XGBoostは学習と検証を繰り返し、徐々に精度を上げていくモデルです。
なので、上図のように各回での学習データと検証データでの精度が出力されます。

回帰モデルを作りたいなら”objective”は”reg:squarederror”にします。
パラメータの項目についての詳細は公式ドキュメントを見るといいですよ。

予測結果

import numpy as np

preds = model.predict(dtrain)
plt.scatter(y_train, preds, alpha = 0.5)
plt.plot(np.arange(50, 350), np.arange(50, 350), "r-")
plt.show()

predictで予測できます。
散布図で正解と予測を見てみました。赤線に乗っていたら正解です。
おおよそ正解していますが、これは学習データ(train)だからということもあります。
つまり答えを教えているデータだから精度が高いです。

なので、検証データ(test)でも見てみましょう。

preds = model.predict(dtest)
plt.scatter(y_test, preds, alpha = 0.5)
plt.plot(np.arange(50, 350), np.arange(50, 350), "r-")
plt.xlabel("true")
plt.ylabel("pred")
plt.show()

こんな感じです。
図で見ているだけでは精度がわかりにくいので、誤差を計算してみましょう。

from sklearn.metrics import mean_squared_error
print(np.sqrt(mean_squared_error(y_test, pred)))

# ========== output ==========
# 66.3967555643605

誤差はおおよそ66.4でした。

特徴量重要度

ここまででモデルを作ることができましたが、
一体どんな特徴(列)が効いているのかわかりませんよね。
XGBoostならどの特徴が効いているかを可視化することができます。

xgb.plot_importance(model)
plt.show()
特徴量重要度

plot_importanceに作成したモデルを入れると、特徴量の重要度を出してくれます。
ただデフォルトでは、どれだけ予測に寄与したかを示すわけではないようです。
予測への寄与度を知りたいなら、“importance_type”を”gain”に変えましょう。

xgb.plot_importance(model, importance_type = "gain")
plt.show()
特徴量重要度(gain)

どちらの結果にせよ、s5とbmiが重要みたいですね。
このデータセットは糖尿病に関するものらしいので、bmiが効くのも納得です。

まとめ

今回はXGBoostで回帰モデルを作る方法を解説しました。
似たようなアルゴリズムでLightGBMがあります。
こちらも同じくらい簡単に作れるわりに精度が高く、計算も軽いので、ぜひ挑戦してみてください。

コメント

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