5

回帰モデルでHyperoptを使用して、そのハイパーパラメーターの 1 つを変数ごとに定義し、リストとして渡す必要があるようにしようとしています。たとえば、3 つの独立変数 (定数を除く) を使用した回帰がある場合、パスします(浮動小数点数はhyperparameter = [x, y, z]どこですか)。x, y, z

このハイパーパラメータの値は、適用される変数に関係なく、同じ境界を持ちます。このハイパーパラメータがすべての変数に適用された場合、単純にhp.uniform('hyperparameter', a, b). hp.uniform('hyperparameter', a, b)代わりに検索スペースを希望するのは、長さのデカルト積ですn。ここnで、回帰の変数の数です(つまり、基本的に、itertools.product(hp.uniform('hyperparameter', a, b), repeat = n)

これが Hyperopt 内で可能かどうかを知りたいです。そうでない場合は、これが可能なオプティマイザーの提案を歓迎します。

4

4 に答える 4

0

まず、組み合わせ前空間を dict として定義します。キーは名前です。値はタプルです。

from hyperopt import hp
space = {'foo': (hp.choice, (False, True)), 'bar': (hp.quniform, 1, 10, 1)}

次に、ループまたは を使用して、必要な組み合わせバリアントを生成しますitertools。各名前は、サフィックスまたはプレフィックスを使用して一意に保たれます。

types = (1, 2)
space = {f'{name}_{type_}': args for type_ in types for name, args in space.items()}
>>> space 
{'foo_1': (<function hyperopt.pyll_utils.hp_choice(label, options)>,
  (False, True)),
 'bar_1': (<function hyperopt.pyll_utils.hp_quniform(label, *args, **kwargs)>,
  1, 10, 1),
 'foo_2': (<function hyperopt.pyll_utils.hp_choice(label, options)>,
  (False, True)),
 'bar_2': (<function hyperopt.pyll_utils.hp_quniform(label, *args, **kwargs)>,
  1, 10, 1)}

最後に、実際のhyperoptスペースを初期化して作成します。

space = {name: fn(name, *args) for name, (fn, *args) in space.items()}
values = tuple(space.values())
>>> space
{'foo_1': <hyperopt.pyll.base.Apply at 0x7f291f45d4b0>,
 'bar_1': <hyperopt.pyll.base.Apply at 0x7f291f45d150>,
 'foo_2': <hyperopt.pyll.base.Apply at 0x7f291f45d420>,
 'bar_2': <hyperopt.pyll.base.Apply at 0x7f291f45d660>}

これは hyperopt 0.2.7 で行われました。免責事項として、ハイパーオプトを使用しないことを強くお勧めします。これは、私の経験では、他のオプティマイザーと比較してパフォーマンスが大幅に低下するためです。

于 2022-02-01T04:48:09.030 に答える
-1

こんにちは、optuna でこのソリューションを実装しました。optuna の利点は、すべての個々の値に対してハイパースペースを作成することですが、この値をよりインテリジェントな方法で最適化し、1 つのハイパーパラメーター最適化のみを使用することです。たとえば、Batch-Size、Learning-rate、Dropout-Rate を使用してニューラル ネットワークを最適化しました。ここに画像の説明を入力

検索スペースは、使用されている実際の値よりもはるかに大きくなります。これにより、グリッド検索の代わりに多くの時間を節約できます。

実装の擬似コードは次のとおりです。

def function(trial): #trials is the parameter of optuna, which selects the next hyperparameter
    distribution = [0 , 1]
    a = trials.uniform("a": distribution) #this is a uniform distribution
    b = trials.uniform("a": distribution)

    return (a*b)-b
    #This above is the function which optuna tries to optimze/minimze

詳細なソース コードについては、Optunaを参照してください。それは私にとって多くの時間を節約し、本当に良い結果でした.

于 2020-08-08T17:45:12.487 に答える