如何优化机器学习超参数以便在多个模型中重用?

我有多个数据集,每个数据集我都想拟合一个高斯过程回归模型。使用fitrgp选择的默认超参数在主观上似乎产生了不太理想的模型。启用超参数优化通常会带来显著的改进,但偶尔会产生极端的过拟合值,并且这是一个计算密集的过程,实际上禁止了对每个模型进行优化。

由于fitrgp只是简单地包装了bayesopt来进行其超参数优化,是否可以直接调用bayesopt来最小化多个模型的损失总和(例如,平均值),而不是一次一个模型的损失?

例如,如果每个数据集都包含在一个表格的单元数组tbls中,我希望找到一个单一的sigma值,可以在对每个表调用fitrgp时使用:

gprMdls = cellfun(@(tbl) {fitrgp(tbl,'ResponseVarName', 'Sigma',sigma)}, tbls);

numel(tbls) == 1时,这个过程相当于:

gprMdl = fitrgp(tbls{1},'ResponseVarName', 'OptimizeHyperparameters','auto');sigma = gprMdl.Sigma;

但这种实现无法自然扩展到为多个模型优化单一的Sigma值的结果。


回答:

最后,我通过直接干预内置的优化例程实现了这一点。

通过在bayesopt的开始处设置断点(通过edit bayesopt),并使用单个输入数据集调用fitrgp,我能够从函数调用堆栈中确定bayesopt使用的目标函数是通过调用classreg.learning.paramoptim.createObjFcn构建的。我还捕获并存储了bayesopt的其余输入参数,以确保我的函数调用与fitrgp构建的完全相同。

classreg.learning.paramoptim.createObjFcn的开始处设置断点,并重新调用fitrgp,我能够捕获并存储此函数的输入参数,这样我就可以为不同的预测器表创建目标函数。

对于我的表格单元数组tbls,以及在捕获的createObjFcn作用域中命名的所有其他变量保持不变:

objFcns = cell(size(tbls));for ii = 1:numel(tbls)    objFcn{ii} = classreg.learning.paramoptim.createObjFcn( ...        BOInfo, FitFunctionArgs, tbls{ii}, Response, ...        ValidationMethod, ValidationVal, Repartition, Verbose);end

然后可以通过取每个数据集的目标函数的平均值来构建一个总体目标函数:

objFcn = @(varargin) mean(cellfun(@(f) f(varargin{:}),objFcns));

然后我能够使用这个objFcn以及从原始调用中捕获的其余参数调用bayesopt。这产生了一组所需的超参数,它们似乎对所有数据集都表现良好。

Related Posts

L1-L2正则化的不同系数

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

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

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

f1_score metric in lightgbm

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

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

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

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

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

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

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

发表回复

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