Python 高斯过程回归结果正确…达到比例因子?

Python 高斯过程回归结果正确…达到比例因子?,python,scikit-learn,Python,Scikit Learn,我正在对一些非常嘈杂的数据进行高斯过程回归。当我用散点图预测(我知道,这是平均值预测)与实际值对比时,我得到了一条漂亮的y=x线 只有一个问题:坡度是完全错误的。有没有什么方法可以在不建立第二阶段线性回归的情况下解决这个问题 很抱歉,我不能分享我的数据,但我的模型相当基本。X是一个有10列的矩阵,y是一个有1列的矩阵。我用1000个例子来训练和策划 新增:下图为预测图与实际图。考虑到我使用的是一个非线性核,我觉得奇怪的是,GP回归器可以找到一个精确到乘数(斜率)的关系 补充:我有点尴尬,但我对

我正在对一些非常嘈杂的数据进行高斯过程回归。当我用散点图预测(我知道,这是平均值预测)与实际值对比时,我得到了一条漂亮的y=x线

只有一个问题:坡度是完全错误的。有没有什么方法可以在不建立第二阶段线性回归的情况下解决这个问题

很抱歉,我不能分享我的数据,但我的模型相当基本。X是一个有10列的矩阵,y是一个有1列的矩阵。我用1000个例子来训练和策划

新增:下图为预测图与实际图。考虑到我使用的是一个非线性核,我觉得奇怪的是,GP回归器可以找到一个精确到乘数(斜率)的关系

补充:我有点尴尬,但我对GP世界特别陌生,实际上,回归是一个ML问题。我没有在测试集上绘制模型的性能图,这显示出强烈的过度拟合。此外,我在代码中添加了一个习惯用法来处理scikit learn的默认GP行为,也就是说,当我给它大量数据时,优化让我很难过,方法是对少量数据进行“预训练”,使用优化器为内核参数找到合理的值,然后“训练”大量数据。这使我能够扩大参数搜索范围,并在优化器上使用多次重新启动,找到一个更具普遍性的模型……几乎全是噪音。这正是我所期待的,真的

kernel = (
    GP.kernels.RationalQuadratic(
        length_scale=1,
        alpha=.5,
        )
    + GP.kernels.WhiteKernel(
        noise_level=1,
        )
    )*GP.kernels.ConstantKernel()

gp = Pipeline( [
    ('scale',preproc.StandardScaler()),
    ('gp',GP.GaussianProcessRegressor(
        kernel=kernel,
        n_restarts_optimizer=3,
        alpha=0,
        )),
    ] )
print("pretraining model for target %s..." % c)
x_pre = X_s.values[:500,:]
y_pre = y_s_scl[:500,:]
gp.fit( x_pre, y_pre )

gp = Pipeline( [
    ('scale',preproc.StandardScaler()),
    ('gp',GP.GaussianProcessRegressor(
        kernel=kernel,
        optimizer=None,
        alpha=0,
        )),
    ] )
print("training model for target %s..." % c)

编辑:在进行回归之前,您是否尝试过将数据居中?(从每个输出中减去所有输出值的平均值)。我知道Matlab中的Gp工具箱不需要数据居中,但我不确定sklearn中的Gp。见:

旧评论: 内核函数中超参数的初始值(即长度刻度和alpha)非常重要。在fit()过程中,会优化超参数,并找到超参数的局部最大值,这反过来可能会影响结果。根据为这些超参数设置的边界,可以根据初始条件找到许多局部最大值。 在sklearn网站上,它说: 由于LML可能有多个局部最优值,可以通过指定n_restarts_optimizer重复启动优化器
您可以尝试使用RBF函数,因为它是GP的一个非常传统的核函数

虽然你的答案非常详细和有帮助,但如果你清楚问题后再发布答案会更好。澄清应该通过评论或聊天来要求。因为刚刚开始,在50个代表点之前,我不会对主要问题发表评论。我想我可以聊天。禁止对新成员发表评论似乎有点违反直觉。我想他们有他们的理由。是的,一开始我觉得这也很荒谬。然后,当我看到大量低质量的帖子充斥着这个网站时,我意识到这是有道理的,这些帖子来自那些甚至不知道如何使用谷歌的人,更不用说StackOverflow了。这里有10点给你,顺便说一句:)谢谢你,雷-你真是太好了!希望前50名能尽快到来,这样我就可以开始做真正的评论了。如果我能帮上忙的话,我可能会先看看安德鲁斯说了什么,然后删除这个答案,然后再放一个新的。(1)见编辑。(2) 我会玩得更多,但我已经尝试过很多了,包括RBF(完全相同的结果,也是理性二次型是RBF的超集)。(3) 我没有,但怀疑它会起作用,因为我使用了一个类似于非线性RBF的核来得到这个结果。(4) 我得了30万分。结果与在1000到4000个点上进行的训练没有什么不同,在10个输入维度上,解算器会因更多的数据而过载。
kernel = (
    GP.kernels.RationalQuadratic(
        length_scale=1,
        alpha=.5,
        )
    + GP.kernels.WhiteKernel(
        noise_level=1,
        )
    )*GP.kernels.ConstantKernel()

gp = Pipeline( [
    ('scale',preproc.StandardScaler()),
    ('gp',GP.GaussianProcessRegressor(
        kernel=kernel,
        n_restarts_optimizer=3,
        alpha=0,
        )),
    ] )
print("pretraining model for target %s..." % c)
x_pre = X_s.values[:500,:]
y_pre = y_s_scl[:500,:]
gp.fit( x_pre, y_pre )

gp = Pipeline( [
    ('scale',preproc.StandardScaler()),
    ('gp',GP.GaussianProcessRegressor(
        kernel=kernel,
        optimizer=None,
        alpha=0,
        )),
    ] )
print("training model for target %s..." % c)