ディープラーニングを使用してNBAの試合結果を予測する

ディープラーニングを使用してNBAの試合結果を予測する

この記事では、ディープラーニングを使用して NBA の試合結果を予測します。この記事を通じて、次のことを学ぶことができます。

  1. NBA の技術統計をクロールする方法。
  2. データを前処理する方法。
  3. シンプルなディープ ネットワーク モデルを構築する方法。
  4. 試合の結果を予測する方法。

ついに翌日の試合を 100% の精度で予測するモデルが完成しました。

技術統計収集

ディープラーニングを使用してゲーム結果を予測するには、学習サンプルとして大量の技術統計データが必要です。

公式テクニカル統計ウェブサイトをご覧ください: http://stats.nba.com/schedule

ブラウザの開発者ツールを開き、各ゲームの右側にある BOX SCORE をクリックします。次のような json ファイルが要求されることがわかります。

具体的には、次の JSON 内の hls (ホーム チーム データ) と vls (アウェイ チーム データ) という統計情報が必要です。

URL の形式は次のとおりです:

https://data.nba.com/data/10s/v2015/json/mobile_teams/nba/2017/scores/gamedetail/0021700228_gamedetail.json

数回試してみると、パターンが見つかります。

  1. https://data.nba.com/data/10s/v2015/json/mobile_teams/nba/ これは修正されました。
  2. 2017 年はシーズン開始年です。たとえば、前シーズンは 2016 年でした。
  3. /scores/gamedetail/ と *** の _gamedetail.json も修正されました。
  4. 0021700228 はゲームの ID です。ルールは 002 がルール、17 はシーズン開始年の最後の 2 桁 (昨シーズンは 16 など)、00228 は 1 から始まる 5 桁の数字で、1 未満の場合はゼロが追加されます。たとえば、シーズンの最初のゲームは 00001 で、00228 は 228 番目のゲームです。
  5. キャプチャされた URL は https ですが、http もサポートされており、クロール時に https よりも高速です。

コレクション スクリプトは比較的単純で、ループで取得して Redis に保存します。

トレーニングに使用するデータは、ホームチームデータとアウェイチームデータの形式で整理し、勝ち負けのラベルを追加する必要があります (バスケットボールの試合では引き分けはありません)。

  1. 127.0.0.1:6379> HGET ゲーム詳細差分 0021700228_ゲーム詳細.json
  2.  
  3. {u'ast ':2、' win ':1.0、u'fbptsa':6、u'tf ':1、u'bpts':-4、 'away':u'lac '、u'pip':u'cha '、u'dreb':4、u'fga u'fbptsm ':5、u'tpa':-3、u'fgm ':1、u'stl':2、u'fbpts ':10、u'ble':13、u'tov ':-6、u'oreb':1、u'potov ':16、u'fta':10、u'pipm ':10、u'pipm': -1、u'pf': -6、u'tmreb': -2、u'blk': 3、u'reb': 5、u'pipa': -4、u'ftm': 10、u'tpm': 3}"  

***2015 年、2016 年、2017 年から 2017 年 11 月 19 日までの 3 シーズンから合計 2699 件の有効なデータが収集されました。

データ前処理

データ処理にはPandasを使用しており、非常に便利です。

まず、redis から直接データを読み取ります。

  1. pandasをpdとしてインポートする
  2. Redisをインポートする
  3. ast をインポート
  4.  
  5. cli = redis.Redis()
  6. データ = cli.hgetall( "gamedetaildiff" )
  7. df = pd.DataFrame([ast.literal_eval(data[k]) データkに対して])
  8. df = df.fillna(value=0.0) # 空白データを0で埋める
  9. df.head()

入力データは無関係な項目が削除され、トレーニング データとテスト データに整理されます。

  1. dataX = df.drop ([ "勝利" "日付" "ホーム" "アウェイ" ]、軸=1)
  2. dataY = df[ "勝つ" ]
  3. train_x = np.array(dataX)[::2] # トレーニングセット 
  4. train_y = np.array(データY)[::2]
  5. test_x = np.array(dataX)[1::2] # テストセット 
  6. test_y = np.array(データY)[1::2]

処理されるデータのディメンションは次のとおりです。

深いネットワークの構築

この部分は、Keras があるため、実際にはこの記事の中で最も簡単な部分です。

  1. keras.modelsからSequentialをインポートする
  2. keras.layers.coreからDense をインポートする
  3.  
  4. モデル = シーケンシャル()
  5. モデルを追加します(Dense(60, input_dim=train_x.shape[1], activation= 'relu' ))
  6. model.add (Dense(30, activation= 'relu' ))
  7. model.add (Dense(1, activation= 'sigmoid' ))
  8. model.compile(損失= 'binary_crossentropy' 、オプティマイザー= 'adam' 、メトリック=[ 'accuracy' ])

最もシンプルな 3 層の完全接続ネットワーク。

ネットワークの出力次元は 1 なので、最後の層の活性化関数は sigmoid で、損失関数は binary_crossentropy です。

モデルのトレーニングと検証

10エポック後、トレーニングデータに対するモデルの精度は98.89%に達したことがわかります。

次に、テスト データを使用してモデルを検証します。

トレーニングデータの精度も 95.40% に達し、このモデルが比較的信頼できることを示しています。トレーニングには数秒しかかかりませんが、保存しておきましょう。

  1. モデルを保存します( "nba-model.hdf5" )

新しいデータの予測

これで、ゲームの結果を予測できるモデルができました。ここで問題となるのは、2 つのチームの技術統計をどのようにシミュレートするかということです。

ホームチームの過去 5 回のホームゲームの平均技術統計とアウェイチームの過去 5 回のアウェーゲームの平均技術統計を使用し、その 2 つを減算してモデルの予測入力とします。

まず、Redis から完全なデータを取得します。

  1. game_detail_data = cli.hgetall( "gamedetail" )
  2. ゲームの詳細json = []
  3. game_detail_datakの場合:
  4. } は、
  5. di_h = {}
  6. j = json.loads(ゲームの詳細データ[k])
  7. vls = j[ "g" ][ "vls" ]
  8. hls = j[ "g" ][ "hls" ]
  9. di_v.update (vls[ "tstsg" ])
  10. di_v.update ({ "日付" : j[ "g" ][ "gdtutc" ], "名前" : vls[ "ta" ], "ホーム" : 0})
  11. ゲームの詳細jsonを追加します(di_v)
  12. di_h.update (hls[ "tstsg" ])
  13. di_h.update ({ "日付" : j[ "g" ][ "gdtutc" ], "名前" : hls[ "ta" ], "ホーム" : 1})
  14. ゲームの詳細jsonを追加します(di_h)
  15. game_detail_df = pd.DataFrame(game_detail_json)
  16. game_detail_df = game_detail_df.fillna(値=0.0)

Pandas を使用すると、1 行のコードでホームチームの過去 5 回のホームゲームの平均を見つけることができます。

  1. def predict(ホーム=なし、アウェイ=なし):
  2. home_data = game_detail_df[(game_detail_df[ 'name' ]==home) & (game_detail_df[ 'home' ]==1)].sort_values( by = 'date' , ascending= False )[:5].mean()
  3. away_data = game_detail_df[(game_detail_df[ 'name' ]==away) & (game_detail_df[ 'home' ]==0)].sort_values( by = 'date' , ascending= False )[:5].mean()
  4. home_data = home_data.drop ([ 'home' ] )
  5. away_data = away_data.drop ([ 'home' ] )
  6. new_x = np.array(ホームデータ - アウェイデータ)
  7. model.predict_classes(new_x[np.newaxis,:], verbose=0)[0][0]を返す

予測効果

データは米国時間 2017 年 11 月 19 日まで収集されています。

2017年11月20日の試合の結果を見てみましょう。

モデルの予測結果を実行します。

11ゲームすべて正解でした、すごい!!

<<:  李開復:今後数年間、中国で最も収益性の高い仕事は何でしょうか?

>>:  TENSORFLOW に基づく中国語テキスト分類のための CNN と RNN

ブログ    
ブログ    

推薦する

容量はGPT-2の1.7倍! Google がニューラル会話モデル Meena を開発

Google は、これは「真の」会話型 AI への試みであると述べた。チャットボットは高度に専門化さ...

英国の消費者団体が警告:AIチャットボットがオンライン詐欺をよりプロフェッショナル化

10月28日、英国の消費者団体Which?が現地時間金曜日に発表した最新の調査結果によると、犯罪者は...

人工知能のルーツを解読する

[[384631]] ◇コンピューティングパワーアルゴリズムの重要な基盤として、人工知能チップと人...

5Gベースバンドに機械学習ユニットを追加:クアルコムには多くのAI脳の穴がある

最も先進的な AI テクノロジーは、最も広く使用されているモバイル チップに使用されています。最近、...

...

ファイアウォールは再び進化します。よりスマートで安全になりましたか?

ハッカーがネットワーク攻撃を開始すると、まず会社のパブリック IP で SSH サービスに使用される...

生成AIを使用して学生のイノベーションを促進する

今年も新学期がやってきましたが、教育者は AI テクノロジーの爆発的な進歩によって大きな倫理的プレッ...

プロジェクト管理における人工知能の役割

人工知能 (AI) の台頭とさまざまな業界への統合の増加に伴い、プロジェクト管理も進化しています。 ...

スマートなモノのインターネットを導入する時が来た

[[427797]]画像ソース: https://pixabay.com/images/id-567...

データサイエンスの分野で働くにはどのようなスキルが必要ですか?

本記事では、海外KDnuggetsフォーラムにおけるSimplilearnの統計結果と、国内有名求人...

顧客体験を改善できませんか? AIを試してみませんか?

いつの時代も、顧客獲得競争は企業にとって永遠の課題です。AI技術がある程度発達した現在、多くの企業が...

顔認識はアニメーションには効果がない、ディズニーはアニメーション専用の顔認識ライブラリを作成

アニメーションといえば、1923年に設立された企業帝国、ディズニー。アニメーション会社としてスタート...

毎日のアルゴリズム: 有効な三角形の数

[[429712]]この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載した...

ロビン・リー:百度はすでに独自のハイエンドチップを製造する能力がある

「中国の改革開放40年はIT産業の爆発的な成長をもたらしたが、ハイエンドチップは常に輸入に依存してき...