2012-08-31 36 views
5

Tôi đang cố gắng thực hiện Naive Bayes trên tập dữ liệu có hơn 6.000.000 mục nhập và mỗi mục nhập 150k tính năng. Tôi đã cố gắng triển khai mã từ liên kết sau: Implementing Bag-of-Words Naive-Bayes classifier in NLTKSử dụng ma trận thưa thớt/học trực tuyến tại Naive Bayes (Python, scikit)

Vấn đề là (như tôi hiểu), khi tôi cố gắng chạy phương pháp đào tạo bằng dok_matrix làm tham số, nó không thể tìm thấy các khóa lặp (tôi đã kết hợp các hàng với OrderedDict như nhãn):

Traceback (most recent call last): 
    File "skitest.py", line 96, in <module> 
    classif.train(add_label(matr, labels)) 
    File "/usr/lib/pymodules/python2.6/nltk/classify/scikitlearn.py", line 92, in train 
    for f in fs.iterkeys(): 
    File "/usr/lib/python2.6/dist-packages/scipy/sparse/csr.py", line 88, in __getattr__ 
    return _cs_matrix.__getattr__(self, attr) 
    File "/usr/lib/python2.6/dist-packages/scipy/sparse/base.py", line 429, in __getattr__ 
    raise AttributeError, attr + " not found" 
AttributeError: iterkeys not found 

câu hỏi của tôi là, liệu có một cách để hoặc là tránh sử dụng một ma trận thưa thớt bằng cách dạy các mục phân loại bởi entry (trực tuyến), hoặc là có một thưa thớt định dạng ma trận tôi có thể sử dụng trong trường hợp này hiệu quả thay vì dok_matrix? Hoặc tôi thiếu một cái gì đó hiển nhiên?

Cảm ơn thời gian của bất kỳ ai. :)

CHỈNH SỬA, sep thứ sáu:

Tìm thấy các khóa lặp, do đó, ít nhất mã chạy. Nó vẫn còn quá chậm, vì nó đã mất vài giờ với một tập dữ liệu có kích thước 32k, và vẫn chưa hoàn thành. Đây là những gì tôi nhận được tại thời điểm này:

matr = dok_matrix((6000000, 150000), dtype=float32) 
labels = OrderedDict() 

#collect the data into the matrix 

pipeline = Pipeline([('nb', MultinomialNB())]) 
classif = SklearnClassifier(pipeline) 

add_label = lambda lst, lab: [(lst.getrow(x).todok(), lab[x]) 
           for x in xrange(lentweets-foldsize)] 

classif.train(add_label(matr[:(lentweets-foldsize),0], labels)) 
readrow = [matr.getrow(x + foldsize).todok() for x in xrange(lentweets-foldsize)] 
data = np.array(classif.batch_classify(readrow)) 

Vấn đề có thể là mỗi hàng được lấy không sử dụng độ chệch của véc tơ, nhưng đi qua mỗi mục nhập 150k. Là một sự tiếp tục cho vấn đề này, có ai biết cách sử dụng Naive Bayes này với các ma trận thưa thớt hay không có cách nào khác để tối ưu hóa mã trên?

+0

Có lẽ bạn có thể mã hóa các tính năng của mình hiệu quả hơn hoặc giảm kích thước của chúng? – piokuc

+0

đúng, nhưng bất kể số lượng tính năng tôi sợ tôi vẫn sẽ cần phải quản lý kích thước của ma trận. Tập dữ liệu bao gồm các từ của tweets. – user1638859

+0

Tìm thấy các iterkeys atleast, bây giờ vấn đề là mã quá chậm. – user1638859

Trả lời

3

Khám phá số document classification example trong quá trình tìm hiểu. Bí quyết là để thư viện xử lý tính năng trích xuất cho bạn. Bỏ qua trình bao bọc NLTK, vì nó không dành cho các tập dữ liệu lớn như vậy. (*)

Nếu bạn có tài liệu trong tập tin văn bản, bạn có thể chuyển các tập tin văn bản đó sang TfidfVectorizer.

from sklearn.feature_extraction.text import TfidfVectorizer 
vect = TfidfVectorizer(input='filename') 
X = vect.fit_transform(list_of_filenames) 

Bây giờ bạn đã đào tạo thiết X theo định dạng ma trận thưa thớt CSR, mà bạn có thể ăn với một phân loại Naive Bayes nếu bạn cũng có một danh sách các nhãn y (có lẽ bắt nguồn từ tên tập tin, nếu bạn mã hóa các trong đó):

from sklearn.naive_bayes import MultinomialNB 
nb = MultinomialNB() 
nb.fit(X, y) 

Nếu điều này không thành công do tập hợp tài liệu quá lớn (không phải vì số TfidfVectorizer được tối ưu hóa cho số tài liệu này), hãy xem ví dụ out-of-core document classification, minh họa HashingVectorizer và API partial_fit cho minibatch học tập. Bạn sẽ cần scikit-learn 0.14 để làm việc này.

(*) Tôi biết, bởi vì tôi đã viết trình bao bọc đó. Giống như phần còn lại của NLTK, nó dành cho mục đích giáo dục. Tôi cũng làm việc về cải tiến hiệu suất trong việc học hỏi và một số mã mà tôi đang quảng cáo là của riêng tôi.

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