【问题标题】:Scikit-learn's Pipeline: Error with multilabel classification. A sparse matrix was passedScikit-learn 的管道:多标签分类错误。传递了一个稀疏矩阵
【发布时间】:2015-09-22 13:32:33
【问题描述】:

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

我正在对文本文件进行排序,操作如下:

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

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

TypeError:传递了稀疏矩阵,但需要密集数据。 使用 X.toarray() 转换为密集的 numpy 数组。

看到下面的帖子here

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

【问题讨论】:

    标签: python scikit-learn gaussian text-classification


    【解决方案1】:

    您可以执行以下操作:

    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)
    

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

    顺便说一句,我不知道您的限制条件,但也许您可以使用其他分类器,例如 RandomForestClassifierSVM,它们确实接受稀疏表示的数据。

    【讨论】:

    • 非常感谢。是的。我尝试过其他的 SVM 算法和 RandomForest 并接受了解析表示
    猜你喜欢
    • 2015-04-07
    • 2015-08-04
    • 2019-05-29
    • 2012-11-24
    • 2015-07-26
    • 2017-07-10
    • 2015-09-28
    • 2015-05-26
    • 2013-04-12
    相关资源
    最近更新 更多