使用 Optuna 进行贝叶斯优化
使用 optuna.create_study()、suggest_float/int/categorical、剪枝和可视化
使用 Optuna 进行贝叶斯优化 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
比随机搜索更智能
网格搜索和随机搜索都会忽略过去的结果。贝叶斯优化会从之前的试验中学习,接着提出更有希望的超参数,从而用更少的评估次数找到优秀的取值。
Optuna 的作用
Optuna 是一个广受欢迎的超参数优化框架。您需要定义一个 objective 函数;Optuna 会智能地抽取超参数,并记住哪些取值有效。
创建优化研究
优化研究负责管理整个优化过程。对于准确率/AUC,将 direction 设置为 "maximize";对于损失/错误,将其设置为 "minimize"。
import optuna
study = optuna.create_study(direction="maximize")目标函数
objective 接收一个 trial 对象,提出超参数,训练模型,并返回要优化的分数。
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
def objective(trial):
n = trial.suggest_int("n_estimators", 100, 500)
d = trial.suggest_int("max_depth", 3, 20)
clf = RandomForestClassifier(n_estimators=n, max_depth=d)
return cross_val_score(clf, X, y, cv=3).mean()设置整数参数
trial.suggest_int(name, low, high) 会从一个范围内选择整数。添加 step 或 log=True 可以控制抽样方式。
def objective(trial):
n_estimators = trial.suggest_int("n_estimators", 100, 1000, step=50)
return train_and_score(n_estimators)设置浮点参数
trial.suggest_float(name, low, high) 会选择一个实数。对于学习率这类跨越多个数量级的参数,可使用 log=True。
def objective(trial):
lr = trial.suggest_float("learning_rate", 1e-4, 0.3, log=True)
subsample = trial.suggest_float("subsample", 0.5, 1.0)
return train_and_score(lr, subsample)设置类别参数
trial.suggest_categorical(name, choices) 会从固定列表中选择一个取值,非常适合内核类型或提升方法等选项。
def objective(trial):
kernel = trial.suggest_categorical("kernel", ["linear", "rbf", "poly"])
return train_svm(kernel)运行优化
study.optimize(objective, n_trials=N) 会运行 N 次试验来执行搜索。试验次数越多,探索的空间越大;Optuna 会随着时间推移聚焦于更有希望的区域。
study.optimize(objective, n_trials=100)读取最佳结果
优化完成后,study.best_params 会给出最佳超参数,study.best_value 会给出最佳目标分数。
print("Best params:", study.best_params)
print("Best value:", study.best_value)
best = RandomForestClassifier(**study.best_params)
best.fit(X, y)剪掉没有希望的试验
Optuna 可以通过剪枝器提前停止表现不佳的试验,从而节省计算资源。在训练循环中报告中间值,并检查 trial.should_prune()。
import optuna
study = optuna.create_study(
direction="maximize",
pruner=optuna.pruners.MedianPruner(),
)Optuna 为何具备良好扩展性
Optuna 支持并行试验、持久化存储和搜索结果可视化。对于成本高昂的模型,其高样本效率的贝叶斯方法比网格搜索或随机搜索少得多的试验次数就能找到优秀的配置。
快速检查
测试您对 Optuna 的掌握情况。
总结
总结:Optuna 使用贝叶斯优化高效地调优超参数。使用 direction 创建优化研究,编写使用 trial.suggest_int/float/categorical 的 objective,运行 study.optimize(objective, n_trials=N),然后读取 study.best_params 和 study.best_value。剪枝器会停止表现较弱的试验,以节省计算资源。
常见问题解答
「使用 Optuna 进行贝叶斯优化」课时是免费的吗?
是的 — 「使用 Optuna 进行贝叶斯优化」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「使用 Optuna 进行贝叶斯优化」这节课中我会学到什么?
使用 optuna.create_study()、suggest_float/int/categorical、剪枝和可视化 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 Optuna 进行贝叶斯优化」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。