【发布时间】:2013-12-27 18:19:20
【问题描述】:
我想比较不同的机器学习算法。作为其中的一部分,我需要能够执行grid search for optimal hyperparameters。但是,我并不真正喜欢为每个固定算法及其超参数的固定子集编写一个单独的网格搜索实现。相反,我希望它看起来更像它在 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', '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:原始grid_search.m 的non-stripped github 版本可能会让您更好地理解我的意思。
【问题讨论】:
标签: algorithm matlab machine-learning hyperparameters