Python - 什么是sklearn.pipeline.Pipeline?

far*_*awa 91 python machine-learning scikit-learn

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

文档中有一些解释.例如,他们的意思是:

使用最终估算器进行变换的流水线.

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

编辑

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

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

pipln = Pipeline([("trsfm1",transformer_1),
                  ("trsfm2",transformer_2),
                  ("estmtr",estimator)])
Run Code Online (Sandbox Code Playgroud)

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

pipln.fit()
OR
pipln.fit_transform()
Run Code Online (Sandbox Code Playgroud)

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

Ibr*_*iev 138

scikit-learn中的变换器 - 一些具有拟合和变换方法的类,或fit_transform方法.

预测变量 - 一些适合和预测方法的类,或fit_predict方法.

Pipeline只是一个抽象的概念,它不是现有的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)
Run Code Online (Sandbox Code Playgroud)

只需:

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)
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么这不会有更多的选票?它应该是一篇博文. (4认同)
  • 在第一个示例中,您不想避免再次拟合测试集吗?难道不应该只调用transform而不是fit_transform吗?同样,管道预测是否在内部调用 fit_transform 还是只是转换?可以控制吗? (3认同)
  • “预测 = pipeline.fit(Xtrain).predict(Xtrain)”是什么意思? (2认同)

NBa*_*ley 14

我认为M0rkHaV有正确的想法.Scikit学习的管道类是用于封装多个不同的变压器旁边的估计到一个对象,这样你只需要一次打电话给你的重要的方法(一个有用的工具fit(),predict()等等).让我们分解两个主要组成部分:

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

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

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

bin = LabelBinarizer()  #first we initialize

vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized
Run Code Online (Sandbox Code Playgroud)

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

print bin.classes_  
Run Code Online (Sandbox Code Playgroud)

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

AttributeError: 'LabelBinarizer' object has no attribute 'classes_'
Run Code Online (Sandbox Code Playgroud)

但是当您将二进制文件放在vec列表中时:

bin.fit(vec)
Run Code Online (Sandbox Code Playgroud)

然后再试一次

print bin.classes_
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

['cat' 'dog']


print bin.transform(vec)
Run Code Online (Sandbox Code Playgroud)

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

[[0]
 [1]
 [1]
 [1]]
Run Code Online (Sandbox Code Playgroud)

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

  • `fit()`是你调用以适应或"训练"变换器的方法,就像分类器或回归模型一样.至于`transform()`,这是你调用实际将输入数据转换为输出数据的方法.例如,调用`Binarizer.transform([8,2,2])`(在拟合之后!)可能会导致`[[1,0],[0,1],[0,1]]`.至于使用估算器作为变换器,我将在我的答案中编辑一个简短的例子. (2认同)

Gui*_*ier 11

ML 算法通常处理表格数据。您可能希望在 ML 算法之前和之后对这些数据进行预处理和后处理。管道是链接这些数据处理步骤的一种方式。

什么是机器学习管道,它们是如何工作的?

管道是转换数据的一系列步骤。它来自旧的“管道和过滤器”设计模式(例如,您可以想到带有管道“|”或重定向运算符“>”的 unix bash 命令)。但是,管道是代码中的对象。因此,您可以为每个过滤器(也称为每个管道步骤)创建一个类,然后是另一个类以将这些步骤组合到最终管道中。一些管道可能会串联或并联其他管道,具有多个输入或输出,等等。我们喜欢将流水线机器学习视为:

  • 管道和过滤器。管道的步骤处理数据,并管理可以从数据中学习的内部状态。
  • 复合材料。管道可以嵌套:例如,可以将整个管道视为另一个管道中的单个管道步骤。管道步骤不一定是管道,但管道本身至少是定义的管道步骤。
  • 有向无环图 (DAG)。一个流水线步骤的输出可能会被发送到许多其他步骤,然后结果输出可以重新组合,依此类推。旁注:尽管管道是非循环的,但它们可以一个一个地处理多个项目,并且如果它们的状态发生变化(例如:每次使用 fit_transform 方法),那么它们可以被视为随着时间循环展开,保持它们的状态(想想像RNN)。这是一种有趣的方式,可以在将在线学习投入生产并在更多数据上对其进行培训时查看进行在线学习的管道。

Scikit-Learn 管道的方法

管道(或管道中的步骤)必须具有这两种方法

  • fit ” 学习数据并获取状态(例如:神经网络的神经权重就是这样的状态)
  • 转换”(或“预测”)以实际处理数据并生成预测。

也可以调用此方法来链接两者:

  • fit_transform ”来拟合然后转换数据,但在一次传递中,当必须直接一个接一个地完成这两种方法时,这允许潜在的代码优化。

sklearn.pipeline.Pipeline 类的问题

Scikit-Learn 的“管道和过滤器”设计模式非常漂亮。但是如何将其用于深度学习、AutoML 和复杂的生产级管道?

Scikit-Learn 于 2007 年首次发布,这是一个前深度学习时代。然而,它是最著名和采用的机器学习库之一,并且仍在增长。最重要的是,它使用管道和过滤器设计模式作为一种软件架构风格——这就是让 Scikit-Learn 如此出色的原因,此外它还提供了可供使用的算法。但是,在执行以下操作时存在大量问题,而我们在 2020 年就应该能够做到:

  • 自动机器学习(AutoML),
  • 深度学习管道,
  • 更复杂的机器学习管道。

我们为那些 Scikit-Learn 问题找到的解决方案

可以肯定的是,Scikit-Learn 非常方便且构建良好。但是,它需要刷新。这是我们与Neuraxle合作的解决方案,使 Scikit-Learn 新鲜且可用于现代计算项目!

通过Neuraxle提供的其他管道方法和功能

注意:如果管道的一个步骤不需要 fit 或 transform 方法之一,它可以从NonFittableMixinNonTransformableMixin继承,以提供这些方法之一的默认实现以不执行任何操作。

首先,管道或其步骤也可以选择定义这些方法

  • setup ”将在其每一步调用“setup”方法。例如,如果一个步骤包含一个 TensorFlow、PyTorch 或 Keras 神经网络,则这些步骤可以创建它们的神经图并在拟合之前在“设置”方法中将它们注册到 GPU。出于多种原因,不鼓励直接在步骤的构造函数中创建图形,例如,如果在自动机器学习算法中使用不同的超参数多次运行之前复制了步骤,该算法会为您搜索最佳超参数。
  • teardown ”,与“setup”方法相反:它清除资源。

默认提供以下方法,使管理的超参数:

  • get_hyperparams ” 将返回一个超参数字典。如果您的管道包含更多管道(嵌套管道),则超参数的键用双下划线“__”分隔符链接。
  • set_hyperparams ”将允许您以与获取时相同的格式设置新的超参数。
  • get_hyperparams_space ”允许您获取超参数的空间,如果您定义了一个,该空间将不为空。因此,这里与“get_hyperparams”的唯一区别是您将获得作为值的统计分布而不是精确值。例如,层数的一个超参数可以是 a RandInt(1, 3),这意味着 1 到 3 层。您可以调用.rvs()此 dict 随机选择一个值并将其发送到“set_hyperparams”以尝试对其进行训练。
  • set_hyperparams_space ”可用于使用与“ get_hyperparams_space ”中相同的超参数分布类来设置新空间。

有关我们建议的解决方案的更多信息,请阅读带有上面链接的大列表中的条目。