Source code for optuna.visualization.matplotlib._intermediate_values

from optuna._experimental import experimental
from optuna.logging import get_logger
from import Study
from optuna.trial import TrialState
from optuna.visualization.matplotlib._matplotlib_imports import _imports

if _imports.is_successful():
    from optuna.visualization.matplotlib._matplotlib_imports import Axes
    from optuna.visualization.matplotlib._matplotlib_imports import plt

_logger = get_logger(__name__)

[docs]@experimental("2.2.0") def plot_intermediate_values(study: Study) -> "Axes": """Plot intermediate values of all trials in a study with Matplotlib. .. note:: Please refer to `matplotlib.pyplot.legend <>`_ to adjust the style of the generated legend. Example: The following code snippet shows how to plot intermediate values. .. plot:: import optuna def f(x): return (x - 2) ** 2 def df(x): return 2 * x - 4 def objective(trial): lr = trial.suggest_float("lr", 1e-5, 1e-1, log=True) x = 3 for step in range(128): y = f(x), step=step) if trial.should_prune(): raise optuna.TrialPruned() gy = df(x) x -= gy * lr return y sampler = optuna.samplers.TPESampler(seed=10) study = optuna.create_study(sampler=sampler) study.optimize(objective, n_trials=16) optuna.visualization.matplotlib.plot_intermediate_values(study) .. seealso:: Please refer to :func:`optuna.visualization.plot_intermediate_values` for an example. Args: study: A :class:`` object whose trials are plotted for their intermediate values. Returns: A :class:`matplotlib.axes.Axes` object. """ _imports.check() return _get_intermediate_plot(study)
def _get_intermediate_plot(study: Study) -> "Axes": # Set up the graph style."ggplot") # Use ggplot style sheet for similar outputs to plotly. _, ax = plt.subplots(tight_layout=True) ax.set_title("Intermediate Values Plot") ax.set_xlabel("Step") ax.set_ylabel("Intermediate Value") cmap = plt.get_cmap("tab20") # Use tab20 colormap for multiple line plots. # Prepare data for plotting. target_state = [TrialState.PRUNED, TrialState.COMPLETE, TrialState.RUNNING] trials = [trial for trial in study.trials if trial.state in target_state] if len(trials) == 0: _logger.warning("Study instance does not contain trials.") return ax # Draw multiple line plots. traces = [] for i, trial in enumerate(trials): if trial.intermediate_values: sorted_intermediate_values = sorted(trial.intermediate_values.items()) trace = ax.plot( tuple((x for x, _ in sorted_intermediate_values)), tuple((y for _, y in sorted_intermediate_values)), color=cmap(i), alpha=0.7, label="Trial{}".format(trial.number), ) traces.append(trace) if not traces: _logger.warning( "You need to set up the pruning feature to utilize `plot_intermediate_values()`" ) return ax if len(trials) >= 2: ax.legend(bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0.0) return ax