使用python寻找多维模型的最佳参数集

问题描述

假设我有一个模型,在给定一组模型参数 xj 的情况下,它可以预测一组变量 Yi 的结果。我现在想找到最优参数 xj 使得模型给出的 Yi 值接近于一组最优(固定)的目标参数 Y'i 。为简单起见,我们假设三个模型参数 xj = (a,b,c)。然后,数据集将如下所示:

模型参数(a,c) 输出变量 Yi
(0,1.4) (3.2,32. 12,...)
(0,1,14.2) (-4.1,342. 13.5,...)
... ...

模型参数 a、b、c 是通过离散网格扫描的(可以自由选择,但有一些限制)。有没有一种简单的方法可以在 python 中使用一些现有的库来做到这一点?任何帮助表示赞赏!

解决方法

这里有一些提示:

评估:问题是:什么是optimal parameters?您需要定义一些目标函数(它将根据您定义的目标来衡量您的模型在给定参数下的好坏程度)。对于prevent overfitting(您的模型过于适应您拥有的数据,当应用于新数据时,它的表现会很差),通常目标函数包括 regularization(即我们不会太紧密地拟合我们的训练数据,以使其成为我们稍后可能会遇到的更好的数据)。这是一个带有 scikit-learn 的回归示例,其中包含您可以使用的各种评估/正则化算法:
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html

计算:如果您的参数是连续的(它们很可能是连续的),那么您有无限数量的可能值(例如,即使在 0 和 1 之间,也有无限数量的实际值),因此,测试所有可能的参数值是不可能的,而且您need some algorithm to find values which are somewhat optimum(您可能永远找不到全局最优值,但只要您找到能够为您的模型提供令人满意的性能的参数,这才是最重要的) .实际上,这围绕着对数据进行采样,评估模型输出作为尝试新值的指示,并重复进行,直到我们认为我们已经达到某个最佳状态(或者我们已经花费了足够的时间/资源,我们应该停止寻找)。 SGD 是一种非常常用的方法。所有 ML 库都支持它,这里是一个例子:
https://scikit-learn.org/stable/auto_examples/linear_model/plot_sgd_iris.html#sphx-glr-auto-examples-linear-model-plot-sgd-iris-py

我最近出现的一些库(我还没有测试过),它需要一些函数 + 参数边界 + 一些目标(又名目标)函数作为输入,并试图找到最佳参数集:
https://github.com/python-adaptive/adaptive

from adaptive import notebook_extension,Runner,Learner1D
notebook_extension()

def peak(x,a=0.01):
    return x + a**2 / (a**2 + x**2)

learner = Learner1D(peak,bounds=(-1,1))
runner = Runner(learner,goal=lambda l: l.loss() < 0.01)
runner.live_info()
runner.live_plot()

enter image description here