「機械学習を使ってイタリアのファンタジーフットボールで勝利した方法」
Winning in Italian fantasy football using machine learning
![Dall-Eによる画像。](https://miro.medium.com/v2/resize:fit:640/format:webp/1*qi1dXD6Qo3dkTfNiExHE7g.png)
AIの力でFantacalcioの秘密を解き明かす
機械工学の学位を持ち、プログラミングとコンピュータサイエンスに興味を持つ機械エンジニアとして、数年前に機械学習と人工知能の世界に魅了されました。これらの技術がさまざまなエンジニアリング分野での可能性を認識し、機械学習の研究の旅に乗り出しました。しかし、理論的な知識を習得したにもかかわらず、新たに獲得したスキルを実践的に応用し、練習する方法に苦労しました。既製のデータセットは利用できましたが、完全なデータの収集と処理の経験を提供してくれませんでした。そこで、私は考えました。なぜ機械学習を使ってファンタジーフットボールで勝つのを手助けしないのかと。
Fantacalcioの紹介
![出典:Fantacalcio。](https://miro.medium.com/v2/resize:fit:640/format:webp/1*-CC6ynNgmgdmXvQJZgM7Cg.png)
Fantacalcioはイタリアのサッカーファンの間で非常に人気のあるゲームです。参加者はシーズン中、実際の選手のパフォーマンスに基づいて競い合います。シーズン開始前に、参加者は20人以上の選手のロスターをドラフトするためのオークションを行います。各Serie Aの試合日後、選手はパフォーマンスに基づいて評価され、ゴールとアシストには追加のボーナスが与えられます。これらの累積された評価とボーナスによって、参加者のスコアが決まります。ゲームの重要な側面の1つは、週ごとに選手のラインナップを選び、定期的に出場させる選手とベンチに置く選手を決めることです。
私の仕事の目的
私の機械学習アルゴリズムの主な目的は、Serie Aの選手のチームの試合に基づいてその選手の得点とファンタボーナス(得点にボーナスを加えたもの)を予測することです。サッカーは不確かなゲームであり、選手が得点するかどうかを保証することは不可能です。しかし、特定の選手は他の選手よりも得点する可能性が高く、彼らのパフォーマンスは対戦相手のチームによって異なることがあります。私の目標は、Serie Aの試合日において、どの選手がより強力なパフォーマンスを発揮する可能性が高いかを客観的な方法で判断することでした。
免責事項:このようなセクションは、Fantacalcioからの実際の例を提供するために記事で使用されます。ゲームやSerie Aの選手に詳しくない場合は、このセクションをスキップしてください。
![ファンタカルチオのラインナップで選手のパフォーマンスを予測するアルゴリズムの結果のプレビュー。著者による画像。](https://miro.medium.com/v2/resize:fit:640/format:webp/1*-orwm96812CNYyQlEX1a3w.png)
データの収集と処理
Fantacalcioから得点のアーカイブをダウンロードした後、次のステップは機械学習アルゴリズムのトレーニングに必要な包括的な特徴量セットを収集することでした。このデータセットを構築するために、Serie Aの選手やチームの統計情報を収集するための貴重な情報源であるfbref.comを見つけました。このサイトは、予測ゴール数、タックル数、パス数、平均的なチャンスの創出数など、さまざまな指標を含む、細心の注意を払って編集された統計情報の幅広い範囲を提供していました。FBRefで利用できる詳細なデータの豊富さは、機械学習アルゴリズムのトレーニングに頑強な特徴量セットを組み立てるプロセスを大いに支援しました。
![利用可能ないくつかの選手の統計情報を示す表。出典:FBref。](https://miro.medium.com/v2/resize:fit:640/format:webp/1*Mz_FzgUiKrLHyTIXTTV7xg.png)
![利用可能なチームの統計データを示す表。出典:FBref](https://miro.medium.com/v2/resize:fit:640/format:webp/1*YvKc_u7o3wrogOWkxYhBqg.png)
私が取ったアプローチは、各選手に50以上の特徴を持つデータセットを構築することでした。このデータセットは、処理された選手の平均統計情報と、そのチームの統計情報、および試合日における対戦相手の統計情報を組み合わせています。データセットの各行のターゲット出力は、選手の投票数とファンタジーボートです。データセットを構築するために、セリエAの過去3シーズンを考慮しました。
シーズン中の出場時間が限られている選手の信頼性の低い統計情報の課題に対処するため、次の3つの戦略を採用しました:
- 前シーズンの統計情報との重み付き平均。
- 信頼性のある歴史的データがない場合、選手の統計情報は同じ役割を持つ平均プレーヤーの統計情報と平均化されました。
- 事前に定義されたリストを使用して、選手の統計情報を同じ役割を持つ以前の選手の統計情報と一部平均化しました。
たとえば、ナポリの新人キムのパフォーマンスは、以前のクリブラリのパフォーマンスと比較されるかもしれません。また、トーヴァンのパフォーマンスは、彼の前任者であるデウロフェウとの関係で評価されるかもしれません(ただし、これは誤りでした)。
![各データセット行を表すスキーム。選手の投票数とファンタジーボートはターゲット出力であり、他のすべての統計情報とホームファクターは特徴セットに結合されます。著者によるイメージ。](https://miro.medium.com/v2/resize:fit:640/format:webp/1*nMzA-Sloeco5vDm1nYEDtg.png)
アルゴリズムの定義とトレーニング
興味深く、視覚的に優れた結果を得るために、機械学習アルゴリズムは、単純な投票数とファンタジーボートの予測を超えるために設計されました。代わりに、確率的なアプローチが採用され、TensorFlowとTensorFlow Probabilityを活用して確率分布を生成するニューラルネットワークが構築されました。具体的には、ネットワークはsin-arcsinh確率分布のパラメータを予測しました。この選択は、選手のパフォーマンス投票の分布における本来の歪度を考慮するために行われました。たとえば、攻撃的な選手の場合、平均ファンタジーボートは約6.5程度であるかもしれませんが、アルゴリズムは、ゴールを決めるなどの特別なパフォーマンスを示す10の投票が、稀なパフォーマンスを示す4の投票よりもより起こりやすいと認識しました。
![さまざまなパラメータを持つSinh-Arcsinh確率分布を示す図。出典:ResearchGate](https://miro.medium.com/v2/resize:fit:640/format:webp/1*jpKHGuzz4kATBXZfYh-VPg.png)
このタスクに使用された深層ニューラルネットワークアーキテクチャは、シグモイド活性化関数を使用した複数の密な層から構成されています。過学習を防止し、汎化を向上させるために、DropoutやEarly Stoppingなどの正則化テクニックが使用されました。Dropoutはトレーニング中に一部のニューラルネットワークユニットをランダムに無効にし、Early Stoppingは検証損失が改善しなくなった場合にトレーニングプロセスを停止します。モデルのトレーニングに選択された損失関数は、負の対数尤度であり、予測された確率分布と実際の結果の不一致を測定します。
ニューラルネットワークの構築のために書かれたコードの一部を以下に示します:
callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience = 10)neg_log_likelihood = lambda x, rv_x: -rv_x.log_prob(x)inputs = tfk.layers.Input(shape=(X_len,), name="input")x = tfk.layers.Dropout(0.2)(inputs)x = tfk.layers.Dense(16, activation="relu") (x)x = tfk.layers.Dropout(0.2)(x)x = tfk.layers.Dense(16, activation="relu") (x)prob_dist_params = 4def prob_dist(t): return tfp.distributions.SinhArcsinh(loc=t[..., 0], scale=1e-3 + tf.math.softplus(t[..., 1]), skewness = t[..., 2], tailweight = tailweight_min + tailweight_range * tf.math.sigmoid(t[..., 3]), allow_nan_stats = False)x1 = tfk.layers.Dense(8, activation="sigmoid")(x)x1 = tfk.layers.Dense(prob_dist_params, activation="linear")(x1)out_1 = tfp.layers.DistributionLambda(prob_dist)(x1)x2 = tfk.layers.Dense(8, activation="sigmoid")(x)x2 = tfk.layers.Dense(prob_dist_params, activation="linear")(x2)out_2 = tfp.layers.DistributionLambda(prob_dist)(x2)modelb = tf.keras.Model(inputs, [out_1, out_2])modelb.compile(optimizer=tf.keras.optimizers.Nadam(learning_rate = 0.001), loss=neg_log_likelihood)modelb.fit(X_train.astype('float32'), [y_train[:, 0].astype('float32'), y_train[:, 1].astype('float32')], validation_data = (X_test.astype('float32'), [y_test[:, 0].astype('float32'), y_test[:, 1].astype('
ニューラルネットワークを使用した予測
訓練されたアルゴリズムは、選手の投票とファンタ・ボートの確率分布予測を提供しました。選手の平均統計、チーム情報、対戦相手のデータ、ホーム/アウェイの要素を考慮することで、将来のセリエAの試合での選手のパフォーマンスを予測することができました。確率分布の事後処理により、予想される数値的な投票予測と最大のポテンシャル投票を導くことができ、ファンタカルチョのラインナップ選択の意思決定を簡素化しました。
![選手の投票(青)とファンタ・ボート(緑)の確率分布を示すプロット。画像提供:著者](https://miro.medium.com/v2/resize:fit:640/format:webp/1*Me-lIg5cn4ku5mrN6n_p3w.png)
モンテカルロ法を使用して、各選手の確率分布を使用してラインナップの予想される総投票数を予測しました。モンテカルロ法は、複数のランダムなシミュレーションを実行して潜在的な結果を推定する方法です。これで完了です!セリエAの各試合日に、ファンタカルチョのロースターから最適なラインナップを選ぶためのすべてのツールを手に入れました。
![モンテカルロシミュレーションによって得られたラインナップポイントの確率分布を示すプロット。画像提供:著者](https://miro.medium.com/v2/resize:fit:640/format:webp/1*Ghl97XbVnPQ5CI4C2cpL7g.png)
アルゴリズムが成功した場所
追加の指標として、予測される投票数を自分自身の主観的な期待と比較し、満足のいく結果を得ました。特に、実際のサッカーに似た複数の役割を果たす選手が関与するマントラファンタカルチョバリアントでは、アルゴリズムが特に効果的でした。オフェンシブな選手がディフェンシブな選手を上回るわけではないため、利用可能なモジュールから最適なラインナップを選択することは複雑な課題でした。
さらに、アルゴリズムを使用して統計的に平均的なセリエAチームを対戦相手として選択することで、1月の市場オークションの準備に役立ちました。一般的な意見によって過小評価されている可能性のある過小評価された選手を特定することができました。
エル・シャーラウィやオルソリーニなどの選手は、セリエAシーズン後半で非常に優れたパフォーマンスを発揮した注目すべき例です。アルゴリズムは、彼らの予想されるパフォーマンスが1月末までに他のトップミッドフィールダーと同等のレベルになると予測しました。
![Fantacalcioロースターに生成された投票予測を示すテーブル、セリエAの試合日の1つ。画像提供:著者](https://miro.medium.com/v2/resize:fit:640/format:webp/0*7who2YQPlbjGNxAC.png)
アルゴリズムの失敗点または改善点
アルゴリズムの弱点は、ゴールキーパーのパフォーマンスを予測することです。異なる特徴を利用し、クリーンシートの確率を出力として追加した別個のニューラルネットワークが開発されました。しかし、結果は満足のいくものではなかったようで、おそらくアウトフィールドプレイヤーに比べてゴールキーパーの数が限られていることが原因です。これにより、データセットが多様性に欠け、過学習のリスクが増加しました。
さらに、アルゴリズムはシーズン全体の各選手の平均統計のみを考慮しました。このアプローチは十分でしたが、特定の試合日までの選手の直近2〜3試合のデータを組み込むことで、アルゴリズムが現在のフォームを考慮する能力を向上させることができます。これにより、選手の最近のパフォーマンスのより包括的な評価が得られます。
すべての作業は公開されています
このプロジェクトのコードと、いくつかのセリエAの試合日に生成された結果は、Githubで入手できます。時間が許す限り、次のシーズンのためにさらなる改善を計画しています。ご質問や説明が必要な場合は、お気軽にご連絡ください。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles