競馬予想は多くの人にとって興味深いテーマであり、データ分析と機械学習の技術を駆使することで予想の精度向上が期待できます。この記事では、Pythonを使用して競馬のレース結果データを分析し、機械学習モデルを構築する手法について詳しく解説します。
競馬データの取得
競馬データはオッズや過去のレース結果など多岐にわたりますが、ここでは競馬データLabから提供されているAPIを使用してデータを取得します。APIキーの取得が必要ですので、事前に取得しておいてください。
必要なライブラリのインストール
まず初めに、データ取得や分析に必要なライブラリをインストールします。
pip install requests pandas scikit-learn
競馬データの取得
import requests import pandas as pd # APIキーとエンドポイントの設定(APIキーは実際のものに置き換えてください) api_key = 'Your API Key' endpoint = 'https://api.keiba.labs/1.0/race-results' # レース結果データの取得 def get_race_results(api_key, endpoint): headers = {'Authorization': f'Bearer {api_key}'} params = {'limit': 1000} # 取得するデータの数を指定 response = requests.get(endpoint, headers=headers, params=params) if response.status_code == 200: race_results = response.json() return race_results['data'] else: print(f"Error: {response.status_code}") return None # 使用例 race_results_data = get_race_results(api_key, endpoint)
上記のコードでは、競馬データLabのAPIを使用して最新のレース結果データを取得しています。取得するデータ数はlimit
パラメータで指定できます。
データの前処理と特徴量エンジニアリング
取得したデータは、分析や機械学習モデルの構築に適した形に整える必要があります。具体的な前処理としては、欠損値の処理、カテゴリカル変数のエンコーディング、特徴量の選択などが挙げられます。
データの前処理
# データの読み込みと基本情報の確認 df = pd.DataFrame(race_results_data) print(df.info()) # 不要な列の削除 df.drop(['course_type', 'going_type', 'ground_type', 'left_right_straight'], axis=1, inplace=True) # 欠損値の確認と処理 print(df.isnull().sum()) df.dropna(inplace=True) # 日付データの変換 df['race_date'] = pd.to_datetime(df['race_date']) # カテゴリカル変数のエンコーディング df = pd.get_dummies(df, columns=['race_type', 'track_type']) # 目的変数の作成(勝利した馬を1、それ以外を0とする) df['target'] = df['order_of_finish'].apply(lambda x: 1 if x == 1 else 0) # 不要な列の削除 df.drop(['order_of_finish'], axis=1, inplace=True) # 特徴量の選択 selected_features = ['horse_number', 'jockey_id', 'frame_number', 'horse_age', 'distance', 'race_type_D', 'race_type_O', 'track_type_ダ', 'track_type_芝'] X = df[selected_features] y = df['target']
上記のコードでは、取得したデータの前処理を行っています。具体的な処理としては、不要な列の削除、欠
損値の処理、日付データの変換、カテゴリカル変数のエンコーディング、目的変数の作成などがあります。目的変数は、各馬がそのレースで1位になるかどうかを表すバイナリ変数として作成しています。
モデルの構築と評価
データの前処理が終わったら、機械学習モデルの構築と評価に進みます。ここではランダムフォレストを使用しますが、他のモデルも試すことができます。
モデルの構築と評価
from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, classification_report, confusion_matrix # データの分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # モデルの構築 model = RandomForestClassifier(random_state=42) model.fit(X_train, y_train) # 予測 y_pred = model.predict(X_test) # 評価 accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy:.2f}") # 分類レポートの表示 print("Classification Report:") print(classification_report(y_test, y_pred)) # 混同行列の表示 print("Confusion Matrix:") print(confusion_matrix(y_test, y_pred))
上記のコードでは、ランダムフォレストを使用してモデルを構築し、テストデータでの予測精度を評価しています。Accuracy(正確度)、分類レポート、混同行列などが表示されます。
結果の可視化と改善
構築したモデルの結果を可視化し、必要に応じて改善を行います。
特徴量の重要度の可視化
import matplotlib.pyplot as plt # 特徴量の重要度を取得 feature_importances = model.feature_importances_ # 重要度の降順で特徴量の名前を取得 feature_names = X.columns sorted_idx = feature_importances.argsort()[::-1] sorted_feature_names = feature_names[sorted_idx] # 可視化 plt.figure(figsize=(10, 6)) plt.bar(range(X.shape[1]), feature_importances[sorted_idx]) plt.xticks(range(X.shape[1]), sorted_feature_names, rotation=45) plt.title('Feature Importance') plt.show()
上記のコードでは、ランダムフォレストモデルの特徴量の重要度を可視化しています。これにより、どの特徴量がモデルにとって重要であるかを確認できます。
モデルの改善
モデルの改善には以下のアプローチがあります。
- ハイパーパラメータの調整: モデルのパラメータを最適化することで性能が向上します。
- 特徴量の追加: より有益な特徴量を追加することでモデルの性能が向上する可能性があります。
- 異なるアルゴリズムの試行: ランダムフォレスト以外の機械学習アルゴリズムを試すことで、最適なモデルを見つけることができます。
まとめ
この記事では、Pythonを使用して競馬予想のためのデータ分析と機械学習モデルの構築について解説しました。競馬データを取得し、前処理を行い、ランダムフォレストモデルを構築して評価する基本的な手順を示しました。競馬予想は複雑で多くの要因が絡むため、機械学習モデルを使用しても十分な精度が得られない場合があります。その際は、データの追加や異なる手法の試行など、様々なアプローチを検討してみてください。