MATLAB中算法无关的超参数网格搜索

我想比较不同的机器学习算法。作为其中的一部分,我需要能够执行超参数的网格搜索。然而,我并不想为每个固定的算法及其超参数的固定子集编写单独的网格搜索实现。相反,我希望它看起来更像scikit-learn中的那样,但可能功能没有那么多(例如,我不需要多个网格),并且用MATLAB编写。

到目前为止,我正在尝试理解尚未编写的grid_search.m的逻辑

function model = grid_search(algo, data, labels, varargin)    p = inputParser;    % 这里是所有算法所有可能超参数的列表    % 为了简洁,我只列出三个    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); % 一个单元数组的单元数组    argsize = 2 * length(names);    args = cell(1, argsize);    args(1 : 2 : argsize) = names;    % 现在这是个难点。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核与约束和Sigma的所有组合:

{'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未剥离版本的github版本可能会让你更好地理解我的意思。


回答:

看起来你想要生成任意数量集合的笛卡尔积。我认为这个ALLCOMB函数可以帮你做到这一点,但如果你想要一个(迭代)算法的详细信息,以便你自己实现,请查看这个答案

编辑:顺便说一句,谢谢你为没有机器学习知识的人提供了一个通用的表述方式。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注