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

pro*_*uga 6 python statistics python-3.x pandas

我使用了Elo和Glicko评级系统以及匹配结果来为玩家生成评级.在每场比赛之前,我可以根据各自的评分为每个玩家产生一个期望值(0到1之间的浮点数).我想测试这种期望的准确程度,原因有两个:

  • 比较差异评级系统
  • 调整用于计算评级的变量(例如Elo中的kfactor)

国际象棋有一些区别值得注意:

  • 可能的结果是胜利(我将其视为1.0),损失(0.0),偶尔(<5%)平局(每次0.5).每个单独的比赛都被评级,而不是国际象棋中的系列.
  • 球员的比赛较少 - 许多比赛少于10,少数比赛超过25,最多比赛为75

认为适当的功能是"相关",我尝试创建一个DataFrame,其中包含一列中的预测(0,1之间的浮点数)和另一列中的结果(1 | 0.5 | 0)并使用corr(),但基于输出,我不确定这是否正确.

如果我创建一个DataFrame,其中只包含匹配中第一个玩家的期望和结果(由于我的数据源,结果将始终为1.0或0.5,输入永远不会首先显示),corr()返回非常低:<0.05.但是,如果我创建一个系列,每个匹配包含两行,并且包含每个玩家的期望和结果(或者,或者随机选择要追加的玩家,那么结果将是0,0.5或1), corr()要高得多:~0.15到0.30.我不明白为什么这会产生影响,这让我想知道我是在滥用功能还是完全使用了错误的功能.

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

Gen*_*sev 5

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

从您的数据中,您应该得到这样的图: 在此处输入图片说明


ead*_*ead 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)。所有比赛的预测器总得分将是单场比赛得分的乘积。分数越大越好。