
【競馬AI開発#17】血統データを予測材料に追加する
この【競馬AI開発】シリーズでは、競馬予想AIを作ることを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っていきます。
■今回やること
今回は、血統データを競馬予想AIの予測材料に追加することで、精度向上を目指します。
netkeiba.comでは「種牡馬リーディング」ページから、「各種牡馬(=父親)から生まれた馬がどのような成績を残したか」というデータを取得することができます。

今回はこのデータを競馬予想AIの予測材料にインプットして学習させていきます。
使用するソースコードは、下に進んでダウンロード・解凍すればそのまま使うことができるので、適宜手元で参照・実行しながらお読みください。
■筆者のプロフィール
東京大学大学院卒業後、データサイエンティストとしてWEBマーケティング調査会社でWEB上の消費者行動ログ分析などを経験。
現在は、大手IT系事業会社で、転職サイトのレコメンドシステムの開発を行っています。
定期購読をすると、今月更新される記事に加えて#1〜#4の記事が980円で全て読めるので、単品購入より圧倒的にお得です。
ソースコードのダウンロード
■ディレクトリ構成
.
├── requirements.txt ・・・必要なライブラリを記載
├── README.md ・・・ディレクトリ構成を記載(本ファイル)
├── common
│ ├── data
│ │ ├── html
│ │ │ ├── race
│ │ │ │ └── {race_id}.bin ・・・スクレイピングしたraceページのhtml
│ │ │ ├── horse
│ │ │ │ └── {horse_id}.bin ・・・スクレイピングしたhorseページのhtml
│ │ │ ├── ped
│ │ │ │ └── {horse_id}.bin ・・・スクレイピングしたpedページのhtml
│ │ │ └── leading
│ │ │ ├── jockey_leading ・・・スクレイピングした騎手リーディングページのhtml
│ │ │ ├── trainer_leading ・・・スクレイピングした調教師リーディングページのhtml
│ │ │ ├── sire_leading ・・・スクレイピングした種牡馬リーディングページのhtml
│ │ │ └── bms_leading ・・・スクレイピングしたBMSリーディングページのhtml
│ │ ├── rawdf ・・・Pandas.DataFrameのrawデータを保存するディレクトリ
│ │ │ ├── results.csv
│ │ │ ├── horse_results.csv
│ │ │ ├── horse_results_prediction.csv
│ │ │ ├── peds.csv
│ │ │ ├── jockey_leading.csv
│ │ │ ├── trainer_leading.csv
│ │ │ ├── sire_leading.csv
│ │ │ ├── bms_leading.csv
│ │ │ ├── return_tables.csv
│ │ │ └── race_info.csv
│ │ ├── mapping ・・・カテゴリ変数から整数へのマッピング
│ │ │ ├── around.json
│ │ │ ├── ground_state.json
│ │ │ ├── race_class.json
│ │ │ ├── race_type.json
│ │ │ ├── place.json
│ │ │ ├── sex.json
│ │ │ └── weather.json
│ │ └── prediction_population ・・・予測母集団(開催日, race_id, horse_id)
│ │ └── population.csv
│ └── src
│ ├── create_rawdf.py ・・・htmlをDataFrameに変換する関数を定義
│ ├── main.ipynb ・・・コードを実行するnotebook
│ ├── dev.ipynb ・・・開発用notebook
│ ├── create_prediction_population.py ・・・予測母集団を作成する関数を定義
│ └── scraping.py ・・・スクレイピングする関数を定義
├── v3_0_4
├── v3_exp5 ・・・実験用のバージョン
└── v3_0_5
├── data
│ ├── 00_population ・・・学習母集団を保存するディレクトリ
│ │ └── population.csv
│ ├── 01_preprocessed ・・・前処理済みのデータを保存するディレクトリ
│ │ ├── horse_results.csv
│ │ ├── horse_results_prediction.csv
│ │ ├── peds.csv
│ │ ├── peds_prediction.csv
│ │ ├── return_tables.pickle
│ │ ├── results.csv
│ │ ├── jockey_leading.csv
│ │ ├── trainer_leading.csv
│ │ ├── sire_leading.csv
│ │ ├── bms_leading.csv
│ │ └── race_info.csv
│ ├── 02_features ・・・全てのテーブルを集計・結合した特徴量を保存するディレクトリ
│ │ └── features.csv
│ ├── 03_train ・・・学習結果を保存するディレクトリ
│ │ ├── model.pkl ・・・学習済みモデル
│ │ ├── evaluation.csv ・・・検証データに対する予測結果
│ │ ├── importance.csv ・・・特徴量重要度(一覧)
│ │ └── importance.png ・・・特徴量重要度(上位を可視化)
│ │ ├── model_odds_removed.pkl ・・・学習済みモデル(オッズと人気を抜いたモデル)
│ │ ├── evaluation_odds_removed.csv ・・・検証データに対する予測結果(オッズと人気を抜いたモデル)
│ │ ├── importance_odds_removed.csv ・・・特徴量重要度(オッズと人気を抜いたモデル)
│ │ └── importance_odds_removed.png ・・・特徴量重要度(オッズと人気を抜いたモデル)
│ └── 04_evaluation ・・・検証データに対する精度評価結果を保存するディレクトリ
└── src
├── dev.ipynb ・・・開発用notebook
├── main.ipynb ・・・コードを実行するnotebook
├── create_population.py ・・・学習母集団を作成する関数を定義
├── preprocessing.py ・・・/common/rawdf/のデータを前処理する関数を定義
├── feature_engineering.py ・・・機械学習モデルにインプットする特徴量を作成するクラスを定義(学習時)
├── feature_engineering_prediction.py ・・・機械学習モデルにインプットする特徴量を作成するクラスを定義(予測時)
├── config.yaml ・・・学習に用いる特徴量一覧
├── config_odds_removed.yaml・・・学習に用いる特徴量一覧(オッズと人気を抜いたモデル)
├── train.py ・・・学習処理を行うクラスを定義
├── evaluation.py ・・・モデルの精度評価を行うクラスを定義
└── prediction.py ・・・予測処理を行う関数を定義
この記事が気に入ったらチップで応援してみませんか?