本記事ではモデリング後に試行錯誤を繰り返した結果、LighGBMのパラメータを変更することで簡単に精度アップ!
競馬予測チャレンジ目次!
- データ取得編1(過去のレースデータ取得)
- データ取得編2(スピード指数取得)
- 特徴量エンジニアリング編
- モデリング、評価編
実践編- 精度UP編 ⇦本記事はココ!
競馬の予測モデルの精度を向上させるために試行錯誤していた結果、LightGBMのパラメータを変えることで簡単に上がりました。 LightGBMのパラメータはOptunaというライブラリを使って最適化しています。
Optunaとは?
OptunaとはPreffered Networks社が開発したハイパーパラメータ自動最適化ツールです。
今回はLightGBMのモデルのパラメータ調整で用いますが、機械学習用途でなくても、複数の目的変数の最適化を行う多目的最適化といった分野でも活躍します。
(画像は公式HPより引用)
無料で使えて、しかも簡単に精度向上できたので個人的にはとても感動しています。
今後は機械学習モデルのハイパーパラメータ調整をする際は必須ツールになりそう…
Optunaを使ったLightGBMのパラメータ最適化
では早速、Optunaを使ったパラメータの最適化を行っていきたいと思います。
まずはOptunaのインストールから
pip install optuna
Optunaのサンプルコードは次の通りです。
これだけでパラメータの自動最適化&モデル作成ができてしまいます。
import optuna.integration.lightgbm as lgb #←注意が必要
import pandas as pd
from sklearn.model_selection import train_test_split
## データをどこからか持ってきて、dfに格納している前提
# まずはデータを学習用と評価用に分ける
X_train_, X_val, y_train_, y_val = train_test_split(df.drop(['y'],axis=1), df['y'], test_size=0.3, shuffle=False)
# 学習データ(tr)と評価データ(vl)をLightGBMの入力仕様に変換
tr=lgb.Dataset(X_train_,y_train_)
vl=lgb.Dataset(X_val,y_val)
# 初期パラメータをなんとなく設定
lgb_param={
"objective": "binary", # 回帰:"regression"、分類:"binary"を選択
"metric": "binary_logloss", # 学習時の評価指標
"verbose":-1, # verbose:-1で学習時に出てくる途中経過を非表示に
"boosting_type": "gbdt", # 動作させるアルゴリズム
}
# 学習データと評価用データを指定し、その他のパラメータを雰囲気で指定し、
# モデルの学習&パラメータの決定を同時にしてくれる
model = lgb.train(
lgb_param,tr,valid_sets=vl,
verbose_eval=False,
early_stopping_rounds=200,
num_boost_round=200,
verbosity= -1,
)
# 予測を実行。predict()の中に、テストデータと最適化したイテレーション回数を指定
pred=model.predict(X_test,num_iteration=model.best_iteration)
注意点としては、最初のLightGBMをimportするところです。
以下のようにimportしてやることでOptunaとLightGBMを同時にかつ便利に使うことができます。
import optuna.integration.lightgbm as lgb
あとは通常のLightGBMを使うように、あとは学習をしてやればそのままハイパーパラメータの調整+モデリングをやってくれます。
パラメータ最適化を行わないときとの比較
さて、次にOputunaを使ってハイパーパラメータを調整した場合と、初期設定のままでモデリングした場合の違いを比較してみます。
- Optunaを使ってハイパーパラメータを調整した結果
⇒回収率120%(AUCは0.93)!!! - ハイパーパラメータの調整なし
⇒回収率88%(AUCは0.87)
なんと30%も良くなりました。
逆にこれは上がりすぎでは…?
ということで、しきい値を変化させて比較してみると、しきい値によっては微妙な結果に。
◆Optunaを使ってハイパーパラメータを調整した結果
しきい値=0.2 | しきい値=0.4 | しきい値=0.6 | しきい値=0.8 | |
支払い | 41,000 | 23,400 | 12,900 | 61,000 |
返金 | 37,640 | 28,800 | 6,010 | 19,600 |
回収率 | 91% | 123% | 46% | 32% |
正答数 | 38 | 26 | 11 | 5 |
レース数 | 410 | 234 | 129 | 61 |
◆ハイパーパラメータの調整なし
しきい値=0.2 | しきい値=0.4 | しきい値=0.6 | しきい値=0.8 | |
支払い | 38,400円 | 23,000円 | 14,700円 | 60,000円 |
返金 | 35,200円 | 19,500円 | 12,450円 | 31,900円 |
回収率 | 91% | 84% | 84% | 53% |
正答数 | 34 | 22 | 15 | 6 |
レース数 | 542 | 293 | 191 | 60 |
【評価のルール】
- 1レース単位でみて、各馬が上位3位に入る/入らないの二値分類モデルを作成
- 上位3位以内に入る確率がしきい値以上であれば100円で馬券を購入
(しきい値を下げれば多くの馬券を購入し、逆にしきい値を上げると自身のあるレースしか購入しないということ) - 上位3位以内に入る確率がしきい値以上で、かつ着順が1位の場合、返金額を加算
- 返金/支払いで回収率を定義
まとめ
- 悩んだら 迷わず使おう Optuna
- LightGBMを使うときはどうしてもパラメータ設定を初期設定のままでやりがちなので、まずはOptunaでモデル作成してやればよいと思います。
- とはいえ、ハイパーパラメータの自動最適化を妄信しすぎるのはNG。精度が必ず上がるわけではありません。
コメント