0
0

勾配ブースティング決定木の性能比較その2

Last updated at Posted at 2024-06-04

昨日分類についてのを書きました。

今度は回帰について書いてみようと思います。
今回の手法は交差検証とR2でやってみます。
データはボストン住宅価格のデータセットです。

基本プログラムと時間

from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import cross_val_score
from sklearn.metrics import r2_score
import pandas as pd
import matplotlib.pyplot as plt
import time

df = pd.read_csv("boston.csv")

y = df["PRICE"]
x = df.drop("PRICE", axis=1)

model = XGBRegressor()
start = time.time()
cvx = cross_val_score(model, x, y, cv=100)
end = time.time()
print("XGBoost :",end-start)

model = LGBMRegressor()
start = time.time()
cvl = cross_val_score(model, x, y, cv=100)
end = time.time()
print("LightGBM :",end-start)

model = GradientBoostingRegressor()
start = time.time()
cvs = cross_val_score(model, x, y, cv=100)
end = time.time()
print("Scikit-Learn :",end-start)
XGBoost : 22.83217167854309
LightGBM : 11.291792869567871
Scikit-Learn : 31.991723775863647

時間で見てみると分類と違って差は2倍と3倍みたいです。

精度の分布

要約統計量

df_dcb = pd.DataFrame(cvx).describe()
df_dcb = pd.concat([df_dcb, pd.DataFrame(cvl).describe(), pd.DataFrame(cvs).describe()], axis=1)
df_dcb.columns = ["XGBoost", "LightGBM", "Scikit-Learn"]
df_dcb

image.png

ボックスプロット

plt.boxplot([cvx, cvl, cvs], labels=df_dcb.columns, positions=[0, 1, 2])
plt.scatter([0, 1, 2], [sum(cvx)/100, sum(cvl)/100, sum(cvs)/100], marker="x", color="#000000")
plt.show()

Untitled.png

要約統計量を見る限り外れ値が大きすぎて平均値が低いみたいなので中央値で見てみると
Scikit-Learn>LightGBM>XGBoost
最大値で見ると
LightGBM>Sckit-Learn>XGBoost
となります。
精度の安定性で見ると
Scikit-Learn>XGBoost>LightGBM
みたいです。

結論

LightGBMがKaggleで使われるの納得ですわ。
精度と速さでは良いですね。ビッグデータになると速さは重要になりますので。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0