我使用了Elo和Glicko评级系统以及匹配结果来为玩家生成评分。在每场比赛之前,我可以根据各自的评分为每个玩家产生一个期望值(0到1之间的浮点数)。我想测试这种期望的准确程度,原因有两个:
国际象棋有一些区别值得注意:
认为适当的功能是" correlation",我尝试创建一个包含一列预测的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
答案 0 :(得分: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()
答案 1 :(得分:2)
实际上,你观察到的东西非常有意义。如果没有抽奖,你总是会在第一行显示获胜者的期望,那么就不会与第二行产生任何关联!因为无论期望有多大或多小,第二行中的数字总是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
)。所有游戏的预测器的总得分将是单个游戏得分的乘积。分数越大越好。