首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习高斯过程回归优化函数中如何改变max_iter?

学习高斯过程回归优化函数中如何改变max_iter?
EN

Stack Overflow用户
提问于 2020-06-14 17:45:56
回答 2查看 7.5K关注 0票数 15

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

代码语言:javascript
复制
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的探地雷达模型中根本不是一个参数。我试图按建议重新处理数据,但它没有起作用,坦率地说,我不理解它(我还需要缩放输出吗?再说一遍,文件很少)。

在优化过程中增加最大迭代是有意义的,但是sklearn似乎没有办法做到这一点,这是令人沮丧的,因为他们建议这样做是为了响应这个警告。

看看探地雷达源代码,这就是sklearn调用优化器的方式,

代码语言:javascript
复制
 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()的默认值为

代码语言:javascript
复制
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})

根据枕骨文档

我想使用上面所示的优化器,如GPR源代码中所示,但将maxiter更改为更高的数字。换句话说,我不想改变优化器的行为,而不是通过增加最大迭代而进行的更改。

面临的挑战是,其他参数(如obj_func, initial_theta, bounds )是在探地雷达源代码中设置的,无法从探地雷达对象访问。

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

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-15 01:45:28

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

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

代码语言:javascript
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2020-11-22 18:29:39

对我起作用的是以下几点。我使用继承,还重新定义了_constrained_optimization方法。

代码语言:javascript
复制
class MyGPR(GaussianProcessRegressor):
    def __init__(self, *args, max_iter=2e05, gtol=1e-06, **kwargs):
        super().__init__(*args, **kwargs)
        self._max_iter = max_iter
        self._gtol = gtol

    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, options={'maxiter':self._max_iter, 'gtol': self._gtol})
            _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

要使此操作正常,除了您通常的导入之外,还应该导入以下内容

代码语言:javascript
复制
from sklearn.utils.optimize import _check_optimize_result
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62376164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档