Scikit-Learn's Pipeline: A sparse matrix was passed, but dense data is required

后端 未结 5 2117
傲寒
傲寒 2020-12-07 19:04

I\'m finding it difficult to understand how to fix a Pipeline I created (read: largely pasted from a tutorial). It\'s python 3.4.2:

df = pd.DataFrame
df = Da         


        
5条回答
  •  独厮守ぢ
    2020-12-07 19:26

    Unfortunately those two are incompatible. A CountVectorizer produces a sparse matrix and the RandomForestClassifier requires a dense matrix. It is possible to convert using X.todense(). Doing this will substantially increase your memory footprint.

    Below is sample code to do this based on http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html which allows you to call .todense() in a pipeline stage.

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

    Once you have your DenseTransformer, you are able to add it as a pipeline step.

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

    Another option would be to use a classifier meant for sparse data like LinearSVC.

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

提交回复
热议问题