在scikit-learn Pipeline中插入或删除一个步骤

Bin*_*Bin 15 python artificial-intelligence machine-learning scikit-learn

是否可以删除或插入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 
Run Code Online (Sandbox Code Playgroud)

是否有可能steps = clf.named_steps()在此列表中执行类似的操作,然后插入或删除?这是否会对clf对象造成不良影响?

Hon*_*zaB 14

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

pipe.steps.append(['step name',transformer()])
Run Code Online (Sandbox Code Playgroud)

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

pipe.steps.insert(1,['estimator',transformer()]) #insert as second step
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的有用回答!我认为“append”或“insert”应该使用“tuple”而不是“list”来完成,因为管道中的每个步骤都是一个“tuple”。如: `pipe.steps.append(('步骤名称',transformer()))` 和 `pipe.steps.insert(1,('estimator',transformer()))` (2认同)

lab*_*ker 7

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

clf_pipeline.steps.pop(n)
Run Code Online (Sandbox Code Playgroud)

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

  • 我有大约 500 个具有相同矢量化步骤的预训练管道。我使用这些管道之一的矢量化步骤转换传入数据,然后在对预矢量化数据运行每个管道的 Predict_proba 方法之前从所有管道中删除此步骤。结果的分数与我在未进行预矢量化的原始数据上运行每个未修改的管道相同,并且由于我没有一遍又一遍地执行相同的矢量化步骤,因此总体运行时间得到了改善。请注意,这仅适用于无状态转换器,例如哈希向量化器。 (2认同)

plu*_*uet 6

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

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

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)
Run Code Online (Sandbox Code Playgroud)

如果你想用 PCA/Polynomial 的步骤创建一个管道,你可以按索引一步一步地将列表切片并将其传递给 Pipeline

clf1 = Pipeline(clf.steps[0:2])
Run Code Online (Sandbox Code Playgroud)

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

clf2 = Pipeline(clf.steps[1:3])
Run Code Online (Sandbox Code Playgroud)

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

clf3 = Pipeline(clf.steps[0] + clf.steps[2]) # errors
Run Code Online (Sandbox Code Playgroud)

  • `clf3 = 管道([clf.steps[0], clf.steps[2]])` (3认同)