我使用了Elo和Glicko评分系统以及比赛结果来为玩家生成评分。在每场比赛之前,我可以根据每个球员各自的评分,为他们生成一个期望值(0到1之间的浮动)。我想测试一下这个期望值有多准确,有两个原因:
与国际象棋有一些不同之处值得注意:
考虑到适当的函数是“correlation”,我尝试创建一个数据帧,其中一列包含预测(0,1之间的浮点值)和另一列(1 | 0.5 | 0)的结果,并使用corr()
,但基于输出,我不确定这是否正确。在
如果我创建一个只包含比赛中第一个选手的期望值和结果的数据帧(结果总是1.0或0.5,因为我的数据来源,失败者从不首先显示),corr()返回非常低的值:<;0.05。但是,如果我创建一个序列,其中每个匹配有两行,并且包含每个玩家的期望值和结果(或者,随机选择要附加的玩家,因此结果将是0、0.5或1),则corr()要高得多:~0.15到0.30。我不明白为什么这会有什么不同,这让我怀疑我是不是误用了函数,还是完全用错了函数。在
如果有帮助的话,这里有一些真实的(不是随机的)样本数据:http://pastebin.com/eUzAdNij
实际上,你所观察到的是完全有道理的。如果没有平局,你总是在第一排表现出对赢家的期待,那么第二排就完全没有关联了!因为无论期望值有多大或多小,第二行中的数字总是
1.0
,也就是说,它根本不依赖于第一行中的数字。在由于绘制的百分比很低(绘制可能与
0.5
周围的值相关),因此您仍然可以观察到一个小的相关性。在也许相关性并不是衡量预测准确度的最佳标准。在
其中一个问题是,Elo不是预测单个结果,而是预测期望的点数。至少有一个未知因素:抽签的概率。你必须在你的模型中加入额外的知识。这种可能性取决于球员之间的实力差异:差距越大,平局的机会越小。可以尝试以下方法:
0...0.4
意味着失败,0.4..0.6
-平局,0.6...1.0
-获胜,看看有多少结果预测正确。在|predicted_score-score|/number_of_games
对玩家的平均值。差别越小越好。在x
,那么预测值的得分是x
,如果游戏赢了,1-x
如果游戏失败了(也许你必须跳过平局或将其记为(1-x)*x/4
-因此,0.5
的预测将得到1
的分数。预测器对所有游戏的总得分将是单个游戏得分的乘积。分数越大越好。在判断预测精度的行业标准方法是接收机工作特性(ROC)。使用下面的代码,可以使用sklearn和matplotlib从数据创建它。在
ROC是真阳性率与假阳性率的二维曲线图。你希望这条线在对角线上方,越高越好。曲线下面积(AUC)是精度的标准度量:越大,分类器越精确。在
从你的数据中,你应该得到这样一个图:
相关问题 更多 >
编程相关推荐