trainデータからtestデータのようなデータを作りたい
はじめに
今回のデータはtrainには全ての打席の情報が含まれていますが、testには含まれていないようです。このディスカッションでは、testデータの特徴について見ていき、それを応用してtrainデータからtestデータのようなデータを作ることを目的とします。
注意:今回のデータ元である2020年のプロ野球は例年と異なる試合形式で進められていました。あまり野球に詳しくない方は調べておくことをお勧めいたしますし、野球に詳しい方は新しいディスカッションやコメントのほうで教えていただけると助かります。
testデータを見てみよう
まずtestデータを見ていきましょう。
# データの読み込み
DATA_DIR = Path('../data') # データのディレクトリを指定
train = pd.read_csv(DATA_DIR / 'train_data.csv')
test = pd.read_csv(DATA_DIR / 'test_data.csv')
game = pd.read_csv(DATA_DIR / 'game_info.csv')
# 適当なtestの試合を見てみる
test.query('gameID == 20202085').sort_values(['inning', 'O'])
![08c5d7c3-f216-4875-8070-23f31c218000.png](https://probspace-stg.s3-ap-northeast-1.amazonaws.com/uploads/user/3829af4975d54ab6a4fb9e6732d93d8d/images/UserImage_167/08c5d7c3-f216-4875-8070-23f31c218000.png =300x)
この画像は4回までの情報ですが実際には9回まで続いています。
これを見てみると例外はありますが、各イニングで0アウト、1アウト、2アウトのときそれぞれ1球だけ切り取られていることがわかります。実際の試合を見てみるとこのボールカウントはランダムに切り取られていることもわかりました。
ではこのアルゴリズムを使ってtrainデータを切り取ってみましょう。
trainデータを加工する
この処理は簡潔に以下のコードで処理できる。
new_train = train.groupby(['gameID', 'inning', 'O']).apply(lambda x: x.sample(n=1, random_state=42))
すると以下のように表示される(一部)。
![26a2be83-9aad-46ec-91db-900c2abf5742.png](https://probspace-stg.s3-ap-northeast-1.amazonaws.com/uploads/user/3829af4975d54ab6a4fb9e6732d93d8d/images/UserImage_168/26a2be83-9aad-46ec-91db-900c2abf5742.png =300x)
これって何が嬉しいの?
おそらくtrainの情報を余すことなく使ったほうがいいと思いますが、testとデータ構造が異なるためCVとLBの相関が取れない可能性があります(このディスカッションを作成した時点では提出は行っていないのでわかりませんが…)。trainをtestのようなデータに直して特徴量作成などを行うことでCVとLBの相関が取れるようになるかもしれません。
おわりに
このディスカッションはtestのデータを見ながらどういうロジックで作成されているか考察したのちtrainで同様の処理を行いました。ただ完璧にtestデータを模倣できたわけではないと思うので改良点などディスカッションが盛り上がれば嬉しいなと思います。
ここからは今回のデータに対して個人的な意見です。(誤っていることもあるかと思いますので一緒に考えていただけたら幸いです)
1つ目に、今回選手をカテゴリデータとみなしcount encoding等を行うのは危険なのかなという気がしています。というのもtrainに含まれる試合数はかなり少なくtrainに含まれておらずtestに含まれる選手が数多くいます(例えばソフトバンクホークスの千賀選手など)。そのため選手情報をどう扱うかはこのコンペの鍵になりそうです。
2つ目に、外国人選手の表記が同じになっている問題です。例えば2020シーズン、阪神とヤクルトには同じ表記名であるスアレス選手が在籍しております(実の兄弟らしいです)。もし選手情報を使う際には名前にチーム名を足してあげるといいかもしれません。
3つ目に、正直3塁打を当てるゲームにならないか?という心配です。今回の評価指標はストライク、ボールなどそれぞれ8つのf1-scoreを計算してその和を8で割ったスコアになります。3塁打自体trainデータには12回しか登場しておらず、そのため少ないながら3塁打を完璧にあてさえすれば単純に1/8=0.125がスコアに加算することができます。オープンデータでもとのデータの取得が容易な以上、testデータのラベルがわかり、testデータに合わせたパラメータチューニングや後処理をうまくすれば3塁打を完璧にあてるようなモデルができる恐れがあります。ルール上外部データの使用はできませんが、学習に使わなくても前述のことを行い「たまたま実験がうまくいったから」という言い逃れができてしまうかもしれません(あってほしくないですが…)。またprobspaceがfinal submit形式ではないのでsubmitをたくさんした方がたまたま3塁打をうまく当てて上位になった、ということも想定できてしまうので本質とはずれたことになるのではと思っています。
以上が個人的な意見です。長期間ではありますが対戦よろしくお願いします!