メインコンテンツへスキップ
見出し画像

【競馬AI開発#17】血統データを予測材料に追加する

    この【競馬AI開発】シリーズでは、競馬予想AIを作ることを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っていきます。

    ■今回やること
    今回は、血統データを競馬予想AIの予測材料に追加することで、精度向上を目指します。

    netkeiba.comでは「種牡馬リーディング」ページから、「各種牡馬(=父親)から生まれた馬がどのような成績を残したか」というデータを取得することができます。

    画像
    https://db.netkeiba.com/?pid=sire_leading&year=2022 

    今回はこのデータを競馬予想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           ・・・予測処理を行う関数を定義
     
     
    競馬予想AIを作ることを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っていきます。

    あなたへのおすすめ