Python と機械学習を使用してサッカーの試合の勝者を予測する方法


Freepikによる画像

Python は、最も用途の広いプログラミング言語の 1 つです。 長年にわたり、Python プログラミングは、さまざまな機械学習アプリケーションを構築するための最も人気のあるプログラミング言語に成長しました。

このようなアプリケーションの重要な要素は、多くの場合、処理可能なデータに基づいて何らかの予測を実行することです。 予測には、Python プログラミングを使用して非常に簡単に対処できる不確実性の側面があります。

ここでは、この記事では、そのような問題の 1 つに取り組みます。 Python プログラミングの助けを借りて、サッカーの試合の結果を予測しようとします。

この問題にはある程度の不確実性が伴うため、Python プログラミングはこれを研究して解決するための最良の選択肢かもしれません。 そして、それこそまさに私たちがここで達成しようとしていることです。

サッカーは、他のスポーツと同様に、本質的に予測不可能な複数の要素を含むスポーツです。

サッカーの試合が、予想とは異なる結果になることがよくあることはよく知られています。

このようなシナリオでは、サッカーの試合の勝者を予測することが課題になります。 ただし、事前に特定の試合のイベントを知ることはできなくても、過去の試合で発生したイベントを知ることはできます。

このデータは、必要に応じて予測を成功させるための重要な要素になります。 これは、データ サイエンスの問題の基礎であり、過去のデータ統計を調べてありそうな未来を予測します。

したがって、この問題では、過去の試合から得られたデータに基づいて結果を出します。 過去のデータに基づいて統計的調査を行い、サッカーの試合で最も可能性の高い勝者を予測します。

そのために、教師あり機械学習を使用して、Python プログラミングを使用して検出用のアルゴリズムを構築します。

この記事の目的は次のとおりです。

  1. 過去のサッカーの試合のデータを収集する Web スクレイピング
  2. 検出モデルを使用して、収集されたデータに基づいてサッカーの試合結果を予測する教師あり機械学習
  3. 検出モデルの評価

1.Webスクレイピング

Web スクレイピングは、インターネット上のさまざまな Web サイトで利用可能な膨大な量のデータから関連データを抽出する方法です。

抽出されるデータは、ほとんどが構造化されておらず、HTML 形式です。 このデータは、構造化され、後でアプリケーションを処理するために簡単にアクセスできるリストの形式に変換される方法でスクレイピングされます。

Web スクレイピングを成功させるには、特にサッカーの試合に関するデータを含む Web サイトに検索を絞り込む必要があります。

それが修正されたら、Web サイトへの URL を使用して、主にページの HTML スクリプトにアクセスします。

この HTML コードを使用して、スクレーパーは必要に応じて必要な出力形式 (スプレッドシート、リスト、CSV/JSON ファイルなど) に変換します。

この問題のために、Web サイト FBref.com で入手可能なデータに対して Web スクレイピングを実行します。

関連する手順は次のとおりです。

  1. 上記のウェブサイトの「コンペティション」セクションに移動します。
  2. 予測を行うために結果を抽出したい言及された大会 (Premier League 2022-23 など) を選択します。
  3. 選択した競技セクションの下にある「スコアと備品」セクションに移動します。

スコアは予測を行うために使用されるため、その情報を Web スクレイピングする必要があります。 したがって、ページの URL をコピーします。

この場合 (たとえば、プレミア リーグ)、リンクは次のようになります: https://fbref.com/en/comps/9/schedule/Premier-League-Scores-and-Fixtures#sched_2022-2023_9_1

必要に応じて、他のコンテストへのリンクを取得することもできます。

  1. ただし、他の Web サイトを使用して検出を実行することもできることに注意してください。

    たとえば、https://en.wikipedia.org/wiki/2022_FIFA_World_Cup のような試合のスコアへのリンクを提供するだけで、Wikipedia 自体から試合の結果を Web スクレイピングすることができます。

  2. 実際の Web スクレイピングを実行するには、コピーした URL を Web スクレイピング スクリプトまたはコードに提供して、関連する一致データを抽出する必要があります。
  3. このスクリプトを使用して、1 シーズンのすべてのゲームをリストまたは .csv ファイルに結合します。
  4. 上記からコピーされた URL は、チャンピオンシップに関する情報を含むテーブルの ID と共に入力として与えられます。
  5. すべての一致を含むコンパイルされたリストが出力として受け取られます。
  6. 選手の統計データなど不要な情報は省略しています。
  7. どのチームが勝つかを予測できるように、情報はチーム データにマッピングされた試合データのみを含むように制限されています。
  8. 結果は、データ フレームの助けを借りて、試合とチームに関するデータ (プレーヤー固有の情報を省略) を含むように追加されます。

これは主にWebスクレイピングの方法であり、抽出されたデータは過去のデータであり、将来の勝者についての予測に基づいています.

次のコード スニペットを使用して、これを理解してみましょう。

まず、必要なライブラリをインポートします。

import pandas as pd
from bs4 import BeautifulSoup
import requests

次に、Beautiful Soup を使用してスープを作成し、Web サイトの HTML コードを抽出します。

url="https://en.wikipedia.org/wiki/2022_FIFA_World_Cup"
res = requests.get(url)
content = res.text
soup = BeautifulSoup(content, 'lxml')

次に、たとえば FIFA ワールド カップの試合のデータなど、予測に基づいて試合の情報を抽出します。

match_data = soup.find_all('div', class_='footballbox')

次に、ホーム チームとアウェー チームのデータ/スコアを抽出します。

for match in match_data:
    home_team.append(match.find('th', class_='fhome').get_text())
    score.append(match.find('th', class_='fscore').get_text())
    away_team.append(match.find('th', class_='faway').get_text())

最後に、データを DataFrame に保存して、.csv ファイルにエクスポートします。

dict_football = {'home_team': home_team, 'score': score, 'away_team': away_team}
df_football = pd.DataFrame(dict_football)

df_football.to_csv("fifa_worldcup_data.csv", index=False)

2. データの前処理

実際の検出モデルを実行する前に、データを処理することが重要になります。 したがって、このシナリオでも同じことを行います。

手順には、以前の試合で獲得したスコアの平均値を格納するための変数の作成が含まれます。

これは、将来のデータにアクセスできないため、既に利用可能なデータに対してのみ検出を行うことができるためです。

シーズンの試合に関する情報を格納するさまざまな変数の平均を計算します。

これに加えて、他のさまざまな変数の移動平均も保存します。

チームのスコアは、各勝利を 3、引き分けを 2、敗北を 1 として合計しました。これらの値は、過去数試合のチームのすべてのスコアを合計するために使用されました。

次に、ホーム チームとアウェイ チームを確実に区別するために、適切な計算を行うことができます。

ただし、この場合、FIFA ワールド カップの結果を導き出す必要があると想定できます。

トーナメントにはニュートラル グラウンドでの試合が含まれるため、この特定のケースでは、ホーム チームとアウェイ チームの概念は無視できます。

どうしても考慮する必要があるとすれば、アウェイチームの結果からホームチームの結果を引いて、ホームチームがアウェイチームよりも優れているかどうかを確認することを念頭に置いておく必要があります。

3. 予測モデルの実装

実際の検出を実行するために、さまざまな種類の予測モデルを使用できます。 この場合、実際の予測を実装するために 3 ~ 4 つのモデルを検討します。 ここで予測のために考慮されているモデルは次のとおりです。

魚の分布

ポアソン分布は、固定間隔内の確率を定義し、一定の平均レートを持つことによって、イベントの可能性を検出するために使用される予測アルゴリズムです。

ポアソン分布は、特定の間隔でイベントが発生する回数を予測します。 これは、単純な可能性のある結果またはそうでない結果ではなく、イベントの確率の尺度を提供するのに役立つことを意味します。

これが、一般に多分類の問題に適している理由ですが、バイナリの問題にも同様に機能します (2 つのクラスをデータセット内の多クラスと見なします)。

実装に使用されるコード スニペットは次のとおりです。

ホームチームとアウェイチームのポイントを計算する関数「予測」を定義します。

def predict(home_team, away_team):

    # Calculate the value of lambda (λ) for both Home Team and Away Team.
    if home_team in df_football.index and away_team in df_football.index:
        lambda_home_team = df_football.at[home_team,'GoalsScored'] * df_football.at[away_team,'GoalsConceded']
        lambda_away_team = df_football.at[away_team,'GoalsScored'] * df_football.at[home_team,'GoalsConceded']

次に、以下に示すように、ポアソン分布の式を使用して「p」の値を計算します。

この値は、引き分け (pr_draw)、ホーム チームの勝者 (pr_home)、アウェイ チームの勝者 (pr_away) のそれぞれの確率を計算するために使用されます。

p = poisson.pmf(x, lambda_home_team) * poisson.pmf(y, lambda_away_team)
if x == y:
    pr_draw += p
elif x > y:
    pr_home += p
else:
    pr_away += p

ホーム チームとアウェイ チームの両方のポイントが個別に計算され、最終的な予測に使用されます。

points_home_team = 3 * pr_home + pr_draw
points_away_team = 3 * pr_away + pr_draw

これが、機械学習モデル (この場合はポアソン分布) を利用して、フットボールの試合の勝者の基本的な予測を行う方法です。

この特定のアプローチは、検討中の予測モデルの式を変更するだけで、他のモデルにも拡張できます。

最終結果は、比較研究の形でさまざまなモデルに対して評価され、入手可能な最も適切なモデルを使用して最良の結果が得られるようにします.

同様の予測を行うために使用できる他のさまざまなモデルを簡単に見てみましょう。

ベクターマシンをサポート

SVM またはサポート ベクター マシンは、教師あり機械学習に基づくアルゴリズムです。

主に分類問題に使用されます。 さまざまな種類のデータの間に境界を作成して分類します。

2 つのデータ エンティティ間の分離として動作するため、主にバイナリ分類ソリューションと考えることができます。

ただし、マルチクラス分類に変更または拡張することもできます。

Python プログラミングを使用して SVM 予測を実行するには、以下を使用できます。

svc_predict = svm.SVC()
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.30)
svc_predict.fit(x_train, y_train)

ここで、svc_predict は、ここで x_train および y_train として示されるトレーニング データの SVM 計算です。 x_train と y_train にはモデルがトレーニングされるデータが含まれ、x_test と y_test はモデルがテストされるデータを示します。

KNN

K-Nearest Neighbors または KNN は、教師あり機械学習にも基づくアルゴリズムです。

クラスラベルを使用してデータの分類を実行します。 基本的に、クラスは分離を作成するためにラベル付けされます。

同じタイプに属するすべてのデータ エンティティには、同じクラス ラベルがあります。

回帰の場合、予測は「K」個の最近傍の平均を取ることによって行われます。

隣同士の距離は通常、それらの間のユークリッド距離です。

ただし、他の距離メトリックも同じために使用できます。

knn_predict = KNeighborsClassifier()
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.30)
knn_predict.fit(x_train, y_train)

ロジスティック回帰

ロジスティック回帰は、バイナリ分類問題の線形モデルです。

イベントの可能性を予測するために使用できます。これが、このケースに使用する理由です。

ロジスティック回帰の場合、従属変数は 0 から 1 の範囲に制限されます。

これが、サッカーの試合の勝敗シナリオなどのバイナリ分類問題に適している理由です。

logistic_predict = LogisticRegression()
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.30)
logistic_predict.fit(x_train, y_train)

4. メトリクスを使用した結果の評価

さまざまなモデルを使用して得られた結果を評価するために、メトリクスを使用して、どのモデルが他のモデルよりもパフォーマンスが優れているかをマッピングできます。

ここで、精度を計算して、モデルのパフォーマンスの質を判断できます。 同じための式は、次のように記述できます。

精度 = (真陽性 + 真陰性) /

(真陽性 + 偽陰性 + 真陰性 + 偽陽性)

真の陽性は、正しく予測された陽性の結果です。 同様に、真陰性は正しく予測された陰性結果です。

偽陰性は、誤って予測された陰性結果です。 同様に、偽陽性は、誤って予測された陽性結果です。

精度を確認するには、予測された出力と実際の出力を比較する必要があります。 これにより、実際の結果に最も近い予測を行うモデルを確認できます。

特定の問題は複雑なものでしたが、それでも Python プログラミングの助けを借りて簡単に結果を得ることができました。

結果は完全に正確ではありませんが、アルゴリズムは、Python プログラミングが毎日どのように世界を変えているかを示しています。

このアルゴリズムは、論理的に簡単に結果を予測できます。これは、ゲームに関する事前情報がなければ、おそらく人間には達成できないタスクです。

このような予測モデルを使用して、それらを微調整し、将来さらに良い結果を達成することができます。

Python と機械学習を使用してデータを予測する方法を理解していただければ幸いです。 Python について詳しくは、KDnuggets、Scaler、freecodecamp などの無料のリソースから学習できます。

ハッピーラーニング!

ヴァイシュナビ 矢田亜美良 テクニカルコンテンツライターです。 彼女は Python、Java、DSA、C などの知識を持っています。 彼女は書くことに気づき、それが大好きになりました。

Leave a Comment

Your email address will not be published. Required fields are marked *