如何使用sklearn Pipeline转换项目?

时间:2015-11-02 02:01:40

标签: python machine-learning scikit-learn

我有两个简单的scikit-learn Pipeline步骤:TfIdfVectorizer后跟LinearSVC

我使用我的数据来适应管道。一切都好。

现在我想使用我的拟合pipeline来转换(不预测!)一个项目。

我尝试了pipeline.transform([item]),但与pipeline.named_steps['tfidf'].transform([item])相比,它提供了不同的结果。甚至结果的形状和类型也不同:第一个是1x3000 CSR矩阵,第二个是1x15000 CSC矩阵。哪一个是正确的?他们为什么不同?

如何使用scikit-learn Pipeline来转换项目,即在最终估算工具之前获取项目的矢量表示?

2 个答案:

答案 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执行的特征选择。