AIの作り方①AIの基本とデータ収集:競馬予測の第一歩
競馬予測にAIを使うことは、レース結果を予測するための強力なツールです。しかし、AIを使い始めるには何が必要なのでしょうか?このガイドでは、初心者でも理解できるようにAIの基本とデータ収集の方法を詳しく解説します。高性能なPCがなくても心配いりません。Google Colabを利用することで、オンラインで簡単に実行できます。
AIの基本とは?
最近では、AIという言葉を耳にすることが多いですが、実際にはどのようなものなのでしょうか?この記事では、AIの基本的な概念を分かりやすく解説します。
AIって何?
AIとは、「人工知能」の略で、コンピュータが人間のように学習し、考え、判断する技術のことです。映画やドラマで見るような未来的なロボットを想像するかもしれませんが、実際には私たちの日常生活の中にたくさんのAIが存在しています。例えば、スマートフォンの音声認識、オンラインショップのおすすめ商品、さらには自動運転車などです。
機械学習と深層学習
AIにはいくつかの種類がありますが、特に重要なのが「機械学習」と「深層学習」です。
機械学習
機械学習は、データを使ってコンピュータにパターンを学ばせる方法です。例えば、たくさんの過去の競馬データを使って、次のレースの結果を予測することができます。機械学習の流れは以下の通りです:
- データ収集:まず、予測に必要なデータを集めます。
 - データ前処理:集めたデータを整理し、分析しやすい形にします。
 - モデル選定:データを基にどのような予測を行うか、アルゴリズムを選びます。
 - モデル訓練:選んだアルゴリズムにデータを学習させます。
 - モデル評価:モデルがどれくらい正確に予測できるかを評価します。
 
深層学習
深層学習は、機械学習の中でも特に高度な手法です。ニューラルネットワークという、人間の脳の構造を模倣した仕組みを使って、大量のデータから複雑なパターンを学びます。これにより、顔認識や音声認識といった高度なタスクが可能になります。
AIの学習プロセス
AIが学習するプロセスは以下の通りです:
- データ収集:まずは必要なデータを集めます。競馬の場合、過去のレース結果や馬の情報などです。
 - データ前処理:データを整理し、必要に応じて欠損値の補完や異常値の処理を行います。
 - 特徴量エンジニアリング:データから予測に必要な特徴を抽出します。例えば、馬の年齢や過去の成績などです。
 - モデル選定と訓練:データを使ってモデルを訓練します。ここでは、どのアルゴリズムを使うかを選びます。
 - 評価とチューニング:モデルの性能を評価し、必要に応じてパラメータを調整します。
 - 予測:最終的に、訓練したモデルを使って未来のレース結果を予測します。
 
AIを作るのに特別なソフトは要らない
「AIを試してみたいけど、高性能なPCがない…」と心配する必要はありません。Google Colabというクラウドベースのサービスを使えば、誰でも簡単にAIの実験ができます。これにより、手軽にAIの世界に触れることができます。
Google Colabとは?
Google Colabは、Googleが提供する無料のクラウドサービスで、ブラウザ上でPythonコードを実行できます。高性能なGPUやTPUも無料で利用できるため、手元に高スペックなコンピュータがなくても、AIや機械学習のモデルを訓練することができます。
Google Colabの始め方
1. Googleアカウントでログイン
まず、Googleアカウントにログインします。まだアカウントを持っていない場合は、こちらから作成してください。
2. Google Colabにアクセス
次に、Google Colabにアクセスします。すると、Colabのホームページが表示されます。

3. 新しいノートブックを作成
Colabのホームページから「新しいノートブック」をクリックします。これで、新しいPythonノートブックが開きます。

Google Colabの基本操作
1. コードセルの使い方
ノートブックには「コードセル」と呼ばれるブロックがあります。このセルにPythonコードを書いて実行します。セルに以下のようなコードを書いてみましょう。
print("こんにちは、Google Colab!")セルの左側にある再生ボタン(▶)をクリックすると、コードが実行され、出力が表示されます。

2. データのアップロード
AIの学習に必要なデータをアップロードする方法も簡単です。以下のコードを実行すると、ファイルをアップロードするダイアログが表示されます。
from google.colab import files
uploaded = files.upload()
アップロードしたファイルはColab環境で使用できるようになります。
3. ライブラリのインストール
Pythonライブラリは、特定の機能や作業を効率的に行うために、再利用可能なコードの集まりです。ライブラリを使うことで、ゼロからコードを書く必要がなくなり、開発効率が大幅に向上します。特にAIやデータサイエンスの分野では、多くの強力なライブラリが用意されています。
Colabでは、必要なライブラリを簡単にインストールできます。例えば、PandasやNumPyなどのライブラリは以下のようにインストールします。
!pip install pandas numpyこのコードを実行することで、ライブラリがインストールされ、すぐに利用可能になります。
Google Colabの便利な機能
1. GPUの利用
Colabでは、高性能なGPUを無料で利用できます。これにより、モデルの訓練速度が大幅に向上します。GPUを有効にするには、以下の手順を行います:
- メニューから「ランタイム」→「ランタイムのタイプを変更」を選択。
 - 「ハードウェア アクセラレータ」から「GPU」を選択し、「保存」をクリック。
 
2. ノートブックの保存と共有
作成したノートブックは、Googleドライブに保存され、自動的にバックアップされます。また、ノートブックの共有も簡単に行えます。共有ボタンをクリックして、リンクを生成するか、特定の人にメールで共有することができます。
ついにデータ収集へ
競馬データの種類
競馬予測に使用するデータにはさまざまな種類があります。以下はその一例です。
- レース結果:過去のレースでの馬の着順、タイム、騎手などの情報。
 - 馬の情報:馬の血統、年齢、性別、過去の成績など。
 - レース条件:レースの距離、コースの種類、天気、馬場状態など。
 
データの入手方法
公式サイトやデータベース
日本中央競馬会(JRA)や地方競馬の公式サイトから過去のレース結果をダウンロードできます。また、競馬専門の情報誌の予想印をデータとして活用できます.

ウェブスクレイピング
自動化ツールを使ってウェブサイトからデータを収集する方法です。PythonのBeautifulSoup、pandasというライブラリを使用します。以下のコードをcolabにコピペして実行してみましょう。
import numpy as np
import requests
import pandas as pd
import time
import re
import os
from bs4 import BeautifulSoup
BASE_DIR = "."
def scrape_race_result(raceid):
    race_url = f"https://db.netkeiba.com/race/{raceid}"
    time.sleep(5)
    r = requests.get(race_url)
    r.encoding = r.apparent_encoding
    soup = BeautifulSoup(r.text, "lxml")
    dfs = [pd.read_html(str(t))[0] for t in soup.select('table:has(tr td)')]
    #######結果#######
    result = dfs[0]
    soup_table = soup.find_all("table")[0]
    horses = [] # 馬のID
    jockeys = [] # 騎手のID
    trainers = [] # 調教師のID
    owners = [] # 馬主のID
    soup_a = soup_table.find_all("a")
    for item in soup_a:
        item_url  = item.get("href")
        if item_url is None: continue
        if "horse/" in item_url: horses.append(item_url)
        elif "jockey/" in item_url: jockeys.append(item_url)
        elif "trainer/" in item_url: trainers.append(item_url)
        elif "owner/" in item_url: owners.append(item_url)
    result["horse id"] = horses
    result["jockey id"] = jockeys
    result["trainer id"] = trainers
    result["owner id"] = owners
    prize = [] # 賞金
    soup_tr = soup_table.find_all("tr")
    for item in soup_tr:
        try: prize.append(item.find_all("td", class_ = "txt_r")[-1].text)
        except: pass
    result["prize"] = prize
    tsuuka = [] # 通過
    agari = [] # 上がり
    soup_tr = soup_table.find_all("tr")
    for temp in soup_tr[1:]:
        soup_td = temp.find_all("td")
        tsuuka.append(soup_td[10].text)
        agari.append(soup_td[11].text)
    result["通過"] = tsuuka
    result["上がり"] = agari
    result["レースID"] = raceid
    date = soup.find("p", class_ = "smalltxt").text
    date = re.findall(r"\d{4}年\d{1,2}月\d{1,2}日", date)[0]
    result["日付"] = [date] * len(result)
    return result
    
year_start = 2022 #取得開始年
year_end = 2023 #取得終了年
all_result = []
for year in range(year_start, year_end + 1):
    for place in range(1, 11):
        for z in range(1, 7):
            for y in range(1, 13):
                for x in range(1, 13):
                    raceid = f"{year}{str(place).zfill(2)}{str(z).zfill(2)}{str(y).zfill(2)}{str(x).zfill(2)}"
                    try:
                        result = scrape_race_result(raceid)
                        all_result.append(result)
                    except IndexError:
                        break
all_result = pd.concat(all_result)
all_result.to_csv(os.path.join(BASE_DIR, "all_result.csv"), index = False)以下にこれらのコードの解説をします。「プログラミングに興味ない」という人は実行するだけで次の記事にいってもらってかまいません!
import requests
import pandas as pd
import time
import os
from bs4 import BeautifulSoup
BASE_DIR = "."ここでは、必要なライブラリをインポートしています。
def scrape_race_result(raceid):
    race_url = f"https://db.netkeiba.com/race/{raceid}"
    time.sleep(5)
    r = requests.get(race_url)
    r.encoding = r.apparent_encoding
    soup = BeautifulSoup(r.text, "lxml")
    dfs = [pd.read_html(str(t))[0] for t in soup.select('table:has(tr td)')]scrape_race_result という関数を定義し、レースのURLを作成して、データを取得します。5秒の待ち時間を入れて、サーバーに負荷をかけないようにしています。BeautifulSoup を使ってHTMLを解析し、テーブルデータを抽出します。
result = dfs[0]
    soup_table = soup.find_all("table")[0]
    horses = []
    jockeys = []
    trainers = []
    owners = []
    soup_a = soup_table.find_all("a")
    for item in soup_a:
        item_url  = item.get("href")
        if item_url is None: continue
        if "horse/" in item_url: horses.append(item_url)
        elif "jockey/" in item_url: jockeys.append(item_url)
        elif "trainer/" in item_url: trainers.append(item_url)
        elif "owner/" in item_url: owners.append(item_url)
    result["horse id"] = horses
    result["jockey id"] = jockeys
    result["trainer id"] = trainers
    result["owner id"] = ownersここでは、馬、騎手、調教師、馬主のIDを抽出して、それぞれの列に追加しています。
    prize = []
    soup_tr = soup_table.find_all("tr")
    for item in soup_tr:
        try: prize.append(item.find_all("td", class_ = "txt_r")[-1].text)
        except: pass
    result["prize"] = prize
    tsuuka = []
    agari = []
    soup_tr = soup_table.find_all("tr")
    for temp in soup_tr[1:]:
        soup_td = temp.find_all("td")
        tsuuka.append(soup_td[10].text)
        agari.append(soup_td[11].text)
    result["通過"] = tsuuka
    result["上がり"] = agari
    result["レースID"] = raceid
    date = soup.find("p", class_ = "smalltxt").text
    date = re.findall(r"\d{4}年\d{1,2}月\d{1,2}日", date)[0]
    result["日付"] = [date] * len(result)
    return result
賞金や通過順、上がりタイムなどの追加情報も抽出して、結果に追加します。
year_start = 2022
year_end = 2023
all_result = []
for year in range(year_start, year_end + 1):
    for place in range(1, 11):
        for z in range(1, 7):
            for y in range(1, 13):
                for x in range(1, 13):
                    raceid = f"{year}{str(place).zfill(2)}{str(z).zfill(2)}{str(y).zfill(2)}{str(x).zfill(2)}"
                    try:
                        result = scrape_race_result(raceid)
                        all_result.append(result)
                    except IndexError:
                        break
all_result = pd.concat(all_result)
all_result.to_csv(os.path.join(BASE_DIR, "all_result.csv"), index = False)
最後に、指定された年と場所、Z日Y回、ラウンドに基づいてすべてのレースIDを生成し、scrape_race_result 関数を使ってデータを取得します。全ての結果を一つのCSVファイルにまとめて保存します。
all_result.csvをダウンロードしてエクセルなどで見てみると実際にスクレイピングできていることが確認できます。
注意事項
- スクレイピングは相手のサーバーに負荷をかける行為ですので、適切な待ち時間を設け、頻繁なリクエストを避けるようにしてください。
 - このブログはスクレイピングを推奨するものではありません。スクレイピングを行う際は、必ず対象サイトの利用規約を確認し、違反しないようにしてください。
 
まとめ
この記事では、競馬予測に必要なAIの基本とデータ収集の方法について解説しました。次回の記事では、データの前処理とクリーニングの詳細について紹介します。高性能なPCがなくても、Google Colabを使えば誰でも簡単にAIを利用できます。さあ、一緒に競馬予測AIを作成しましょう!
