簡體   English   中英

值錯誤:維度不匹配

[英]ValueError: Dimension mismatch

我使用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))

我不知道為什么會出現這個錯誤。 有人可以向我解釋一下並為這個問題提供解決方案嗎? 非常感謝!

在我看來,就像您只需要對測試數據集使用vectorizer.transform ,因為訓練數據集修復了詞匯表(畢竟您無法知道包括訓練集在內的完整詞匯表)。 只是要清楚,那是vectorizer.transform而不是vectorizer.fit_transform

另一個解決方案是使用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_) #vocabulary is a parameter, it should be vocabulary_ as it is an attribute.
text_vector = vector.transform(text)
trained_model.predict_prob(text_vector)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM