复述:
from evalml.automl import AutoMLSearch
from evalml.demos import load_breast_cancer
X, y = load_breast_cancer()
automl = AutoMLSearch(X, y, problem_type="binary", max_batches=1)
automl.search()
pipelines = [automl.get_pipeline(i) for i in range(3)]
assert [p.name for p in pipelines] == ['LightGBM Classifier w/ Imputer', 'LightGBM Classifier w/ Imputer', 'LightGBM Classifier w/ Imputer']
管道不应全部具有相同的名称。 估计量不同:
[p.estimator.name for p in pipelines]
['Baseline Classifier', 'Decision Tree Classifier', 'LightGBM Classifier']
不仅仅是名字; 超参数(我怀疑存储在类中的其他值)也会更新。 这是因为我们正在使用GeneratedPipelineBinary
类并更新其类变量。 由于每个管道都是GeneratedPipelineBinary
,它将为整个类更新它并影响所有实例。
我相信这源于 #1400 。 我认为我们陷入了困境(双关语) - 我们的管道设计依赖于设置类属性来定义管道,这有助于像我们在搜索中所做的那样动态生成管道类。 问题是这些管道不能从 AutoMLSearch 中“导出”。
我可能忽略了一个简单的解决方案,但我认为如果我们想解决这个问题并保持我们的 automl 管道可以进行pickle,这将需要深入的设计讨论。
计划
短期:此问题跟踪从 #1400 恢复更改以解决错误行为。 我们的管道不支持 python pickle
但仍然可以使用现有的save
/ load
功能进行序列化,这些功能使用cloudpickle
。
长期:在恢复之后,#1956 跟踪弄清楚我们应该如何支持使用 python pickle
保存 evalml 管道。
最有用的评论
我相信这源于 #1400 。 我认为我们陷入了困境(双关语) - 我们的管道设计依赖于设置类属性来定义管道,这有助于像我们在搜索中所做的那样动态生成管道类。 问题是这些管道不能从 AutoMLSearch 中“导出”。
我可能忽略了一个简单的解决方案,但我认为如果我们想解决这个问题并保持我们的 automl 管道可以进行pickle,这将需要深入的设计讨论。