【问题标题】:How to transform items using sklearn Pipeline?如何使用 sklearn 管道转换项目?
【发布时间】:2016-02-01 20:45:36
【问题描述】:

我有一个简单的 scikit-learn Pipeline 两个步骤:TfIdfVectorizer,然后是 LinearSVC

我已经使用我的数据拟合了管道。都很好。

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

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

当使用 scikit-learn 的 Pipeline 时,如何转换项目,即在最终估计器之前获取项目的向量表示?

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    您不能在最后一步包含非转换器的管道上调用转换方法。 如果您不想在此类管道上调用 transfrom,则最后一个估算器必须是转换器。

    即使transform method doc 也是这么说的:

    对数据应用变换,以及变换方法 最终估计器。仅当最终估计器实现时才有效 变换

    此外,除了最后一个之外,没有任何方法可以使用每个估算器。 你可以创建自己的 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
    

    【讨论】:

      【解决方案2】:

      结果不同的原因(以及为什么调用transform 甚至工作)是LinearSVC 也有一个转换(现已弃用)来进行特征选择

      如果您只想使用第一步进行转换,pipeline.named_steps['tfidf'].transform([item]) 是正确的做法。 如果您想使用除最后一步之外的所有步骤进行转换,olologin 的答案提供了代码。

      默认情况下,管道的所有步骤都会被执行,最后一步的变换也是如此,也就是LinearSVC执行的特征选择。

      【讨论】:

        猜你喜欢
        • 2020-12-20
        • 2016-03-26
        • 2020-06-17
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        • 1970-01-01
        • 2018-01-09
        • 2018-02-16
        相关资源
        最近更新 更多