Skip to main content
Version: 2.17.1

超参优化工具

超参优化工具库

  1. Skopt:包括随机搜索、贝叶斯搜索、决策森林和梯度提升树。在小型搜索空间和良好的初始估计下效果最好。

  2. Hyperopt:对具有一定条件或约束的搜索空间进行调优,其中包括随机搜索和Tree Parzen Estimators等算法。用于模型选择和优化的函数库分别建立在scikit-learn和keras的基础上。

  3. Simple(x):超参数优化库,可作为贝叶斯优化的替代方法。Simple(x)和贝叶斯搜索一样,试图以尽可能少的样本进行优化,但也将计算复杂度从n³降低到log(n),这对大型搜索空间非常有用。

  4. Ray.tune:主要适用于深度学习和强化学习模型。如Hyperband算法、基于群体的训练算法、Hyperopt方法和中值停止规则。

  5. Chocolate:分布式超参数优化库,支持网格搜索、随机搜索、准随机搜索、贝叶斯搜索和自适应协方差矩阵进化策略。

  6. GpFlowOpt:基于GpFlow库的高斯过程优化器,可使用TensorFlow在GPU上运行高斯过程任务。

  7. FAR-HO:包含TensorFlow的一系列基于梯度的优化器,Reverse-HG和Forward-HG。

  8. Xcessiv:包括一个贝叶斯搜索参数优化器,这个优化器支持高级别并行计算,支持与TPOT库的集成。

  9. HORD:适用于极高维数据分析。

  10. ENAS-pytorch:可在pytorch中实现高效的深度学习结构搜索,使用参数共享来构建更高效的网络,使其适用于深度学习结构搜索。

优化工具 Hyperopt

Hyperopt是一个sklearn的Python库,在搜索空间上进行串行和并行优化,搜索空间可以是实值,离散和条件维度。

支持跨多台机器的并行化,并使用 MongoDb 作为存储超参数组合结果的中心数据库。

优化库基于 hyperopt-sklearn 和 hyperas, 这两个用于模型选择和优化的函数库分别建立在scikit-learn和keras的基础上。

  1. 使用方法及配置

        # 定义目标函数
    def objective(args):
    case, val = args
    if case == 'case 1':
    return val
    else:
    return val ** 2

    # 定义搜索空间
    from hyperopt import hp
    space = hp.choice(
    'a',
    [
    ('case 1', 1 + hp.lognormal('c1', 0, 1)),
    ('case 2', hp.uniform('c2', -10, 10))
    ]
    )

    # 取得最优参数
    from hyperopt import fmin, tpe
    best = fmin(objective, space, algo=tpe.suggest, max_evals=100)
  2. 搜索空间定义

    源码请参考git地址

        from hyperopt import hp
    space = hp.choice(
    'a',
    [
    ('case 1', 1 + hp.lognormal('c1', 0, 1)),
    ('case 2', hp.uniform('c2', -10, 10))
    ]
    )

    参数说明:

    'a' - 可选类别

    'c1' - 'case 1'中正参数

    'c2' - 'case 2'中给定边界的实值参数

  3. 基于scikit-learn的搜索空间实例

        from hyperopt import hp
    space = hp.choice(
    'classifier_type',
    [
    {'type': 'naive_bayes'},
    {
    'type': 'svm',
    'C': hp.lognormal('svm_C', 0, 1),
    'kernel': hp.choice('svm_kernel', [
    {'ktype': 'linear'},
    {'ktype': 'RBF', 'width': hp.lognormal('svm_rbf_width', 0, 1)}])
    },
    {
    'type': 'dtree',
    'criterion': hp.choice('dtree_criterion', ['gini', 'entropy']),
    'max_depth': hp.choice('dtree_max_depth',[None, hp.qlognormal('dtree_max_depth_int', 3, 1, 1)]),
    'min_samples_split': hp.qlognormal('dtree_min_samples_split', 2, 1, 1)
    },
    ]
    )