我有一个简单的scikit-learn Pipeline
,包含两个步骤:一个TfIdfVectorizer
后跟一个LinearSVC
。
我已经使用我的数据拟合了这个pipeline,一切正常。
现在我想使用我的拟合pipeline
来转换(而不是预测!)一个项目。
我尝试使用pipeline.transform([item])
,但与pipeline.named_steps['tfidf'].transform([item])
相比,结果不同。甚至结果的形状和类型也不同:第一个是一个1×3000的CSR矩阵,第二个是一个1×15000的CSC矩阵。哪个是正确的?为什么它们不同?
当使用scikit-learn的Pipeline
时,如何转换项目,即在最终估计器之前获取项目的向量表示?
回答:
你不能在一个包含非转换器作为最后一步的pipeline上调用transform方法。如果你想在这样的pipeline上调用transform,最后的估计器必须是一个转换器。
甚至transform
方法文档也这么说:
对数据应用转换,以及最终估计器的transform方法。只有当最终估计器实现了transform时才有效。
此外,没有一种方法可以使用除了最后一个之外的所有估计器。不过,你可以创建自己的Pipeline,并从scikit-learn的Pipeline继承所有内容,但添加一个方法,类似于:
def just_transforms(self, X): """对数据应用所有转换,而不应用最后的估计器。
参数
----------
X : iterable
要预测的数据。必须满足pipeline第一步的输入要求。
""" Xt = X for name, transform in self.steps[:-1]: Xt = transform.transform(Xt) return Xt