テニスにおける疲労度の影響の定量化(spoana5の内容+α)

はじめに

「プロテニスにおいて疲れが勝敗に与える影響を定量化してみる」 という題目で下記イベントでLTしてきました。

spoana.connpass.com

使用した資料は以下になります。

プロテニスにおいて疲れが勝敗に与える影響を定量化してみる - Speaker Deck

内容の余談

行間的なものを何か書こうと思っていましたが正直あまり追記するようなこともなかったので使用したコードだけ載せておきます。 後述の追加検証のコードもこちらになります。

github.com

スライドに書いていない内容としては以下のような感じです。

  • レーティングと試合の勝敗のデータは別のデータソースから取得し選手名をキーとして紐づけているが、"Stan Wawrinka"と"Stanislas Wawrinka"のように 選手名の表記が異なっている人が何名かいたため、対応がわかる人については名前を手動修正、わからなかった人は行を捨てている。

  • ロジスティック回帰に入れる際、正解が1だけになってしまうのを防ぐため、勝敗を反転させたデータを追加している

  • 疲労度を算出する際、選手・大会ごとに値を集計する必要があるため前処理が少し面倒

追加検証

twitterのコメントを読んでいたら、 汎化性能はどうなのか?とか解釈性はpdpという選択肢もあるというようなコメントを見かけたので、 この辺りの追試もしてみました。

交差検証

汎化性の確認のためロジスティック回帰で交差検証をしました。 データをkfoldで4分割し、そのオッズ比の検証をしました。

試行 オッズ比
fold1 0.9957
fold2 0.9969
fold3 0.9902
fold4 0.9953
全件 0.9946

それなりに汎化性能はあるのではないでしょうか。 全件データで出した95%信頼区間は0.9913~0.9979だったので、 信頼区間ベースでも3/4はこの枠内に収まっています。

lightgbm + pdp

次に、lightgbm+pdp(partial dependence plot)で結果の解釈をしてみます。

pbpは機械学習の解釈方法の一つです。まず機械学習モデルで学習を行い、その後入力データ全件に対し影響を見たい変数を入力データ内で一律で変化させながら予測値の平均値を算出することで、 変数が予測値に与える影響を確認する方法です。各変数は独立であるという前提をおいている点には注意が必要です。

参考資料:

ロジスティック回帰のときに使った入力データと同じものを lightgbmで学習させ、そのpdpを算出します。 4foldで行い、そのout of foldで出した結果が以下になります。

f:id:rmizutaa:20191110103834p:plain

横軸が疲労度の差、縦軸が勝率に与える影響です。 一番左の点が基準点扱いとなっているため、疲労度の差が-100以下の場合はない場合と比較して勝率が0.08くらい上がり、 疲労度の差が250くらいあると勝率が0.1くらい下がるような結果です。

入力データには勝者と敗者を反転させたものを入れているので左右対称にならないのは違和感がありますが、 サンプルサイズが小さいのでこのあたりは仕方のない部分なのかなとは思います。

今回のデータの疲労度の差は実は以下のようなヒストグラムを描いています。

f:id:rmizutaa:20191110104300p:plain

入力データのサンプルサイズは964あるのですが、 そのうち疲労度の差が100を超えるものは48しかありません。 疲労度の差が出にくい1回戦が全体の1/2、2回戦が全体の1/4のデータを占めるためこのような形になってしまいます。 回帰木は線型性を仮定しないので、疲労度の絶対値が大きい部分の予測値はブレが生じやすい結果になっているのではないかと思います。とはいえ全体の傾向をつかむという目的の場合はこのくらいのサンプルサイズの時でも使用できるかなと思いました。

まとめ

解釈系の話の妥当性確認は難しい。