2017-03-18 42 views
6

我已经使用Elo和Glicko评分系统以及比赛结果来为球员生成评分。在每场比赛之前,我可以根据各自的评分,为每名球员产生一个期望值(0和1之间的浮动值)。我想测试如何准确的这个期望是,有两个原因:如何衡量使用Python/Pandas进行预测的准确性?

  • 为了比较差的评价系统
  • 要调整的变量(如的Elo K系数)用于计算评分

有从国际象棋值得几个不同点是意识到:

  • 可能的结果是胜(其中我治疗如1.0),损失(0.0),用非常偶然的(< 5%)d原料(各0.5)。每个单独的比赛都是被评分的,而不是象国际象棋这样的系列赛。
  • 玩家有更少的比赛 - 很多不到10个,少去了25个,最多是75

思考相应的功能是“相关性”,我试图在一列中创建包含预测的数据帧(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

+0

我想你应该添加代码,否则是不容易知道你在做什么,究竟 – ead

+0

也许你应该考虑正确的预测结果的数量作为测量,相关性可能不是那么好这里 – 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)。预测器在所有游戏中的总分将是单个游戏分数的乘积。分数越大越好。
+0

回复:“总是1.0”,然后哇,这是有道理的。惊讶,没有发生在我身上。当你说我应该评估正确预测了多少结果时,一种技术是将相似的预测(即20-30%)分组到足够大的分箱中,然后查看在该范围内赢得了多少匹配? –

4

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

+1

虽然这个问题留下了很多解释,但这个答案显示了如何开始思考如何准确性阈值的坚实指导。好答案。 – deepelement

相关问题