我试图理解为什么使用 optuna 运行下面的超参数调整代码会给出不同的最佳参数值,即使我使用相同的
random_state = 42
运行完全相同的代码。随机部分从哪里来?
import optuna
import sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
def objective(trial):
digits = sklearn.datasets.load_digits()
x, y = digits.data, digits.target
max_depth = trial.suggest_int("rf_max_depth", 2, 64, log=True)
max_samples = trial.suggest_float("rf_max_samples", 0.2, 1)
rf_model = RandomForestClassifier(
max_depth = max_depth,
max_samples = max_samples,
n_estimators = 50,
random_state = 42
)
score = cross_val_score(rf_model, x, y, cv=3).mean()
return score
study = optuna.create_study(direction = "maximize")
study.optimize(objective, n_trials = 3)
trial = study.best_trial
print("Best Score: ", trial.value)
print("Best Params: ")
for key, value in trial.params.items():
print(" {}: {}".format(key, value))
即使使用相同的
random_state = 42
,Optuna 在不同的运行中产生不同的结果,是因为
Optuna 维护其内部随机数生成器,独立于的模型或其他库(如 scikit-learn)
。设置
random_state
在的 RandomForestClassifier 中仅确保每次试验使用相同的随机性来初始化模型,但它不会影响 Optuna 搜索超参数空间的方式。
以下是 Optuna 中随机性的一些潜在来源,即使使用固定的
random_state
也会导致不同的结果:
-
试验采样: Optuna 使用采样器来确定要评估的超参数空间中的下一个点。即使使用相同的采样器,初始采样点也可能在不同的运行中有所不同,从而导致不同的试验轨迹和不同的最佳超参数。
-
并行运行: 如果同时运行多个 Optuna 进程(例如,使用
n_jobs > 1
),每个进程将独立维护其随机数生成器。这可能会导致不同的试验顺序和结果,即使在每个进程中设置了相同的random_state
。 -
Optuna 版本: Optuna 的不同版本可能会使用不同的采样算法或随机数生成,从而导致不同的结果,即使对于相同的代码和
random_state
也是如此。
要获得更可重复的结果,可以尝试以下操作:
-
设置
seed
以获取 Optuna 采样器: 可以通过在创建学习时指定seed
参数来设置 Optuna 内部随机数生成器的种子。这将确保每次运行都使用相同的随机性进行试验采样。python study = optuna.create_study(direction="maximize", sampler=optuna.samplers.TPESampler(seed=42))
-
禁用并行运行: 将
n_jobs
参数设置为 1 以确保 Optuna 按顺序运行试验。python study.optimize(objective, n_trials=3, n_jobs=1)
-
指定固定的
random_state
以进行交叉验证: 为了在每次试验中获得更一致的交叉验证结果,请在cross_val_score
函数中也设置random_state
。python score = cross_val_score(rf_model, x, y, cv=3, random_state=42).mean()
-
使用固定的 Optuna 版本: 在的项目中使用特定的 Optuna 版本可以防止因版本差异而导致的结果发生变化。
请记住,即使采用这些步骤,由于机器学习的随机性,也可能无法获得完全相同的最佳超参数。但是,这些步骤应该可以帮助获得更一致和可重复的结果。
标签:python,optuna From: 77311398