見出し画像

JRDBデータを利用した2022年競馬データを活用したレース結果予測

機械学習を使った競馬予想に新たな光。2022年のデータから何が見えてくるのか、簡潔に解説します。

  1. データの準備

    • 2022年の競馬データ(SEDデータセット)をCSVファイルとして保存し、分析に使用。

    • 日付順にデータを並べ替え、最新の20%をテストデータとして分割。

  2. データの前処理

    • 不要なカラム(例:「出遅」や「不利」などの注釈列)を削除。

    • 目標変数として、3着以内を「1」、それ以外を「0」とする二値変数を作成。

  3. 欠損値の処理

    • 数値データに対して平均値での欠損値補完を行う。

  4. モデルの訓練

    • LightGBMのGradient Boosting Classifierを用いて学習。

    • トレーニングデータでモデルを訓練。

  5. 予測と評価

    • テストデータを用いて予測を行い、予測の正確性(Accuracy)とF1スコアを計算。

    • 精度の高い予測が可能かどうかを評価。

コードはこちら
データは、以前の記事で説明したjrdb webツールにで作成。


SED_df.to_csv('train_data/SED_2022.csv', index=False)
In [43]:
from sklearn.metrics import accuracy_score, f1_score

# 日付の新しいものを20%をテストデータとして分割
data_sorted = SED_df.sort_values('年月日', ascending=False)
split_index = int(len(data_sorted) * 0.8)
train_data = data_sorted.iloc[:split_index]
test_data = data_sorted.iloc[split_index:]

# 不要なカラムを除去
excluded_columns = [
    'Unnamed: 0', '年', '回', '日', 'R', '出遅', '位置取', '不利', '前不利', '中不利', '後不利', 'レース', 'コース取り',
    '上昇度コード', 'クラスコード', '馬体コード', '気配コード', '備考', 'コーナー順位1', 'コーナー順位2', 'コーナー順位3', 'コーナー順位4',
    '単勝', '複勝', 'レースペース流れ', '馬ペース流れ', '4角コース取り', '確定単勝オッズ', '確定複勝オッズ', '確定単勝人気順位'
]
train_data_reduced = train_data.drop(columns=excluded_columns, errors='ignore')
test_data_reduced = test_data.drop(columns=excluded_columns, errors='ignore')

# 3着以内を1、それ以外を0とする新しい目標変数を作成
y_train = (train_data['着順'] <= 3).astype(int)
y_test = (test_data['着順'] <= 3).astype(int)

# 欠損値の処理
imputer_reduced = SimpleImputer(strategy='mean')
X_train_reduced_imputed = imputer_reduced.fit_transform(train_data_reduced[numeric_features_reduced])
X_test_reduced_imputed = imputer_reduced.transform(test_data_reduced[numeric_features_reduced])

# LightGBMのGradient Boosting Classifierでモデルを学習
lgb_classifier = lgb.LGBMClassifier()
lgb_classifier.fit(X_train_reduced_imputed, y_train)

# テストデータに対する予測
predictions_reduced = lgb_classifier.predict(X_test_reduced_imputed)

# Accuracyの計算
accuracy_reduced = accuracy_score(y_test, predictions_reduced)

# F1 scoreの計算
f1_reduced = f1_score(y_test, predictions_reduced)

# 結果の表示
print

モデルのAccuracyは約89.9%、F1スコアは約76.4%で、これらの数値はモデルが競馬の結果を高い精度で予測できることを示しています。特に、レースの上位着順(3着以内)の予測において良好なバランスを持っています。しかし、競馬の不確実性を完全には予測できないため、モデルの予測はあくまで参考情報の一つとして利用すべきです。

この記事が気に入ったらサポートをしてみませんか?