超参优化算法——BO-GP

超参优化算法

特性汇总

NAIE SDK包内置了多种参数优化算法, 适用于多种超参优化场景.

优化算法收敛快探索强维度高迭代多极值多离散值多连续值多
Random Search (随机搜索) --- --- --- --- --- --- ---
Grid Search (网格搜索) --- --- --- --- --- --- ---
BO-GP (高斯过程)
BO-SMAC (SMAC)
BO-TPE (TPE)

算法简介

内置的算法主要包括两大类: 简单搜索方法基于模型的序贯优化方法.


简单搜索方法
简单搜索方法指的是一些通用的, 朴素的搜索策略. 当前内置的这类方法主要包括: 随机搜索网格搜索.

优化算法算法简介使用场景
Random Search (随机搜索) 随机搜索指的是每次随机生成一个样本. 随机搜索尽管思路简单, 但往往能在超参优化问题中取得令人意想不到的效果. 因此, 往往被当作基准使用.
Grid Search (网格搜索) 网格搜索指的是遍历用户配置中的所有样本. 网格搜索效率较低, 往往适用于在用户指定的配置空间进行精调.


基于模型的序贯优化方法
基于模型的序贯优化方法(SMBO, Sequential Model-Based Optimization)是一种贝叶斯优化的范式.
该范式主要可以分为两个部分: 代理模型(surrogate model) 和 采集函数(acquisition function).
代理模型用于对历史样本点的均值和方差进行拟合.
采集函数利用获得的均值和方差提出新的样本点.


SMBO范式具体可参考论文.
当前内置的这类方法主要包括: BO-GPBO-SMACBO-TPE.

优化算法算法简介使用场景
BO-GP (高斯过程) GP是SMBO范式下最经典的贝叶斯超参优化算法, 其采用的代理模型是高斯过程模型(GP, Gaussian Process). BO-GP收敛性能好, 适合于资源受限的超参搜索场景(如:亟需寻找一个局部最优点), 但迭代次数较多时其性能会下降.
BO-SMAC (SMAC) SMAC(Sequential Model-Based Optimization forGeneral Algorithm Configuration)隶属于SMBO范式, 其代理模型为随机森林(RF, Random Forest). BO-SMAC具有优异的超参探索能力, 可以使用于各种超参优化场景, 尤其擅长处理大量离散型的超参.
BO-TPE (TPE) TPE(Tree-structured Parzen Estimator)亦隶属于SMBO范式, 其代理模型为基于核密度估计模型(KDE, Kernel Density Estimation)混合模型. BO-TPE可以使用于各种超参优化场景中, 其探索能力优异, 通常都能取得较好的效果.

SDK使用


使用示例

import json

from sklearn.metrics import accuracy_score
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

from naie.context import Context


## Step 1. 定义需要被优化的主函数
def main():
    iris = datasets.load_iris()
    X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target)
    n_estimators = Context.get("n_estimators")
    min_samples_split = Context.get("min_samples_split")
    max_features = Context.get("max_features")
    clf = RandomForestClassifier(
                                 n_estimators=int(n_estimators),
                                 min_samples_split=int(min_samples_split),
                                 max_features=max(min(float(max_features), 0.999), 1e-3),
                                 random_state=2
    )
    clf.fit(X_train, y_train)
    accuracy = accuracy_score(y_test, clf.predict(X_test))
    return accuracy


## Step 2. 定义超参空间
config = {
  "trial_iter": 10,
  "method": "bo-gp",
  "goal": "max",
  "domain_spaces": {
    "my_model": {
      "hyper_parameters": [
        {
          "name": "n_estimators",
          "range": [
            10,
            500
          ],
          "type": "INT",
          "slice": 1
        },
        {
          "name": "max_features",
          "range": [
            0.01,
            1.0
          ],
          "type": "FLOAT",
          "slice": 1
        },
        {
          "name": "min_samples_split",
          "range": [
            2,
            25
          ],
          "type": "int",
          "slice": 2
        }
      ]
    }
  },
  "async_optimization": True
}


## Step 3. 运行超参优化
from naie.model_selection import HyperparameterOptimization

optimizer = HyperparameterOptimization(main, configuration=config)
optimizer.start_trials()


主函数:

  • 超参需要通过Context.get()来从程序外部获取;
  • 被定义的主函数需要有一个可比较大小的返回值.

超参优化配置:
goal 表示优化目标, 可选值为 "max" 或者 "min".
trial_iter 表示超参优化任务的最小迭代次数.
trial_time 表示超参优化任务的最大执行时间, 单位为 "分钟".

  • 优化方法配置

method 表示优化方法, 具体配置如下:
bo表示贝叶斯优化 (BO, Bayesian Optimization), 是一种基于历史训练数据提出样本点的优化方法, 其中:
bo-gp表示采用高斯过程 (GP, Gaussian Process) 作为代理模型的贝叶斯优化方法.
bo-smac表示采用随机森林 (RF, Random Forest) 作为代理模型的贝叶斯优化方法.
bo-tpe表示采用核密度估计 (KDE, Kernel Density Estimation) 生成代理模型的贝叶斯优化方法.
random表示纯随机的优化方法.
grid表示网格遍历形式的优化方法.

  • 超参数配置

domain_spaces 表示算法的搜索域.
my_model 表示当前算法的算法名称.
hyper_parameters 表示超参的搜索域, 详细信息如下:
name 表示超参名称.
type 为超参类型, 其值应当为以下选项中的一个:["INT","INT_EXP","INT_CAT","FLOAT","FLOAT_EXP","FLOAT_CAT","STRING","BOOL"].
INT 表示整数型超参, 该类超参会在 (a, b) 范围内随机采样.
INT_EXP 表示指数类型的整型超参, 该类超参会先在 (log(a), log(b)) 范围内随机采样, 再用指数函数恢复到原范围内.
INT_CAT 表示范畴类型的整型超参, 该类超参会在一组可选值内随机采样, 例如(用","分隔): 1,5,7.
FLOAT 表示浮点型超参, 该类超参会在 (a, b) 范围内随机采样.
FLOAT_EXP 表示指数类型的浮点型超参, 该类超参会先在 (log(a), log(b)) 范围内随机采样, 再用指数函数恢复到原范围内.
FLOAT_CAT 表示范畴类型的浮点型超参, 该类超参会在一组可选值内随机采样, 例如(用","分隔): 0.1, 0.5, 0.7.
STRING 表示字符串型超参, 该类超参会在一组可选值内随机采样, 例如(用","分隔): "string_1", "string_2", "string_3".
BOOL 表示布尔型超参, 该类超参会在 True 和 False 范围内随机采样.
slice 表示超参的切割片数, 该参数仅当网格搜索时才会被使用.

  • 并行优化配置

async_optimization 表示是否使用并行优化, True表示开启并行优化, False表示关闭并行优化.
multi_job 表示是否使用多机并行, True表示多机并行优化, False表示使用单机并行优化(多进程).
n_jobs 表示并行数量.


注意点


如果在SDK是在本地运行的, 则需要用如下形式设置result_path来为程序指定输出目录.

from naie.context import Context
Context.set("result_path", r'./result')

 


 

NAIE SDK帮助文档汇总请参考:

posted @ 2023-08-24 10:12  bonelee  阅读(87)  评论(0编辑  收藏  举报