原文:
www.kdnuggets.com/2021/03/bayesian-hyperparameter-optimization-tune-sklearn-pycaret.html
评论
由Antoni Baum,PyCaret 的核心贡献者及 Ray Tune 的贡献者
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升您的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持您的组织 IT 需求
这里有一个每个PyCaret用户都熟悉的情况:在从compare_models()
中选择了一个或两个有前景的模型后,是时候使用tune_model()
调整其超参数,以充分发挥模型的潜力了。
from pycaret.datasets import get_data
from pycaret.classification import *
data = get_data("juice")
exp = setup(
data,
target = "Purchase",
)
best_model = compare_models()
tuned_best_model = tune_model(best_model)
(如果你想了解更多关于 PyCaret 的信息——这是一个开源的低代码 Python 机器学习库,这个指南是一个很好的起点。)
默认情况下,tune_model()
使用的是经过验证的RandomizedSearchCV
,来自 scikit-learn。然而,并非所有人都知道tune_model()
提供的各种高级选项。
在这篇文章中,我将向你展示如何利用tune-sklearn,这是一个用于 scikit-learn 模型选择模块的替代品,提供了前沿的超参数调优技术,来轻松使用其他最先进的算法。我还将报告一系列基准测试结果,展示 tune-sklearn 如何轻松提升分类模型的性能。
超参数优化算法的效率差异可能很大。
随机搜索一直是机器学习的主流方法,这有充分的理由:它易于实现和理解,并且在合理的时间内能给出良好的结果。然而,正如名称所示,它是完全随机的——大量时间可能花在评估不良配置上。考虑到迭代次数是有限的,优化算法专注于它认为有前景的配置,并考虑到已评估的配置,似乎更有意义。
本质上,这就是贝叶斯优化(BO)的核心思想。BO 算法跟踪所有评估,并利用数据构建一个“替代概率模型”,该模型的评估速度比 ML 模型快得多。评估的配置越多,算法的知识越丰富,替代模型就越接近实际的目标函数。这样,算法可以做出明智的选择,决定接下来评估哪些配置,而不仅仅是随机采样。如果你想了解更多关于贝叶斯优化的知识,可以查看Will Koehrsen 的这篇精彩文章。
幸运的是,PyCaret 内置了多个优化库的封装器,在本文中,我们将重点关注tune-sklearn。
tune-sklearn是 scikit-learn 模型选择模块的替代品。tune-sklearn 提供了一个基于 scikit-learn 的统一 API,让你可以访问各种流行的先进优化算法和库,包括 Optuna 和 scikit-optimize。这个统一的 API 允许你通过一个参数在多种超参数优化库之间切换。
tune-sklearn 由Ray Tune驱动,它是一个用于实验执行和超参数调优的 Python 库,支持任何规模的调优。这意味着你可以在多台机器上扩展调优,而无需更改代码。
为了更简单,从版本 2.2.0 开始,tune-sklearn 已集成到 PyCaret 中。你只需执行pip install "pycaret[full]"
,所有可选依赖项将自动处理。
如何协同工作
!pip install "pycaret[full]"
from pycaret.datasets import get_data
from pycaret.classification import *
data = get_data("juice")
exp = setup(
data,
target = "Purchase",
)
best_model = compare_models()
tuned_best_model_hyperopt = tune_model(
best_model,
search_library="tune-sklearn",
search_algorithm="hyperopt",
n_iter=20
)
tuned_best_model_optuna = tune_model(
best_model,
search_library="tune-sklearn",
search_algorithm="optuna",
n_iter=20
)
只需向tune_model()
添加两个参数,你就可以通过Hyperopt或Optuna将随机搜索切换为 tune-sklearn 驱动的贝叶斯优化。请记住,PyCaret 内置了所有包含模型的搜索空间,但你始终可以传递自己的搜索空间(如果你愿意的话)。
但是,它们与随机搜索相比效果如何呢?
为了比较贝叶斯优化与随机搜索的效果,我进行了一个非常简单的实验。使用 Kaggle 房价数据集,我创建了两个流行的回归模型,分别是 随机森林 和 弹性网络。然后,我使用 scikit-learn 的随机搜索以及 tune-sklearn 的 Hyperopt 和 Optuna 搜索器对它们进行了调优(所有方法进行 20 次迭代,最小化 RMSLE)。该过程重复三次,使用不同的种子,并对结果进行了平均。下面是代码的简化版本——你可以在 这里 找到完整代码。
from pycaret.datasets import get_data
from pycaret.regression import *
data = get_data("house")
exp = setup(
data,
target = "SalePrice",
test_data=data, # so that the entire dataset is used for cross validation - do not normally do this!
session_id=42,
fold=5
)
rf = create_model("rf")
en = create_model("en")
tune_model(rf, search_library = "scikit-learn", optimize="RMSLE", n_iter=20)
tune_model(rf, search_library = "tune-sklearn", search_algorithm="hyperopt", n_iter=20)
tune_model(rf, search_library = "tune-sklearn", search_algorithm="optuna", optimize="RMSLE", n_iter=20)
tune_model(en, search_library = "scikit-learn", optimize="RMSLE", n_iter=20)
tune_model(en, search_library = "tune-sklearn", search_algorithm="hyperopt", n_iter=20)
tune_model(en, search_library = "tune-sklearn", search_algorithm="optuna", optimize="RMSLE", n_iter=20)
PyCaret 让事情变得如此简单,难道不是很棒吗?无论如何,这里是我在我的机器上获得的 RMSLE 分数:
实验的 RMSLE 分数
为了更好地理解,下面是相较于随机搜索的百分比改进:
相较于随机搜索的百分比改进
所有这些操作都使用了相同的迭代次数,在相近的时间内完成。请记住,由于过程的随机性,你的效果可能会有所不同。如果你的改进不明显,可以尝试将迭代次数(n_iter
)从默认的 10 增加到 20–30,这通常是一个明智的选择。
Ray 的优点在于你可以轻松地将计算从单台机器扩展到由数十、数百或更多节点组成的集群。虽然 PyCaret 目前尚不完全支持 Ray 集成,但可以在调整之前初始化一个 Ray 集群——并且 tune-sklearn 将自动使用它。
exp = setup(
data,
target = "SalePrice",
session_id=42,
fold=5
)
rf = create_model("rf")
tune_model(rf, search_library = "tune-sklearn", search_algorithm="optuna", optimize="RMSLE", n_iter=20) # Will run on Ray cluster!
只要所有必要的配置就位(RAY_ADDRESS
环境变量),就无需其他操作即可利用 Ray 的分布式计算进行超参数调整。由于超参数优化通常是创建 ML 模型中性能最密集的部分,使用 Ray 进行分布式调整可以为你节省大量时间。
为了加快 PyCaret 中的超参数优化,你只需安装所需的库并更改 tune_model()
中的两个参数——多亏了内置的 tune-sklearn 支持,你可以轻松利用 Ray 的分布式计算,超越本地机器的限制。
请务必查看PyCaret、Ray Tune和tune-sklearn的文档,以及PyCaret和tune-sklearn的 GitHub 仓库。最后,如果你有任何问题或想与社区联系,请加入PyCaret 的 Slack和Ray 的 Discourse。
感谢 Richard Liaw 和 Moez Ali 的校对和建议。
个人简介: Antoni Baum 是计算机科学与计量经济学硕士生,同时也是 PyCaret 的核心贡献者和 Ray Tune 的贡献者。
原文。经许可转载。
相关:
-
高级超参数优化/调优算法
-
轻松的数据科学的 5 种工具
-
你在 PyCaret 中做错的 5 件事