5

さまざまな機械学習アルゴリズムを比較したいと思います。その一環として、最適なハイパーパラメータのグリッド検索を実行できるようにする必要があります。ただし、固定アルゴリズムごとにグリッド検索の個別の実装と、そのハイパーパラメーターの固定サブセットを作成するという考えにはあまり興味がありません。代わりに、 scikit-learn のように見えるようにしたいと思いますが、おそらくそれほど多くの機能はなく (たとえば、複数のグリッドは必要ありません)、MATLAB で記述します。

これまでのところ、まだ書かれていないのロジックを理解しようとしていますgrid_search.m

function model = grid_search(algo, data, labels, varargin)
    p = inputParser;
    % here comes the list of all possible hyperparameters for all algorithms
    % I will just leave three for brevity
    addOptional(p, 'kernel_function', {'linear'});
    addOptional(p, 'rbf_sigma', {1});
    addOptional(p, 'C', {1});

    parse(p, algo, data, labels, varargin{:});

    names = fieldnames(p.Results);
    values = struct2cell(p.Results); % a cell array of cell arrays

    argsize = 2 * length(names);
    args = cell(1, argsize);
    args(1 : 2 : argsize) = names;
    % Now this is the stumbling point.
end

関数の呼び出しは次のgrid_searchようになります。

m = grid_search('svm', data, labels, 'kernel_function', {'rbf'}, 'C', {[0.1], [1], [10]}, 'rbf_sigma', {[1], [2], [3]})
m = grid_search('knn', data, labels, 'NumNeighbors', {[1], [10]}, 'Distance', {'euclidean', 'cosine'})

最初の呼び出しでは、rbf カーネルと Constraints および Sigmas のすべての組み合わせを試します。

{'rbf', 0.1, 1}
{'rbf', 0.1, 2}
{'rbf', 0.1, 3}
{'rbf', 1, 1}
{'rbf', 1, 2}
{'rbf', 1, 3}
{'rbf', 10, 1}
{'rbf', 10, 2}
{'rbf', 10, 3}

args変数の背後にある考え方は、{'name1', 'value1', 'name2', 'value2', ..., 'nameN', 'valueN'}後で対応するアルゴリズムに渡される形式のセル配列であるということです: algo(data, labels, args{:}). その{'name1', 'name2', ..., 'nameN'}部分は簡単です。{'value1', 'value2', ..., 'valueN'}問題は、各ステップでパーツを作成する方法がわからないことです。

機械学習の用語は誰もが知っているわけではないことを理解しています。そのため、以下に自己完結型の例を示します。

TARDIS の乗組員が次のクラスの存在で構成されているとします。

tardis_crew = {{'doctor'}, {'amy', 'clara'}, {'dalek', 'cyberman', 'master'}}

Timelord、Companion、Villain には常に 1 つの場所しかないため、次の cell 配列を生成する方法を教えてください。

{'Timelord', 'doctor', 'Companion', 'amy', 'Villain', 'dalek'}
{'Timelord', 'doctor', 'Companion', 'amy', 'Villain', 'cyberman'}
{'Timelord', 'doctor', 'Companion', 'amy', 'Villain', 'master'}
{'Timelord', 'doctor', 'Companion', 'clara', 'Villain', 'dalek'}
{'Timelord', 'doctor', 'Companion', 'clara', 'Villain', 'cyberman'}
{'Timelord', 'doctor', 'Companion', 'clara', 'Villain', 'master'}

解決策は一般的なものである必要があります。つまり、クラス内の存在の数が変更されたり、より多くのクラスの存在が追加されたりしても、引き続き機能するはずです。コードではなく、段階的な説明もいただければ幸いです。

PS:オリジナルのストリップされていないgithub バージョンのgrid_search.m方が、私の言いたいことがよくわかるかもしれません。

4

1 に答える 1

2

あなたが望むのは、任意の数のセットのデカルト積を生成することです。このALLCOMB関数がそれを行うと思いますが、(反復)アルゴリズムの詳細が必要な場合は、自分で実装できるようにするには、この回答を確認してください。

編集:ML の知識のない人に一般的な言い回しを提供してくれてありがとう。

于 2013-12-10T13:07:50.487 に答える