まだタイトルない

アウトプット用です

【Kaggle挑戦記】MLB コンペ振り返り【#10】

こんにちは。

2021/6/10-2021/7/31 の期間で開催されていたMLB Player Digital Engagement Forecastingというコンペに参加してきました。取組期間は6/29-8/1の約一ヶ月です。結果は2021/9/15に決まるのでまだどうなったかはわかりません。
今回はコンペ中に気になったこととそれに対してやったこと(殆どは何もわからんで対策できず)について書きます。

また、他の参加者がどう考えてたのか、本質は何だったのか聞く機会があればいいなーと思っています。

コンペページ

MLB Player Digital Engagement Forecasting

概要

選手のパフォーマンスデータ、ソーシャルメディアのデータ、市場規模などのチーム要因などを使って、将来ファンがMLB選手のデジタルコンテンツにどのように関わっているかを予測する。

具体的には2021年のシーズンの各MLB選手について、4つの異なるエンゲージメント指標(target1~target4)を予測する。

評価値

  • MCMAE(Mean Column-Wise Mean Absolute Error)
  • 4つのターゲット変数ごとに平均絶対誤差が計算され、その4つのMAE値の平均値がスコアとなる

データ

詳しくはコンペのDataを見るに限りますが選手やチーム等のマスターとtrain.csvが与えられていました。
train.csvが一番メインのテーブルで1行が1日分のデータになっていて、ラベルを始め選手個人のデータやチーム単位のデータ、試合の1球ごとに発生したイベント情報まで含まれています。 与えられてる項目が既に多いためどの特徴量を使うか/使わないか ダブルヘッダーの扱いやnanの扱いでかなり苦労しました。これは技術不足です。

分析

大きく分けると下記です。

  1. ラベルのスケールと他選手との相対的なターゲットに同対応したら良かったの?
  2. レギュラーシーズンのデータが少なくない?
  3. NaNが多かった
  4. 情報のリークによるエンゲージメント増加は流石に予想できないよね

ラベルの値はスケールされてる

f:id:teyoblog:20210805081233p:plain 引用元

  • 各targetは0から100の範囲でラベル付けされている
  • 分布をみるとほとんどが10以下
  • 1日あたりtarget1~4で1つづつ100になってるデータが有る(たまに複数の例も確認)
    • target毎にスケーリングされているのではないかという話がディスカッションで議論されていた
  • このことから、試合がないオフシーズンでも誰かは100になる
  • 普段大谷選手がホームランを打てば100になっていたとしても同日にシャーザー投手の移籍が話題に上がればシャーザー投手が100をつけることになるかもしれない
    • 同日内で一番大きな出来事を見つけられればいいですが私はチャレンジできませんでした。

レギュラーシーズンのデータが少ない

  • trainデータの期間は2018/01/01~2021/04/30
    • コンペ終盤に5月1日から7月17日までのデータが配布される
    • 締切後に7/18~7/31のデータも使えるようになる
      • 学習から推論までするノートを提出することで、rerunしたときに7/31まで使用して学習する
  • public testは2021年5月
  • privateは2021年8月以降の一定期間

test期間はいわゆるレギュラーシーズンの期間にあたります。データの中でレギュラーシーズンは下記

  • 2018年3/29~9/30 162日間2430試合
  • 2019年3/28~9/29 162日間2430試合
  • 2020年7/23~9/27 60日間900試合
  • 2021年4/1~10/3(予定) 162試合(予定)
    • trainには379試合分含まれる

不安点としては下記がありました。みなさんはどう判断していたのでしょうか?

  • 今シーズンのデータが1ヶ月分しかない
    • cvを4月で測る流れになってたが今年のデータを学習に使えない
  • privateはシーズン終盤
  • 直近のシーズン2020年シーズンはコロナ禍で特殊なシーズンだった

色々試せばいいが正義だとは思いますがなかなか実験を早く回すこともできなくて最終的には7/17までのデータが配布されたあとの6/1-7/17をvalidにしました。(privateでは31までがvalidになる)直近の2ヶ月分をvalidだけで使うのはもったいなすぎるためbestiteration*1.1で再学習をするようにしました。

target毎に若干相関がある?

player_engagement_targets_correlations = df_targets[['target1', 'target2', 'target3', 'target4']].corr()
display(player_engagement_targets_correlations.round(decimals = 4))

f:id:teyoblog:20210805081254p:plain

何らかのメディアのエンゲージメント4種なのでむしろ低いのではないか?という捉え方も出来ますが、、、
lightgbmだと4つそれぞれにモデルを組むため他のtargetとの関係は考慮されません。そのためスタッキングを試してみましたが、用意したモデルが少なかっただけなのかうまくいきませんでした。

野手と投手でデータがある列が違う

  • 野手だと投手用特徴量はNaNになっている。
  • DH制の投手は打撃成績はNaNになっている。

打者用のモデル、投手用のモデルを考えましたがやりませんでした。

サイクルヒットを達成しても100になるとは限らない

サイクル安打ってすごいし話題にもなるので特徴になるかと思いましたが意外と100にならない場合がありました。

player_score.query('doubles > 0 & triples > 0 & homeRuns > 0 & hits >= 4 \
                    & hits - doubles - triples - homeRuns > 0 ').reset_index(drop=True).merge(targets, on=['dailyDataDate','playerId'], how='left')

f:id:teyoblog:20210805081319p:plain

サイクル安打が達成された日に、その人以外が100をとった要因を調べてみました。

  • 2018-08-09 Giancarlo Stanton 2015年に導入されたスタットキャスト史上最速となる121.7mph(約196km/h)の本塁打を放った
  • 2018-08-09 Kenley Jansen 宿泊ホテルで不整脈を訴え、そのまま病院に搬送され故障者リスト入り
  • 2018-08-29 不明 31のヤンキース移籍のときには3つ100がついた 噂でも出ていた?
  • 2018-09-17 Aaron Judge 怪我からの復帰戦
  • 2018-09-30 Christian YelichがナショナルリーグMVPに選ばれる
  • 2018-09-30 josh hader 最優秀救援投手になったから?
  • 2018-10-08 ポストシーズンヤンキースに登板予定?登板して好投?
  • 2019-04-05 エンゼルス mike trout 2ホームラン
  • 2019-04-05 Bryce Harper シーズン開幕して、調子がいい()
  • 2019-06-13 Greinke 7かい無失点好投
  • 2019-06-14 t4 Joe Mauer メジャーにいない・・・
  • 2019-06-14 edwin Encarnación ヤンキースに移籍 (発表は6/19頃)もれていた・・・?
  • 2019-07-23 ヤンキースが劇的勝利、ヒックスとグレゴリウスがホームラウンを打っている
  • 2019-07-23 マイク・トラウト33号ホームラン
  • 2019-08-05ブルワーズイエリッチ2HR
  • 2019-08-05マーリンズイーサン・ディアスメジャー初ホームラン
  • 2019-08-05 アレクマノアはプロ入り前
  • 2019-09-17 mik yastrzemski のチームが延長15回で勝利、 当人はホームランを打ったが殊勲ではない
  • 2019-09-17 ヤンキースの投手 投げてない・・・

なんとなく、ホームランを打つと盛り上がる人がいたりヤンキースは盛り上がる・・・?

特徴量としてその日大谷はホームランを打ったか?トラウトはホームランを打ったか?という特徴量を作ってみました。 殆ど効かなかったです。

eventデータを使えば終盤に逆転勝ちをしたかどうかや、殊勲打打った人とかはわかりそうだと思いましたが力が足りず手を付けられませんでした。

edwin Encarnación選手のヤンキースに移籍によるエンゲージメントの増加はwikiやネットニュースで書かれてる公式発表から数日前にすでに100になっているので何らかのリークや噂が立ってるのかもしれないですが与えられたデータからは判断できません。transaction内には含まれてるので発表当日の高い値は予測できるかもしれませんが、移籍全てが高くなるわけでもないので他の特徴量との組み合わせになるでしょう。

その他特徴量

実験管理を雑にしすぎててどれくらい効いたのかあまり残ってないですが...

  • チームの成績、完封勝ちしたか、完封負けしたか
    • 0.01
  • アメリカ人かどうか
    • +0.01
  • 何個賞を受け取ったか
  • トレードの発表があったか
  • 打点はその日のチームの総得点の何割か
  • 人気選手がホームランを打ったか(Ohtani,Trout,Judge,Yelich,Acuna.jr
  • 年俸データ
  • 記述統計量
    • +0.06
    • なるべく直近のターゲットで集計しました f:id:teyoblog:20210805081330p:plain

提出コード

www.kaggle.com

試したけど採用されなかったもの

  • lightgbmのobject hover
  • lightgbmでweightを設定
  • 個人、チームのツイッターアカウントのフォロワー数
  • スタッキング
  • NNmodel

おわりに

今回はまだ評価期間なこともあって、忘れないようにコンペ中気になったことを雑に書き並べてみました。(サイクルヒット打っても100にならない!を伝えたかっただけかもしれない。というか期間中にディスカッションに掛けばよかったとまで思います。

前回のコンペ(Coleridge)が終わってから1週間で次のコンペを始められたのは良かったと思います。が、もう少し序盤からペースよくすすめられたら良かった。まだまだ実験の速度が遅いと痛感しました。