【问题标题】:How to measure the accuracy of predictions using Python/Pandas?如何使用 Python/Pandas 测量预测的准确性?
【发布时间】:2017-08-09 19:25:27
【问题描述】:

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

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

与国际象棋有一些不同之处需要注意:

  • 可能的结果是获胜(我将其视为 1.0)、失败 (0.0),以及非常偶然的 (
  • 玩家的比赛数量较少 - 许多人少于 10 人,少数人超过 25 人,最多 75 人

认为适当的函数是“相关性”,我尝试创建一个 DataFrame,其中包含一列中的预测(0、1 之间的浮点数)和另一列 (1|0.5|0) 中的结果,并使用corr() ,但根据输出,我不确定这是否正确。

如果我创建一个 DataFrame,其中仅包含比赛中第一个玩家的期望和结果(结果将始终为 1.0 或 0.5,因为由于我的数据源,永远不会首先显示失败者), corr() 返回非常低:

如果有帮助,这里有一些真实(非随机)的样本数据:http://pastebin.com/eUzAdNij

【问题讨论】:

  • 我认为你应该添加你的代码,否则不容易知道你在做什么
  • 也许你应该以正确预测结果的数量作为衡量标准,这里的相关性可能不是那么好

标签: python python-3.x pandas statistics


【解决方案1】:

实际上,您所观察到的一切都非常合理。如果没有平局,你总是在第一排表现出对获胜者的期望,那么与第二排根本没有关联!因为无论期望大小,第二行的数字总是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 的分数)。预测器在所有游戏中的总得分将是单个游戏得分的乘积。分数越大越好。

【讨论】:

  • 回复:“总是 1.0”,哇,这很有道理。很惊讶我没想到。当您说我应该评估正确预测的结果数量时,一种技术是将相似的预测(即 20-30%)分组到足够大的箱中,然后查看在该范围内赢得了多少匹配?
【解决方案2】:

判断预测准确性的行业标准方法是接收器操作特性 (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()

根据您的数据,您应该得到如下图:

【讨论】:

  • 虽然这个问题留下了很多解释,但这个答案显示了如何开始考虑如何确定准确度阈值的可靠指导。很好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 2021-10-18
  • 2021-09-16
  • 2015-06-18
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多