与其他编程语言的Hyperopt接口

基本上有两种方法可以将Hyperopt与其他语言接口:

  1. 你可以为非Python编写的成本函数编写一个Python包装器,或者
  2. 你可以替换hyperopt-mongo-worker程序,并直接使用JSON与MongoDB通信。

包装对非Python代码的调用

使用Hyperopt优化非Python函数(例如外部可执行文件)的参数的最简单方法是编写一个Python函数包装器来包装该外部可执行文件。假设你有一个可执行文件foo,它接受一个整数命令行参数--n并打印出一个分数,你可以这样包装它:

import subprocess


def foo_wrapper(n):
    # 可选:为外部可执行文件编写一个脚本
    # (我们只是用hyperopt提出的参数调用foo)
    proc = subprocess.Popen(['foo', '--n', n], stdout=subprocess.PIPE)
    proc_out, proc_err = proc.communicate()
    # <你可能需要在这里对foo的输出进行更复杂的解析>
    score = float(proc_out)
    return score

当然,要优化foon参数,你还需要调用hyperopt.fmin并定义搜索空间。我只能想象你会想在Python中完成这部分工作。

from hyperopt import fmin, hp, rand

best_n = fmin(foo_wrapper, hp.quniform('n', 1, 100, 1), algo=rand.suggest)

print(best_n)

当搜索空间大于这里的简单示例时,你可能希望或需要包装函数将其参数转换为某种配置文件/脚本供外部可执行文件使用。

这种方法与MongoTrials完全兼容。

直接与MongoDB通信

通过直接与MongoDB通信(使用MongoTrials时),可以更直接地与搜索过程接口,就像hyperopt-mongo-worker所做的那样。解释如何做到这一点超出了教程的范围,但Hannes Schultz(@temporaer)通过他的MDBQ项目使Hyperopt工作,这是一个基于mongodb的独立任务队列:

Hyperopt C++ 客户端

查看该代码以及hyperopt/mongoexp.py的内容,以了解工作进程如何在工作队列中保留作业,并将结果存储回MongoDB。