競馬AI開発

競馬AI開発⑦~学習用のデータを作成する~

 競馬AI開発についての第7回です。

今回は学習用データの作成について記述します。

学習用データ作成の概要

 第5回でデータベース(DB)の作成について記述しましたが、

実際に学習用に使用するデータはDBのデータを直接読み取りして使用するわけではなく(一部は使いますが)、

レースごとにDBのデータを加工してあらかじめ「学習用データファイル」を作成・出力しておきます。

では「なんでこんな回りくどいことをするのか?」ですが、

理時間の短縮

が主な理由です。

DBから直接読み取って加工する形でももちろん良いのですが、

私の採用している機械学習手法・モデル構造の特性と使用データ量の関係上、

DBへのアクセスと加工処理時間がかかりすぎてとても現実的な学習時間にならないのです。。。

DBとは別の場所にデータを出力するため、

そのための時間(地方競馬用データ作成に10~20日くらい2台のPCを回しっぱなし)と

ハードディスクのメモリ容量(数十GB)が必要になりますが、

それでもDBから直接読み取り、加工する時間と比較すると圧倒的な効率化につながっています。

では具体的にどんなことをやっているか?という点ですが、

  • 基本的にはDBに格納されているデータを、レースごとにそのまま抽出
    (レースIDや競走馬IDなどをキーとしてDBごとにテーブルを結合、並び替えし、選択する操作)
  • 特別な加工やデータの前処理(次項で説明)を施す

といった処理をしています。

こうして出来上がったデータをロードしてAIモデル構築をしています。

学習用データ作成例

学習用データ作成イメージ

データの前処理について

 データ処理や機械学習をかじったことがある方には馴染みがある言葉だと思いますが、

前処理とは、AIモデル構築に必要なデータ加工処理全般を指す言葉です。

第5回で触れたような、カテゴリ値の変換や走破時計の単位変換なども前処理の一種といえます。

学習用データ作成時点での前処理は、主に

値反転

外れ値置換

スケーリング

を行います。

値反転

 着順、着差、走破時計など

「その値が小さいほど価値が高い」

と考えられる項目については、あらかじめ値反転をすることで、

「その値が大きいほど価値が高い」

という意味合いになるように変換しています。

具体的には、入力値を、その入力値が取りうる値の最大値から引いています。

例えば、

着順が1着の場合、18 - 1 = 17 

着順が18着の場合、18 - 18 = 0

とすることで、着順が低いほど、特徴量の値が大きくなるように調整しています。

上述の処理は、最初から検討していたものではなく、

開発する中で試してみたら精度が向上したのでそのまま組み込んでいます。

技術的に納得のいく説明ができないのですが、

「ニューラルネットワークの学習では重みの勾配計算が行われるのため、

ゼロに近い値(着順だと1着に近い値)だと、あまり学習への影響を与えられないため」

かな?と思っています。もし理由が分かる方いれば教えてほしいです。。。

外れ値置換

 外れ値(異常値)とは、「他の値から極端に大きいまたは小さい値」のことであり、

データ処理においては必ず考慮しなければなりません

例えば、「着差」の最大値はAISSのDBに存在する中央レースの中では、

2009年7月18日小倉4Rのカシノビヨンセが、勝馬1:10.0で入線のところ、3:16.6で入線、

つまり、2分6秒6の着差がありました。

着差例1

この着差最大値をそのまま後述の正規化に用いてしまうと、例えば着差が0.1秒と1.0秒などでは、

数値上ほとんど同じ値となってしまい、うまく学習できないと考えられます。

ちなみに、比較的記憶に新しい例で、

重賞初出走のちそのまま引退とかなり話題になったヘヴィータンクですが、

それでも着差22秒9でした笑

この着差と比較してもカシノビヨンセの着差が外れ値とみなされるのは当然ですね。

着差例2

外れ値対応のポイントは2つであり、

  1. 外れ値と判断する基準は何か?
  2. 外れ値をどのように置換するか?

です。

外れ値検出・置換方法はさまざまですが、AISSの場合は

下限値 = 第一四分位数 - 1.724 × 四分位範囲
上限値 = 第三四分位数 + 1.724 × 四分位範囲

を外れ値とみなす境界値とする。
その範囲外は外れ値とみなし、その外れ値境界値に置き換える(clipping)。

ようにしています。

【参考】統計実務におけるレンジチェックのための外れ値検出方法

データスケーリング

 例えば着順は正常値であれば、最小1~最大18ですが、単勝オッズは最小1.0~最大999.9と、

項目によりとりうる値の範囲が大きく異なります。

そのため、データをある基準に従い、値の範囲などを統一する「スケーリング」がよく用いられます

その中でも良く用いられるのは、

正規化(Min-Max normalization)

標準化(standardization)

の2つです。

○正規化

 項目のとりうる値の範囲を通常、最小値0から最大値1に揃える変換方法であり、

xを入力値とすると、以下の式で変換されます。

正規化

○標準化

 値の平均を0、標準偏差を1に揃える変換方法であり、

xを入力値とすると、以下の式で変換されます。

   

○データスケーリングのポイント

 一般的なデータ処理においては、カテゴリ値や画像処理における画素のような、

値の最小値と最大値が決まっている場合などを除き、外れ値にあまり影響しない標準化を用いることがほとんどですし、

上記以外にもデータの値の分布によっては非線形変換を施す場合もあります。

AISSにおいてはさまざまなスケーリング手法を実験してみた結果、最終的に「正規化」に落ち着きました。 

注意

GBDTなど決定木をベースにした機械学習手法ではデータスケーリングが必要ない場合もあります。

 

まとめ

 今回は、

  • 学習用データ作成とは何をするのか?
  • AISSではどのようなデータ前処理をしているのか?

について説明しました。

特にデータの前処理は、少し工夫するだけで大きく精度改善する可能性を秘めているため

データ加工技術の習得もかねて色々と実験してみると良いですね。

※データの前処理や分析手法全般については下記書籍が大変参考になりました。

Kaggleで勝つデータ分析の技術

 

それでは次回はいよいよメインの話題であるAIモデル構築について解説したいと思います!

次回へ

-競馬AI開発

© 2022 AISS BLOG