使用深度学习来预测NBA比赛结果

作者: 佚名 2017-11-23 14:49:51

这篇文章,我们来使用深度学习来预测 NBA 比赛结果。通过本文,我们可以学习到:

  1. 如何爬取 NBA 技术统计数据;
  2. 如何预处理数据;
  3. 如何搭建简单的深度网络模型;
  4. 如何预测比赛结果。

使用深度学习来预测NBA比赛结果

最终我们得到一个预测第二天比赛准确率 100% 的模型。

技术统计数据收集

要用深度学习来预测比赛结果,需要有大量技术统计数据作为学习样本。

来看下官方的技术统计网站:https://stats.nba.com/schedule

使用深度学习来预测NBA比赛结果

打开浏览器的开发者工具,点击每场比赛右边的 BOX SCORE,我们就能看到会请求这样的一个 json 文件:

使用深度学习来预测NBA比赛结果

具体到我们要找的数据统计,是这个 json 里面的 hls (主队数据) 和 vls (客队数据):

使用深度学习来预测NBA比赛结果

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 则是赛季开始年份的后两位,如上赛季是 16;00228 则是 5 位的数字,从 1 开始,不足补零,比如该赛季***场是 00001,而 00228 就是第 228 场比赛;
  5. 抓到的 url 是 https,其实 http 也是支持的,抓取时比 https 快点。

收集脚本比较简单,就是循环获取,然后存 redis。

使用深度学习来预测NBA比赛结果

对于我们要用来跑训练的数据,需要整理成 主队数据 - 客队数据的方式,并增加一个 win or lose 的 label (篮球比赛没有平局)。

  1. 127.0.0.1:6379> HGET gamedetaildiff 0021700228_gamedetail.json 
  2.  
  3. "{u'ast': 2, 'win': 1.0, u'fbptsa': 6, u'tf': 1, u'bpts': -4, 'away': u'LAC', u'pip': -2, 'home': u'CHA', u'dreb': 4, u'fga': 4, u'tmtov': 0, u'scp': 14, 'date': u'2017-11-19', 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': -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 三个赛季的有效数据共 2699 条。

数据预处理

我们用 Pandas 来做数据处理,非常方便。

先直接从 redis 里读入数据:

  1. import pandas as pd 
  2. import redis 
  3. import ast 
  4.  
  5. cli = redis.Redis() 
  6. data = cli.hgetall("gamedetaildiff"
  7. df = pd.DataFrame([ast.literal_eval(data[k]) for k in data]) 
  8. df = df.fillna(value=0.0)   # 用 0 填补空白数据 
  9. df.head() 

使用深度学习来预测NBA比赛结果

输入数据去掉无关项,整理成训练数据和测试数据:

  1. dataX = df.drop(["win""date""home""away"], axis=1) 
  2. dataY = df["win"
  3. train_x = np.array(dataX)[::2] # train set 
  4. train_y = np.array(dataY)[::2] 
  5. test_x = np.array(dataX)[1::2] # test set 
  6. test_y = np.array(dataY)[1::2] 

处理后的数据维度:

使用深度学习来预测NBA比赛结果

搭建深度网络

这部分其实反而是这篇文章中最简单的部分,因为我们有 Keras:

  1. from keras.models import Sequential 
  2. from keras.layers.core import Dense 
  3.  
  4. model = Sequential() 
  5. model.add(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(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

最简单的三层全连接层网络。

因为网络的输出维度是 1,所以***一层的激活函数是 sigmoid,损失函数为 binary_crossentropy。

使用深度学习来预测NBA比赛结果

模型训练以及验证

使用深度学习来预测NBA比赛结果

可以看到 10 个 epochs 之后,模型对于训练数据的准确度已经达到了 98.89%

再使用测试数据对该模型进行验证:

使用深度学习来预测NBA比赛结果

训练数据的准确度也达到了 95.40%,说明这个模型还是比较靠谱的。虽然训练花不了几秒钟,但我们还是保存下吧:

  1. model.save("nba-model.hdf5"

新数据的预测

我们有模型可以来预测比赛结果了。现在我们的问题就在于如何模拟对阵双方的技术统计了。

我们用主队上五场主场技术统计均值,和客队上五场客场技术统计均值,两者相减作为模型的预测输入。

先从 redis 获取下完整的数据:

  1. game_detail_data = cli.hgetall("gamedetail"
  2. game_detail_json = [] 
  3. for k in game_detail_data: 
  4.     di_v = {} 
  5.     di_h = {} 
  6.     j = json.loads(game_detail_data[k]) 
  7.     vls = j["g"]["vls"
  8.     hls = j["g"]["hls"
  9.     di_v.update(vls["tstsg"]) 
  10.     di_v.update({"date": j["g"]["gdtutc"], "name": vls["ta"], "home": 0}) 
  11.     game_detail_json.append(di_v) 
  12.     di_h.update(hls["tstsg"]) 
  13.     di_h.update({"date": j["g"]["gdtutc"], "name": hls["ta"], "home": 1}) 
  14.     game_detail_json.append(di_h) 
  15. game_detail_df = pd.DataFrame(game_detail_json) 
  16. game_detail_df = game_detail_df.fillna(value=0.0) 

用 Pandas 可以一行代码实现 找到主队上五场主场数据均值 的功能:

  1. def predict(home=None, away=None): 
  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(home_data - away_data) 
  7.     return model.predict_classes(new_x[np.newaxis,:], verbose=0)[0][0] 

预测效果

数据只收集到美国时间 2017-11-19:

使用深度学习来预测NBA比赛结果

我们来看下 2017-11-20 那天的比赛结果:

使用深度学习来预测NBA比赛结果

跑下我们模型的预测结果:

使用深度学习来预测NBA比赛结果

11 场全部正确,amazing !!

深度学习 NBA 数据
上一篇:深入浅出解读卷积神经网络 下一篇:深度学习的异构加速技术(一):AI 需要一个多大的“心脏”?
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

草图变真人脸?AI:可以,多草都行

这篇论文讲技术人员如何在styleGAN顶层训练了一个深度神经网络来学习将源图像映射到styleGAN模型的输入,最终输出高质量的目标图像。

丰色 ·  16h前
深度学习算法

深度学习算法在机器视觉中就如一个巧妙的接收转换器般的存在,它灵活、敏捷、“深度”与广度兼具,强悍的计算与预测能力可以称为其魅力之处。深度计算——可以集数亿个神经网络的自拟,对于数据、语音、图像等多种形式的资源进行分析、解释。

三姆森科技 ·  20h前
中美欧人工智能发展现状比较分析

从投资、人才、研究、硬件、应用、数据多个维度,系统对比中、美、欧人工智能发展现状,最终得出结论称,美国当前依然保持着世界人工智能发展总体领先地位,中国在一些重要领域与美国的差距缩小,欧盟在三者中相对落后。

王璐菲 ·  20h前
通过细胞自动机,AI在「我的世界」学会了盖房子

许多研究采用了更为复杂的神经网络规则,被称为神经元细胞自动机(NCA)。但是其应用大多局限于2D结构,或是只能生成简单的3D结构。

子豪 ·  21h前
解锁人工智能、机器学习和深度学习

深度学习是机器学习的子集,而机器学习又是人工智能的子集,但是这些名称的起源来自一个有趣的历史。此外,还有一些引人入胜的技术特征,可将深度学习与其他类型的机器学习区分开来……对于技能水平较高的ML、DL或AI的任何人来说,这都是必不可少的工作知识。

佚名 ·  21h前
AI给老照片上色,真的准吗?技术圈和历史圈吵了1000帖

AI总是倾向于选择不鲜艳的颜色,让天空总是灰蒙蒙,人们的穿着都很朴素,地面充满灰尘和泥土。

梦晨 ·  22h前
OpenAI CEO Sam Altman:AI革命即将到来,我们需要新的系统

我们正处于这场技术变革的开端,我们拥有创造未来的宝贵机会。而这不是简单地解决目前的社会和政治问题,它必须为完全不同的社会而设计。

Sam Altman ·  1天前
谈谈基于深度学习的目标检测网络为什么会误检,以及如何优化目标检测的误检问题

在训练人脸检测网络时,一般都会做数据增强,为图像模拟不同姿态、不同光照等复杂情况,这就有可能产生过亮的人脸图像,“过亮”的人脸看起来就像发光的灯泡一样。

刘冲 ·  1天前
Copyright©2005-2021 51CTO.COM 版权所有 未经许可 请勿转载