Số liệu phân loại đa nhãn trên scikit


19

Tôi đang cố gắng xây dựng một trình phân loại nhiều nhãn để gán chủ đề cho các tài liệu hiện có bằng scikit

Tôi đang xử lý các tài liệu của mình chuyển chúng qua TfidfVectorizercác nhãn thông qua MultiLabelBinarizervà tạo một OneVsRestClassifiervới SGDClassifiertư cách là công cụ ước tính.

Tuy nhiên, khi kiểm tra trình phân loại của tôi, tôi chỉ nhận được số điểm lên tới .29 mà từ những gì tôi đã đọc là khá thấp cho các vấn đề tương tự. Tôi đã thử nhiều tùy chọn trên TfidfVectorizer như mật khẩu, unigram, xuất phát và dường như không có gì thay đổi kết quả nhiều như vậy.

Tôi cũng đã từng sử dụng GridSearchCVđể có được các tham số tốt nhất cho công cụ ước tính của mình và hiện tại tôi không biết nên thử gì tiếp theo.

Đồng thời, từ những gì tôi hiểu tôi không thể sử dụng scikit.metricsvới OneVsRestClassifiervậy làm thế nào tôi có thể nhận được một số số liệu (F1, Chính xác, Nhớ lại, v.v.) để tìm ra điều gì sai?

Nó có thể là một vấn đề với kho dữ liệu của tôi?

Cập nhật: Tôi cũng đã thử sử dụng CountVectorizerHashingVectorizervà pipelining họ TfidfTransformernhưng kết quả cũng tương tự. Vì vậy, tôi đoán rằng cách tiếp cận từ ngữ đang làm tốt nhất trong miền mã thông báo và phần còn lại tùy thuộc vào phân loại ...


1
Đo 0,29 là gì? Độ chính xác? Thứ gì khác?
Sycorax nói Phục hồi lại

@GeneralAbrial Theo tài liệu scikit chạy scoretrên trình phân loại,Returns the mean accuracy on the given test data and labels. In multi-label classification, this is the subset accuracy which is a harsh metric since you require for each sample that each label set be correctly predicted.
mobius

Đó là những gì bạn đã làm? Không có gì rõ ràng từ câu hỏi của bạn rằng đây là trường hợp, vì vậy đây là một câu hỏi hoàn toàn hợp lý.
Sycorax nói Phục hồi lại

@GeneralAbrial Có, đây là những gì tôi đã làm. Xin lỗi vì sự nhầm lẫn, tôi đã cố gắng giữ câu hỏi ở chế độ lý thuyết hơn là phát triển.
mobius

Bạn có thể vui lòng thêm mã của bạn ở đây? Cụ thể là bạn đang sử dụng sample_ weight = "cân bằng" cho SGD? Nhưng có thể có những điều khác cần lưu ý khi chúng tôi thấy mã của bạn.
Diego

Câu trả lời:


21

Độ 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_scorechỉ 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):

nhập mô tả hình ảnh ở đây

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:

nhập mô tả hình ảnh ở đây

Đâ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.


câu trả lời tuyệt vời, nó chỉ làm cho tôi tốt hơn :) Tôi sẽ đọc nó kỹ hơn, thử điểm Hamming và lấy lại cho bạn!
mobius

Thành thật mà nói, nó không hoàn toàn rõ ràng với tôi chính xác độ chính xác của tập hợp con là bao nhiêu (Tỷ lệ khớp chính xác). Bạn có thể vui lòng giải thích thêm một chút? Có vẻ như trong trường hợp của đa lớp, điều này giống hệt với việc thu hồi.
Poete Maudit

Các hamming_scorelỗi chức năng trên Keras: <ipython-input-34-16066d66dfdd> trong hamming_score (y_true, y_pred, normalize, sample_ weight) 60 '' '61 acc_list = [] ---> 62 cho tôi trong phạm vi (y_true.sh 0]): 63 set_true = set (np.where (y_true [i]) [0]) 64 set_pred = set (np.where (y_pred [i]) [0]) TypeError: index được trả về không phải là int (loại noneType )
rjurney

0

Là điểm 0,29 không đủ? Ma trận nhầm lẫn của bạn trông như thế nào? Có một số chủ đề không thể tách rời có thể chỉ bằng cách nhìn vào nội dung từ?

Mặt khác, hãy cố gắng giải quyết vấn đề của bạn: Giả thuyết rằng điểm thấp thực sự là thứ tốt nhất mà trình phân loại của bạn có thể làm trên dữ liệu của bạn. Điều đó có nghĩa là các tài liệu của bạn không được phân loại bằng cách sử dụng phương pháp này.

Để kiểm tra giả thuyết này, bạn cần một bộ tài liệu kiểm tra với các đặc điểm túi từ đã biết (do bạn tự tạo). Bạn sẽ nhận được 100% điểm.

Nếu bạn không, thì bạn có một lỗi. Nếu không, bạn cần một cách tiếp cận khác để phân loại tài liệu của bạn. Hãy tự hỏi: làm thế nào để các tài liệu từ các lớp khác nhau khác nhau? Tôi có cần xem các tính năng khác của tài liệu của mình không, v.v.


Ngoài những con số tôi cảm thấy rằng 0,29 là thấp. Tôi sử dụng mô hình được đào tạo để dự đoán các chủ đề trên các tài liệu mà tôi đã sử dụng trong khóa đào tạo để kiểm tra thủ công trình phân loại. Tôi chưa thể có được ít nhất cùng một số chủ đề mà người dùng đã nhập thủ công trên tài liệu. Tôi thường chỉ nhận được một tập hợp con của chúng. Ngoài ra, liên quan đến câu hỏi về ma trận nhầm lẫn, tôi không nghĩ rằng tôi có thể nhận được một ma trận nhầm lẫn trên OneVsRestClassifier bằng scikit.metrics ... Tôi sẽ kiểm tra xem
mobius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.