昨日分類についてのを書きました。
今度は回帰について書いてみようと思います。
今回の手法は交差検証と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
ボックスプロット
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()
要約統計量を見る限り外れ値が大きすぎて平均値が低いみたいなので中央値で見てみると
Scikit-Learn>LightGBM>XGBoost
最大値で見ると
LightGBM>Sckit-Learn>XGBoost
となります。
精度の安定性で見ると
Scikit-Learn>XGBoost>LightGBM
みたいです。
結論
LightGBMがKaggleで使われるの納得ですわ。
精度と速さでは良いですね。ビッグデータになると速さは重要になりますので。