SciPy и scikit-learn - ValueError: несоответствие размеров
Я использую SciPy и scikit-learn для обучения и применения многокомпонентного классификатора Наивного Байеса для бинарная текстовая классификация. Точно, я использую модуль sklearn.feature_extraction.text.CountVectorizer
для создания разреженных матриц, которые содержат слова функции counts из текста и модуля 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: 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))
Я не знаю, почему эта ошибка возникает. Может ли кто-нибудь объяснить это мне и предоставить решение этой проблемы? Большое спасибо заранее!
Ответы
Ответ 1
Звучит для меня, как будто вам просто нужно использовать vectorizer.transform
для тестового набора данных, поскольку набор учебных материалов фиксирует словарь (вы не можете знать полный словарь, включая набор тренировок после всего). Чтобы быть ясным, thats vectorizer.transform
вместо vectorizer.fit_transform
.
Ответ 2
Другое решение будет использовать vector.vocabulary
# after trainning the data
vector = CountVectorizer()
vector.fit(self.x_data)
training_data = vector.transform(self.x_data)
bayes = MultinomialNB()
bayes.fit(training_data, y_data)
# use vector.vocabulary for predict
vector = CountVectorizer(vocabulary=vector.vocabulary)
text_vector = vector.transform(text)
trained_model.predict_prob(text_vector)