
錦織選手からブレイクをもぎ取りたい!〜MLPによるサーブコースの予測〜
初めまして、Aidemy研修生の竹内です!
さてみなさん、いきなりですが、日本を代表するテニスのトッププロ選手といえば誰を思い浮かべますか・・・??
そう、錦織圭選手ですね!他の選手との体格差を感じさせない攻撃的なテニススタイルで、シングルス世界ランキング7位(2018年3月現在)を保持。僕自身もテニスを嗜んでおり、錦織選手の活躍にいつも元気をもらっています。
そんなトップクラスの選手に、一泡吹かせたい!ポイントを取ってやりたい!なんて思っている、無謀な方はいらっしゃいませんか?そんな方に朗報があるんです!!
なんと、錦織選手のサーブは多層パーセプトロン(MLP)を用いた機械学習によって、ある程度コースの予測が可能なんです!!
今回はその予測の流れと、実際ポイントを取って、錦織選手のサービスゲームをブレイクできるのかどうかについての考察を書きたいと思います!
目次[非表示]
- 1.実行環境
- 2.データ収集
- 3.データの整形
- 4.データの分割とスケーリング
- 5.モデルの作成と学習
- 6.モデルを用いた場合の得点率の計算
- 7.再戦
- 7.1.SMOTEによるデータの水増し
- 7.2.ベイズ最適化によるパラメータの決定
- 8.考察・今後の改善・感想
- 9.参考文献
実行環境
- Python 3.7.2
- jupyter notebook
- MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports)(10.14.1)
データ収集
今回、錦織選手のサーブデータの収集には、以下のサイトにあるcsvファイルを使わさせていただきました!
今回利用したのは、2018年の公式戦における錦織選手のサーブデータです。スクレイピングしてきたデータは大会別になっているので、データをくっつけて一つのデータフレームを作ります。
コートのサーフェス(地面の材質)も、判断材料になると考え、大会の開催場所によってサーフェスの種類ごとに数値を割り当てました!こちらのデータフレームに、AceDbF、Cource、FirstSecond、OpponentPlayer、Server、Set、Speed、TotalGame、Tournament、WinLose、ScoreServer、ScoreReturner、Side、WonA、WonB、Surfaceのデータが格納されています。
データの整形
このデータのうち、サーブを打つ前にわかっている、かつサーブコースに関係のありそうな情報である、
FirstSecond…1stサーブか2ndサーブか
Set…何セット目か
TotalGame…そのセット内で何ゲーム目なのか
ScoreServer…プレー開始前のサーバーのスコア
ScoreReturner…プレー開始前のレシーバーのスコア
Side…サーブを打つサイド
Surface…サーブの地面の材質
これらの情報を説明変数とし、
Course...サーブのコース。Body(b)、Center(c)、Wide(w)の三種類の分類。
これをラベルデータとします!
データの中には空欄や特殊なケース(フォルトなど)が混ざっており、それらのデータもこの作業で落としています。
データの分割とスケーリング
データをトレーニングデータとテストデータに分割し、スケーリングによって変数の重みを揃えます。
モデルの作成と学習
いよいよモデルを作成していきます!今回はscikit-learnを用い、そこに実装されているMLPClassifierを学習機として多層パーセプトロンを実装していきます。
混同行列は、上の列から順に、実際bodyコースだったものから、center、wideとなっており、左の列から順に、モデルがbodyと予想したもの、center、wideとなっています。
ランダムサーチによりパラメーターの調整を行いました。正解率は54%と、2分の1を超えているのでまずまずといったところでしょうか。これで勝てればいいのだけれど...。
モデルを用いた場合の得点率の計算

さあ、モデルも完成しましたし、いよいよ錦織選手に挑戦です!
・・・とはいえ、本当に試合を挑むことはあらゆる手を尽くしても叶わないので、以下の流れの下ブレイクできたかどうか判定したいと思います!
1.1stサーブの時、レシーバーの得点率は29%、2ndサーブの時44%とする。(ATPのデータから引用)
2.(得点率)× 3 ×(モデルによって算出されたスコアのうち、実際に打たれたサーブに対応する値)を得点確率とし、乱数を用いて実際に得点したか否かを決定する。
3.テストデータ全てに対しこれを行い、得点率を求める。得点率が50%以上ならブレイク可能!
これだけだとわかりにくいと思うので、例を出して、モデルによる予測を用いた場合の意識の配分と、予測を用いない場合の意識の配分に分けて説明します。以下の説明は、あるテストデータで、説明変数が
「1stサーブ、1セット目、総ゲーム数3、サーバーの獲得ポイント40、レシーバーの獲得ポイント15、デュースサイド、インドアハードコート」
であり、ラベルデータがwideであるものを例にとっています。
・予測を用いない場合
この時、レシーバーはどのコースにも当確率でサーブが来る可能性があると考えるので、配分できる意識の合計値を1とすると、意識をbodyに0.33、centerに0.33、wideに0.33ずつ配分します。
錦織選手に対して1stサーブでこちらが得点できる確率は29%(ATP提供のデータに基づく)なので、改めて得点できる可能性を計算すると
29% × 3 × 0.33 = 29% ←(1stサーブの得点率) × 3 × (配分された意識)
となり、29%の確率でそのポイントを取ることができます。
・予測を用いる場合
モデルでは、bodyに1割、centerに4割、wideに5割の確率でサーブが来ると予測しました。
この結果をもとにして、意識をそのままの割合、つまりbodyに0.10、centerに0.40、wideに0.50配分します。
改めて得点できる確率を計算すると、
29% × 3 × 0.5 =43.5%
(1stサーブの得点率 × 3(補整) × 実際にサーブの来たコースであるwideに配分された意識)
となります。
つまりは、レシーバーは普段3つのコースを均等に意識して構えていると仮定して、モデルによって算出されたスコアに応じてその意識の配分割合を変えるとどうなるのかを検証することになります!
まず、何も意識しない、つまり予測を用いない場合、
このような結果となります。お世辞にもブレイクなんてできそうにないですね。
では、作成したモデルによる予測を適用するとどうなるのか。
以下のコードを実行して確かめてみます!
お・・・惜しい!得点率約49%と大健闘の末破れてしまいました。
こうみると、かなり予測によって得点率が向上していることがわかりますね!
しかしトッププロは一筋縄ではいきませんでしたね。かなり悔しいです!
再戦
それにしても悔しい。あまりに惜しい。
諦めきれなかった僕は、いくつか工夫をしてモデルを作成しなおしてみることにしました!
SMOTEによるデータの水増し
imbalanced-learn のSMOTEを用いて、少なかったbodyコースへのデータの水増しを試みました! これにより、モデルが少しでもbodyを的中させることが狙いです。以下が、ランダムサーチでSMOTEを利用した結果です。
確かにbodyの判別をしてくれるようにはなったものの、精度の向上には繋がりませんでした。
ベイズ最適化によるパラメータの決定
ベイズ最適化は、パラメータをむやみに試すのでなく、モデルが最適化されそうな値を予想してパラメータを試していってくれる手法です!bayes_optのBayesianOptimizationによって実装します。
モデルの最適化として、今回はモデルの精度の最大化ではなく、モデルを用いて試合をシミュレートした結果の、得点率の最大化を目指します。
しれっと"solver"の選択肢から"lbfgs"を除いていますが、これは時間のかかる割に良いデータが得られなかったためです。
このモデルによる再戦の結果・・・
27回目の試行で0.5越え!パラメータは、以下のものでした。
activation="relu", hidden_layer_sizes= (99,8,100), random_state = 5, solver="adam"
僅差にはなっていますが、見事勝利できました!!
リベンジ達成です!!!!!
考察・今後の改善・感想
しかし、勝利できたとは言ったものの、random_stateの値くらいでも揺らいでしまう勝利では意味がありません。今後は以下のような改良が考えられます。
今回用いたデータは、おそらくサーブコースの決定への寄与が小さく、実際の試合では相手選手の苦手等を分析したコースを増やすのではないかと考えます。そこで、対戦相手を固定したデータで検証を行えば精度が向上するのではないでしょうか。
また、戦況の要素として、プレー経験のある私としては試合の流れを捉えることも予測の大きな助けになると考えます。選手の有利不利による心理的な変化を捉えられなかった可能性もあります。「流れ」を捉えるなら時系列解析ですね。
錦織選手からブレイクできたかのシミュレーションのやり方に関しても実際の対戦に近づけられるよう工夫の余地があります。
モデルのチューニングについても、まだ工夫の余地があります。各モデルの損失関数の可視化なども用いて手がかりを探っていくという方法も考えられそうです。
でもまあ勝ちは勝ちです!やはりある程度の精度でサーブのコースは予測可能だったというわけです。引き続き改良を重ねれば、錦織選手から自信を持ってブレイクできるようになる日も近いでしょう。
参考文献
- Qlita「大井競馬で帝王賞を機械学習で当てた話」
- け日記「imbalanced-learnで不均衡なデータのunder-sampling/over-samplingを行う」
- け日記「Python: BayesianOptimizationによるベイズ最適化」
PythonやAIプログラミングを学ぶなら、オンライン制スクールのアイデミープレミアムプラン。
「機械学習・ディープラーニングに興味がある」
「AIをどのように活用するのだろう?」
「文系の私でもプログラミング学習を続けられるだろうか?」
少しでも気になることがございましたら、ぜひお気軽にAidemy Premium Planの無料相談会にお越しいただき、お悩みをお聞かせください!このほかにも、Aidemy MagazineとTwitter(@AidemyMagazine)ではたくさんのAI活用事例をご紹介しています。どちらも要チェック!それではまた次の記事でお会いしましょう。最後までご覧くださりありがとうございました。