gpt4 book ai didi

python - Scikit-Learn 的 Pipeline : A sparse matrix was passed, 但需要密集数据

转载 作者:IT老高 更新时间:2023-10-28 22:16:28 26 4
gpt4 key购买 nike

我发现很难理解如何修复我创建的管道(阅读:大部分粘贴自教程)。这是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

最佳答案

不幸的是,这两者是不相容的。 CountVectorizer 产生一个稀疏矩阵,而 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())])

关于python - Scikit-Learn 的 Pipeline : A sparse matrix was passed, 但需要密集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28384680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com