【不务正业】设计一个神经网络预测足球比赛胜负
首先作为一个研究生,以下内容皆游离在我的研究内容之外。但是没办法,我承认我确实有“逢赌必输”的运气加成,总之跟着我的直觉反买必中,可能也算一种预测方法。不过大家也都知道,兴趣才是最好的老师,本人潜心钻研,旨在为各位“赌狗”提供更加准确的专业解决方案。
好了,言归正传。神经网络作为时下最热门的概念,确实可以“坑蒙拐骗”一群非计算机专业的吃瓜群众,好像“万物皆可神经网络”。当然这是个悖论,以下问题对此进行了很好地解释:是不是并不是所有问题都适合用神经网络预测?
神经网络说起来非常玄乎,不过在我看来其实也就是个复杂的数学模型,复杂到你我都看不太懂而已(姑且认为你不太懂)。神经网络的作用主要有回归、预测等等……对没错,所谈论的预测其实也就是一种函数逼近而已。反正咱自己也预测不准,不如用神经网络试一试,死马当活马医了,说干就干!
OK我首先从最简单的BP(Back Propagation)神经网络做起,与文献[1]的思想类似,但其使用Java语言,而本文利用的是Python语言的Tensorflow框架(以下皆是)。
关于BP神经网络,大家可以参考这个话题:bp神经网络
BP神经网络其实就是按照一定规则连接起来的多个神经元。按结构来说分为输入层、隐藏层和输出层。第层的每个神经元和第N层的所有神经元相连,第N-1层神经元的输出就是第N层神经元的输入,且每个连接都有一个权值。关于这些内容,网上有众多介绍并且大同小异,在此不过多赘述了。大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!
当然,数学模型离不开理论推导,这对刚入门的人来说也是个超级困难的过程。关于BP神经网络的推导和误差的梯度下降法可以借鉴以下这篇文章:https://zhuanlan.zhihu.com/p/24801814
关于BP神经网络的激活函数,一般使用的是Sigmoid函数:
上文的推导也是基于Sigmoid函数做的,然而我却不准备用Sigmoid函数。
在网上看了一些文献之后,准备利用Tanh函数作为激活函数: 那么以上推导也会有一定的变化。
由图可见,Sigmoid函数在输入处于[-1,1]之间时,函数值变化敏感。一旦接近或者超出区间就失去敏感性,处于饱和状态,影响神经网络预测的精度值。Tanh函数的输出和输入能够保持非线性单调上升和下降关系,符合BP网络的梯度求解,容错性好。
神经网络的输入应该是+影响足球比赛胜负的各因素,但现实比赛中,影响胜负的因素却没有固定标准,以某APP提供的数据暂且归纳为以下几点(排名不分先后):
(1)主队进球数:废话。
(2)对方进球数:这也是一句废话。
(3)主/客场:作为一个球迷,当然希望主队的每一场比赛都是在主场。如果要拿“客场进球优势”呛我,请当我没说,不过至少这样不用满世界跑来跑去踢比赛了对吧……OK那么我们定义主场为“1”,客场为“0”,中立场为“0.5”。
(4)控球率:指一场比赛某一方控制足球的时间比率,两队的控球率之和为100%,正好不用归一化了。(PS:其实这个数据的使用比较纠结,因为貌似和球队风格有关,某些“宇宙队”就喜欢拿着球来回传……不过既然有这个现成的数据咱还是用吧!)
(5)主队射正数:主要包括进入球网的、本可以进入球网,却被守门员救出的、本可以进入球网,却被最靠后的防守队员挡出的。简而言之,射正一定是进球的前提,进球又是获胜的前提。
(6)对方射正数:同上。
(7)主队危险进攻:顾名思义,有危险的进攻才能进球,想必也都理解。
(8)对方危险进攻:同上。
(9)主队任意球+角球数:任意球和角球也是比较重要的进球方式
(10)对方任意球+角球数:同上。
(11)主队红牌数:红牌作为一项负因素,意味着主队要被罚下一人,比赛以少打多。
(12)对方红牌数:同上。
(13)士气:士气是决定比赛的重要因素之一,但其存在不可量化的缺陷,这里引入一个士气评估标准。初始士气值为0.5,每赢一场比赛加0.1分,平局不加分,输一场扣0.1分,某名首发球员复出加0.1分,受伤扣0.1分。为满足归一化要求,士气值上限不超过1分,下限不低于0分。
(PS:如果还有别的因素我未列举的,欢迎私信给我,用作优化网络、提升精度使用。)
接下来对以上数据归一化处理,其中(3)、(4)、(13)可以直接使用,(1)、(2)直接与结果相关,暂时不用。(4)~(10)作为比赛正相关因素,认为其值越大表示胜利可能性越高,设置两两为一组,做归一化处理:
其中 为本方数据, 为对手数据,将数据限制在[0,1]之间,便于神经网络输入。
(11)、(12)作为比赛负相关因素,认为其值越小表示胜利可能性越高,做归一化处理:大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!
BP神经网络使用的是有监督学习,那么我们为赢球标注为“1”,输球为“0”,平局为“0.5”大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!。
例如将RealMadrid在2020年2月1日至2020年2月23日的五场比赛(比分分别为1:0、3:4、4:1、2:2、0:1,RealMadrid在前)归一化处理后列表如下。
这里只选取了五场比赛结果,可以考虑选取最近的 场比赛结果作为输入,可做后续研究。
在此神经网络下,输入即为前7列*5维个数据。
同样地,针对预测场次的数据,可以考虑选取最近的 场比赛数据计算平均得出。这里模拟预测2020年2月27日vs ManchesterCity的比赛结果,选取截至此前的赛季平均数据作为模拟(其中主/客场按本场比赛计算),如表所示。
归一化后,得到测试集为[0,0.642,0.468,0.480,0.487,0.421,0.6]:
选用RealMadrid的前五场比赛作为训练集:
进行模型训练:
该训练模型有7层输入,设置2个隐藏层和1个输出。
输出为:
显示RealMadrid本场比赛的胜率为0.429,还不及五成。嗯,看来凶多吉少。
结果当天的新闻......
OK!看起来预测的结果还不错!
接下来再测试几场比赛的胜负,准确率大约在70%左右,还有30%可能是真的预测不出来,比如这样的……
或者这样的……
果然冷门也是足球的一部分,可能也是足球的魅力所在吧!
听说五大联赛因为新冠肺炎都停了,好吧,可能近一段时间都没比赛要去预测了,希望早日战胜病毒,在家一直闲着感觉也不是很好……
顺便坐等中超成为世界第一大足球联赛!
最后如果有预测需求的兄弟直接联系我。