6,000,000 を超えるエントリと各エントリ 150k の機能を持つデータセットで Naive Bayes を実行しようとしています。次のリンクからコードを実装しようとしました: Implementing Bag-of-Words Naive-Bayes classifier in NLTK
問題は (私が理解しているように)、パラメーターとして dok_matrix を使用して train-method を実行しようとすると、 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 の各エントリを通過することです。問題の続きとして、この単純ベイズをスパース行列で利用する方法を知っている人はいますか、または上記のコードを最適化する他の方法はありますか?