sklearn 高斯过程回归器中的优化器调整

Posted

技术标签:

【中文标题】sklearn 高斯过程回归器中的优化器调整【英文标题】:Optimizer Tuning in sklearn Gaussian Process Regressor 【发布时间】:2017-12-09 11:46:40 【问题描述】:

我正在尝试使用GaussianProcessRegressor as part of scikit-learn 0.18.1

我正在对 200 个数据点进行训练,并为我的内核使用 13 个输入特征 - 一个常数乘以具有十二个元素的径向基函数。该模型运行时没有任何抱怨,但如果我多次运行相同的脚本,我注意到有时会得到不同的解决方案。可能值得注意的是,一些优化的参数正在运行到我提供的范围内(我目前正在研究哪些功能很重要)。

我尝试将参数n_restarts_optimizer 增加到50,虽然这需要更长的时间来运行它并没有消除明显随机性的元素。尽管我没有运气,但似乎可以更改优化器本身。从快速扫描看来,语法上最相似的是 scipy 的 fmin_tncfmin_slsqp(其他优化器不包括边界)。但是,使用其中任何一个都会导致其他问题:例如,fmin_tnc 不会返回目标函数的最小值。

对于如何拥有更具确定性的脚本有什么建议吗?理想情况下,无论迭代如何,我都希望它打印相同的值,因为就目前而言,它感觉有点像彩票(因此得出任何结论都是值得怀疑的)。

我正在使用的代码的 sn-p:

from sklearn.gaussian_process import GaussianProcessRegressor as GPR
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C

lbound = 1e-2
rbound = 1e1
n_restarts = 50
n_features = 12 # Actually determined elsewhere in the code
kernel = C(1.0, (lbound,rbound)) * RBF(n_features*[10], (lbound,rbound))
gp = GPR(kernel=kernel, n_restarts_optimizer=n_restarts)
gp.fit(train_input, train_outputs)
test_model, sigma2_pred = gp.predict(test_input, return_std=True)
print gp.kernel_

【问题讨论】:

您可以尝试编辑您的问题以减少基于意见的问题。有没有办法表达你的问题,它有一个(大部分)客观正确的答案? 我不确定我明白你的意思,@Ares。 检查您在代码中使用的所有方法或类的文档,看看它们是否包含“random_state”参数。如果是,将其设置为固定值 嗨@Andrew,我只能使用优化器'fmin_l_bfgs_b'。关于如何使用“fmin_tnc”和“fmin_slsqp”的任何想法?但是,我看过他们的文档,但仍然无法找出正确的方法。 【参考方案1】:

这使用initialize optimization的随机值:

由于 LML 可能有多个局部最优,优化器可以是 通过指定 n_restarts_optimizer 重复启动。

据我了解,总会有随机因素。有时它会找到局部最小值,也就是你提到的界限。

如果您的数据允许(可逆 X 矩阵),如果适合您的需要,您可以使用正规方程,那里没有随机因素。

您可以在此基础上进行(类似于随机森林)采样,多次运行此算法并选择最佳拟合或共同值:您必须权衡一致性与准确性。

希望我正确理解了您的问题。

【讨论】:

所以要清楚,您将如何使用正规方程作为高斯过程的一部分?我只熟悉线性回归中的这种技术。 我提供切换方法。例如,如果您使用高斯过程作为建模和预测方法,您可以在 200 个数据点上运行非线性变换和线性回归的迭代。对于线性回归,您可以使用正态方程 (MLS)。这是对预测值的不确定性信息损失的一致性权衡。

以上是关于sklearn 高斯过程回归器中的优化器调整的主要内容,如果未能解决你的问题,请参考以下文章

SKlearn:高斯过程回归在学习期间没有改变

sklearn 高斯朴素贝叶斯 - 为啥是“高斯”?

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

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

使用 sklearn 和 GPFlow 的高斯回归

scikit learn 中的高斯处理回归,无需内核梯度评估