2012-08-31 39 views
5

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をスパース行列でどのように活用すればよいか、あるいは上記のコードを最適化する他の方法はありますか?

+0

おそらく、あなたの機能をより効率的にエンコードするか、サイズを小さくすることができますか? – piokuc

+0

本当ですが、私が恐れている機能の数が何であれ、私はまだマトリックスのサイズを管理する必要があります。データセットはツイートの単語で構成されています。 – user1638859

+0

少なくともiterkeysが見つかりました。問題はコードが遅すぎるということです。 – user1638859

答えて

3

scikit-learnでdocument classification exampleをチェックしてください。そのトリックは、ライブラリがあなたのために特徴抽出を処理するようにすることです。

テキストファイルがある場合は、これらのテキストファイルをTfidfVectorizerに渡すだけで、そこから疎な行列が作成されます。つまり、NLTKラッパーをスキップすると、その大規模なデータセットは対象外となります。あなたがエンコードされた場合には(おそらく、ファイル名に由来しますが、今、あなたはまた、ラベルyのリストを持っている場合は、単純ベイズ分類器に供給できることを、CSRスパース行列形式でXをトレーニングを設定している

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

クラス):

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

文書セットが大きすぎるため(TfidfVectorizerがこの数の文書だけに最適化されているため)、out-of-core document classificationの例を見てください。HashingVectorizerpartial_fitミニバッチ用のAPIを示しています学習。これが機能するにはscikit-learn 0.14が必要です。

(*)私はそのラッパーを書いたので、知っています。他のNLTKと同様、教育目的のためのものです。私はscikit-learnでパフォーマンスの改善に取り組みました。私が宣伝しているコードのいくつかは自分のものです。

関連する問題