我有两个简单的scikit-learn Pipeline
步骤:TfIdfVectorizer
后跟LinearSVC
。
我使用我的数据来适应管道。一切都好。
现在我想使用我的拟合pipeline
来转换(不预测!)一个项目。
我尝试了pipeline.transform([item])
,但与pipeline.named_steps['tfidf'].transform([item])
相比,它提供了不同的结果。甚至结果的形状和类型也不同:第一个是1x3000 CSR矩阵,第二个是1x15000 CSC矩阵。哪一个是正确的?他们为什么不同?
如何使用scikit-learn Pipeline
来转换项目,即在最终估算工具之前获取项目的矢量表示?
答案 0 :(得分:8)
在最后一步中,不能在包含非变换器的管道上调用变换方法。 如果你不想在这样的管道上调用transfrom,最后估算器必须是变压器。
即使是方法文档也这么说:
将变换应用于数据,以及变换方法 最终估算。仅在最终估算器实现时有效 的变换强>
此外,除了最后一个之外,没有方法可以使用每个估算器。 你可以制作自己的Pipeline,并继承scikit-learn的Pipeline中的所有内容,但添加一个方法,如:
def just_transforms(self, X):
"""Applies all transforms to the data, without applying last
estimator.
Parameters
----------
X : iterable
Data to predict on. Must fulfill input requirements of first step of
the pipeline.
"""
Xt = X
for name, transform in self.steps[:-1]:
Xt = transform.transform(Xt)
return Xt
答案 1 :(得分:4)
结果不同的原因(以及调用transform
甚至工作的原因)是LinearSVC
还有一个进行特征选择的变换(现已弃用)
如果您想仅使用第一步进行转换,pipeline.named_steps['tfidf'].transform([item])
是正确的做法。
如果您想使用除最后一步之外的所有步骤进行转换,olologin的答案将提供代码。
默认情况下,执行管道的所有步骤,以及最后一步的转换,即LinearSVC执行的特征选择。