
今年デビューした2歳馬の出世を予測しよう!~機械学習を使ったG1馬の予測~
本記事は「Misskey.io競馬部アドカレ」の6日目記事になります。
また、素敵なヘッダー画像は黒井澪さん(@kuro_kuro_kuroi@misskey.io)さんいご提供いただきました。この場を借りてお礼申し上げます。
突然ですが問題です
次の4つのレースラップのうち、「勝ち馬が出世したレースラップ」はどれでしょう?
①12.5 - 11.7 - 12.8 - 12.5 - 12.3 - 12.5 - 12.2 - 12.2 - 12.5
②12.9 - 11.8 - 13.2 - 12.7 - 12.4 - 12.1 - 11.6 - 11.4 - 12.5
③12.9 - 12.6 - 13.2 - 12.6 - 12.4 - 12.2 - 11.8 - 11.4 - 11.1
④12.8 - 11.8 - 13.5 - 13.1 - 12.3 - 12.3 - 11.9 - 12.0 - 11.7
あんまり引き延ばしてもアレなんで答えを言ってしまうと③番です。これすべて2020~2023年の夏の小倉最終週に行われる芝1800mの新馬戦なんですね。
勝ち馬
①アナベルエクラ(現役、1勝クラス)
②トーアライデン(現役、2勝クラス)
③ドウデュース(現役、東京優駿などGI5勝)
④アドマイヤザーゲ(引退、2勝クラス)
③の勝ち馬ドウデュースは言わずと知れたダービー馬。しかもこのレースの2着はガイアフォース、3着はフェーングロッテンといずれも重賞ホースで、まさに「伝説の新馬戦」と呼ぶにふさわしいものでした。
このアンケートをMisskey.io競馬部内で実施したところ、③が最も多いという結果になりました(内訳としては①が6票、②が5票、③が14票、④が6票。皆さん流石お目が高い…!)。皆さんが何を根拠に選んだかは不明ですが、おそらく「4F~9Fのロングスパート加速ラップ」「大きく緩まない中ラスト11.1という速い上がり」あたりが主な判断材料じゃないかなと予測しています。
さて、このように多くの人が「良い」と認めるラップからは素晴らしい馬が出ますし、逆もまた然りだと思っています(個人的に最近好きなのはソールオリエンスとレーベンスティールが直接対決した東京芝1800m戦です)。そういう思想で今年の私は新馬戦の回顧記事なんかを一時期書いてました。残念ながらエタってしまいましたが(リベンジしたい)、回顧を書く中でふと気づいたことがあったのです。
「過去のG1馬の勝ち上がりレースを分析すれば来年のダービー馬が見えるのでは?」と…
統計的にも世代G1を勝つ馬は12月のこの時期までにはほとんどがデビュー・勝ち上がりを済ませていますし、それなら2歳G1が始まる直前に分析して預言者めいたことができないか?と思った次第です。
分析方法
(ちょっと技術的な話も入ります。読み飛ばしてもOK!)
学習データとしては2012~2023年の新馬・未勝利戦を選びました。
世代G1、すなわち「阪神JF、朝日杯FS、ホープフルS(ラジニケ時代は除く)、桜花賞、皐月賞、NHKマイル、オークス、ダービー」を勝った馬に「1」のラベルを、そうでない馬に「0」のラベルをつけ、「1」のラベルに分類される確率を予測させました。秋の2戦は余力がなかったので割愛。
特徴量は勝ち時計、ラップタイム、コース、馬場状態、個別上がり3F、騎手、調教師など色々詰込み。カテゴリ変数はTarget Encodingで。
学習モデルは使い慣れているXGBoostを特にパラメータを弄らずに使いました。
そうしてできたのが以下のコードです。
from sklearn.preprocessing import LabelEncoder
import pandas as pd
# netkeibaでの表記に合わせる
G1_races = ['阪神ジュベナイルF(GI)', '朝日フューチュリティ(GI)', 'ホープフルS(GI)', '桜花賞(GI)', '皐月賞(GI)', 'NHKマイルC(GI)', '優駿牝馬(GI)', '東京優駿(GI)']
for G1_race in G1_races:
race_results = pd.read_csv(r'C:\Users\elisa\OneDrive\Desktop\programming\Keiba\data\RaceResults.csv')
race_info = pd.read_csv(r'C:\Users\elisa\OneDrive\Desktop\programming\Keiba\data\RaceInfo.csv')
race_info = race_info.drop(columns='horse_name')
# ラベル決定用のデータフレームを作成
df = pd.merge(race_results, race_info, on='race_id', how='left')
# ラベル決定用のリストを作成
G1_1st = df[(df['race_name'] == G1_race) & (df['order'] == 1)]['horse_name'].tolist()
# 学習・テスト用のデータフレームを作成
race_info = pd.read_csv(r'C:\Users\elisa\OneDrive\Desktop\programming\Keiba\data\RaceInfo.csv')
race_lap = pd.read_csv(r'C:\Users\elisa\OneDrive\Desktop\programming\Keiba\data\RaceLap.csv')
race_lap = race_lap.drop(['13F', '14F', '15F', '16F', '17F', '18F'], axis=1)
df = pd.merge(race_info, race_lap, on='race_id', how='left')
# 判断レースは初勝利となる新馬or未勝利に限定
debut_and_maiden = ['2歳新馬', '2歳未勝利', '3歳新馬', '3歳未勝利']
df = df[df['race_name'].isin(debut_and_maiden)]
df = df.drop(columns='race_class')
# 個別情報を追加
ind_info = pd.read_csv(r'C:\Users\elisa\OneDrive\Desktop\programming\Keiba\data\RaceResults.csv', encoding='utf-8', usecols=['race_id', 'horse_id', 'sex', 'weight', 'ind_last3F', 'corner4'])
df = df.merge(ind_info, on=['race_id', 'horse_id'], how='left')
# 3F目以降の最大値と最小値を追加
df['F_max'] = df[['3F', '4F', '5F', '6F', '7F', '8F', '9F', '10F', '11F', '12F']].max(axis=1)
df['F_min'] = df[['3F', '4F', '5F', '6F', '7F', '8F', '9F', '10F', '11F', '12F']].min(axis=1)
# レース日程から月だけ抽出
df['date'] = pd.to_datetime(df['date'])
df['month'] = df['date'].dt.month
# 2024年のデータをテストデータ、それ以前を訓練データにする
train = df[df['date'] < '2024-06-01']
test = df[df['date'] >= '2024-06-01']
# ラベル付与
def assign_label(horse_name):
if horse_name in G1_1st:
return 1
else:
return 0
# 訓練データにラベルを添付
train['Label'] = df['horse_name'].apply(assign_label)
exclude_columns = ['race_id', 'horse_id', 'horse_name']
categorical_columns = train.select_dtypes(include=['object']).columns.difference(exclude_columns)
# ラベルエンコーディング
all_data = pd.concat([train, test], ignore_index=True)
encoder_dict = {}
for col in categorical_columns:
encoder = LabelEncoder()
all_data[col] = encoder.fit_transform(all_data[col].astype(str))
encoder_dict[col] = encoder
# 分割して元のデータフレームに戻す
train = all_data.iloc[:len(train)].copy()
test = all_data.iloc[len(train):].copy()
train_x = train.drop(columns=['race_id', 'date', 'year', 'day', 'horse_name', 'horse_id', 'jockey_id', 'trainer_id', 'Label'])
train_y = train['Label']
test_x = test.drop(columns=['race_id', 'date', 'year', 'day', 'horse_name', 'horse_id', 'jockey_id', 'trainer_id', 'Label'])
import xgboost as xgb
model = xgb.XGBClassifier(
objective='binary:logistic',
eval_metric='logloss'
)
model.fit(train_x, train_y)
# testデータに対する確率予測
test['pred_score'] = model.predict_proba(test_x)[:, 1]
# testデータの復元
for col in exclude_columns:
test[col] = df.loc[df['date'] >= '2024-06-01', col].values
test = test.sort_values(by='pred_score', ascending=False)
filename = G1_race + '_prediction.csv'
output = test[['race_id', 'horse_id', 'horse_name', 'pred_score']]
output.to_csv(filename, index=False)
果たしてAIは誰を未来のG1馬と見定めたのでしょうか!
予測結果
ここからは各レースについて予測確率の高かった5頭を紹介したいと思います。
最初はラップだけで予想しようとしたのですがあまり予測確率に差が出ず…。
仕方ないのでコースやデビュー月、騎手、調教師や、ラスト2Fのタイム差(マイナスなら加速ラップ)、3Fからの一番緩んだラップと一番速いラップも特徴量として加えて予想してもらいました。以下結果になります。
阪神JF
1:ラヴァブル
2:ミリオンローズ
3:テリオスララ
4:コートアリシアン
5:ハードワーカー
1位に選ばれたのはラヴァブルでした。父ジャスタウェイ、母エピックラヴなのでダノンザキッドの全妹ですね。勝ち上がりは中京マイルでほとんど緩まない流れに乗って先行押切り。兄がマイルでも活躍したことを考えると納得の内容でしょう。まあ出走しないんですがね!赤松賞ではトムを乗せて4着でしたが、クラシックに向けて賞金を積めるでしょうか。期待です。
2位はこれまた出走しないミリオンローズでした。新馬回顧でも触れましたが非常にレベルの高い新馬戦だったので個人的にも納得です。アルテミスSはらしからぬ負け方でしたがこの馬も素質十分なので春に向けての巻き返しなるでしょうか。
3,4位にようやく出走馬のテリオスララとコートアリシアンです。テリオスララは1800m中心に使っていますが阪神JFはマイル以上で末脚勝負に勝てる馬が有力なので納得の選出。新馬はハイレベルなキングスコール戦の2着、勝ち上がりの2戦目もまずまずのパフォーマンスを見せています。
コートアリシアンも新馬戦で上り33.3を使って快勝するなど実力は確かなもの。気性の怪しさはありますがすでに重賞で力を見せています。AIを信じる方はこの2頭のワイド1点勝負とかいいんじゃないでしょうか。
5位はハードワーカーでした。ノーブルミッション×マンカフェというややマイナーな血統で、中山を新馬勝ちして次走芙蓉Sでしたが心房細動で競走中止でした。幸い一命はとりとめているので復活を待ちましょう!
朝日杯FS
1:ニシノルアノーヴァ
2:グーテンベルク
3:ペイシャケイプ
4:サトノシャイニング
5:コートアリシアン
6:ダノンミッション
1位予測はニシノルアノーヴァでした。初戦こそ落としたものの2戦目の中山マイル戦で11.8 - 11.5 - 11.3を4番手から差し切り勝利。残念ながら放牧中とのことでここには出てきそうにないですがラップ自体はいいのでもう1つ勝ちあがるチャンスはありそうです。
2位はグーテンベルク。叔父にシンハナーダのいる血統です。ジャパンカップ前日に東京マイルでデビューして0.3秒差で新馬勝ち。ラップ的には中13.1と緩んだのがやや不満ですがそれでも最後11.4-11.4を出しているのは力がある証拠。朝日杯FSの想定にも名前がありますね!穴で買ってみるのもいいんじゃないでしょうか。
3位になんとダート1200mで勝ち上がったペイシャケイプ。AIくんえぐいところ突きますね。アジアエクスプレスに引っ張られてる気も。舞台はともかくラスト12.6 - 12.6 - 12.3を上がり順位2位に1.1秒も差をつける35.9秒で差し切っており、ここじゃないにしろ大物の気配が匂ってきます。
4位は東スポ杯2着の実績があるサトノシャイニングでした。デビュー戦は14.0まで緩んだ新馬特有のスローペースに乗り最後11.8 - 11.1 - 11.3を前で差し切り。大物候補クロワドゥノールともいい勝負を繰り広げたので来年のクラシックも湧かせてくれるでしょう!あ、朝日杯自体は回避の見込みらしいです。
5位コートアリシアンは触れたので省略。代わりに6位ダノンミッションの話をしましょうか。3戦目の東京マイルで緩んだ箇所でも11.9という2歳未勝利にしては速い流れで先行勝ち。名牝ダンスインザムードを祖母に持つ血統馬でいかにもPOG人気していそうな馬ですね。内容もいいので重賞でも期待大です。
ホープフルS
1:パートオブワールド
2:イブニングタイド
3:カムニャック
4:エンブロイダリー
5:ディアナザール
1位は牝馬のパートオブワールド。勝ち上がった東京2000m戦はラスト11.8 - 11.8 - 11.0と余力を見せています。百日草特別こそ振るいませんでしたがまだまだ巻き返し十分。おそらくホープフルSには出ないでしょうが同舞台の弥生賞でもしかしたら…?
2位はこれまた牝馬のイブニングタイドが上がりました。がっつり緩んだ&秋中山3日目という条件付きではありますがラスト11.6 - 11.2 - 10.7を出しています。ぱっと調べたのですがこの上がり33.5というのはここ20年の同舞台では出ておらずもしかしたら史上最速かもしれません(だれか調べて)。緩い流れなら押さえておきたい、ぜひ出走を!
3位もまた牝馬です。男どもはどうしたよ。こちらは筆者も注目しているカムニャック。中京2000mデビューで見せた12.2 - 10.9 - 10.9のラップには川田騎手も素質を認めており、クラシックに期待がかかっています。アルテミスSではっきりした通りマイルは忙しそうなのでここを使って皐月賞やオークスを狙う路線もありかもしれません。どうやらエルフィンSらしいですが。
4位もまた牝馬です。AIくんはレガレイラにシリコンを焼かれてるんですかね。エンブロイダリーは先に名前を挙げたミリオンローズ戦の2着馬ですね。あの後新潟で逃げつつ上がり最速7馬身差のパフォーマンスを見せて勝ち上がり、自己条件でもう1勝してます。しかしビワハイジの牝系は本当によく勝ち上がりますね。
5位にようやく牡馬のディアナザール。ドナウブルーの子どもでこちらも血統馬。斎藤部屋ならぬ斎藤厩舎の大型馬で新馬戦はスローペースを前でしっかり差し切って快勝。萩Sこそ落としていますがベゴニア賞はシンフォーエバーの作る速い流れに乗って勝ち切っていますしレベルの上がるG1でも…!と思っていましたがどうやら骨折で半年休養とのこと。能力を示すだけではダメなのも競馬とはいえなかなか難しいですね…。
流石に出走想定馬ゼロは悲しいので出走馬のうち何頭か上げるとショウナンマクベスが22位、ピコチャンブラックが29位、マジックサンズが38位でした。ホープフルSはG1昇格後まだ日が浅いのでうまく学習できていないのかもしれません。
桜花賞
1:ツインピークス
2:プロクレイア
3:ロンドボス
4:ダンツエラン
5:テリオスララ
6:マジカルフェアリー
ここからは来年のG1。
1位予想はウシュバテソーロの半妹ツインピークスでした。初勝利は5戦目でしたが、未勝利4戦とも前走よりプラス体重で出てきていい成長曲線を描いています。兄譲りの末脚が武器で、勝ち上がり戦では府中マイルの11.7 - 11.4 - 11.6を33.3で差し切りと豪快な内容です。差し馬場の桜花賞なら楽しみな存在になるかも?
2位予想はプロクレイア。近年有力馬のデビュー舞台となっている新潟で初勝利を挙げています。時計的には地味ですが新潟2歳Sで3着に来るなど実力を見せています。
3位にはロンドボスが入りました。開幕初日の府中マイルで11.5 - 11.4 - 11.4と止まらない流れを33.4で差し切っており期待が持てる内容でした。赤松賞は先行して最後失速しましたが、この赤松賞自体がかなり期待できそうな内容。ぜひとも権利獲得してほしいですね。
4位はファンタジーSの勝ち馬ダンツエラン。新潟でデビューし、緩い流れを前でしっかり差し切る優等生競馬をして勝ち上がっています。Storm Catの3×4×5という濃厚クロスを持っており、この血統に裏付けされたパワーで不良馬場のファンタジーSを勝利。パワーの必要な阪神マイルもこなしてくれるでしょう!
テリオスララには触れたのでマジカルフェアリーを。これも筆者注目の一頭です。緩い流れとはいえ小倉1800mの11.9-11.9-11.4を差し切り勝ち。前走萩Sはマイナス10kgが堪えたのかぱっとしませんでしたが春の立て直しに期待です。
皐月賞
1:レイニング
2:ショウナンマクベス
3:デンクマール
4:カザンラク
5:キングメーカー
皐月賞予想1位はレイニング。いわずと知れた国枝厩舎の牡馬でククナ、アライバルなどの半弟にあたります。11/3の府中1800m戦を8番手から運び、11.5 - 11.0 - 11.0を上がり32.9で勝利。AI君が上位指名するのもうなずけます。鞍上も戸崎騎手でしたし、第二のジャスティンミラノになるでしょうか。
2位にはホープフルSにも名前が挙がっているショウナンマクベス。デビュー戦を東京1600mで逃げ切り勝ち(実は現地観戦していました)。百日草特別も番手追走で勝利しており、活躍が期待できそうです。
3位はデンクマール。今を時めくタナパク厩舎からルメール騎手を背にデビューしており、東京1800mを逃げ切り3馬身半差勝利しています。逃げながら上がり最速を記録しており十分期待できる内容ですね!
4位にはシュヴァリエローズなどをきょうだいに持つカザンラクの名前が出ました。こちらもルメール騎手とともに東京1800mをデビューし逃げ切り快勝。余談ですがルメール騎手は強い馬を無難に勝たせるときに逃げを使う気がします。ラップも11.6-11.2-11.0と余力のある内容で2戦目では更なるパフォーマンスを見せてくれるはずです。
5位はキングメーカー。またルメールの逃げで京都1800mの新馬を快勝しています。坂のくだりをうまく使って11.9 - 11.7 - 11.2 - 11.0といい流れを刻んでおり確かにこれは実力があると思わせる内容。タイムも申し分ありません。母母母がサトルチェンジなのでマンハッタンカフェと同じファミリーというのも人気が出そうですね。
NHKマイル
1:ダノンミッション
2:スターウェーブ
3:ゴーゴータカシ
4:クロワデュノール
5:リラエンブレム
1位は朝日杯FSにも名前が挙がったダノンミッションでした。詳細は割愛。
2位はスターウェーブ。この記事で上がる中だと筆者一番の期待馬です。6月デビューながら府中1400mを11.3 - 11.3 - 11.2で差し切り勝ち。マイルにふさわしいスピードを持っていると言えるでしょう。残念ながら2勝目からは少し遠ざかっていますが、立て直しを期待したい一頭です。
3位はゴーゴータカシ。珍名馬と侮るなかれ、新馬戦を逃げ切った後はコスモス賞でも2着に入っています。ただ気性の悪さが災いしてか2000mに延長した2戦は振るわず。そういう意味でもマイル戦は期待できますね。
4位に東スポ杯勝ち馬クロワドゥノールが入りました。正直実績と血統を考えるとここに出る可能性は限りなく低いと思いますが、新馬戦は府中1800mで緩んで12.5の速いペースを2番手差し切り勝ちというもの。確かにマイルで見てみたい気持ちもあります。
5位はリラエンブレムが入りました。京都マイルを浜中騎手とともに34.4の末脚で差し切り勝ち。昨年タガノエルピーダが同舞台で勝った時よりも0.2秒早く、キャリア1戦ながら今後に楽しみが持てますね!
オークス
1:エンブロイダリー
2:カネラフィーナ
3:ロンドボス
4:ミリオンローズ
5:インプロペリア
さてこの辺まで来るとかなり名前が被ってきますね。まだ上がっていなかった2頭について触れましょうか。
まずはカネラフィーナ。新馬戦は新潟マイルで33.1の豪脚を見せるもシンフォーエバーを捕まえきれず2着。2戦目も2着でしたが3戦目の距離延長、府中1800mで待望の初勝利を手にしました。これまでの3戦すべてで上り2位以上をマークしており、例年スローペースからの末脚勝負になりやすいオークスならではの注目馬でしょうか。距離延長で勝ったのもプラスですね。
そしてもう一頭はインプロペリア。府中マイルでデビューし、1.2倍の人気にこたえて逃げ切り勝ち。ただラップやサブライムアンセムの下という血統を考えると距離は短いほうがいいような気も。
日本ダービー
1:カザンラク
2:デンクマール
3:ガルダイア
4:ファイアンクランツ
5:フォーキャンドルズ
ダービー馬の称号を手にする候補として推薦されたのはこの5頭。カザンラク、デンクマールはすでに名前が挙がっていますね。残りの3頭を紹介しましょう。
ガルダイアは姉にアエロリットを持つ血統馬。デビュー戦は東京芝1800mで、向こう正面で動きながらも上がり最速タイの33.8で勝ち切っています。ラスト3Fも11.7-11.0-11.1と余力を見せており、素質を感じさせます。
ファイアンクランツはすでに札幌2歳S、東スポ杯と王道路線を歩んでいるので知っている人も多いのではないでしょうか。勝ち上がった新馬戦は重馬場札幌ながら12.1 - 11.8 - 11.1の加速ラップで、重賞に手が届くのではと感じさせる内容。順調に賞金を積んで夢の舞台へと駒を進めてほしいですね。
そしてフォーキャンドルズ。祖母がクラシックで活躍しながらG1タイトルには手が届かなかったエアデジャヴーで、その主戦だったノリさんを背に2戦目の京都1800m戦で勝ち上がっています。時計が出ない馬場ながらも最後は12.0-11.6-11.6と甘くならずに踏ん張り切っており、名手の新たなる相棒となるか、要注目です。
おわりに
以上、ダービーまでの芝世代G1についてAIくんに予想をしてもらいました。個人的にはPOG人気にこたえているあの馬とかすでに結果を出しているあの馬が出るかなぁと思っていたのですが意外なところからの名前が多かったですね。視野が広いのはAIのいいところだと思います。
今週末からこの予想の答え合わせが始まります。まあドンピシャは1レースあればいいほうだとは思いますが、名前を挙げた馬の中には重賞を勝てると筆者も考える馬もいましたので、春のクラシック戦線に期待しましょう!