当前位置: 首页 > 知识库问答 >
问题:

你到底学到了什么。管道管道

燕航
2023-03-14

我搞不懂这本书是怎么学的。管道管道工作正常。

文件中有一些解释。例如,它们是什么意思:

具有最终估计器的变换管道。

为了让我的问题更清楚,什么是<代码>步骤?它们是如何工作的?

编辑

由于有了这些答案,我可以更清楚地回答我的问题:

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

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

当我叫它时会发生什么?

pipln.fit()
OR
pipln.fit_transform()

我不知道估计器是如何成为变压器的,变压器是如何安装的。

共有3个答案

杜阳炎
2023-03-14

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

管道是数据转换的一系列步骤。它来自于旧的“管道和过滤器”设计模式(例如,您可以想到带有管道“|”或重定向操作符的unix bash命令)

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

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

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

也可以调用此方法来链接以下两个对象:

  • “fit_transform”来拟合然后转换数据,但只需一次,这允许在两个方法必须一个接一个直接完成时进行潜在的代码优化

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

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

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

当然,Scikit Learn非常方便且构建良好。但是,它需要刷新。以下是我们使用NeuralAxix的解决方案,以使Scikit在现代计算项目中获得新鲜感和可用性!

  • 无法合理地进行自动机器学习(AutoML)
    • 问题:定义搜索空间(超参数分布)
    • 问题:在构造函数中定义超参数有限制
    • 问题:不同的训练和测试行为
    • 问题:您培训了一个管道,并且希望获得关于其学习的反馈
    • 问题:Scikit学习几乎不允许小批量梯度下降(增量拟合)
    • 问题:使用针对低维数据的步骤处理管道中的3D、4D或ND数据
    • 问题:沿途修改管道,例如用于预培训或微调
    • 问题:从Scikit学习管道获取模型属性
    • 问题:您无法使用无法按Joblib“原样”序列化的步骤并行化或保存管道

    注意:如果管道的一个步骤不需要有一个适应或转换方法,它可以从NonFittableMixin或NonTransformableMixin继承,以提供其中一个方法的默认实现。

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

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

    默认情况下,提供以下方法以允许管理超参数:

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

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

通学真
2023-03-14

我认为M0rkHaV的想法是正确的。Scikit learn的pipeline类是一个有用的工具,用于将多个不同的转换器和估计器封装到一个对象中,这样您只需调用一次重要的方法(fit()predict(),等等)。让我们分解两个主要部分:

>

  • 变形金刚是实现fi()转换()的类。您可能熟悉一些skLearning预处理工具,如TfidfVectorzerBinarzer。如果您查看这些预处理工具的文档,您将看到它们实现了这两种方法。我觉得很酷的是,一些估计器也可以用作转换步骤,例如LinearSVC

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

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

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

    现在,当二值化器安装在某些数据上时,它将具有一个名为classes_u的结构,其中包含转换器“知道”的唯一类。如果不调用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对象上的转换后,我们得到以下结果:

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

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

  • 戚翰飞
    2023-03-14

    scikit学习中的Transformer-某些类具有fit和transform方法,或fit_transform方法。

    Predictor-一些具有拟合和预测方法或fit_predict方法的类。

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

    下面是一个很好的管道使用示例。管道为所有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()或预测()。所以你不能在管道上调用fit_transform或转换,最后一步是预测。

     类似资料:
    • 我刚开始学习angular4,遇到了一个概念上的问题。管道(在本例中与结合使用)用于订阅可观察的,而不用手动订阅。查看web上的示例: 情况1:绑定到包含单个项(如

    • defineProps做了什么? script setup文档 里面的代码会被编译成组件 setup() 函数的内容。这意味着与普通的 <script> 只在组件被首次引入的时候执行一次不同,<script setup> 中的代码会在每次组件实例被创建的时候执行。 defineProps 和 defineEmits 都是只能在 <script setup> 中使用的编译器宏。他们不需要导入,且会随

    • 主要内容:线性表,树存储结构,图存储结构通过上节我们知道, 数据结构是学习数据存储方式的一门学科,那么,数据存储方式有哪几种呢?本节将对数据结构的学习内容做一个简要的总结。 数据结构大致包含以下几种存储结构: 线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构; 下面对各种数据结构做详细讲解。 线性表 线性表结构存储的数据往往是可以依次排列的,就像小朋友手拉手,每位学生的前面和后面都仅有一

    • 问题内容: 连接到MySQL数据库时,请执行以下步骤 实际上,我想知道语句的作用。 虽然此类不在mysql.jar中。它在哪里? 问题答案: 本类位于java.lang包,因此在分布用java,并自动导入到每个班级。 该方法所做的只是返回由类加载器加载的参数对象。然后,该方法返回该类的新实例。 因此,发生什么情况是您称之为 返回com.mysql.jdbc.Driver.class。然后,您调用该

    • 问题内容: 很抱歉,如果这是一个noobie问题,但我找不到很好的答案。 要找到然后删除我可以使用的东西 但是为什么我不能像这样将结果通过管道传递给rm 就像我将其输送到grep 我从某处读到rm不会从stdin接收输入,因此我无法通过管道传输它,但这是什么意思?当我输入rm a.txt时,它会从标准输入中读取,就像我可以grep一样吗?还是stdin和命令行之间有区别。帮帮我! 问题答案: 要扩