Câu hỏi SciPy và scikit-learn - ValueError: Thứ nguyên không khớp


tôi sử dụng SciPy và scikit-learn để đào tạo và áp dụng Phân loại Naive Bayes đa thức cho phân loại văn bản nhị phân. Chính xác, tôi sử dụng mô-đun sklearn.feature_extraction.text.CountVectorizer để tạo các ma trận thưa thớt giữ các tính năng từ từ văn bản và mô-đun sklearn.naive_bayes.MultinomialNB khi triển khai trình phân loại để đào tạo trình phân loại về dữ liệu đào tạo và áp dụng nó trên dữ liệu thử nghiệm.

Đầu vào cho CountVectorizer là danh sách các tài liệu văn bản được biểu diễn dưới dạng chuỗi unicode. Dữ liệu đào tạo lớn hơn nhiều so với dữ liệu thử nghiệm. Mã của tôi trông như thế này (đơn giản):

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)

Vấn đề: Ngay khi MultinomialNB.predict_log_proba() được gọi là, tôi nhận được ValueError: dimension mismatch. Theo ngăn xếp IPython bên dưới, lỗi xảy ra trong 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))

Tôi không biết tại sao lỗi này xảy ra. Ai có thể vui lòng giải thích nó cho tôi và cung cấp một giải pháp cho vấn đề này? Cảm ơn rất nhiều trước!


14
2017-09-18 20:16


gốc




Các câu trả lời:


Âm thanh với tôi, giống như bạn chỉ cần sử dụng vectorizer.transform cho tập dữ liệu thử nghiệm, vì tập dữ liệu đào tạo sửa từ vựng (bạn không thể biết từ vựng đầy đủ bao gồm cả tập huấn luyện sau). Chỉ cần rõ ràng, đó là vectorizer.transform thay vì vectorizer.fit_transform.


30
2017-09-18 21:46



Ôi trời ơi, bạn thật đúng. Làm thế nào tôi có thể bỏ lỡ điều đó? Cảm ơn rất nhiều! :) - pemistahl
Đã mất 2 giờ để tìm ra giải pháp này! Cảm ơn nhiều! - Евгений Смирнов