Hyperopt:定义依赖于其他参数的参数
Hyperopt: Define parameter which is dependent on other parameter
我正在使用 python
包 hyperopt
并且我有一个参数 a
需要大于参数 b
.
比如我希望我的参数space像
from hyperopt import hp
space = {"b": hp.uniform(0, 0.5), "a": hp.uniform(b, 0.5)}
其中,要求 a
至少大于 b
,我该怎么做?
提前致谢
一个简单的选项是使用 hyperopt
嵌套参数的能力。因此,您可以根据需要定义超参数 space:
space = hp.uniform("a", hp.uniform("b", 0, 0.5), 0.5)
只有"a"
的值被传递给你优化的函数(因为这是超参数space),但是hyperopt.fmin()
会return两者参数.
类似的选项,但要优化的函数接收两个参数的地方是:
b_var = hp.uniform("b", 0, 0.5)
space = {"b": b_var, "a": hp.uniform("a", b_var, 0.5)}
最后,稍微更改优化函数的输入可能会更简单:参数 a
可以替换为 a_fraction
运行 在 0 和 1 之间并在 b
和 0.5(即 a_fraction = 0
产生 a = b
和 a_fraction = 1
在要优化的修改函数内给出 a = 0.5
)。因此,参数 space 具有通常的形式:
space = {"b": hp.uniform("b", 0, 0.5), "a_fraction": hp.uniform("a_fraction", 0, 1)}
https://github.com/hyperopt/hyperopt/issues/175#issuecomment-29401501 上有一个有趣的讨论。
也许我的发现可以帮助别人。我使用 HyperOpt 来优化分段仿射函数的参数。
因此我需要嵌套参数来正确设置 x 参数部分:
由于嵌套参数(不再)对 HyperOpt 或 Optuna 不起作用...我向所有遇到相同问题的人推荐 pwlf library。
这个库提出了两种提取分段线性函数参数的方法:
- 通过提供零件数量
- 通过提供断点位置
如果你像我一样对找到断点位置感兴趣,你可以提供零件数量:
import pwlf
import pandas as pd
data = pd.DataFrame.from_dict({
"x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"y": [0, 4, 6, 7, 8, 9, 10, 7, 3, 1],
})
model = pwlf.PiecewiseLinFit(data.x, data.y)
nb_parts = 3
model.fit(nb_parts)
print(f"x part intersections: {model.fit_breaks}")
# x part intersections: [0. 1.99 6.00 9.]
print(f"linear coefficient of each part: {model.slopes}")
# linear coefficient of each part: [ 4.00, 1.00, -3.00]
print(f"linear bias of each part: {model.intercepts}")
# linear bias of each part: [-7.11e-06, 5.99e+00, 3.00e+01]
希望对您有所帮助!
我正在使用 python
包 hyperopt
并且我有一个参数 a
需要大于参数 b
.
比如我希望我的参数space像
from hyperopt import hp
space = {"b": hp.uniform(0, 0.5), "a": hp.uniform(b, 0.5)}
其中,要求 a
至少大于 b
,我该怎么做?
提前致谢
一个简单的选项是使用 hyperopt
嵌套参数的能力。因此,您可以根据需要定义超参数 space:
space = hp.uniform("a", hp.uniform("b", 0, 0.5), 0.5)
只有"a"
的值被传递给你优化的函数(因为这是超参数space),但是hyperopt.fmin()
会return两者参数.
类似的选项,但要优化的函数接收两个参数的地方是:
b_var = hp.uniform("b", 0, 0.5)
space = {"b": b_var, "a": hp.uniform("a", b_var, 0.5)}
最后,稍微更改优化函数的输入可能会更简单:参数 a
可以替换为 a_fraction
运行 在 0 和 1 之间并在 b
和 0.5(即 a_fraction = 0
产生 a = b
和 a_fraction = 1
在要优化的修改函数内给出 a = 0.5
)。因此,参数 space 具有通常的形式:
space = {"b": hp.uniform("b", 0, 0.5), "a_fraction": hp.uniform("a_fraction", 0, 1)}
https://github.com/hyperopt/hyperopt/issues/175#issuecomment-29401501 上有一个有趣的讨论。
也许我的发现可以帮助别人。我使用 HyperOpt 来优化分段仿射函数的参数。 因此我需要嵌套参数来正确设置 x 参数部分:
这个库提出了两种提取分段线性函数参数的方法:
- 通过提供零件数量
- 通过提供断点位置
如果你像我一样对找到断点位置感兴趣,你可以提供零件数量:
import pwlf
import pandas as pd
data = pd.DataFrame.from_dict({
"x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"y": [0, 4, 6, 7, 8, 9, 10, 7, 3, 1],
})
model = pwlf.PiecewiseLinFit(data.x, data.y)
nb_parts = 3
model.fit(nb_parts)
print(f"x part intersections: {model.fit_breaks}")
# x part intersections: [0. 1.99 6.00 9.]
print(f"linear coefficient of each part: {model.slopes}")
# linear coefficient of each part: [ 4.00, 1.00, -3.00]
print(f"linear bias of each part: {model.intercepts}")
# linear bias of each part: [-7.11e-06, 5.99e+00, 3.00e+01]
希望对您有所帮助!