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()
让我们运行代码。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选项卡。您将看到上面的计算图正在进行实时处理!在
现在可以检索结果:
adapt.plot_improvements()# to show the improvementsoptimal_params=adapt.get_optimal_params()# which you can use to train your final model
如果在本地计算机上运行此程序,则必须负责删除临时目录:
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延迟计算图:
传入任意可调用的估计器
您可以传入任意可调用估计器,只要它实现标准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仪表板,同时只处理两个延迟计算图,实现了有效的动态资源分配:
待办事项:
- 其他交叉验证方案
- 硬阈值提交过程的测试(以及没有硬阈值的测试速度)
- 监督编码
- 添加单元测试
- 持续集成设置
- 随机搜索法
- 多GPU环境
- 文件
- ~~正在获取优化结果~~
- ~~优化可视化~~
- 使用回调的早期停止标准
- ~~β自述文件.rst安装和教程~ ~
- 满的自述文件.rst用于安装和教程
- 定期培训
- 贝叶斯热启动训练
- 依赖关系管理
- 每个工作线程池的活动管理
- 项目
标签: