Scikit-learnカリフォルニア住宅価格データセットでlightGBMしてみる

機械学習

前回の記事で、『Scikit-learnカリフォルニア住宅価格データセットで深層ニューラルネットワークしてみる』これをやったんです。さすがの深層ニューラルネットワークだね、という結果が得られました。こうなればですね、非深層系では最強との呼び声高い、勾配ブースティング決定木でもやってみて、どうなるの?、が見たくなりました。ので、前回のデータでlightGBMをやってみようと思います。

lightGBMで学習

import lightgbm as lgb

こいつをインポートします。

lgb_train = lgb.Dataset(x_train, y_train.ravel())
lgb_val = lgb.Dataset(x_train_val, y_train_val.ravel())                      

こないして、訓練用と検証用のデータを用意せなあきません。

params = {'metric': 'rmse',
          'max_depth' : 20}

lgbm = lgb.train(params,
                lgb_train,
                valid_sets=lgb_val,
                num_boost_round=1000,
                early_stopping_rounds=100,
                verbose_eval=50)

こないして、学習します。

valid_sets検証用データ
num_boost_roundブースティングの回数(木の本数)
early_stopping_rounds検証用データの評価指標が指定した回数改善しなかったら計算終わってねのやつ
verbose_evalこの数字刻みのブースト回数で結果を出力してねのやつ

ということで、これで学習完了。結果の出力としては、

Training until validation scores don't improve for 100 rounds.
[50]	valid_0's rmse: 0.464031
[100]	valid_0's rmse: 0.444464
[150]	valid_0's rmse: 0.438133
[200]	valid_0's rmse: 0.436031
[250]	valid_0's rmse: 0.434568
[300]	valid_0's rmse: 0.433457
[350]	valid_0's rmse: 0.43408
[400]	valid_0's rmse: 0.434361
Early stopping, best iteration is:
[302]	valid_0's rmse: 0.433316

こんなです。
これ、同じ勾配ブースティング決定木を用いたxgboostを使ったことあるんですが、
計算速度が全然違います、さすがlight、めちゃくちゃ速いです。重宝される訳ですね。

モデルの評価

学習、検証、テスト各々のデータで、決定係数を見てやります。さてはて、

print(metrics.r2_score(y_train,lgbm.predict(x_train)))
print(metrics.r2_score(y_train_val,lgbm.predict(x_train_val)))
print(metrics.r2_score(y_test,lgbm.predict(x_test)))

0.9420902329786626
0.8008689316581606
0.8118103058463246

テストデータで、前回の深層ニューラルネットワークの結果を越えてきましたね。
すんごい数値です。そりゃ皆さん使うわけですね。
簡単にテストデータの散布図見てやると、

plt.figure(figsize=(10,10))
plt.scatter(y_test.tolist(),lgbm.predict(x_test).tolist(),color="red",alpha=0.1)

かなり当てはまりの良いモデルができました。
今日はここまで。