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?
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
đú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
Tìm thấy các iterkeys atleast, bây giờ vấn đề là mã quá chậm. – user1638859