如何使用Python/Pandas来衡量预测的准确性?

2024-10-16 20:47:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用了Elo和Glicko评分系统以及比赛结果来为玩家生成评分。在每场比赛之前,我可以根据每个球员各自的评分,为他们生成一个期望值(0到1之间的浮动)。我想测试一下这个期望值有多准确,有两个原因:

  • 比较不同的评分系统
  • 调整用于计算评级的变量(如Elo中的kfactor)

与国际象棋有一些不同之处值得注意:

  • 可能的结果是赢(我认为是1.0),输(0.0),偶尔(5%)平局(每次0.5%)。每一场比赛都是分级的,不像国际象棋那样是一系列的。在
  • 玩家的比赛次数较少——很多人的比赛少于10场,很少有人超过25场,最多75场

考虑到适当的函数是“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


Tags: 数据函数系统玩家原因评分国际象棋球员
2条回答

实际上,你所观察到的是完全有道理的。如果没有平局,你总是在第一排表现出对赢家的期待,那么第二排就完全没有关联了!因为无论期望值有多大或多小,第二行中的数字总是1.0,也就是说,它根本不依赖于第一行中的数字。在

由于绘制的百分比很低(绘制可能与0.5周围的值相关),因此您仍然可以观察到一个小的相关性。在

也许相关性并不是衡量预测准确度的最佳标准。在

其中一个问题是,Elo不是预测单个结果,而是预测期望的点数。至少有一个未知因素:抽签的概率。你必须在你的模型中加入额外的知识。这种可能性取决于球员之间的实力差异:差距越大,平局的机会越小。可以尝试以下方法:

  1. 将期望点映射到预期结果上,例如0...0.4意味着失败,0.4..0.6-平局,0.6...1.0-获胜,看看有多少结果预测正确。在
  2. 对于一个玩家和一堆游戏来说,准确度的衡量标准是|predicted_score-score|/number_of_games对玩家的平均值。差别越小越好。在
  3. 一种贝叶斯方法:如果一个游戏的预测点数是x,那么预测值的得分是x,如果游戏赢了,1-x如果游戏失败了(也许你必须跳过平局或将其记为(1-x)*x/4-因此,0.5的预测将得到1的分数。预测器对所有游戏的总得分将是单个游戏得分的乘积。分数越大越好。在

判断预测精度的行业标准方法是接收机工作特性(ROC)。使用下面的代码,可以使用sklearn和matplotlib从数据创建它。在

ROC是真阳性率与假阳性率的二维曲线图。你希望这条线在对角线上方,越高越好。曲线下面积(AUC)是精度的标准度量:越大,分类器越精确。在

import pandas as pd

# read data
df = pd.read_csv('sample_data.csv', header=None, names=['classifier','category'])

# remove values that are not 0 or 1 (two of those)
df = df.loc[(df.category==1.0) | (df.category==0.0),:]

# examine data frame
df.head()

from matplotlib import pyplot as plt
# add this magic if you're in a notebook
# %matplotlib inline

from sklearn.metrics import roc_curve, auc
# matplot figure
figure, ax1 = plt.subplots(figsize=(8,8))

# create ROC itself
fpr,tpr,_ = roc_curve(df.category,df.classifier)

# compute AUC
roc_auc = auc(fpr,tpr)

# plotting bells and whistles
ax1.plot(fpr,tpr, label='%s (area = %0.2f)' % ('Classifier',roc_auc))
ax1.plot([0, 1], [0, 1], 'k ')
ax1.set_xlim([0.0, 1.0])
ax1.set_ylim([0.0, 1.0])
ax1.set_xlabel('False Positive Rate', fontsize=18)
ax1.set_ylabel('True Positive Rate', fontsize=18)
ax1.set_title("Receiver Operating Characteristic", fontsize=18)
plt.tick_params(axis='both', labelsize=18)
ax1.legend(loc="lower right", fontsize=14)
plt.grid(True)
figure.show()

从你的数据中,你应该得到这样一个图: enter image description here

相关问题 更多 >