使用最大似然估计对NFL球队排名

使用最大似然估计对NFL球队排名
我几乎更喜欢这些。

2017年美国国家橄榄球联盟(NFL)赛季的前四名球队,按输赢记录,分别是:

  1. 新英格兰爱国者队 (13–3)
  2. 匹兹堡钢人队 ,13–3
  3. 费城老鹰队 13–3
  4. 明尼苏达维京人 ,13–3

那么哪支球队是最好的?

乍一看,这个问题听起来无法回答。 如果输赢记录可以完全评估整个赛季的表现,那么所有这些球队的表现都是一样的,没有区别。

但是,正如任何观看体育比赛的人都知道的那样,事实并非如此。 即使不考虑老鹰队在第14周失去了首发四分卫卡森·温茨,您仍然会看到大多数球迷将爱国者和维京人置于老鹰队和钢人队的上方。 为什么? 因为团队的比赛方式存在明显差异:策略,优势和劣势以及整个比赛的重点。

简而言之,并非每次胜利都是平等的。

因此,人们提出了排名系统。 那些因在First Take上大喊大叫而工作的哑巴,Ringer,FiveThirtyEight,都已经开发了一种系统,可以根据记录之外的数据对NFL球队进行评估和排名。

这些质量各不相同。 就像半脑子的人可以想象的那样,Skip Bayless的推理真是令人敬畏。 我认为ESPN相当不错,而且我认为FiveThirtyEight的基于ELO的系统既非常有趣,而且给出了始终合理的预测。

今天,我将基于根本不同的推理而忽略所有这些系统,并自行创建系统。 为什么? 因为我可以。

让我们从一个例子开始。 想象一个由三支球队组成的联赛: X,Y和Z。 让我们说这一系列结果发生了:

  1. X击败Y。
  2. Y击败Z。
  3. Z击败X。
  4. Y击败X。

然后,在进行了四场比赛之后,我们的三支球队取得了以下记录:

  • X :1-2
  • Y :2-1
  • Z :1-1

因此,我们的目标是为每个团队分配一个等级R ,代表该团队的真正实力。

首先,让我们对每个团队的等级施加约束:

使用最大似然估计对NFL球队排名

也就是说,X队击败Y队的概率等于其在这两个队之间的总分中所占的份额。 然后,我们可以得出以下结果:

使用最大似然估计对NFL球队排名

上文指出,本赛季结果的总概率等于每场比赛结果概率的乘积。 但是,我们知道这些游戏会产生给定的结果:我们自己观察了它们! 因此,最大化我们观察到的结果的可能性的评级是每个团队的“真实”评级。

也就是说,我们希望找到每个R的值,以使Pr(schedule)最大化:团队等级的最大似然估计

实际发现这需要一些数学运算,我们将在下一部分中进行介绍,但是首先,让我们直观地考虑一下此优化问题。 假设您有三个杠杆,每个杠杆代表一个团队的等级。 我们首先将所有三个杠杆设为1,然后慢慢开始增加X的杠杆。 您会看到X既是我们正在优化的分数的分子又是分母,因此增加X只会将Pr(schedule)增大到一个点。 然后,我们跳到Y的杠杆,并开始增加它,直到该值再次开始减小。 然后,我们跳回X或前进到Z,依此类推,直到找到三个使方程最大化的完美平衡。

但是,当然,现实没有杠杆,计算我们的最大值需要数学。 我们本质上将要为该方程式导出梯度下降(并最终对其编程并运行!),该过程从寻找梯度开始。

同样,这是我们的等式:

使用最大似然估计对NFL球队排名

您会注意到的第一件事是,这将是令人沮丧的表达式。 我们有除法和乘法,这将导致一些痛苦的代数。 但是,事实证明,我们对这个特定的方程式没有任何特别的忠诚:我们可以优化一个等效方程式,该方程式更易于推导,但行为与该方程式相同(也就是说,具有与这个)。

我随意选择自然对数,因为它是一个单调递增的函数,可保留原始方程式的全局极值,并将这种复杂的数学运算转换为更易于处理的加法和减法。 然后:

使用最大似然估计对NFL球队排名

对于一些代数,这变为:

使用最大似然估计对NFL球队排名

下一步是依次取每个R的偏导数。 我只是给你这些方程式; 如果需要,请验证我的数学!

使用最大似然估计对NFL球队排名
使用最大似然估计对NFL球队排名
使用最大似然估计对NFL球队排名

现在,我们将每个导数设置为0(因为我们想找到函数不发生变化的点(在该函数中为最大值),然后将方程式改组为更好的形式:

使用最大似然估计对NFL球队排名

现在,我们剩下的三个方程式的系统代表了我们每个团队的评级。 显而易见的下一步是解决该系统,但是即使粗略地浏览也可以告诉您,找到代数解决方案将十分困难,即使不是不可能。 矩阵方法在这里也行不通,因为这是一个非线性系统,无法按摩成更好的形式。

因此,让我们退后一步,然后换一个角度来看。 如果我们只是为每个R任意选择值作为初始估计,该怎么办? 例如,让每个等级为1。

使用最大似然估计对NFL球队排名

然后,将这些值重新插入每个方程式中。 那给你:

使用最大似然估计对NFL球队排名

这告诉我们什么? 好吧,它告诉我们,在上述方程式迭代之后,我们发现这是最大似然的当前估计。 尽管这不是一个特别好的估计,但它已经表达了我们之前讨论的许多直观想法。 Y胜过X和Z,因此得分最高。 X击败了Y,但它也输给了Y,输给了Z,Y击败了Z,所以它低于Y。Z高于X,因为它击败了X并输给了Y,X也输给了Y。

现在,我们可以再次运行相同的过程,插入这些新的R值并找到更新的估计值。 整整一个世纪的学术文献都可以追溯到1920年代,它说这些值最终会收敛,您将找到最大似然估计。

恭喜你! 您只运行了梯度下降。 现在,做同样的事情,但是要让整个NFL赛季达到32支球队和15 * 17 = 180场比赛。

我们上面的数学解决了NFL赛季残酷无节的问题,但是很容易扩展到整个赛季。 这又是我们的最终方程式:

使用最大似然估计对NFL球队排名

现在,如果您凝视一下,您将可以说服自己上述方程式的一般形式是:

使用最大似然估计对NFL球队排名

其中R_AA队的评价,W_AA队的总数胜和G_Ω是一个游戏的交手队Ω数量。

解决了上面的数学问题之后,我们终于可以编写代码来找到一些实际数据的最大似然估计器。 我将以2017 NFL赛季为例,并且我将从头开始编写所有内容,因为我可以

让我们首先执行我们要优化的广义评级方程:

在这里, current_weights是一个长度为32的数组,在我们的第一次迭代中初始化为1,其中current_weights[i]是对第i队的评分的当前估算值 games_matrix是一个二维数组,因此games_matrx[i][j]是团队i参加团队j的次数 ,而wins_array是一维数组,其中wins_array[i]是团队i的获胜次数

然后,这与我们上面导出的方程式完全相同。 现在,要进行迭代,我们可以执行以下操作:

这个函数是不言自明的:它从上方获取games_matrixwins_array参数,初始化一个current_weights数组,然后尽管在迭代之间仍然有变化,但它沿着梯度曲线(即我们的optimization_function )向局部最大值移动。

现在,我们需要的只是样本数据! 为此,我使用了非常有用的nflgame模块 ,该模块NFL.com的GameCenter JSON源中提取数据。 这是下面的代码:

现在我们可以将它们连接在一起:

这是我在2017 NFL赛季上使用上述代码获得的结果:

我认为非常扎实。 您可以在此处查看ESPN的常规赛最终排名。 他们的前五名是新英格兰爱国者队,匹兹堡钢人队,明尼苏达维京人队,新奥尔良圣徒队和洛杉矶公羊队,这与我的球队非常接近,尤其是因为我们没有使用比赛结果以外的任何信息。 (例如,我确定Carson Wentz撕毁了他的ACL对老鹰队跌倒前五名有很大的影响)。

迄今为止,这种方法的中心问题是,它将每场胜利都视为平等,这是完全错误的。 老鹰队在分区轮对阵猎鹰队的窄小15-10胜利中,是否应该被视为与上周他们在会议冠军赛中以38-7击败维京人的方式相同?显然,不应该这样。 猎鹰队输掉了一场激烈竞争的比赛,而维京人队则被彻底摧毁。 确实,猎鹰的评分似乎应该随着这两个结果而提高,因为他们输给了被高评价的维京人歼灭的团队。

表达这一点的最简单的指标是获胜的余地:获胜和失败的球队之间的积分差距。 一种简单的方法可以将其纳入我们的方法中,即在计算每支球队的获胜时,权衡更大的获胜更多,而更低的获胜更少。

经过反复试验,我得出了以下公式:

使用最大似然估计对NFL球队排名

其中D是得分差异, S是得分的总数。 从本质上讲,这是每次获胜都会自动获得1/2,然后,我们添加一个与点差成正比的因子。 如果D接近S ,则表示获胜团队获胜很多,我们最终得到的数字接近1/2,这导致总获胜权重接近1。但是,如果D远小于S ,我们就结束了获胜权重接近1/2。

每次胜利都将落在这个范围内的某个地方,但其价值将与获胜者所赢得的金额成正比。 它在代码中的外观如下:

此处,游戏是nflgame模块中的对象,其中包含有关特定NFL游戏的数据。

如果您还记得的话,我们会在generate_matrices函数中算出我们的胜利。 再次出现,但是调用wins_update_formula函数,而不是简单地为每个获胜加1:

当然,这里是结果:

他们改变了一点。 我会给你一个完整的比较,但是新奥尔良升了一个位置,而卡罗来纳州倒下了。 明尼苏达州仍然是我们常规赛的最爱,但是费城上升了一个,亚特兰大下降了一些。

您还可以做一千件事。 寻找一种方法来考虑主场优势,或更详细的进攻/防守指标。 查找更智能的加权获胜公式。 在更大的数据集上运行它,也许可以找到有史以来最好的团队。 将一支球队的常规赛平均得分与其季后赛得分进行比较(仅有的有足够数据的球队是钢人和爱国者队)。 修复我的糟糕代码,以便在大量数据上更快地运行。

但是在您执行此操作之前,我当前的方法存在问题。 我的统计知识渊博的读者可能已经意识到,合并获胜余量存在自相关问题:更好的球队获胜的机会会更多,获胜的余地也会更多,这会随着时间的推移而提高我们的评级。 解决此问题的方法是找到一个胜利更新公式,该公式在较低等级的球队获胜时权衡胜利约束,而在较高等级的球队获胜时权衡胜利约束。 我将引导这位呆板的教授,并将其作为练习(提示: 使用自然日志,卢克! )。

这是包含本文中使用的所有代码的存储库。 否则,您可以在Twitter上通过@AakashJapi找到我,在gmail.com上的aakashjapi上找到电子邮件并在上面的名称下找到Facebook。 随时与我联系,提出想法/想法/模因/爱国者垃圾话,或其他任何东西。

From: https://hackernoon.com/ranking-nfl-teams-using-maximum-likelihood-estimation-7a4ed8994a67