我正在尝试对具有超过 6,000,000 个条目且每个条目具有 150k 个特征的数据集进行朴素贝叶斯。我尝试从以下链接实现代码: 在 NLTK 中实现词袋朴素贝叶斯分类器
问题是(据我了解),当我尝试使用 dok_matrix 作为参数运行训练方法时,它找不到 iterkeys(我已将行与 OrderedDict 作为标签配对):
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
我的问题是,有没有办法通过逐项(在线)教授分类器条目来避免使用稀疏矩阵,或者在这种情况下我可以有效地使用稀疏矩阵格式而不是 dok_matrix?还是我错过了一些明显的东西?
感谢任何人的时间。:)
编辑,9 月 6 日:
找到了iterkeys,所以至少代码运行。它仍然太慢,因为它花了几个小时处理一个 32k 大小的数据集,但仍未完成。这是我目前得到的:
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))
问题可能是所采用的每一行都没有利用向量的稀疏性,而是遍历了 150k 条目中的每一个。作为该问题的延续,有谁知道如何将这个朴素贝叶斯与稀疏矩阵一起使用,或者有没有其他方法可以优化上述代码?