Trial¶
- 
class optuna.trial.Trial(study, trial_id)[源代码]¶
- 一个 Trial 是一个评估目标函数的过程。 - 该对象被传递给目标函数,并提供接口以获取 parameter suggestion, 管理 trial 状态以及设置/获取 trial 的用户定义属性。 - 请注意,我们不建议直接使用此构造函数。 该对象被无缝实例化,并传递给 - optuna.study.Study.optimize()方法后面的目标函数; 因此,库用户并不关心该对象的实例化。- 参数
- study -- A - Studyobject.
- trial_id -- A trial ID that is automatically generated. 
 
 - 
property distributions¶
- 返回待优化参数的分布。 - 返回
- 一个包含所有分布的字典。 
 
 - 
property number¶
- 返回 trial 的连续且唯一的编号。 - 返回
- A trial number. 
 
 - 
property params¶
- Return parameters to be optimized. - 返回
- 一个包含所有参数的字典. 
 
 - 
report(value, step)[源代码]¶
- 报告给定的步骤下目标函数值。 - Pruner 使用报告的值来确定是否应对该 trial 剪枝。 - 参见 - 参见 - BasePruner.- 注解 - 报告值在内部被 - float()函数转换成- float类型。因此,它接受所有类似float的类型(例如- numpy.float32'' )。 如果转换失败,则会引发 ``TypeError.- 示例 - 报告 SGDClassifier <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html> 在训练中的中间值。 - import numpy as np from sklearn.datasets import load_iris from sklearn.linear_model import SGDClassifier from sklearn.model_selection import train_test_split import optuna X, y = load_iris(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y) def objective(trial): clf = SGDClassifier(random_state=0) for step in range(100): clf.partial_fit(X_train, y_train, np.unique(y)) intermediate_value = clf.score(X_valid, y_valid) trial.report(intermediate_value, step=step) if trial.should_prune(): raise optuna.TrialPruned() return clf.score(X_valid, y_valid) study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=3) - 参数
- value -- 从目标函数返回的值。 
- step -- Trial 步骤(例如,神经网络训练的 epoch)。 
 
 
 - 
set_user_attr(key, value)[源代码]¶
- 将用户属性设置到 trial中。 - 可以通过 - optuna.trial.Trial.user_attrs()访问试 trial 中的用户属性。- 示例 - 保存神经网络训练的固定超参数。 - import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPClassifier import optuna X, y = load_iris(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y, random_state=0) def objective(trial): trial.set_user_attr('BATCHSIZE', 128) momentum = trial.suggest_uniform('momentum', 0, 1.0) clf = MLPClassifier(hidden_layer_sizes=(100, 50), batch_size=trial.user_attrs['BATCHSIZE'], momentum=momentum, solver='sgd', random_state=0) clf.fit(X_train, y_train) return clf.score(X_valid, y_valid) study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=3) assert 'BATCHSIZE' in study.best_trial.user_attrs.keys() assert study.best_trial.user_attrs['BATCHSIZE'] == 128 - 参数
- key -- A key string of the attribute. 
- value -- 属性的值。 该值应为JSON可序列化的。 
 
 
 - 
should_prune() → bool[源代码]¶
- 建议是否应修剪该 trial. - 该 suggestion 是基于先前报告的值并通过与试验相关的 pruning 算法提出的。 可以在构造一个 - Study时指定该算法。- 注解 - 如果未报告任何值,则该算法无法提出有意义的 suggestion。 同样,如果使用完全相同的一组报告值多次调用此方法,则 suggestion 也将相同。 - 参见 - 请参考 - optuna.trial.Trial.report()的示例代码。- 返回
- 一个布尔值。如果为 - True, 则应根据配置的 pruning 算法对 trial 进行修剪。否则, trial 应继续进行。
 
 - 
suggest_categorical(name, choices)[源代码]¶
- 为分类参数提供一个 suggestion. - 这个值是用 - choices进行采样的。- 示例 - 为 SVC 提供一个 suggestion. - import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.svm import SVC import optuna X, y = load_iris(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y) def objective(trial): kernel = trial.suggest_categorical('kernel', ['linear', 'poly', 'rbf']) clf = SVC(kernel=kernel, gamma='scale', random_state=0) clf.fit(X_train, y_train) return clf.score(X_valid, y_valid) study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=3) - 参数
- name -- A parameter name. 
- choices -- Parameter value candidates. 
 
 - 返回
- A suggested value. 
 
 - 
suggest_discrete_uniform(name, low, high, q)[源代码]¶
- 提供离散参数的 suggestion. - 该值是从 \([\mathsf{low}, \mathsf{high}]\) 中采样的,并且其离散化的步数是:math:q. 更具体地说,该方法返回 \(\mathsf{low}, \mathsf{low} + q, \mathsf{low} + 2 q, \dots, \mathsf{low} + k q \le \mathsf{high}\) 序列中的一个值,其中:math:k 代表一个整数。注意,如果 \(q\) 不是整数的话,\(high\) 可能因为舍入误差而不同。请通过检查 warning 信息来找到改变的值。 - 示例 - 为 拟合 GradientBoostingClassifier 的各个 learner 所需的样本个数提供一个 suggestion. - import numpy as np from sklearn.datasets import load_iris from sklearn.ensemble import GradientBoostingClassifier from sklearn.model_selection import train_test_split import optuna X, y = load_iris(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y) def objective(trial): subsample = trial.suggest_discrete_uniform('subsample', 0.1, 1.0, 0.1) clf = GradientBoostingClassifier(subsample=subsample, random_state=0) clf.fit(X_train, y_train) return clf.score(X_valid, y_valid) study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=3) - 参数
- name -- A parameter name. 
- low -- Suggestion 值范围的下限。 - low包含在范围内。
- high -- Suggestion 值范围的上限。 - high包含在范围内。
- q -- 一个离散化步骤 
 
- 返回
- A suggested float value. 
 
 - 
suggest_float(name: str, low: float, high: float, *, step: Optional[float] = None, log: bool = False) → float[源代码]¶
- 提供一个 浮点数的 suggestion. - 注意,这事一个用于 - suggest_uniform(),- suggest_loguniform()和- suggest_discrete_uniform()的 wrapper 方法。- 1.3.0 新版功能. - 示例 - 为神经网络训练提供 momentum,learning rate 和 learning rate 的比例因子的suggestion 值。 - import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPClassifier import optuna X, y = load_iris(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y, random_state=0) def objective(trial): momentum = trial.suggest_float('momentum', 0.0, 1.0) learning_rate_init = trial.suggest_float('learning_rate_init', 1e-5, 1e-3, log=True) power_t = trial.suggest_float('power_t', 0.2, 0.8, step=0.1) clf = MLPClassifier(hidden_layer_sizes=(100, 50), momentum=momentum, learning_rate_init=learning_rate_init, solver='sgd', random_state=0, power_t=power_t) clf.fit(X_train, y_train) return clf.score(X_valid, y_valid) study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=3) - 参数
- name -- A parameter name. 
- low -- Suggestion 值范围的下限。 - low包含在范围内。
- high -- Suggestion 值范围的上限。 - high不包含在范围内。
- step -- 一个离散化步骤 .. note:: - step和- log参数不能同时使用。要把- step设置成浮点数的话,请先把- log参数设置成- False.
- log -- 是否从对数域采样值的设置选项。如果 - log是 true,则从对数域中的范围采样该值,否则将从线性域中的范围采样。参见- suggest_uniform()和- suggest_loguniform()... note::- step和- log参数不能同时使用。要把- step设置成浮点数的话,请先把- log参数设置成- False.
 
- 引发
- ValueError -- 如果 - step is not None并且制定了- log = True.
- 返回
- A suggested float value. 
 
 - 
suggest_int(name: str, low: int, high: int, step: int = 1, log: bool = False) → int[源代码]¶
- 提供一个整数 suggestion. - 该值是从 \([\mathsf{low}, \mathsf{high}]\) 中采样的。 - 示例 - 为 RandomForestClassifier 提供一个关于树个数的 suggestion. - import numpy as np from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split import optuna X, y = load_iris(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y) def objective(trial): n_estimators = trial.suggest_int('n_estimators', 50, 400) clf = RandomForestClassifier(n_estimators=n_estimators, random_state=0) clf.fit(X_train, y_train) return clf.score(X_valid, y_valid) study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=3) - 参数
- name -- A parameter name. 
- low -- Suggestion 值范围的下限。 - low包含在范围内。
- high -- Suggestion 值范围的上限。 - high包含在范围内。
- step -- 一个离散化步骤。 .. note:: 注意, \(\mathsf{high}\) 会被改变,如果该范围无法被 \(\mathsf{step}\) 整除的话。 请通过检查 warning 信息来找出改变了的值。 .. note:: 该方法返回序列 \(\mathsf{low}, \mathsf{low} + \mathsf{step}, \mathsf{low} + 2 * \mathsf{step}, \dots, \mathsf{low} + k * \mathsf{step} \le \mathsf{high}\) 中的一个值,其中 \(k\) 代表一个整数. .. note:: 参数 - step != 1and- log不能同时使用。 要把- step设置成 \(\mathsf{step} \ge 2\) 的话, 先把- log设置成- False.
- log -- 是否从对数域采样值的设置选项。.. note:: 如果``log`` 是 true,则在一开始的时候, suggestion 值的范围会被分成宽度为 1 的网格点。然后 suggestion 值会被转化到对数域,并在该域上进行采样。这些均匀采样的值会被重新转换到原来的线性域上,并且被舍入到最近的网格点中。这就是确定采样值的过程。比如,如果 low = 2 且 high = 8 的话, suggestion 值的范围就是 [2, 3, 4, 5, 6, 7, 8] 而且较小的值有更大的概率被采样到。 - step != 1和- log参数不能同时使用要把- log设置成- True的话,请先把- step设置成 1.
 
- 引发
- ValueError -- 如果 - step != 1and- log = True被确定了
 
 - 
suggest_loguniform(name, low, high)[源代码]¶
- 从连续参数值中提供 suggestion. - 该值是从对数域的 \([\mathsf{low}, \mathsf{high}]\) 中采样的。当 mathsf{low} = mathsf{high}` 时,返回结果是 \(\mathsf{low}\). - 示例 - 为 SVC. 的罚参数 - C提供一个 suggestion 值。- import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.svm import SVC import optuna X, y = load_iris(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y) def objective(trial): c = trial.suggest_loguniform('c', 1e-5, 1e2) clf = SVC(C=c, gamma='scale', random_state=0) clf.fit(X_train, y_train) return clf.score(X_valid, y_valid) study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=3) - 参数
- name -- A parameter name. 
- low -- Suggestion 值范围的下限。 - low包含在范围内。
- high -- Suggestion 值范围的上限。 - high不包含在范围内。
 
- 返回
- A suggested float value. 
 
 - 
suggest_uniform(name, low, high)[源代码]¶
- 从连续参数值中提供 suggestion. - 该值是从线性域的 \([\mathsf{low}, \mathsf{high}]\) 中采样的。当 mathsf{low} = mathsf{high}` 时,返回结果是 \(\mathsf{low}\). - 示例 - 为神经网络训练提出 momentum 的suggestion 值。 - import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPClassifier import optuna X, y = load_iris(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y) def objective(trial): momentum = trial.suggest_uniform('momentum', 0.0, 1.0) clf = MLPClassifier(hidden_layer_sizes=(100, 50), momentum=momentum, solver='sgd', random_state=0) clf.fit(X_train, y_train) return clf.score(X_valid, y_valid) study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=3) - 参数
- name -- A parameter name. 
- low -- Suggestion 值范围的下限。 - low包含在范围内。
- high -- Suggestion 值范围的上限。 - high不包含在范围内。
 
- 返回
- A suggested float value. 
 
 - 
property user_attrs¶
- 返回用户属性 - 返回
- 包含所有用户属性的字典。 
 
 
- 
class optuna.trial.FixedTrial(params, number=0)[源代码]¶
- 一个始终为每个参数提供固定 suggestion 值的 trial 类。 - 该对象和 - Trial有着一样的方法。它提供预定义的参数值 suggestion. 这些参数值可以通过构造- FixedTrial来决定。和- Trial不同,- FixedTrial并不依赖- Study, 这对于部署优化过程很有用。- 示例 - 根据用户给定的参数值对一个目标函数求解。 - import optuna def objective(trial): x = trial.suggest_uniform('x', -100, 100) y = trial.suggest_categorical('y', [-1, 0, 1]) return x ** 2 + y assert objective(optuna.trial.FixedTrial({'x': 1, 'y': 0})) == 1 - 注解 - 关于方法和属性的细节请参考 - Trial.- 参数
- params -- 一个包含所有参数的字典. 
- number -- Trial 编号,默认是 - 0.
 
 
- 
class optuna.trial.FrozenTrial(number, state, value, datetime_start, datetime_complete, params, distributions, user_attrs, system_attrs, intermediate_values, trial_id)[源代码]¶
- 一个 - Trial的状态和结果。- 
state¶
- TrialStateof the- Trial.
 - 
params¶
- 包含参数 suggestion 值的字典。 
 - 
user_attrs¶
- 通过 - optuna.trial.Trial.set_user_attr()设置的、包含了- Trial属性的字典。
 - 
intermediate_values¶
- 通过 - optuna.trial.Trial.report()来设定的 中间目标函数值。
 - 
property duration¶
- 返回完成该 trial 耗费的时间。 - 返回
- 持续时间。 
 
 
-