在scikit学习管道中插入或删除步骤



是否可以在sklearn.pipeline.Pipeline对象中删除或插入步骤?

我正在尝试在Pipeline对象中使用或不使用一个步骤进行网格搜索。想知道我是否可以在管道中插入或删除一个步骤。我在Pipeline源代码中看到,有一个self.steps对象包含所有步骤。我们可以通过named_steps()得到步骤。在修改它之前,我想确保我不会造成意想不到的影响。

下面是一个示例代码:

from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
estimators = [('reduce_dim', PCA()), ('svm', SVC())]
clf = Pipeline(estimators)
clf 

我们有可能做一些类似steps = clf.named_steps()的事情,然后在这个列表中插入或删除吗?这是否会对clf对象造成不希望的影响?

我看到每个人都只提到了删除步骤。如果您还想在管道中插入一个步骤:

pipe.steps.append(['step name',transformer()])

pipe.steps的工作方式与列表相同,因此您也可以将项目插入特定位置:

pipe.steps.insert(1,['estimator',transformer()]) #insert as second step

基于基本测试,您可以像删除任何列表项一样,通过简单的安全地从scikit学习管道中删除一个步骤

clf_pipeline.steps.pop(n)

其中n是您试图移除的单个估计器的位置。

只是插话,因为我觉得其他答案很好地回答了向管道添加步骤的问题,但没有真正涵盖如何从管道中删除步骤

不过要注意我的做法。在这种情况下分割列表有点奇怪。

from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.preprocessing import PolynomialFeatures
estimators = [('reduce_dim', PCA()), ('poly', PolynomialFeatures()), ('svm', SVC())]
clf = Pipeline(estimators)

如果你想创建一个只包含PCA/多项式步骤的管道,你可以逐个索引对列表进行切片,并将其传递给管道

clf1 = Pipeline(clf.steps[0:2])

只想使用步骤2/3吗?注意这些切片并不总是最有意义的

clf2 = Pipeline(clf.steps[1:3])

只想使用步骤1/3吗?我似乎无法使用这种方法

clf3 = Pipeline(clf.steps[0] + clf.steps[2]) # errors

是的,这是可能的,但您必须满足Pipeline在初始化时所要求的相同要求,即除了最后一步之外,您不能在任何步骤中插入预测器,您应该在更新Pipeline.steps之后调用fit,因为在这样的更新之后,所有步骤(可能是在以前的fit调用中学习到的)都将无效,管道的最后一步应该始终实现fit方法,之前的所有步骤都应该实现fit_transform

所以,是的,它将在当前的代码库中工作,但我认为这对你的任务来说不是一个好的解决方案,它使你的代码更加依赖于Pipeline的当前实现,我认为用修改的步骤创建新的Pipeline更方便,因为Pipeline至少会在初始化中验证你的所有步骤,创建新的管道在速度上与修改现有管道的步骤没有显著差异,但正如我刚才所说的,在每次修改步骤后创建新管道更安全,以防有人会显著改变管道的实施。

相关内容

  • 没有找到相关文章

最新更新