在 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
是否可以在 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