Main Content

ベイズ最適化の出力関数

ベイズ最適化の出力関数とは

出力関数とは、bayesopt の各反復の最後に呼び出される関数です。出力関数は反復を停止させることができます。また、プロットの作成、ワークスペースまたはファイルへの情報の保存、その他の任意の計算が行えます。

反復の停止以外に、出力関数でベイズ最適化の進行を変更することはできません。最適化の進行状況を監視するだけです。

組み込み出力関数

これらの組み込み出力関数は、最適化の結果をファイルまたはワークスペースに保存します。

  • @assignInBase — 各反復後にワークスペース内の 'BayesoptResults' という名前の変数に結果を保存します。別の名前を選択するには、名前と値の引数 SaveVariableName を渡します。

  • @saveToFile — 各反復後に現在のフォルダー内の 'BayesoptResults.mat' という名前のファイルに結果を保存します。別の名前またはフォルダーを選択するには、名前と値の引数 SaveFileName を渡します。

たとえば、各反復後に結果を 'BayesIterations' という名前のワークスペース変数に保存するには、次のようにします。

results = bayesopt(fun,vars,'OutputFcn',@assignInBase, ...
    'SaveVariableName','BayesIterations')

カスタム出力関数

次のシグネチャを使用してカスタム出力関数を記述します。

stop = outputfun(results,state)

bayesopt は変数 results および state をカスタム関数に渡します。カスタム関数では、反復を停止する場合は true、継続を許可する場合は false に設定した stop を返します。

resultsBayesianOptimization クラスのオブジェクトです。results には、それまでの計算に関して使用できる情報が含まれています。

state は次の値が可能です。

  • 'initial'bayesopt は反復を開始しようとしています。

  • 'iteration'bayesopt は反復を 1 回完了したところです。

  • 'done'bayesopt で最後の反復が完了しました。

たとえば、ベイズ最適化の出力関数を参照してください。

ベイズ最適化の出力関数

この例では、ベイズ最適化でカスタム出力関数を使用する方法を示します。この出力関数は、交差検証誤差率である目的関数が 13% 未満になると最適化を停止させます。また、各反復の時間もプロットします。

function stop = outputfun(results,state)
persistent h
stop = false;
switch state
    case 'initial'
        h = figure;
    case 'iteration'
        if results.MinObjective < 0.13
            stop = true;
        end
        figure(h)
        tms = results.IterationTimeTrace;
        plot(1:numel(tms),tms')
        xlabel('Iteration Number')
        ylabel('Time for Iteration')
        title('Time for Each Iteration')
        drawnow
end
end

目的関数は ionosphere データの KNN 分類の交差検証損失です。データを読み込み、再現性を得るために既定の乱数ストリームを設定します。

load ionosphere
rng default

3 つの距離計量について 1 ~ 30 の近傍サイズで最適化します。

num = optimizableVariable('n',[1,30],'Type','integer');
dst = optimizableVariable('dst',{'chebychev','euclidean','minkowski'},'Type','categorical');
vars = [num,dst];

交差検証分割と目的関数を設定します。再現性を得るために、AcquisitionFunctionName'expected-improvement-plus' に設定します。最適化を実行します。

c = cvpartition(351,'Kfold',5);
fun = @(x)kfoldLoss(fitcknn(X,Y,'CVPartition',c,'NumNeighbors',x.n,...
    'Distance',char(x.dst),'NSMethod','exhaustive'));
results = bayesopt(fun,vars,'OutputFcn',@outputfun,...
    'AcquisitionFunctionName','expected-improvement-plus');
|=====================================================================================================|
| Iter | Eval   | Objective   | Objective   | BestSoFar   | BestSoFar   |            n |          dst |
|      | result |             | runtime     | (observed)  | (estim.)    |              |              |
|=====================================================================================================|
|    1 | Best   |     0.19943 |     0.44909 |     0.19943 |     0.19943 |           24 |    chebychev |
|    2 | Best   |     0.16809 |     0.36314 |     0.16809 |      0.1747 |            9 |    euclidean |
|    3 | Best   |     0.12536 |     0.11268 |     0.12536 |     0.12861 |            3 |    chebychev |

__________________________________________________________
Optimization completed.
Total function evaluations: 3
Total elapsed time: 7.6473 seconds
Total objective function evaluation time: 0.9249

Best observed feasible point:
    n       dst   
    _    _________

    3    chebychev

Observed objective function value = 0.12536
Estimated objective function value = 0.12861
Function evaluation time = 0.11268

Best estimated feasible point (according to models):
    n       dst   
    _    _________

    3    chebychev

Estimated objective function value = 0.12861
Estimated function evaluation time = 0.26373

関連するトピック