2012-05-02 32 views
13

Tôi đang so sánh hai trình phân loại Naive Bayes: một from NLTK và một from scikit-learn. Tôi đang đối phó với một vấn đề phân loại nhiều lớp (3 lớp: dương (1), âm (-1), và trung lập (0)).scikits tìm hiểu và nltk: hiệu suất phân loại Naive Bayes rất khác nhau

Không thực hiện bất kỳ lựa chọn tính năng nào (sử dụng tất cả các tính năng có sẵn) và sử dụng tập dữ liệu đào tạo 70.000 trường hợp (được gắn nhãn nhiễu, với phân phối thể hiện 17% dương, 4% âm và trung bình 78%), Tôi đào tạo hai phân loại, đầu tiên là một nltk.NaiveBayesClassifier, và thứ hai là một sklearn.naive_bayes.MultinomialNB (với fit_prior=True).

Sau khi đào tạo, tôi đánh giá phân loại trên tập kiểm tra của tôi về 30.000 trường hợp và tôi nhận được kết quả như sau:

**NLTK's NaiveBayes** 
accuracy: 0.568740 
class: 1 
    precision: 0.331229 
    recall: 0.331565 
    F-Measure: 0.331355 
class: -1 
    precision: 0.079253 
    recall: 0.446331 
    F-Measure: 0.134596 
class: 0 
    precision: 0.849842 
    recall: 0.628126 
    F-Measure: 0.722347 


**Scikit's MultinomialNB (with fit_prior=True)** 
accuracy: 0.834670 
class: 1 
    precision: 0.400247 
    recall: 0.125359 
    F-Measure: 0.190917 
class: -1 
    precision: 0.330836 
    recall: 0.012441 
    F-Measure: 0.023939 
class: 0 
    precision: 0.852997 
    recall: 0.973406 
    F-Measure: 0.909191 

**Scikit's MultinomialNB (with fit_prior=False)** 
accuracy: 0.834680 
class: 1 
    precision: 0.400380 
    recall: 0.125361 
    F-Measure: 0.190934 
class: -1 
    precision: 0.330836 
    recall: 0.012441 
    F-Measure: 0.023939 
class: 0 
    precision: 0.852998 
    recall: 0.973418 
    F-Measure: 0.909197 

tôi đã nhận thấy rằng trong khi phân loại Scikit của có độ chính xác tổng thể tốt hơn và chính xác, thu hồi của nó là rất thấp so với NLTK, ít nhất là với dữ liệu của tôi. Có tính đến rằng họ có thể (gần như) cùng một phân loại, không phải là lạ?

+0

Tính năng là gì? Bạn có thử 'BernoulliNB' không? Điều đó nên gần gũi hơn với NLTK Naive Bayes. –

+0

Cảm ơn bạn đã trả lời. Các tính năng là các từ có giá trị 1 nếu chúng tồn tại trong tài liệu (boolean). Kết quả cho scikits BernoulliNB rất gần với MultinomialNB: 'chính xác: 0.834680 lớp: 1 \t chính xác: 0,400380 \t thu hồi: 0,125361 \t F-Measure: 0,190934 lớp: -1 \t chính xác: 0,330836 \t thu hồi: 0.012441 \t F-Measure: 0,023939 lớp: 0 \t chính xác: 0,852998 \t thu hồi: 0,973418 \t F-Measure: 0.909197' –

+4

điều duy nhất tôi có thể nhìn thấy trong documentat ion là phân loại NB của NBT dường như không làm mịn. Tôi sẽ không nghĩ rằng để tạo ra một sự khác biệt lớn, mặc dù ... –

Trả lời

3

Hành vi mặc định cho trọng số lớp giống nhau trong cả hai thư viện? Sự khác biệt về độ chính xác của lớp hiếm (-1) có vẻ như là nguyên nhân ...

+0

Naive Bayes trong NLTK đưa vào xác suất nhãn trước, và (tôi nghĩ rằng) Scikits không giống nhau khi sử dụng với fit_prior = Thông số thực ... –

+2

Sự hiểu biết của tôi (có thể sai) là fit_prior = True sẽ sử dụng trọng số lớp thực tế để, ví dụ, chỉ định tất cả các ví dụ tiêu cực (4% mẫu) cho lớp trung tính sẽ chỉ dẫn đến độ chính xác là -4% (đó là những gì nó xuất hiện để được làm). Hãy thử chạy nó với fit_prior = False. –

+0

Cảm ơn. Tôi đã thử chạy nó với fit_prior = False và đáng ngạc nhiên nó cho kết quả gần như giống nhau (tôi cập nhật bài chính) –

2

Trình phân loại Naive Bayes thường có nghĩa là một phân lớp Bayes trên các tính năng nhị phân được cho là độc lập. Đây là những gì thực hiện NLTK's Naive Bayes classifier. Trình phân loại scikit tương ứng là BernoulliNB trình phân loại.

Hạn chế đối với các tính năng có giá trị boolean không thực sự cần thiết, nó chỉ đơn giản nhất để triển khai. Một trình phân loại Bayes ngây thơ có thể được định nghĩa cho các tính năng độc lập (giả định) từ bất kỳ phân phối tham số nào.

MultinomialNB là dành cho dữ liệu có các tính năng đầu vào có giá trị số nguyên được giả định là phân phối đa thức.

Sckit cũng có GaussianNB cho các tính năng có giá trị liên tục được giả định là Gaussian phân bổ độc lập.

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