복붙노트

[PYTHON] SciPy 및 scikit-learn - ValueError : 치수 불일치

PYTHON

SciPy 및 scikit-learn - ValueError : 치수 불일치

SciPy와 scikit을 사용하여 바이너리 텍스트 분류를위한 Multinomial Naive Bayes Classifier를 훈련하고 적용하는 법을 배웁니다. 정확하게 저는 텍스트로부터 단어 특징 카운트를 보유하는 희소 행렬을 생성하기 위해 sklearn.feature_extraction.text.CountVectorizer 모듈을 사용하고 훈련 데이터에 대한 분류자를 훈련시키고이를 테스트 데이터에 적용하기위한 분류 자 ​​구현으로서 sklearn.naive_bayes.MultinomialNB 모듈을 사용합니다.

CountVectorizer에 대한 입력은 유니 코드 문자열로 표현 된 텍스트 문서의 목록입니다. 훈련 데이터는 테스트 데이터보다 훨씬 큽니다. 내 코드는 다음과 같습니다 (단순화).

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 : 차원 불일치가 발생합니다. 아래의 IPython stacktrace에 따르면 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))

나는이 오류가 왜 발생하는지 전혀 모른다. 아무도 나에게 설명해 주시고이 문제에 대한 해결책을 제공해 주시겠습니까? 많은 감사드립니다!

해결법

  1. ==============================

    1.트레이닝 데이터 세트가 어휘를 수정하기 때문에 (트레이닝 세트를 포함한 전체 어휘를 ​​알 수는 없기 때문에) 테스트 데이터 세트에 vectorizer.transform을 사용하기 만하면됩니다. 그냥 명확히하기 위해 vectorizer.transform 대신 vectorizer.transform을 사용합니다.

    트레이닝 데이터 세트가 어휘를 수정하기 때문에 (트레이닝 세트를 포함한 전체 어휘를 ​​알 수는 없기 때문에) 테스트 데이터 세트에 vectorizer.transform을 사용하기 만하면됩니다. 그냥 명확히하기 위해 vectorizer.transform 대신 vectorizer.transform을 사용합니다.

  2. from https://stackoverflow.com/questions/12484310/scipy-and-scikit-learn-valueerror-dimension-mismatch by cc-by-sa and MIT license