結論から書けば玉砕でした。。
そりぁそうですよ
全兄弟で同じ厩舎でも一方はG1馬、他方は未勝利馬ということもあるわけですから。
数千サンプルのデータと二十次元程度の特徴量から予測するなんておこがましかったわけです。
いちおうトライしたのでやったことを書いておこうと思います。
データ
先日実装したnetkeibaスクレイパーを使って現3歳馬のデータを抽出しました。
- 2018/5/3時点での皐月賞後が終わったあとデータ
- 5962頭から 地方調教師に所属する馬を除いて 全3923頭
他に調教師、生産者、種牡馬、母父、母馬のデータも抽出し、結合して使います
特徴量ベクトル(説明変数)
調教師、生産者、種牡馬、母父、母馬のデータを結合し、 19次元のベクトルを入力として用います。
- debut_weight:デビュー戦の体重
- birth_date_from_beginning_of_year:1/1を基準にした誕生日までの日数
- crop_win_count:母馬の産駒の合計勝利数
- crop_grade_horse_count:母馬の産駒の重賞馬の合計頭数
- crop_grade_win_count:母馬の産駒の重賞勝ちの合計数
- win_count_trainer:調教師の勝利数
- prize_trainer:調教師の獲得賞金額
- win_count_breeder:生産者の勝利数
- prize_breeder:生産者の獲得賞金額
- win_ratio:種牡馬の勝率
- earning_index:種牡馬のearning index
- prize_sire:種牡馬の獲得賞金額
- win_ratio_bms:母父の勝率
- earning_index_bms:母父のearning index
- sex_セ、sex_牝、sex_牡: 性別(sexをone-hot encoding)
- stable_trainer_栗東、stable_trainer_美浦: 所属(stable_trainerをone-hot encoding)
今年デビュー予定馬のデビュー時体重のデータを得るのは難しいかもしれませんが 大型とか小型とかある程度はPOG本から情報仕入れられるのと予測に役に立ちそうなファクターな気がしたので入れています。
目的変数
もちろん獲得賞金額になりますがlogをとって対数スケールにしました。
使った機械学習アルゴリズム
手っ取り早い RandomForest です。 パラメータチューニングなしで学習させました。
学習データと検証データの比率は 7:3 でランダムに分割しました
学習結果
学習データでの予測結果のグラフです (logスケールなので軸の目盛りは0-10です)
R2スコアは 0.83です
このグラフを見ると淡い期待が。。
競馬で言えば、最後の直線に入り「そのまま、そのまま」と叫ぶのに似た気持ちです
検証データでの予測結果
R2スコアは 0.07 ...
全部正解だったときのスコアが1.0、ランダムに当てずっぽうに答えたときのスコアが0.0なので非常に辛い結果です
心の目で見るとわずかに右上がりの傾向が見えないこともないけど?(強がり)
Feature Importance
夢は潰え終戦しました
が、最後にFeature Importanceを出力し、各特徴量の学習への寄与度を見てみます。
上位8位の特徴量
- 調教師の獲得賞金額
- 1/1を基準にした誕生日までの日数
- 母馬の産駒の合計勝利数
- デビュー戦の体重
- 母父のearning index
- 生産者の獲得賞金額
- 種牡馬の勝率
- 母父の勝率
これはPOGをやったことある人ならうなずける結果ではないでしょうか
このデータを頭に入れてドラフト会議に臨みたいと思います