29

SciPyscikit-learnを使用して、バイナリ テキスト分類用の多項単純ベイズ分類器をトレーニングして適用します。正確にはsklearn.feature_extraction.text.CountVectorizer、テキストから単語の特徴数を保持するスパース行列を作成するためのモジュールと、sklearn.naive_bayes.MultinomialNBトレーニング データで分類器をトレーニングし、それをテスト データに適用するための分類器の実装としてモジュールを使用します。

への入力CountVectorizerは、Unicode 文字列として表されるテキスト ドキュメントのリストです。トレーニング データは、テスト データよりもはるかに大きいです。私のコードは次のようになります(簡略化):

vectorizer = CountVectorizer(**kwargs)

# sparse matrix with training data
X_train = vectorizer.fit_transform(list_of_documents_for_training)

# vector holding target values (=classes, either -1 or 1) for training documents
# this vector has the same number of elements as the list of documents
y_train = numpy.array([1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, ...])

# sparse matrix with test data
X_test = vectorizer.fit_transform(list_of_documents_for_testing)

# Training stage of NB classifier
classifier = MultinomialNB()
classifier.fit(X=X_train, y=y_train)

# Prediction of log probabilities on test data
X_log_proba = classifier.predict_log_proba(X_test)

問題:MultinomialNB.predict_log_proba()が呼び出されるとすぐに、が表示されますValueError: dimension mismatch。以下の IPython スタックトレースによると、エラーは SciPy で発生します。

/path/to/my/code.pyc
--> 177         X_log_proba = classifier.predict_log_proba(X_test)

/.../sklearn/naive_bayes.pyc in predict_log_proba(self, X)
    76             in the model, where classes are ordered arithmetically.
    77         """
--> 78         jll = self._joint_log_likelihood(X)
    79         # normalize by P(x) = P(f_1, ..., f_n)
    80         log_prob_x = logsumexp(jll, axis=1)

/.../sklearn/naive_bayes.pyc in _joint_log_likelihood(self, X)
    345         """Calculate the posterior log probability of the samples X"""
    346         X = atleast2d_or_csr(X)
--> 347         return (safe_sparse_dot(X, self.feature_log_prob_.T)
    348                + self.class_log_prior_)
    349 

/.../sklearn/utils/extmath.pyc in safe_sparse_dot(a, b, dense_output)
    71     from scipy import sparse
    72     if sparse.issparse(a) or sparse.issparse(b):
--> 73         ret = a * b
    74         if dense_output and hasattr(ret, "toarray"):
    75             ret = ret.toarray()

/.../scipy/sparse/base.pyc in __mul__(self, other)
    276 
    277             if other.shape[0] != self.shape[1]:
--> 278                 raise ValueError('dimension mismatch')
    279 
    280             result = self._mul_multivector(np.asarray(other))

このエラーが発生する理由がわかりません。誰でも私に説明して、この問題の解決策を提供してもらえますか? よろしくお願いします!

4

2 に答える 2

60

トレーニングデータセットは語彙を修正するため、テストデータセットに使用する必要があるようにvectorizer.transform思えます(結局、トレーニングセットを含む完全な語彙を知ることはできません)。明確にするために、それvectorizer.transformはの代わりですvectorizer.fit_transform

于 2012-09-18T21:46:40.720 に答える