因为疫情原因导致NBA2019-2020赛季没有进行完,所以我们使用NBA2018-2019赛季的数据进行预测,数据获取方式有下面两种:

通过网站获取

我们可以通过网站去获取任意一年的所有场次比赛数据,获取方式如下:

  1. 在浏览器中访问https://www.basketball-reference.com/leagues/NBA_2019_games.html
  2. 点击Share&more
  3. 点击Get table as CSV (for Excel)
  4. 复制连带表头的所有数据到Excel的文本文件中
  5. 依次选择每一个月份,复制不带表头的数据到上一个文件后

同时我们还需要获取上赛季积分榜的数据,获取方式如下:

  1. 在浏览器中访问https://www.basketball-reference.com/leagues/NBA_2018_standings.html
  2. 点击Expander Standings,可以看到整个赛季的战况信息
  3. 点击Export链接
  4. 复制数据并保存即可

通过GitHub获取

本文中的数据和代码已经上传到GitHub上,链接如下:https://github.com/bigdatavalley/NBA_predict

在进行预测的算法设计之前,我们需要先进行数据的查看和整合,由于原有数据中很多的特征名称设定的不是很好,所以我们在加载数据的时候重新设定一下列名称,代码如下:

 

运行结果如下:

在这里插入图片描述

我们在建立预测模型的时候通常会有一个标准,当我们的预测效果超过这个标准的时候我们就可以认为预测模型起到了作用,接下来我们来建立一个关于预测球队获胜的标准。

在NBA比赛中,通常分为主客场,当球队在主场比赛的时候往往会占据一定的优势,那么如果我们每次都预测主场球队获胜,应该也能得到不错的准确率,那么我们就可以用这个数值来当作我们的标准,代码如下:

 

运行结果如下:

 

现在我们就有了一个0.59作为标准,后面我们要保证建立的模型不低于这个准确率就可以了。

构造特征一点一点进行,后面我们再陆续添加新的特征。

进行模型建立之前,还有一个重要的过程就是构建我们要使用的特征,第一个我们要思考的就是两只球队是否赢得了上一场的比赛,通常我们会认为赢得了上一场比赛的球队就是更厉害的。我们建立两个新的特征分别是主队/客队是否赢了上一场比赛。代码如下:

 

运行结果如下:

 
 

我们尝试使用简单的决策树算法进行简单的训练,并且通过交叉验证的方式获取评分。

决策树的原理:
决策树(上)
决策树(下)
代码如下:

 

运行结果如下:

 

根据结果可以发现,当前的特征下,并没有使得我们的预测效果提高,接下来我们继续对数据和模型进行改进。

考虑到球队获胜可能和上个赛季的战绩也有一定的关系,我们尝试加入上个赛季的数据来进行预测。

 
 

运行结果如下:

 

很明显,我们加入上个赛季的战绩的时候,预测的准确率提升了3个百分点。

接下来我们继续加入交手的两只球队中哪一个在上一次交手中胜出的数据,代码如下:

 
 

运行结果如下:

 

结果和上面差异不大,没有关系,我们继续尝试使用其他的策略来进行改进。

我们之前做的工作都是根据一些比赛数据来进行的,下面我们尝试加入队伍数据来检验一下我们的运行成果,由于我们不能直接对字符数据进行计算,所以先把数据通过LabelEncoder转化为数值类型,但是一般数值类型又会有大小造成的影响,所以我们再进行一次OneHotEncoder的操作即可。代码如下:

 
 

运行结果如下:

 

很显然虽然比我们直接预测主队获胜的效果要好,但是也没有高出很多。不要慌,我们继续使用更好的算法来尝试一下。

随机森林是一种以决策树为基分类器的集成学习算法,理论上讲,我们所得到的效果要好于决策树。

代码如下:

 

运行结果如下:

 

尝试使用网格搜索,代码如下:

 

运行结果如下:

 

可以看到根据目前我们所构造的几个简单的特征就已经可以得到显著的准确率提升了。同时收到球员转会、受伤等情况的影响,对于不同赛季的数据使用这些方法会得到不同的结果,有兴趣的读者可以自己获取其他赛季的数据来尝试一下。

你可能对当前的结果还不是很满意,可以尝试进行下面几个方向的参考:

  • 上一次比赛距离本次比赛的时间
  • 最近半个月的比赛状态
  • 双方在最近几场比赛的战绩
  • 每个球队在客场和主场的表现情况