Độ chính xác của tập hợp con thực sự là một số liệu khắc nghiệt. Để hiểu được mức độ tốt hay xấu của 0,29, một số ý tưởng:
- nhìn vào số lượng nhãn bạn có trung bình cho mỗi mẫu
- nhìn vào thỏa thuận giữa các bộ chú thích, nếu có (nếu không, hãy tự thử xem độ chính xác của tập hợp con thu được khi bạn là bộ phân loại)
- nghĩ xem chủ đề có được xác định rõ không
- nhìn vào số lượng mẫu bạn có cho mỗi nhãn
Bạn cũng có thể muốn tính điểm hamming, để xem liệu trình phân loại của bạn có rõ ràng hay thay vào đó là tốt nhưng có vấn đề dự đoán chính xác tất cả các nhãn. Xem bên dưới để tính điểm hamming.
Đồng thời, từ những gì tôi hiểu, tôi không thể sử dụng scikit.metrics với OneVsRestClassifier để làm cách nào tôi có thể nhận được một số số liệu (F1, Precision, Recall, v.v.) để tìm ra điều gì sai?
Xem Làm thế nào để tính toán độ chính xác / thu hồi để phân loại đa lớp? . Tôi quên rằng liệu sklearn có hỗ trợ hay không, tôi nhớ nó có một số hạn chế, ví dụ sklearn không hỗ trợ đa nhãn cho ma trận nhầm lẫn . Đó sẽ là một ý tưởng tốt để xem những con số thực sự.
Điểm Hamming :
Trong cài đặt phân loại đa nhãn , sklearn.metrics.accuracy_score
chỉ tính độ chính xác của tập hợp con (3): tức là bộ nhãn được dự đoán cho một mẫu phải khớp chính xác với bộ nhãn tương ứng trong y_true.
Cách tính toán độ chính xác này đôi khi được đặt tên, có lẽ ít mơ hồ hơn, tỷ lệ khớp chính xác (1):
Một cách điển hình khác để tính độ chính xác được xác định trong (1) và (2) và ít được gọi một cách mơ hồ là điểm Hamming (4) (vì nó liên quan chặt chẽ đến mất Hamming) hoặc độ chính xác dựa trên nhãn ). Nó được tính như sau:
Đây là một phương pháp python để tính điểm Hamming:
# Code by /programming//users/1953100/william
# Source: /programming//a/32239764/395857
# License: cc by-sa 3.0 with attribution required
import numpy as np
y_true = np.array([[0,1,0],
[0,1,1],
[1,0,1],
[0,0,1]])
y_pred = np.array([[0,1,1],
[0,1,1],
[0,1,0],
[0,0,0]])
def hamming_score(y_true, y_pred, normalize=True, sample_weight=None):
'''
Compute the Hamming score (a.k.a. label-based accuracy) for the multi-label case
/programming//q/32239577/395857
'''
acc_list = []
for i in range(y_true.shape[0]):
set_true = set( np.where(y_true[i])[0] )
set_pred = set( np.where(y_pred[i])[0] )
#print('\nset_true: {0}'.format(set_true))
#print('set_pred: {0}'.format(set_pred))
tmp_a = None
if len(set_true) == 0 and len(set_pred) == 0:
tmp_a = 1
else:
tmp_a = len(set_true.intersection(set_pred))/\
float( len(set_true.union(set_pred)) )
#print('tmp_a: {0}'.format(tmp_a))
acc_list.append(tmp_a)
return np.mean(acc_list)
if __name__ == "__main__":
print('Hamming score: {0}'.format(hamming_score(y_true, y_pred))) # 0.375 (= (0.5+1+0+0)/4)
# For comparison sake:
import sklearn.metrics
# Subset accuracy
# 0.25 (= 0+1+0+0 / 4) --> 1 if the prediction for one sample fully matches the gold. 0 otherwise.
print('Subset accuracy: {0}'.format(sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)))
# Hamming loss (smaller is better)
# $$ \text{HammingLoss}(x_i, y_i) = \frac{1}{|D|} \sum_{i=1}^{|D|} \frac{xor(x_i, y_i)}{|L|}, $$
# where
# - \\(|D|\\) is the number of samples
# - \\(|L|\\) is the number of labels
# - \\(y_i\\) is the ground truth
# - \\(x_i\\) is the prediction.
# 0.416666666667 (= (1+0+3+1) / (3*4) )
print('Hamming loss: {0}'.format(sklearn.metrics.hamming_loss(y_true, y_pred)))
Đầu ra:
Hamming score: 0.375
Subset accuracy: 0.25
Hamming loss: 0.416666666667
(1) Sorower, Mohammad S. " Một khảo sát tài liệu về các thuật toán cho việc học đa nhãn. " Đại học bang Oregon, Corvallis (2010).
(2) Tsoumakas, Grigorios và Ioannis Katakis. " Phân loại đa nhãn: Tổng quan. " Khoa Tin học, Đại học Aristotle ở Thessaloniki, Hy Lạp (2006).
(3) Ghamrawi, Nadia và Andrew McCallum. " Phân loại đa nhãn hiệu tập thể. " Kỷ yếu hội thảo quốc tế ACM lần thứ 14 về quản lý thông tin và kiến thức. ACM, 2005.
(4) Godbole, Chaianu và Sunita Sarawagi. " Phương pháp phân biệt đối xử để phân loại đa nhãn. " Những tiến bộ trong Khám phá tri thức và Khai thác dữ liệu. Springer Berlin Heidelberg, 2004. 22-30.