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或转换管道,最后一步是预测器.
NBa*_*ley 14
我认为M0rkHaV有正确的想法.Scikit学习的管道类是用于封装多个不同的变压器旁边的估计到一个对象,这样你只需要一次打电话给你的重要的方法(一个有用的工具fit()
,predict()
等等).让我们分解两个主要组成部分:
变形金刚是实现两个类fit()
和transform()
.您可能熟悉某些sklearn预处理工具,例如TfidfVectorizer
和Binarizer
.如果您查看这些预处理工具的文档,您将看到它们实现了这两种方法.我发现很酷的是,一些估算器也可以用作转换步骤,例如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
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个最重要的特征.
Gui*_*ier 11
ML 算法通常处理表格数据。您可能希望在 ML 算法之前和之后对这些数据进行预处理和后处理。管道是链接这些数据处理步骤的一种方式。
管道是转换数据的一系列步骤。它来自旧的“管道和过滤器”设计模式(例如,您可以想到带有管道“|”或重定向运算符“>”的 unix bash 命令)。但是,管道是代码中的对象。因此,您可以为每个过滤器(也称为每个管道步骤)创建一个类,然后是另一个类以将这些步骤组合到最终管道中。一些管道可能会串联或并联其他管道,具有多个输入或输出,等等。我们喜欢将流水线机器学习视为:
管道(或管道中的步骤)必须具有这两种方法:
也可以调用此方法来链接两者:
Scikit-Learn 的“管道和过滤器”设计模式非常漂亮。但是如何将其用于深度学习、AutoML 和复杂的生产级管道?
Scikit-Learn 于 2007 年首次发布,这是一个前深度学习时代。然而,它是最著名和采用的机器学习库之一,并且仍在增长。最重要的是,它使用管道和过滤器设计模式作为一种软件架构风格——这就是让 Scikit-Learn 如此出色的原因,此外它还提供了可供使用的算法。但是,在执行以下操作时存在大量问题,而我们在 2020 年就应该能够做到:
可以肯定的是,Scikit-Learn 非常方便且构建良好。但是,它需要刷新。这是我们与Neuraxle合作的解决方案,使 Scikit-Learn 新鲜且可用于现代计算项目!
注意:如果管道的一个步骤不需要 fit 或 transform 方法之一,它可以从NonFittableMixin或NonTransformableMixin继承,以提供这些方法之一的默认实现以不执行任何操作。
首先,管道或其步骤也可以选择定义这些方法:
将默认提供以下方法,使管理的超参数:
RandInt(1, 3)
,这意味着 1 到 3 层。您可以调用.rvs()
此 dict 随机选择一个值并将其发送到“set_hyperparams”以尝试对其进行训练。有关我们建议的解决方案的更多信息,请阅读带有上面链接的大列表中的条目。
归档时间: |
|
查看次数: |
63205 次 |
最近记录: |