Repro:
from evalml.demos import load_breast_cancer
from evalml.pipelines import BinaryClassificationPipeline
from evalml.automl import AutoMLSearch
class PipeLine(BinaryClassificationPipeline):
component_graph = ["Drop Columns Transformer", "Random Forest Classifier"]
X , y = load_breast_cancer()
automl = AutoMLSearch(X, y, problem_type="binary", allowed_pipelines=[PipeLine],
pipeline_parameters={"Drop Columns Transformer": {"columns": ["mean texture"]}})
automl.search()
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~/sources/evalml/evalml/pipelines/component_graph.py in instantiate(self, parameters)
77 try:
---> 78 new_component = component_class(**component_parameters, random_seed=self.random_seed)
79 except (ValueError, TypeError) as e:
~/sources/evalml/evalml/pipelines/components/transformers/column_selectors.py in __init__(self, columns, random_seed, **kwargs)
15 if columns and not isinstance(columns, list):
---> 16 raise ValueError(f"Parameter columns must be a list. Received {type(columns)}.")
17
ValueError: Parameter columns must be a list. Received <class 'str'>.
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last)
<ipython-input-21-b4819258a317> in <module>
10 automl = AutoMLSearch(X, y, problem_type="binary", allowed_pipelines=[PipeLine],
11 pipeline_parameters={"Drop Columns Transformer": {"columns": ["mean texture"]}})
---> 12 automl.search()
~/sources/evalml/evalml/automl/automl_search.py in search(self, show_iteration_plot)
490 logger.info("Allowed model families: %s\n" % ", ".join([model.value for model in self.allowed_model_families]))
491 self.search_iteration_plot = None
--> 492 if self.plot:
493 self.search_iteration_plot = self.plot.search_iteration_plot(interactive_plot=show_iteration_plot)
494
~/sources/evalml/evalml/automl/automl_algorithm/iterative_algorithm.py in next_batch(self)
63 next_batch = []
64 if self._batch_number == 0:
---> 65 next_batch = [pipeline_class(parameters=self._transform_parameters(pipeline_class, {}), random_seed=self.random_seed)
66 for pipeline_class in self.allowed_pipelines]
67
~/sources/evalml/evalml/automl/automl_algorithm/iterative_algorithm.py in <listcomp>(.0)
63 next_batch = []
64 if self._batch_number == 0:
---> 65 next_batch = [pipeline_class(parameters=self._transform_parameters(pipeline_class, {}), random_seed=self.random_seed)
66 for pipeline_class in self.allowed_pipelines]
67
~/sources/evalml/evalml/pipelines/classification_pipeline.py in __init__(self, parameters, random_seed)
23 """
24 self._encoder = LabelEncoder()
---> 25 super().__init__(parameters, random_seed=random_seed)
26
27 def fit(self, X, y):
~/sources/evalml/evalml/pipelines/pipeline_base.py in __init__(self, parameters, random_seed)
77 else:
78 self._component_graph = ComponentGraph(component_dict=self.component_graph, random_seed=self.random_seed)
---> 79 self._component_graph.instantiate(parameters)
80
81 self.input_feature_names = {}
~/sources/evalml/evalml/pipelines/component_graph.py in instantiate(self, parameters)
80 self._is_instantiated = False
81 err = "Error received when instantiating component {} with the following arguments {}".format(component_name, component_parameters)
---> 82 raise ValueError(err) from e
83
84 component_instances[component_name] = new_component
ValueError: Error received when instantiating component Drop Columns Transformer with the following arguments {'columns': 'mean texture'}
IterativeAlgorithm
wählt das erste Element der columns
Liste aus, das nicht das beabsichtigte Verhalten ist.
Dieses Problem tritt auf, wenn IterativeAlgorithm
_transform_parameters
aufruft und versucht, die Parameter zu entpacken. Dieser Code wurde der Adresse hinzugefügt, wenn der Benutzer pipeline_parameters
eingibt, um die Hyperparameter einzufrieren oder auf eine bestimmte Teilmenge zu setzen. Zum Beispiel:
params = {'Imputer': {'numeric_impute_strategy': ['median', 'most_frequent']},
'Decision Tree Regressor': {'max_depth': [17, 18, 19], 'max_features': Categorical(['auto'])},
'Elastic Net Regressor': {"alpha": Real(0, 0.5), "l1_ratio": (0.01, 0.02, 0.03)}}
automl = AutoMLSearch(X_train=X, y_train=y, problem_type='regression', pipeline_parameters=params, n_jobs=1)
automl.search()
Im ersten Batch in _transform_parameters
, um Listeneingaben wie max_depth
oder numeric_impute_strategy
oben zu verarbeiten, wählen wir einfach das erste Element in der Liste aus oder proben es.
Eine Möglichkeit, dieses Problem zu umgehen, besteht darin, diese Zeile zu entfernen und zu erzwingen, dass Listen nicht zulässig sind.
@dsherry @freddyaboulton @bchen1116 @chukarsten FYI :)
@dsherry @chukarsten
In #1862 ist geplant, Drop Columns Transformer
in _get_preprocessing_components
hinzuzufügen, wenn eine Indexspalte vorhanden ist, und diese Spalten dann auch zu self. pipeline_parameters
hinzuzufügen, damit dieses Problem auch dies blockiert.
Hilfreichster Kommentar
@dsherry @chukarsten
In #1862 ist geplant,
Drop Columns Transformer
in_get_preprocessing_components
hinzuzufügen, wenn eine Indexspalte vorhanden ist, und diese Spalten dann auch zuself. pipeline_parameters
hinzuzufügen, damit dieses Problem auch dies blockiert.