2021年11月29日月曜日

MLBでの7,000投球の球種の機械学習と球面SOMによる可視化

【what is this】MLBでの投球に関する機械学習の続編です。今回は、投球7,000球のそれぞれに球種ラベル(2-seam, 4-seam, sinker, など7種)が付与されたデータを機械学習させ、その結果を使って、テスト用に用意された700投球で球種を予測させました。さらに、その700球の球種を、球面SOM(自己組織化マップ)で可視化してみました。

■ MLB 7,000投球のデータ
 MLBの公開データのうちに、7,000投球について、以下に示す球速等と左右投手の識別子のデータセットがあります。そして、その各投球に球種ラベルが付与されて、参考文献[2]で解説されています。
投球データのfeatures(特徴量8要素);
 ball velocity (vx0, vy0, vz0)
 ball acceleration (ax, ay, az)
 starting speed of pitch
 whether pitcher is left handed or not

球種ラベル(pitch_code 7種)
    2-seam, 4-seam, changeup, curveball, slider, cutter, sinker
(プルグラム中では、0〜6の整数で表される)

 これらのデータの具体例を示します:
(投球データの次は、左(1)/右(0)投手を表す。最後は球種ラベル。)
 vx0, vy0, vz0, ax, ay, az, start_speed, left_handed_pitcher, pitch_code
 7.699, -132.225, -6.583, -22.508, 28.311, -16.585, 91.1, 0, 0
 6.680, -134.215, -6.355, -19.660, 26.703, -14.343, 92.4, 0, 0
 2.565, -135.398, -2.916, -14.784, 27.808, -21.573, 93.1, 0, 0
  . . .

■ 投球のデータの機械学習
 これらのデータを教師付き機械学習させるプログラム概要も[2]に示されています。それは、Tensorflow JSを使って、Node.jsのサーバで動かすものです。しかし、当方の環境でNode.jsをうまく稼働させることができなかったので、自分で通常のWebサーバで稼働させるように修正して学習させました。その結果(球種毎の正解率)を以下に示します。

 2-seam   => training:0.822, validation:0.701
 4-seam   => training:0.899, validation:0.618
 changeup => training:0.841, validation:0.718
 curveball=> training:0.970, validation:0.804
 slider   => training:0.864, validation:0.607
 cutter   => training:0.900, validation:0.591
 sinker   => training:0.811, validation:0.443

 上記で、"training"は、学習に用いた7,000件についての、そして、"validation"は、これとは別に用意したテスト用のデータ700件についての球種予測(prediction)の正解率です。 "validation" では、cutterやsinker正解率は低めですが、投球の複雑な物理現象を考えれば、全般的には、かなりよく球種を予測できていると思います。

■ 球面SOM(自己組織化マップ)による球種の可視化
 このように、ある程度良い学習結果が得られましたが、ちょっと物足りません。つまり、正解率の数値だけでは、頭の中に具体像が得られません。球種を何らかの形で可視化したい。そこで思い付いたのが、自己組織化マップSOMです。SOMについては、10年以上前に、少し勉強しただけで、その後はご無沙汰していたのですが、その当時使っていた書籍[1]を思いだし、それに添付のSOMツールを使ってみました。古いツールですが、何とか稼働させることができました!

 以下に、その結果の一部を示します。細かいので、拡大してご覧下さい。SOMは、教師ラベル無しでデータを学習して、類似性の高いデータ同士を近い場所に配置してくれます。下図は、球面SOMによる結果です。ここでは、最初に述べたTensorflowJSを使った機械学習とは別の方法での学習ですが、同様に妥当な結果が得られていると思います。

 例えば、図1では、"sinker"となるべきベクトル(ここでは8次元ベクトル)が、中央付近に集まっています。また、"2-seam"同士も、その左側や上側に集まっているのが確認できます。小生は野球データに関しては全くの素人なので、間違っているかも知れませんが、sinkerと2-seamは、共に速球で沈むという共通点があり、それらの集団が隣接しているのも納得できそうです。(なお、右上ブルーで囲まれた球面は、大きい球面の裏側です。)


 図2では、"curve" が中央から右にかけて集まっています。そして、中央の斜め下方向に強い区分けの赤線があります。その赤線に隣接する左下方向には、"cutter" が集まっています。curveとcutterは共に曲がるという特性がある一方、球速が大幅に異なることから、この強い区分け線ができているようです。

 以上、2つの方法での機械学習は、いずれも、8種の特徴量(8次元ベクトル)で、球種をある程度予測できることを示しています。特に、球面SOMの結果は、頭の中に、具体的なイメージを定着させてくれると感じます。

参考資料
[1] 大北正昭、徳高平蔵、藤村喜久郎、権田英功:自己組織化マップとそのツール、シュプリンガージャパン、2008年12月
[2] Node.jsを使用して野球の投球の種類を予測する
https://www.tensorflow.org/js/tutorials/training/nodejs_training?hl=ja

0 件のコメント:

コメントを投稿