Scikit-learn 的管道:多标签分类错误。传递了一个稀疏矩阵

Scikit-learn's Pipeline: Error with multilabel classification. A sparse matrix was passed

我正在使用不同的机器学习算法实现不同的 classifier。

我正在整理文本文件,操作如下:

classifier = Pipeline([
('vectorizer', CountVectorizer ()),
('TFIDF', TfidfTransformer ()),
('clf', OneVsRestClassifier (GaussianNB()))])
classifier.fit(X_train,Y)
predicted = classifier.predict(X_test)

当我使用GaussianNB算法时出现以下错误:

TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray () to convert to a dense numpy array.

我看到了下面的post

在此post中创建了一个class来执行数据转换。 可以使用 TfidfTransformer 调整我的代码。 我该如何解决这个问题?

您可以执行以下操作:

class DenseTransformer(TransformerMixin):
    def transform(self, X, y=None, **fit_params):
        return X.todense()

    def fit_transform(self, X, y=None, **fit_params):
        self.fit(X, y, **fit_params)
        return self.transform(X)

    def fit(self, X, y=None, **fit_params):
        return self

classifier = Pipeline([
('vectorizer', CountVectorizer ()),
('TFIDF', TfidfTransformer ()),
('to_dense', DenseTransformer()), 
('clf', OneVsRestClassifier (GaussianNB()))])
classifier.fit(X_train,Y)
predicted = classifier.predict(X_test)

现在,作为管道的一部分,数据将转换为密集表示。

顺便说一句,我不知道你的限制,但也许你可以使用另一个分类器,例如 RandomForestClassifier or SVM 接受稀疏表示中的数据。