6,000,000を超えるエントリと150kの各エントリを持つデータセットでNaive Bayesを実行しようとしています。私は、次のリンクからコードを実装しようとしました: Implementing Bag-of-Words Naive-Bayes classifier in NLTKNaive Bayes(Python、scikit)のスパース行列/オンライン学習の使用
問題は、私はそれがパラメータだとして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の代わりに効率的に使うことができますか?または私は何か明白な行方不明ですか?
いつもありがとうございます。 :)
EDIT、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エントリのそれぞれを通過する:ここで私は、現時点で得たものです。問題の継続として、このNaive Bayesをスパース行列でどのように活用すればよいか、あるいは上記のコードを最適化する他の方法はありますか?
おそらく、あなたの機能をより効率的にエンコードするか、サイズを小さくすることができますか? – piokuc
本当ですが、私が恐れている機能の数が何であれ、私はまだマトリックスのサイズを管理する必要があります。データセットはツイートの単語で構成されています。 – user1638859
少なくともiterkeysが見つかりました。問題はコードが遅すぎるということです。 – user1638859