小编典典

Scikit-Learn的管道:通过了稀疏矩阵,但是需要密集数据

python

我发现很难理解如何修复我创建的管道(阅读:很大程度上是从教程中粘贴的)。是python 3.4.2:

df = pd.DataFrame
df = DataFrame.from_records(train)

test = [blah1, blah2, blah3]

pipeline = Pipeline([('vectorizer', CountVectorizer()), ('classifier', RandomForestClassifier())])

pipeline.fit(numpy.asarray(df[0]), numpy.asarray(df[1]))
predicted = pipeline.predict(test)

当我运行它时,我得到:

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

这是行pipeline.fit(numpy.asarray(df[0]), numpy.asarray(df[1]))

我已经通过numpy,scipy等尝试了很多解决方案,但是我仍然不知道如何解决它。是的,以前也曾提出过类似的问题,但不是在管道内部。它在哪里,我要申请toarraytodense


阅读 218

收藏
2020-12-20

共1个答案

小编典典

不幸的是,这两个是不兼容的。ACountVectorizer产生一个稀疏矩阵,RandomForestClassifier需要一个密集矩阵。可以使用进行转换X.todense()。这样做会大大增加您的内存占用量。

以下是基于http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-
pipelines.html进行此操作的示例代码,可让您.todense()在管道阶段进行调用。

class DenseTransformer(TransformerMixin):

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

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

一旦有了DenseTransformer,就可以将其添加为管道步骤。

pipeline = Pipeline([
     ('vectorizer', CountVectorizer()), 
     ('to_dense', DenseTransformer()), 
     ('classifier', RandomForestClassifier())
])

另一种选择是使用用于稀疏数据的分类器,例如LinearSVC

from sklearn.svm import LinearSVC
pipeline = Pipeline([('vectorizer', CountVectorizer()), ('classifier', LinearSVC())])
2020-12-20