如何在sklearn高斯过程回归使用的优化函数中更改max_iter?

无线网络

我正在使用sklearn的GPR库,但偶尔会遇到此烦人的警告:

ConvergenceWarning: lbfgs failed to converge (status=2):
ABNORMAL_TERMINATION_IN_LNSRCH.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
  _check_optimize_result("lbfgs", opt_res)

我不仅几乎找不到有关此警告的文档,而且max_iter根本不是sklearn的GPR模型中的参数。我尝试按照建议的方法缩放数据,但是它没有用,并且坦率地说我不理解(我还需要缩放输出吗?同样,文档很少)。

在优化过程中增加最大迭代是有道理的,但是sklearn似乎没有做到这一点的方法,这很令人沮丧,因为他们响应此警告而建议这样做。

查看GPR源代码,这就是sklearn调用优化器的方式,

 def _constrained_optimization(self, obj_func, initial_theta, bounds):
        if self.optimizer == "fmin_l_bfgs_b":
            opt_res = scipy.optimize.minimize(
                obj_func, initial_theta, method="L-BFGS-B", jac=True,
                bounds=bounds)
            _check_optimize_result("lbfgs", opt_res)
            theta_opt, func_min = opt_res.x, opt_res.fun
        elif callable(self.optimizer):
            theta_opt, func_min = \
                self.optimizer(obj_func, initial_theta, bounds=bounds)
        else:
            raise ValueError("Unknown optimizer %s." % self.optimizer)

        return theta_opt, func_min

其中的scipy.optimize.minimize()默认值为

scipy.optimize.minimize(fun, x0, args=(), method='L-BFGS-B', jac=None, bounds=None, 
tol=None, callback=None, options={'disp': None, 'maxcor': 10, 'ftol': 2.220446049250313e-09,
'gtol': 1e-05, 'eps': 1e-08, 'maxfun': 15000, 'maxiter': 15000, 'iprint': -1, 'maxls': 20})

根据scipy的文档

我想完全使用上面GPR源代码中所示的优化程序,但是将maxiter更改为更大的数字。换句话说,除了增加最大迭代次数之外,我不想更改优化程序的行为。

挑战在于,其他参数(例如obj_func, initial_theta, boundsGPR源代码中设置的参数)无法从GPR对象访问。

这就是我调用GPR的方式,请注意,除了n_restarts_optimizer和内核之外,这些大多数都是默认参数。

for kernel in kernels:
    gp = gaussian_process.GaussianProcessRegressor(
                    kernel              = kernel,
                    alpha               = 1e-10,
                    copy_X_train        = True,
                    optimizer           = "fmin_l_bfgs_b",
                    n_restarts_optimizer= 25,
                    normalize_y         = False,
                    random_state        = None)
Bnaecker

您想扩展和/或修改现有Python对象的行为,这听起来像是继承的好用例。

一个解决方案可能是从scikit-learn实现继承,并确保使用所需的参数调用常规的优化器。这是一个草图,但是请注意,这未经测试。

from functools import partial
from sklearn.gaussian_process import GaussianProcessRegressor
import scipy.optimize

class MyGPR(GaussianProcessRegressor):
    def __init__(self, *args, max_iter=15000, **kwargs):
        super().__init__(*args, **kwargs)
        self._max_iter = max_iter

    def _constrained_optimization(self, obj_func, initial_theta, bounds):
        def new_optimizer(obj_func, initial_theta, bounds):
            return scipy.optimize.minimize(
                obj_func,
                initial_theta,
                method="L-BFGS-B",
                jac=True,
                bounds=bounds,
                max_iter=self._max_iter,
            )
        self.optimizer = new_optimizer
        return super()._constrained_optimization(obj_func, initial_theta, bounds)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Scikit学习,KMeans:如何使用max_iter

Sklearn:使用预训练的超参数高斯过程回归

在sklearn python中使用高斯过程回归时出错

early_stopping设置为False,但是迭代在Sklearn MLPClassifier中的max_iter之前停止

如何在scikit-learn中为高斯过程回归器创建自定义内核?

CPLEX C ++:如何在优化过程中更改参数

为高斯过程回归优化超参数时的不同结果

高斯过程回归的各向异性内核如何与可变数量的特征一起使用?

在Python中重现R的高斯过程最大似然回归

scikit-learn中的多输出高斯过程回归

使用scikit-learn的WhiteKernel进行高斯过程回归

高斯过程回归增量学习

sklearn的python代码中如何在回归中使用SwarmPackagePy?

如何在 sklearn 中对负二项式回归使用 K 折交叉验证?

如何在sklearn中对连续但有界的因变量使用逻辑回归?

在斯坦/斯坦优化高斯过程

如何在 sklearn 的拟合函数中选择要优化的指标?

如何正确使用scikit-learn的高斯过程进行2D输入,1D输出回归?

如何在Excel中优化VBA函数

pymc3多重高斯过程回归

高斯过程回归:标准偏差含义

如何在训练过程中添加具有不同std的高斯噪声?

如何在函数中使用iter(v,w)?

在 R 中从高斯过程生成函数数据

使用Matlab进行高斯过程平方协方差函数?

如何为约束为正的观测值建立高斯过程回归模型

如何在R中更改逻辑回归输出

如何在matconvnet中通过回归更改softmaxlayer

使用高斯过程回归 (GPR) 预测无线电信号强度 (RSS)