optuna.samplers.NSGAIISampler

class optuna.samplers.NSGAIISampler(*, population_size=50, mutation_prob=None, crossover=None, crossover_prob=0.9, swapping_prob=0.5, seed=None, constraints_func=None, elite_population_selection_strategy=None, child_generation_strategy=None, after_trial_strategy=None)[source]

使用 NSGA-II 算法的多目标采样器。

NSGA-II 是“非支配排序遗传算法 II”的缩写,它是一种众所周知的、快速且精英主义的多目标遗传算法。

有关 NSGA-II 的更多信息,请参阅以下论文

注意

TPESampler 在 v4.0.0 中变得更快,并支持 NSGAIISampler 不支持的许多功能,例如处理动态搜索空间和分类距离。要使用 TPESampler,您需要明确指定采样器,如下所示

import optuna


def objective(trial):
    x = trial.suggest_float("x", -100, 100)
    y = trial.suggest_categorical("y", [-1, 0, 1])
    f1 = x**2 + y
    f2 = -((x - 2) ** 2 + y)
    return f1, f2


# We minimize the first objective and maximize the second objective.
sampler = optuna.samplers.TPESampler()
study = optuna.create_study(directions=["minimize", "maximize"], sampler=sampler)
study.optimize(objective, n_trials=100)

另请参阅我们的文章,了解 v4.0.0 中速度提升的更多详细信息。

参数:
  • population_size (int) – 一代中的个体(试验)数量。population_size 必须大于或等于 crossover.n_parents。对于 UNDXCrossoverSPXCrossovern_parents=3;对于其他算法,n_parents=2

  • mutation_prob (float | None) – 创建新个体时,每个参数发生突变的概率。如果指定为 None,则使用值 1.0 / len(parent_trial.params),其中 parent_trial 是目标个体的父试验。

  • crossover (BaseCrossover | None) –

    创建子个体时应用的交叉操作。可用的交叉操作列表在此处:https://docs.optuna.cn/en/stable/reference/samplers/nsgaii.html

    UniformCrossover 始终应用于从 CategoricalDistribution 采样的参数;对于从其他分布采样的参数,除非指定此参数,否则默认应用此交叉操作。

    有关每种交叉方法的更多信息,请参阅具体的交叉文档。

  • crossover_prob (float) – 创建新个体时,发生交叉(父代参数交换)的概率。

  • swapping_prob (float) – 在交叉过程中,父代的每个参数发生交换的概率。

  • seed (int | None) – 随机数生成器的种子。

  • constraints_func (Callable[[FrozenTrial], Sequence[float]] | None) –

    一个可选函数,用于计算目标约束。它必须接受一个 FrozenTrial 并返回约束。返回值必须是一个由 float 组成的序列。严格大于 0 的值表示约束被违反。等于或小于 0 的值被认为是可行的。如果 constraints_func 为一个试验返回多个值,则当且仅当所有值都等于或小于 0 时,该试验才被认为是可行的。

    constraints_func 将在每个成功的试验后进行评估。当试验失败或被剪枝时,不会调用该函数,但此行为可能会在未来的版本中更改。

    约束通过约束支配来处理。如果满足以下任一条件,则称试验 x 在约束上支配试验 y

    1. 试验 x 可行而试验 y 不可行。

    2. 试验 x 和 y 都不可行,但试验 x 的总体违反程度较小。

    3. 试验 x 和 y 都可行,且试验 x 支配试验 y。

    注意

    在 v2.5.0 中作为实验性功能添加。接口可能会在更新版本中更改,恕不另行通知。请参阅 https://github.com/optuna/optuna/releases/tag/v2.5.0

  • elite_population_selection_strategy (Callable[[Study, list[FrozenTrial]], list[FrozenTrial]] | None) –

    用于确定从当前种群中幸存个体的选择策略。默认为 None

    注意

    参数 elite_population_selection_strategy 在 v3.3.0 中作为实验性功能添加。接口可能会在更新版本中更改,恕不另行通知。请参阅 https://github.com/optuna/optuna/releases/tag/v3.3.0

  • child_generation_strategy (Callable[[Study, dict[str, BaseDistribution], list[FrozenTrial]], dict[str, Any]] | None) –

    从父试验生成子参数的策略。默认为 None

    注意

    参数 child_generation_strategy 在 v3.3.0 中作为实验性功能添加。接口可能会在更新版本中更改,恕不另行通知。请参阅 https://github.com/optuna/optuna/releases/tag/v3.3.0

  • after_trial_strategy (Callable[[Study, FrozenTrial, TrialState, Sequence[float] | None], None] | None) –

    在每个试验后执行的一系列过程。默认为 None

    注意

    参数 after_trial_strategy 在 v3.3.0 中作为实验性功能添加。接口可能会在更新版本中更改,恕不另行通知。请参阅 https://github.com/optuna/optuna/releases/tag/v3.3.0

方法

after_trial(study, trial, state, values)

试验后处理。

before_trial(study, trial)

试验预处理。

get_parent_population(study, generation)

获取给定代的父代种群。

get_population(study, generation)

获取给定代的种群。

get_trial_generation(study, trial)

获取给定试验的代数。

infer_relative_search_space(study, trial)

推断目标试验中相对采样将使用的搜索空间。

reseed_rng()

重新设定采样器的随机数生成器种子。

sample_independent(study, trial, param_name, ...)

为给定的分布采样一个参数。

sample_relative(study, trial, search_space)

在给定的搜索空间中采样参数。

select_parent(study, generation)

从给定代的种群中选择父试验。

属性

population_size

after_trial(study, trial, state, values)[source]

试验后处理。

在目标函数返回之后、试验完成并存储其状态之前调用此方法。

注意

在 v2.4.0 中作为实验性功能添加。接口可能会在更新版本中更改,恕不另行通知。请参阅 https://github.com/optuna/optuna/releases/tag/v2.4.0

参数:
  • study (Study) – 目标研究对象。

  • trial (FrozenTrial) – 目标试验对象。修改此对象前请先复制一份。

  • state (TrialState) – 试验结果状态。

  • values (Sequence[float] | None) – 试验结果值。如果试验成功,保证不是 None

返回类型:

None

before_trial(study, trial)[source]

试验预处理。

在目标函数调用之前以及试验实例化之后立即调用此方法。更确切地说,此方法在试验初始化期间、 justo before 调用 infer_relative_search_space() 之前被调用。换句话说,它负责在推断搜索空间之前应进行的预处理。

注意

在 v3.3.0 中作为实验性功能添加。接口可能会在更新版本中更改,恕不另行通知。请参阅 https://github.com/optuna/optuna/releases/tag/v3.3.0

参数:
  • study (Study) – 目标研究对象。

  • trial (FrozenTrial) – 目标试验对象。

返回类型:

None

get_parent_population(study, generation)

获取给定代的父代种群。

此方法将父代种群缓存到研究的系统属性中。

参数:
  • study (Study) – 目标研究对象。

  • generation (int) – 目标代数。

返回:

父代冻结试验列表。如果 generation == 0,返回空列表。

返回类型:

list[FrozenTrial]

get_population(study, generation)

获取给定代的种群。

参数:
  • study (Study) – 目标研究对象。

  • generation (int) – 目标代数。

返回:

给定代中的冻结试验列表。

返回类型:

list[FrozenTrial]

get_trial_generation(study, trial)

获取给定试验的代数。

此方法返回指定试验的代数。如果试验的系统属性中未设置代数,它将计算并设置代数。

当前代数取决于所有已完成试验的最大代数。

参数:
  • study (Study) – 试验所属的研究对象。

  • trial (FrozenTrial) – 获取代数的试验对象。

返回:

给定试验的代数。

返回类型:

int

infer_relative_search_space(study, trial)[source]

推断目标试验中相对采样将使用的搜索空间。

此方法在调用 sample_relative() 方法之前被调用,并且此方法返回的搜索空间会传递给它。不包含在搜索空间中的参数将使用 sample_independent() 方法进行采样。

参数:
  • study (Study) – 目标研究对象。

  • trial (FrozenTrial) – 目标试验对象。修改此对象前请先复制一份。

返回:

一个包含参数名称和参数分布的字典。

返回类型:

dict[str, BaseDistribution]

另请参阅

请参阅 intersection_search_space() 作为 infer_relative_search_space() 的实现示例。

reseed_rng()[source]

重新设定采样器的随机数生成器种子。

当试验以 n_jobs>1 选项并行执行时,Study 实例会调用此方法。在这种情况下,采样器实例(包括随机数生成器的状态)将被复制,它们可能会建议相同的值。为了防止这个问题,此方法为每个随机数生成器分配一个不同的种子。

返回类型:

None

sample_independent(study, trial, param_name, param_distribution)[source]

为给定的分布采样一个参数。

此方法仅用于采样不在 sample_relative() 方法返回的搜索空间中的参数。此方法适用于不使用参数之间关系的采样算法,例如随机采样和 TPE。

注意

任何内置采样器在采样新参数时都会忽略失败的试验。因此,从采样器的角度来看,失败的试验被视为已删除。

参数:
  • study (Study) – 目标研究对象。

  • trial (FrozenTrial) – 目标试验对象。修改此对象前请先复制一份。

  • param_name (str) – 采样的参数名称。

  • param_distribution (BaseDistribution) – 指定采样算法先验和/或尺度的分布对象。

返回:

参数值。

返回类型:

Any

sample_relative(study, trial, search_space)[source]

在给定的搜索空间中采样参数。

此方法在每个试验开始时调用一次,即在评估目标函数之前。此方法适用于使用参数之间关系的采样算法,例如高斯过程和 CMA-ES。

注意

任何内置采样器在采样新参数时都会忽略失败的试验。因此,从采样器的角度来看,失败的试验被视为已删除。

参数:
返回:

一个包含参数名称和值的字典。

返回类型:

dict[str, Any]

select_parent(study, generation)[source]

从给定代的种群中选择父试验。

此方法每代调用一次,用于从当前代的种群中选择父代。

此函数的输出会缓存到研究的系统属性中。

必须在子类中实现此方法以定义具体的选择策略。

参数:
  • study (Study) – 目标研究对象。

  • generation (int) – 目标代数。

返回:

父代冻结试验列表。

返回类型:

list[FrozenTrial]