与其他编程语言的Hyperopt接口
基本上有两种方法可以将Hyperopt与其他语言接口:
- 你可以为非Python编写的成本函数编写一个Python包装器,或者
- 你可以替换
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
当然,要优化foo
的n
参数,你还需要调用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/mongoexp.py的内容,以了解工作进程如何在工作队列中保留作业,并将结果存储回MongoDB。