Подтвердить что ты не робот

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))

Я не знаю, почему эта ошибка возникает. Может ли кто-нибудь объяснить это мне и предоставить решение этой проблемы? Большое спасибо заранее!

4b9b3361

Ответ 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)