SciPy y scikit-learn – ValueError: No coinciden las dimensiones

Utilizo SciPy y scikit-learn para entrenar y aplicar un Clasificador Multinomial Naive Bayes para la clasificación de texto binario. Precisamente, utilizo el módulo sklearn.feature_extraction.text.CountVectorizer para crear matrices dispersas que contienen recuentos de características de palabras del texto y el módulo sklearn.naive_bayes.MultinomialNB como la implementación del clasificador para capacitar al clasificador sobre los datos de entrenamiento y aplicarlos en los datos de prueba.

La entrada al CountVectorizer es una lista de documentos de texto representados como cadenas Unicode. Los datos de entrenamiento son mucho más grandes que los datos de prueba. Mi código se ve así (simplificado):

 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) 

Problema: Tan pronto como se llama ValueError: dimension mismatch MultinomialNB.predict_log_proba() , obtengo ValueError: dimension mismatch . De acuerdo con el stacktrace de IPython a continuación, el error ocurre en 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)) 

No tengo idea de por qué se produce este error. ¿Puede alguien explicármelo y brindarme una solución para este problema? ¡Muchas gracias por adelantado!

Me suena, como si solo necesitaras usar vectorizer.transform para el conjunto de datos de prueba, ya que el conjunto de datos de entrenamiento corrige el vocabulario (no puedes conocer el vocabulario completo, incluido el conjunto de entrenamiento después de todo). Para que quede claro, eso es vectorizer.transform lugar de vectorizer.fit_transform .