当前位置: 首页 > 科技观察

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

时间:2023-03-13 20:27:12 科技观察

这篇文章,我们来使用深度学习预测NBA比赛结果。通过这篇文章,我们可以了解到:如何爬取NBA技术数据;如何预处理数据;如何建立一个简单的深度网络模型;如何预测比赛结果。我们最终得到了一个能够100%准确预测第二天比赛的模型。技术统计数据的收集需要深度学习来预测比赛结果,需要大量的技术统计数据作为学习样本。看看官方技术统计网站:http://stats.nba.com/schedule打开浏览器的开发者工具,点击每场比赛右边的BOXSCORE,我们可以看到有这样一个json文件会要求:具体我们要找的数据统计就是这个json里面的hls(主队数据)和vls(客队数据):url是这样的格式:https://data.nba.com/data/10s/v2015/json/mobile_teams/nba/2017/scores/gamedetail/0021700228_gamedetail.json多试几次找到模式:https://data.nba.com/data/10s/v2015/json/mobile_teams/nba/这是固定的;2017是赛季的开始年份,比如上赛季是2016年;/scores/gamedetail/和***_gamedetail.json也已修复;0021700228是比赛的id,rule是002是规定,17是赛季开始年份的最后两位数,比如上赛季是16;00228为5位数字,从1开始,以零补齐,例如本赛季第一场比赛为00001,00228为第228场比赛;抓取的url是https,其实http也是支持的,爬取的时候比https快。采集脚本比较简单,就是循环获取,然后保存到redis中。对于我们要用于跑步训练的数据,我们需要将其整理成主队数据-客队数据,并加上输赢标签(篮球比赛没有平局)。127.0.0.1:6379>HGETgamedetaildiff0021700228_gamedetail.json"{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,'日期':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读取数据:importpandasapdimportredisimportastcli=redis.Redis()data=cli.hgetall("gamedetaildiff")df=pd.DataFrame([ast.literal_eval(data[k])forkindata])df=df.fillna(value=0.0)#用0填充空白数据df.head()输入数据去除无关项,整理成训练数据和测试数据:dataX=df.drop(["win","date","home",“离开”],axis=1)dataY=df["win"]train_x=np.array(dataX)[::2]#trainsettrain_y=np.array(dataY)[::2]test_x=np.array(dataX)[1::2]#testsettest_y=np.array(dataY)[1::2]处理后的数据维度:构建深度网络的部分其实是本文最简单的部分,因为我们有Keras:fromkeras。modelsimportSequentialfromkeras.layers.coreimportDensemodel=Sequential()model.add(Dense(60,input_dim=train_x.shape[1],activation='relu'))model.add(Dense(30,activation='relu'))模型。add(Dense(1,activation='sigmoid'))model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])最简单的三层全连接层网络。因为网络的输出维度为1,所以最后一层的激活函数为sigmoid,损失函数为binary_crossentropy。经过模型训练和验证,可以看到经过10个epoch后,模型对训练数据的准确率达到了98.89%,再用测试数据验证模型:训练数据的准确率也达到了95.40%,说明这个模型还是比较靠谱的。虽然训练不会花费几秒钟,但让我们保存它:model.save("nba-model.hdf5")新数据的预测我们有一个模型来预测比赛的结果。现在我们的问题是如何模拟双方的技术统计。我们使用主队最近五场主场技术统计的平均值和客队最近五场客场技术统计的平均值,将两者相减作为模型的预测输入。首先从redis中获取完整的数据:game_detail_data=cli.hgetall("gamedetail")game_detail_json=[]forkinggame_detail_data:di_v={}di_h={}j=json.loads(game_detail_data[k])vls=j["g"]["vls"]hls=j["g"]["hls"]di_v.update(vls["tstsg"])di_v.update({"date":j["g"]["gdtutc"],"name":vls["ta"],"home":0})game_detail_json.append(di_v)di_h.update(hls["tstsg"])di_h.update({"date":j["g"使用pandas,一行代码即可实现求主队近五场比赛主场数据平均值的功能:defpredict(home=None,away=None):home_data=game_detail_df[(game_detail_df['name']==home)&(game_detail_df['home']==1)].sort_values(by='date',ascending=False)[:5].mean()away_data=game_detail_df[(game_detail_df['name']==阿波y)&(game_detail_df['home']==0)].sort_values(by='date',ascending=False)[:5].mean()home_data=home_data.drop(['home'])away_data=away_data.drop(['home'])new_x=np.array(home_data-away_data)returnmodel.predict_classes(new_x[np.newaxis,:],verbose=0)[0][0]预测性能数据仅收集于美国时间2017-11-19:我们来看看2017-11-20的比赛结果:跑下来我们模型的预测结果:11场比赛全部正确,厉害!!