2 题: Python - 什么是sklearn.pipeline.Pipeline?

在...创建的问题 Tue, Jun 21, 2016 12:00 AM

我无法弄清楚sklearn.pipeline.Pipeline是如何正常工作的。

doc 中有一些解释。例如,他们的意思是:

  

使用最终估算器进行转换的管道。

为了让我的问题更清楚,steps是什么?他们是如何运作的?

修改强>

感谢答案,我可以让我的问题更清楚:

当我调用管道并传递,作为步骤,两个变换器和一个估算器,例如:

 
pipln = Pipeline([("trsfm1",transformer_1),
                  ("trsfm2",transformer_2),
                  ("estmtr",estimator)])

当我打电话给你时会发生什么?

 
pipln.fit()
OR
pipln.fit_transform()

我无法弄清楚估算器如何成为变压器以及如何安装变压器。

    
79
  1. 根据我的理解,管道可以帮助您自动化学习过程的几个步骤。比如模型的训练和测试或特征选择......所以如果你想混合回归然后用它来提供分类器,你的步骤将是回归的训练,然后是分类器的训练。编辑:添加详细信息
    2015-10-13 02:02:28Z
  2. 2018-08-10 16:45:27Z
  3. 醇>
    2个答案                              2 跨度>                         
    scikit-learn中的

    Transformer - 一些具有拟合和变换方法的类,或fit_transform方法。

    预测器 - 一些适合和预测方法的类,或fit_predict方法。

    管道只是一个抽象的概念,它不是现有的ml算法。通常在ML任务中,您需要在应用最终估算器之前执行原始数据集的不同转换序列(查找要素集,生成新要素,仅选择一些好的要素)。

    此处是管道使用的一个很好的例子。 Pipeline为您提供了所有3个转换步骤和结果估算器的单一界面。它封装了内部的变换器和预测器,现在你可以做类似的事情:

     
        vect = CountVectorizer()
        tfidf = TfidfTransformer()
        clf = SGDClassifier()
    
        vX = vect.fit_transform(Xtrain)
        tfidfX = tfidf.fit_transform(vX)
        predicted = clf.fit_predict(tfidfX)
    
        # Now evaluate all steps on test set
        vX = vect.fit_transform(Xtest)
        tfidfX = tfidf.fit_transform(vX)
        predicted = clf.fit_predict(tfidfX)
    

    只有:

     
    pipeline = Pipeline([
        ('vect', CountVectorizer()),
        ('tfidf', TfidfTransformer()),
        ('clf', SGDClassifier()),
    ])
    predicted = pipeline.fit(Xtrain).predict(Xtrain)
    # Now evaluate all steps on test set
    predicted = pipeline.predict(Xtest)
    

    使用管道,您可以轻松地对此元估计器的每个步骤的参数集执行网格搜索。如上面的链接所述。除最后一步之外的所有步骤必须是变换,最后一步可以是变换器或预测器。 回答编辑: 当您拨打pipln.fit()时 - 管道内的每个变压器将安装在先前变压器的输出上(在原始数据集上学习第一个变压器)。最后一个估算器可能是变换器或预测器,只有当你的最后一个估算器是变换器(实现fit_transform,或者单独转换和拟合方法)时,你才能在管道上调用fit_transform(),你可以只在管道上调用fit_predict()或predict()你的最后一个估算器是预测器。所以你不能调用fit_transform或转换管道,最后一步是预测器。

        
    122
    2017-02-22 23:31:15Z
    1. predicted = pipeline.fit(Xtrain).predict(Xtrain)是什么意思?
      2015-10-13 12:35:36Z
    2. @ farhawa,预测训练集上的课程。
      2015-10-13 13:19:13Z
    3. 谢谢,请看看我的编辑。
      2015-10-13 14:07:44Z
    4. 为什么这不会有更多的选票?它的应该是博客文章。
      2017-05-03 22:32:31Z
    5. @ iamgin,大多数scikit-learn变换器的接口不允许选择我们想要转换的所需列。但是您可以编写自己的“项目选择器”,这将帮助您仅使用所需的列来提供变换器。这是ItemSelector和FeatureUnion的一个很好的例子 scikit-learn.org/stable/auto_examples /...
      2017-08-16 18:50:24Z
    6. 醇>

    我认为M0rkHaV有正确的想法。 Scikit-learn的管道类是一个有用的工具,可以将多个不同的变换器与估算器一起封装到一个对象中,这样您只需要调用一次重要的方法(fit(),predict()等)。让我们分解两个主要组成部分:

    1. 变形金刚是同时实现fit()transform()的类。您可能熟悉一些sklearn预处理工具,如TfidfVectorizerBinarizer。如果您查看这些预处理工具的文档,您会看到它们实现了这两种方法。我觉得非常酷的是,一些估算器也可以用作转换步骤,例如LinearSVC

    2. Estimators 是同时实现fit()predict()的类。您会发现许多分类器和回归模型都实现了这两种方法,因此您可以轻松地测试许多不同的模型。可以使用另一个变换器作为最终估计器(即,它不一定实现predict(),但绝对实现fit())。所有这些意味着你将无法拨打predict()

    3. 醇>

      至于你的编辑:让我们来看一个基于文本的例子。使用LabelBinarizer,我们希望将标签列表转换为二进制值列表。

       
      bin = LabelBinarizer()  #first we initialize
      
      vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized
      

      现在,当二进制化器适用于某些数据时,它将具有一个名为classes_的结构,其中包含变换器“知道”的唯一类。没有调用fit(),二进制文件不知道数据是什么样的,所以调用transform()没有任何意义。如果在尝试拟合数据之前打印出类列表,则会出现这种情况。

       
      print bin.classes_  
      

      尝试此操作时出现以下错误:

       
      AttributeError: 'LabelBinarizer' object has no attribute 'classes_'
      

      但是当您将二进制化器放在vec列表上时:

       
      bin.fit(vec)
      

      再试一次

       
      print bin.classes_
      

      我得到以下内容:

       
      ['cat' 'dog']
      
      
      print bin.transform(vec)
      

      现在,在对vec对象调用transform之后,我们得到以下内容:

       
      [[0]
       [1]
       [1]
       [1]]
      

      对于用作变换器的估算器,让我们使用DecisionTree分类器作为特征提取器的示例。决策树很多原因很多,但出于我们的目的,重要的是它们能够对发现的预测有用的功能进行排名。当您在决策树上调用transform()时,它将获取您的输入数据并找到认为最重要的功能。因此,您可以将其视为将数据矩阵(n行m列)转换为较小的矩阵(n行x列),其中k列是决策树找到的k个最重要的特征。

          
    12
    2015-10-14 02:23:53Z
    1. fit()transform()之间的区别是变形金刚? ,估算器如何用作变形金刚?
      2015-10-13 12:28:19Z
    2. fit()是您调用以适合或“训练”变换器的方法,就像分类器或回归模型一样。对于transform(),这是您调用实际将输入数据转换为输出数据的方法。例如,调用Binarizer.transform([8,2,2])(在拟合之后!)可能会导致[[1,0],[0,1],[0,1]]。至于使用估算器作为变换器,我将在我的答案中编辑一个简短的例子。
      2015-10-13 16:03:05Z
    3. 醇>
来源放置 这里