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

我有多个数据集,每个数据集我都想拟合一个高斯过程回归模型。使用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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