再現:
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パイプラインをピクルスにできるようにするには、設計に関する深い議論が必要になると思います。
プラン
短期的:この問題は、バグのある動作を解決するために#1400からの変更を元に戻すことを追跡します。 私たちのパイプラインはPython pickle
サポートしませんが、 cloudpickle
を使用する既存のsave
/ load
機能を使用してシリアル化できます。
長期:復帰後、#1956は、 Python pickle
を使用してevalmlパイプラインの保存をサポートする方法を見つけ出します。
最も参考になるコメント
これは#1400に由来すると思います。 私たちはピクルスになっていると思います(しゃれを意図しています)-私たちのパイプライン設計は、パイプラインを定義するためにクラス属性を設定することに依存しています。これは、検索で行うように動的に生成されたパイプラインクラスを持つのに役立ちます。 問題は、これらのパイプラインをAutoMLSearchから「エクスポート」できないことです。
私が見落としている簡単な解決策があるかもしれませんが、これを修正してautomlパイプラインをピクルスにできるようにするには、設計に関する深い議論が必要になると思います。