2017-03-18 18 views
6

Tôi đã sử dụng hệ thống xếp hạng Elo và Glicko cùng với kết quả cho các trận đấu để tạo xếp hạng cho người chơi. Trước mỗi trận đấu, tôi có thể tạo ra một kỳ vọng (một điểm nổi giữa 0 và 1) cho mỗi người chơi dựa trên xếp hạng tương ứng của họ. Tôi muốn kiểm tra mức độ chính xác mong muốn đây là, vì hai lý do:Làm thế nào để đo lường tính chính xác của các dự đoán bằng cách sử dụng Python/Pandas?

  • Để so sánh hệ thống đánh giá sự khác biệt
  • Để biến điều chỉnh (như kfactor trong Elo) được sử dụng để tính toán xếp hạng

Có được một vài sự khác biệt từ cờ đáng được nhận thức của:

  • kết quả có thể là chiến thắng (mà tôi đang điều trị như 1.0), tổn thất (0.0), với rất thỉnh thoảng (< 5%) d raws (0,5 mỗi). Mỗi trận đấu cá nhân được đánh giá, không phải là một chuỗi như trong cờ vua.
  • Người chơi có trận đấu ít - nhiều người có ít hơn 10, vài đi qua 25, tối đa là 75

Nghĩ chức năng thích hợp là "tương quan", tôi đã cố gắng tạo ra một DataFrame chứa dự đoán trong một cột (một float giữa 0, 1) và kết quả trong khác (1 | 0.5 | 0) và sử dụng corr(), nhưng dựa trên đầu ra, tôi không chắc chắn nếu điều này là chính xác.

Nếu tôi tạo Khung dữ liệu chứa các kỳ vọng và kết quả chỉ cho người chơi đầu tiên trong trận đấu (kết quả sẽ luôn là 1,0 hoặc 0,5 do nguồn dữ liệu của tôi, người thua sẽ không bao giờ được hiển thị trước), corr() trả về rất thấp : < 0,05. Tuy nhiên, nếu tôi tạo một chuỗi có hai hàng cho mỗi trận đấu và chứa cả kỳ vọng và kết quả cho mỗi người chơi (hoặc, cách khác, chọn ngẫu nhiên người chơi nào sẽ nối thêm, vì vậy kết quả sẽ là 0, 0,5 hoặc 1), corr() cao hơn nhiều: ~ 0,15 đến 0,30. Tôi không hiểu tại sao điều này lại tạo nên sự khác biệt, điều đó khiến tôi tự hỏi liệu tôi có sử dụng sai chức năng hay sử dụng sai hàm hoàn toàn không.

Nếu nó giúp, đây là một số thực (không phải ngẫu nhiên) dữ liệu mẫu: http://pastebin.com/eUzAdNij

+0

Tôi nghĩ bạn nên thêm mã của bạn, nếu không nó không phải là dễ dàng để biết những gì bạn đang làm chính xác – ead

+0

Có lẽ bạn nên tham gia số lượng kết quả được dự đoán chính xác như phép đo, tương quan có thể không tốt ở đây – ead

Trả lời

2

Trên thực tế, những gì bạn quan sát làm cho hoàn hảo ý nghĩa. Nếu không có trận hòa và bạn luôn thể hiện kỳ ​​vọng của người chiến thắng ở hàng đầu tiên, thì sẽ không có mối tương quan nào với hàng thứ hai chút nào! Bởi vì dù kỳ vọng lớn hay nhỏ, số ở hàng thứ hai luôn là 1.0, tức là số này không phụ thuộc vào số ở hàng đầu tiên.

Do phần trăm số lần rút ngắn (số lần rút có thể tương quan với các giá trị xung quanh 0.5), bạn vẫn có thể quan sát một mối tương quan nhỏ.

Có lẽ mối tương quan không phải là biện pháp tốt nhất cho tính chính xác của các dự đoán ở đây.

Một trong những vấn đề là, Elo không dự đoán được kết quả đơn lẻ mà là số lượng điểm dự kiến. Có ít nhất một yếu tố không xác định: Xác suất của trận hòa. Bạn phải đưa thêm kiến ​​thức về xác suất rút vào mô hình của bạn. Xác suất này phụ thuộc vào sự khác biệt về sức mạnh giữa các cầu thủ: sự khác biệt càng lớn thì cơ hội rút ngắn càng lớn. Người ta có thể thử các cách tiếp cận sau:

  1. ánh xạ các điểm được mong đợi lên kết quả mong đợi, ví dụ:0...0.4 có nghĩa là mất mát, 0.4..0.6 - hòa và 0.6...1.0 - giành chiến thắng và xem có bao nhiêu kết quả được dự đoán chính xác.
  2. Đối với người chơi và một loạt trò chơi, thước đo về độ chính xác sẽ là |predicted_score-score|/number_of_games tính trung bình so với người chơi. Sự khác biệt càng nhỏ thì càng tốt.
  3. Một loại phương pháp Bayes: nếu cho trò chơi số điểm dự đoán là x so với điểm số của người dự đoán là x nếu trò chơi đã thắng và 1-x nếu trận đấu bị mất (có thể bạn phải bỏ qua hòa hoặc ghi chúng là (1-x)*x/4 - do đó dự đoán của 0.5 sẽ có số điểm là 1). Điểm số tổng thể của người dự đoán trên tất cả các trò chơi sẽ là sản phẩm của điểm số trò chơi duy nhất. Điểm càng lớn thì càng tốt.
+0

Re: "Always 1.0", sau đó wow, có ý nghĩa. Ngạc nhiên là điều đó không xảy ra với tôi. Khi bạn nói tôi nên đánh giá có bao nhiêu kết quả được dự đoán chính xác, một kỹ thuật có thể nhóm các dự đoán tương tự (tức là 20-30%) vào các thùng đủ lớn và sau đó xem có bao nhiêu kết quả phù hợp trong phạm vi đó? –

4

Cách tiêu chuẩn của ngành để đánh giá tính chính xác của dự đoán là Tính năng hoạt động của người nhận (ROC). Bạn có thể tạo nó từ dữ liệu của bạn bằng cách sử dụng sklearn và matplotlib với đoạn mã dưới đây.

ROC là một âm mưu 2-D có tỷ lệ dương thực dương và dương tính giả. Bạn muốn các dòng được trên đường chéo, càng cao càng tốt. Area Under Curve (AUC) là thước đo chuẩn về độ chính xác: độ phân loại càng chính xác càng lớn.

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() 

Từ dữ liệu của bạn, bạn sẽ nhận được một âm mưu như thế này một: enter image description here

+1

Trong khi câu hỏi để lại nhiều giải thích, câu trả lời này cho thấy hướng dẫn vững chắc về cách bắt đầu suy nghĩ về cách ngưỡng chính xác. Câu trả lời tốt. – deepelement

Các vấn đề liên quan