在 scikit-learn 流水线中插入或删除一个步骤

Insert or delete a step in scikit-learn Pipeline

是否可以在 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 对象造成不良影响吗?

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

所以是的,它可以在当前的代码库中工作,但我认为这不是解决您的任务的好方法,它使您的代码更加依赖于当前的 Pipeline 实现,我认为创建修改后的新 Pipeline 更方便步骤,因为 Pipeline 至少会验证您在初始化中的所有步骤,而且创建新 Pipeline 与修改现有 Pipeline 的步骤在速度上不会有显着差异,但正如我刚才所说 - 在每次修改步骤后创建新 Pipeline在有人将显着更改管道的实现的情况下更安全。

根据基本测试,您可以安全地从 scikit-learn 管道中删除一个步骤,就像您删除任何列表项一样,只需一个简单的

clf_pipeline.steps.pop(n)

其中 n 是您要删除的单个估算器的位置。

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

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

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

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

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

注意我的方法。在这种情况下切片列表有点奇怪。

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/Polynomial 你可以只按索引对列表进行切片并将其传递给管道

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