Source code for evalml.automl.pipeline_search_plots
"""Plots displayed during pipeline search."""
from evalml.utils import import_or_raise, jupyter_check
[docs]class SearchIterationPlot:
"""Search iteration plot.
Args:
results (dict): Dictionary of current results.
objective (ObjectiveBase): Objective that AutoML is optimizing for.
"""
def __init__(self, results, objective):
self._go = import_or_raise(
"plotly.graph_objects",
error_msg="Cannot find dependency plotly.graph_objects",
)
if jupyter_check():
import_or_raise("ipywidgets", warning=True)
self.best_score_by_iter_fig = None
self.curr_iteration_scores = list()
self.best_iteration_scores = list()
title = "Pipeline Search: Iteration vs. {}<br><sub>Gray marker indicates the score at current iteration</sub>".format(
objective.name,
)
data = [
self._go.Scatter(x=[], y=[], mode="lines+markers", name="Best Score"),
self._go.Scatter(
x=[],
y=[],
mode="markers",
name="Iter score",
marker={"color": "gray"},
),
]
layout = {
"title": title,
"xaxis": {"title": "Iteration", "rangemode": "tozero"},
"yaxis": {"title": "Validation Score"},
}
self.best_score_by_iter_fig = self._go.FigureWidget(data, layout)
self.best_score_by_iter_fig.update_layout(showlegend=False)
self.update(results, objective)
self._go = None
[docs] def update(self, results, objective):
"""Update the search plot."""
if len(results["search_order"]) > 0 and len(results["pipeline_results"]) > 0:
iter_idx = results["search_order"]
pipeline_res = results["pipeline_results"]
iter_scores = [pipeline_res[i]["validation_score"] for i in iter_idx]
iter_score_pairs = zip(iter_idx, iter_scores)
iter_score_pairs = sorted(iter_score_pairs, key=lambda value: value[0])
sorted_iter_idx, sorted_iter_scores = zip(*iter_score_pairs)
# Create best score data
best_iteration_scores = list()
curr_best = None
for score in sorted_iter_scores:
if curr_best is None:
best_iteration_scores.append(score)
curr_best = score
else:
if (
objective.greater_is_better
and score > curr_best
or not objective.greater_is_better
and score < curr_best
):
best_iteration_scores.append(score)
curr_best = score
else:
best_iteration_scores.append(curr_best)
# Update entire line plot
best_score_trace = self.best_score_by_iter_fig.data[0]
best_score_trace.x = sorted_iter_idx
best_score_trace.y = best_iteration_scores
curr_score_trace = self.best_score_by_iter_fig.data[1]
curr_score_trace.x = sorted_iter_idx
curr_score_trace.y = sorted_iter_scores
[docs]class PipelineSearchPlots:
"""Plots for the AutoMLSearch class during search.
Args:
results (dict): Dictionary of current results.
objective (ObjectiveBase): Objective that AutoML is optimizing for.
"""
def __init__(self, results, objective):
self._go = import_or_raise(
"plotly.graph_objects",
error_msg="Cannot find dependency plotly.graph_objects",
)
self.results = results
self.objective = objective
[docs] def search_iteration_plot(self, interactive_plot=False):
"""Shows a plot of the best score at each iteration using data gathered during training.
Args:
interactive_plot (bool): Whether or not to show an interactive plot. Defaults to False.
Returns:
plot
Raises:
ValueError: If engine_str is not a valid engine.
"""
if not interactive_plot:
plot_obj = SearchIterationPlot(self.results, self.objective)
return self._go.Figure(plot_obj.best_score_by_iter_fig)
try:
ipython_display = import_or_raise(
"IPython.display",
error_msg="Cannot find dependency IPython.display",
)
plot_obj = SearchIterationPlot(self.results, self.objective)
ipython_display.display(plot_obj.best_score_by_iter_fig)
return plot_obj
except ImportError:
return self.search_iteration_plot(interactive_plot=False)