Dask并行贝叶斯优化工具箱

scikit-optimize-adapter的Python项目详细描述


Scikit Optimize Adapter(Adapter:“A DAsk Parallel TunER”)是建立在Scikit Optimize和DAsk之上的一个高效的轻量级库,允许用户使用不同的并行交叉验证方案进行贝叶斯优化超参数调整。在

安装

pip install --index-url https://test.pypi.org/simple/ --no-deps scikit-optimize-adapter --upgrade

入门

让我们从以下虚拟训练数据开始:

^{pr2}$

适配器随XGBoost回归器和分类器一起提供,但如果您希望自定义设计,则可以传入设计的可调用估计器。在

fromadapterimportAdapteradapt=Adapter(df,features,target,K,groupby=None,cross_validation_scheme='random_shuffle',search_method="bayesian_optimization",estimator="xgboost_regression")# "xgboost_regression" or "xgboost_classification" or callable estimator (more on this later)

尝试将链接复制到web浏览器以检查dask仪表板:http://127.0.0.1:8789/status。在

您可以可视化Dask延迟计算图:

delayed_graph=adapt.construct_delayed_graph(num_iter=3,search_space=space)# we will set n_iter to 3 to make visualizing manageable.delayed_graph.visualize()
https://github.com/mozjay0619/scikit-optimize-adapter/blob/master/media/graph.png

让我们运行代码。num_initial是随机初始搜索的数目,num_iter是执行的搜索步骤总数,包括num_initial步数。(例如:num_initial=5, num_iter=15表示5个随机搜索和10个贝叶斯搜索)

res=adapt.run(num_initial=5,num_iter=15,search_space=space)

运行时,再次签出仪表板,然后单击Graph选项卡。您将看到上面的计算图正在进行实时处理!在

https://github.com/mozjay0619/scikit-optimize-adapter/blob/master/media/daskdashboard.png

现在可以检索结果:

adapt.plot_improvements()# to show the improvementsoptimal_params=adapt.get_optimal_params()# which you can use to train your final model
https://github.com/mozjay0619/scikit-optimize-adapter/blob/master/media/improvement.png

如果在本地计算机上运行此程序,则必须负责删除临时目录:

adapt.cleanup()

交叉验证方案

适配器支持5种不同的交叉验证方案:

  • random_shuffle:从随机无序排列的行创建K个交叉验证折叠
    • 大多数回归任务的默认模式。在
  • ordered:按某列对列车数据排序后创建K个交叉验证折叠
    • 用于回归任务,其中数据具有时间序列性质,具有高时间自相关性。在
    • 必须提供orderby参数。在
  • binary_classification:在保留正负标签比例的位置创建K个交叉验证折叠
    • 用于分类任务。在
    • 此模式将保留每个折叠中的正负标签比例。在
  • stratified_sampling:创建K个交叉验证折叠,以便保留响应的倾斜分布
    • 用于连续响应变量高度倾斜的回归任务。在
    • 此模式将通过分层取样保持响应值的倾斜分布。在
    • 必须提供num_partition参数。在
  • expanding_window:主要用于时间序列建模
    • 参考:

并行调整多个模型

再次,让我们看一个具体的示例数据:

importpandasaspdimportnumpyasnpgroup_col=np.asarray([1]*10+[2]*10+[3]*10+[4]*10+[5]*10+[6]*10).reshape(-1,1)# this time we have a column specifying groupdata=np.arange(60*4).reshape(60,4)data=np.hstack((data,group_col))df=pd.DataFrame(data=data,columns=['target','f1','f2','f3','groups'])features=['f1','f2','f3']target='target'K=5orderby=Nonenum_partition=Nonewindow_size=Nonefromskopt.spaceimportSpace,Categorical,Integer,Real,Dimensionspace=[Real(0.5,10),# learning rate       (learn_rate)Real(0,1),# gamma               (min_split_improvement)Integer(3,4),# max_depth           (max_depth)Integer(11,13),# n_estimators        (ntrees)Integer(2,4),# min_child_weight    (min_rows)Real(0,1),# colsample_bytree    (col_sample_rate_per_tree)Real(0,1)]# subsample           (sample_rate)

我们可以通过传递groupby参数来优化每个组的模型。在

fromadapterimportAdapteradapt=Adapter(df,features,target,K,groupby='groups',cross_validation_scheme='random_shuffle',search_method="bayesian_optimization",estimator="xgboost_regression")

以相同的方式运行适配器:

res=adapt.run(num_initial=5,num_iter=15,search_space=space)

您可以可视化Dask延迟计算图:

https://github.com/mozjay0619/scikit-optimize-adapter/blob/master/media/multigraph_dashboard.png

传入任意可调用的估计器

您可以传入任意可调用估计器,只要它实现标准scikit learn estimator API:

fromabcimportABCMeta,abstractmethodclassBaseEstimator(object,metaclass=ABCMeta):"""
    Base class for all Algorithm classes.
    """def__init__(self,**kwargs):pass@abstractmethoddeffit(self,X,y,params):pass@abstractmethoddefscore(self,X,y):pass@abstractmethoddefpredict(self,X):pass

例如,我们甚至可以这样做:

fromadapterimportBaseEstimator# import BaseEstimator!classDummyEstimator(BaseEstimator):def__init__(self):passdeffit(self,train_X,train_y,params):a=len(train_X)/10.foriinrange(int(a*5000000)):i+1print(len(train_X),len(train_y))defscore(self,validation_X,validation_y):print(len(validation_X),len(validation_y))return1.5defpredict(self,test_X):returnlen(test_X)my_estimator=DummyEstimator()

然后可以将其与适配器一起使用:

fromadapterimportAdapteradapt=Adapter(df,features,target,K,groupby='groups',cross_validation_scheme='random_shuffle',search_method="bayesian_optimization",estimator=my_estimator)# your own estimator

使用高度倾斜的训练数据大小调整多个模型

当每个组的数据大小高度倾斜时,可能会出现次优的资源分配。在这种情况下,通过使用多个线程实例来限制向Dask客户机发送延迟的图形更为有利。让我们再看一个例子:

importpandasaspdimportnumpyasnpimporttimegroup_col=np.asarray([1]*100+[2]*2+[3]*2+[4]*2+[5]*2+[6]*2+[7]*2+[8]*2+[9]*2+[16]*2+[26]*2+[17]*2+[18]*2+[19]*2+[116]*2+[126]*2).reshape(-1,1)data=np.arange(130*4).reshape(130,4)data=np.hstack((data,group_col))df=pd.DataFrame(data=data,columns=['target','f1','f2','f3','groups'])features=['f1','f2','f3']groupby='groups'target='target'K=5fromadapterimportBaseEstimator# import BaseEstimator!classDummyEstimator(BaseEstimator):def__init__(self):passdeffit(self,train_X,train_y,params):a=len(train_X)/10.foriinrange(int(a*5000000)):i+1print(len(train_X),len(train_y))defscore(self,validation_X,validation_y):print(len(validation_X),len(validation_y))return1.5defpredict(self,test_X):returnlen(test_X)my_estimator=DummyEstimator()orderby=Nonenum_partition=Nonewindow_size=Nonefromskopt.spaceimportSpace,Categorical,Integer,Real,Dimensionspace=[Real(0.5,10),# learning rate       (learn_rate)Real(0,1),# gamma               (min_split_improvement)Integer(3,4),# max_depth           (max_depth)Integer(11,13),# n_estimators        (ntrees)Integer(2,4),# min_child_weight    (min_rows)Real(0,1),# colsample_bytree    (col_sample_rate_per_tree)Real(0,1)]# subsample           (sample_rate)

在这种情况下,我们使用run_with_threads方法调用,其中我们传递一个附加参数num_threads

fromadapterimportAdapteradapt=Adapter(df,features,target,K,groupby='groups',cross_validation_scheme='random_shuffle',search_method="bayesian_optimization",estimator=my_estimator)# your own estimatorres=adapt.run(num_initial=5,num_iter=15,search_space=space,num_threads=2)# num_threads

你可以去Das查一下k仪表板,同时只处理两个延迟计算图,实现了有效的动态资源分配:

https://github.com/mozjay0619/scikit-optimize-adapter/blob/master/media/twograph_dashboard.png

待办事项:

  1. 其他交叉验证方案
  2. 硬阈值提交过程的测试(以及没有硬阈值的测试速度)
  3. 监督编码
  4. 添加单元测试
  5. 持续集成设置
  6. 随机搜索法
  7. 多GPU环境
  8. 文件
  9. ~~正在获取优化结果~~
  10. ~~优化可视化~~
  11. 使用回调的早期停止标准
  12. ~~β自述文件.rst安装和教程~ ~
  13. 满的自述文件.rst用于安装和教程
  14. 定期培训
  15. 贝叶斯热启动训练
  16. 依赖关系管理
  17. 每个工作线程池的活动管理

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Switch语句,用于根据用户输入确定字母等级(十进制)   使用rich:datascroller更改页面后,java actionListener无法在rich:dataTable中工作   使用Azure AD帐户时java强制密码更改问题   java如何在flink中模拟异步操作   java如何将整数格式化为两个小数?   基于javascript条件访问amazon lamda结果?   java成本/从源节点到目标节点的所有可能路径的距离   java为什么我的光标在NextLine()之后的错误行上?   java Gridlayout未根据约束调整大小   windows使用特殊路径名在java中加载文件   如何在java上使用selenium在移动浏览器中滑动   Java中字符串类的成员使用了哪种utf8编码?   java删除截击缓存   java Musicg库不适用于mp3、rm、wma