我搞不懂这本书是怎么学的。管道管道工作正常。
文件中有一些解释。例如,它们是什么意思:
具有最终估计器的变换管道。
为了让我的问题更清楚,什么是<代码>步骤?它们是如何工作的?
编辑
由于有了这些答案,我可以更清楚地回答我的问题:
当我调用管道并作为步骤传递两个变压器和一个估计器时,例如:
pipln = Pipeline([("trsfm1",transformer_1),
("trsfm2",transformer_2),
("estmtr",estimator)])
当我叫它时会发生什么?
pipln.fit()
OR
pipln.fit_transform()
我不知道估计器是如何成为变压器的,变压器是如何安装的。
ML算法通常处理表格数据。您可能希望在ML算法前后对这些数据进行预处理和后处理。管道是链接这些数据处理步骤的一种方式。
管道是数据转换的一系列步骤。它来自于旧的“管道和过滤器”设计模式(例如,您可以想到带有管道“|”或重定向操作符的unix bash命令)
管道(或管道中的步骤)必须具有以下两种方法:
也可以调用此方法来链接以下两个对象:
Scikit Learn的“管道和过滤器”设计模式非常漂亮。但如何将其用于深度学习、AutoML和复杂的生产级管道?
Scikit学习在2007年首次发布,那是一个前深度学习时代。然而,它是最著名和被采用的机器学习库之一,并且仍在增长。最重要的是,它使用管道和过滤器设计模式作为软件架构风格——这就是Scikit学习如此出色的原因,此外,它还提供了可供使用的算法。然而,当涉及到做以下事情时,它有巨大的问题,我们应该在2020年已经能够做到:
当然,Scikit Learn非常方便且构建良好。但是,它需要刷新。以下是我们使用NeuralAxix的解决方案,以使Scikit在现代计算项目中获得新鲜感和可用性!
注意:如果管道的一个步骤不需要有一个适应或转换方法,它可以从NonFittableMixin或NonTransformableMixin继承,以提供其中一个方法的默认实现。
首先,管道或其步骤也可以选择性地定义这些方法:
默认情况下,提供以下方法以允许管理超参数:
RandInt(1,3)
,这意味着1到3层。您可以调用。rvs()
在此命令上随机选取一个值,并将其发送到“set_hyperparams”尝试对其进行训练
有关我们建议的解决方案的更多信息,请阅读上面带有链接的大列表中的条目。
我认为M0rkHaV的想法是正确的。Scikit learn的pipeline类是一个有用的工具,用于将多个不同的转换器和估计器封装到一个对象中,这样您只需调用一次重要的方法(fit()
,predict()
,等等)。让我们分解两个主要部分:
>
变形金刚是实现fi()
和转换()
的类。您可能熟悉一些skLearning预处理工具,如TfidfVectorzer
和Binarzer
。如果您查看这些预处理工具的文档,您将看到它们实现了这两种方法。我觉得很酷的是,一些估计器也可以用作转换步骤,例如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个最重要的特征。
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和命令行之间有区别。帮帮我! 问题答案: 要扩