LightGBMによるAI競馬予想(チューニング編)

AI競馬

LightGBMチューニングの知識

PC-KEIBA Database」と「LightGBM」を使って、優れたAI競馬予想を作るために、最低限必要なチューニング方法をまとめました。チューニングを習得するためには、以下の2つの概念を理解する必要があるので、まずこれらを説明します。

  1. 決定木
  2. 過学習

決定木

「決定木(けっていぎ)」は「Yes/No」の質問を連続的に行い、データを効率よく整理して目的の結果に導く方法です。これは、LightGBMアルゴリズムの核でもあります。

例えば、競馬予想の場合、決定木は異なる属性(例:レース成績、馬体重など)に関する質問を通じて、レース結果を予測します。優れた決定木を構築することで、予測の精度が向上し、レース結果をより正確に予測できるようになります。

過学習

「過学習(かがくしゅう)」とは、機械学習モデルが学習データを過剰に学習しすぎて、未知のデータに対応できなくなる現象を指します。この問題を解決することは、予測精度を向上させるために非常に重要な課題です。

学習データをチューニング

まず、こいつが先。役に立たない学習データを使ってたらLightGBMのパラメータをチューニングしても意味がない(笑)

学習データを増やす

データ分析の世界では一般的に、データが多いほど信頼性が高まります。しかし、競馬の場合はルールや条件が変わることがあるため、古すぎるデータを使わないように気を付けましょう。データの内容によっては問題ありませんが、注意が必要です。

データクレンジングする

データのクレンジングは統計学の基本的な処理です。競馬予想においては、競走中止、失格、降着などが発生したイレギュラーなレースを学習データから取り除くことが重要です。これによって、機械学習モデルの品質が高くなります。

説明変数をチューニング

ポイントは次の3つです。

  1. 学習データを作るとき、いきなりすべての説明変数を使わず、SQLを使って回収率や的中率を検証しながら、段階的に追加していくことが大事です。このプロセスも「PC-KEIBA Database」が得意とする仕事です。
  2. レース結果に影響を与えない説明変数は、当たり前ですが不要です。また逆に、オッズなど、影響が強すぎて最終的には人気と同じような予測になる説明変数も避けるべきです。
  3. 新聞と赤ペンだけで予想してる凡人が考えもしない説明変数を考えてください。例えば、競走馬の成績をそのまま使うんじゃなくて、相対的な順位や偏差値に変換するとか、独自のアイデアが重要です。

このように説明変数を慎重に選択し、独自のアプローチを取ることで、競馬予想の精度を向上させることができます。

LightGBMのパラメータをチューニング

LightGBMのパラメータは、モデルの性能や学習速度を改善するための設定項目です。これらのパラメータを適切に調整することで、モデルの性能を最適化し、予測の精度や学習の効率を向上させることができます。

さて本題です。競馬予想にも使えるLightGBMの代表的なパラメータを抜粋しました。このサイトではSQLを使って学習データを作ることを前提としてるので、SQLで同じことができるパラメータについては触れません。また、コンテストで速さを競うつもりもないので、そういうパラメータも無視してます。

管理人@PC-KEIBAが選んだパラメータは以下の6つです。これらだけでも非常に効果的にチューニングできる可能性が高いと考えています。

  1. num_iterations
  2. num_leaves
  3. max_depth
  4. min_data_in_leaf
  5. lambda_l1
  6. lambda_l2

num_iterations

型 int
初期値 100

num_iterationsは、試行する決定木の本数を指します。この値を増やすと、予測精度の高いモデルを得る可能性が高くなりますが、その代わりに計算に時間がかかることがあります。

num_leaves

型 int
初期値 31

num_leavesは、決定木の「葉」の最大数を指します。この値が大きいほど、モデルはより複雑になり、過学習のリスクが高まります。例えば、num_leavesを6から5に減らすと、決定木の形状がこんな感じに変化します。

max_depth

型 int
初期値 -1 (上限なし)

max_depthは、決定木の「深さ」の最大数を指します。この値が大きいほど、決定木はより深く複雑になり、過学習のリスクが高まります。

min_data_in_leaf

型 int
初期値 20

min_data_in_leafは、1つの葉に含むべき最小データ数を指します。この値が小さいほど、決定木の各葉が個別のデータに過度に適合し、過学習のリスクが高まります。例えば、min_data_in_leafを100から200に増やすと、決定木の葉がより多くのデータを含むようになり、モデルの安定性が向上する可能性があります。

この例では、データ数が180の葉が除外され、1つ手前の葉で終了しています。

lambda_l1

型 double
初期値 0.0 (正則化しない)

lambda_l1は、L1正則化の強さを表します。この値が小さいほど、過学習のリスクが高まります。大きい値を設定するほど、モデルから不要な説明変数を除外します。

lambda_l2

型 double
初期値 0.0 (正則化しない)

lambda_l2は、L2正則化の強さを表します。この値が小さいほど、過学習のリスクが高まります。L2正則化は、モデルの係数を小さくしてモデルの安定性を高める効果があります。

L1正則化とL2正則化は、モデルの複雑さを調整する方法であり、どちらも過学習を防ぐ役割を果たします。詳細な仕組みについては「ググる」などして勉強してください。

パラメータを書く場所

この記事で紹介したパラメータは「学習用ソースコード」に書きます。

この「AI競馬」のカテゴリで無料で公開しているソースコードを例に説明します。

二値分類(binary)

二値分類の場合「# LightGBM パラメータ」のコメントがある部分に追記します。こんな感じです。区切り文字のカンマ(,)を忘れないよう注意。

# LightGBM パラメータ
params = {
  'objective':'binary',    # 目的 : 二値分類
  'metric':'binary_error', # 評価指標 : 不正解率(1 - 正解率)
  'num_iterations':100,
  'num_leaves':31,
  'max_depth':-1,
  'min_data_in_leaf':20,
  'lambda_l1':0.0,
  'lambda_l2':0.0
}
  • 多クラス分類(multiclass)
  • 回帰分析(regression)

の場合も同じです。

ランキング学習(lambdarank)

ランキング学習の場合は「# モデルの学習」のコメントがある部分に追記します。こんな感じです。区切り文字のカンマ(,)を忘れないよう注意。

# モデルの学習
model = lgb.LGBMRanker(
  random_state=0,
  num_iterations=100,
  num_leaves=31,
  max_depth=-1,
  min_data_in_leaf=20,
  lambda_l1=0.0,
  lambda_l2=0.0
)

チューニングとは(まとめ)

  1. 使える学習データを作る。目的変数に影響を与えている説明変数を追求する。
  2. 過学習を防ぐためにシンプルな決定木を作る。
  3. 予測精度を上げるために複雑な決定木を作る。

これらをええ塩梅に調整するのが腕の見せ所。

チューニングは、この記事だけじゃなくてLightGBMの技術に特化したサイトなども参考にすることで、より深い理解とスキルの向上が期待できます。

以上、「PC-KEIBA Database」が皆様のお役に立てれば幸いでございます。