さまざまな機械学習アルゴリズムを比較したいと思います。その一環として、最適なハイパーパラメータのグリッド検索を実行できるようにする必要があります。ただし、固定アルゴリズムごとにグリッド検索の個別の実装と、そのハイパーパラメーターの固定サブセットを作成するという考えにはあまり興味がありません。代わりに、 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
方が、私の言いたいことがよくわかるかもしれません。