【问题标题】:GaussianProcess regression results correct...up to a scale factor?GaussianProcess 回归结果正确...达到比例因子?
【发布时间】:2017-06-28 21:48:08
【问题描述】:

我正在对一些非常嘈杂的数据运行 GaussianProcess 回归。当我散布图预测(我知道,即均值预测)与实际值时,我得到了一条漂亮但略带噪声的 y=x 线。

只有一个问题:斜率完全错误。有什么方法可以在不构建第二阶段线性回归器的情况下解决这个问题?

我很遗憾无法分享我的数据,但我的模型相当基础。 X 是一个有 10 列的矩阵,y 是一个有 1 列的矩阵。我正在使用 1,000 个示例进行训练和绘图。

添加:下图绘制的是预测值与实际值。鉴于我使用的是非线性内核,我觉得奇怪的是 GP 回归器可以找到精确到乘数(斜率)的关系。

kernel = (
    GP.kernels.RationalQuadratic(
        length_scale=.8,
        length_scale_bounds=(1e-3,1e3),
        alpha=.8,
        alpha_bounds=(1e-3,1e3),
        )
    + GP.kernels.WhiteKernel()
    )

gp = Pipeline( [
    ('scale',preproc.StandardScaler()),
    ('gp',GP.GaussianProcessRegressor(kernel=kernel)),
    ] )
gp.fit( X, y )

补充说:我有点尴尬,但我尤其是 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)

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    编辑:在进行回归之前,您是否尝试过将数据居中? (从每个输出中减去所有输出值的平均值)。我知道 Matlab 中的 Gp Toolbox 不需要将数据居中,但我不确定 sklearn 中的 GP。看: https://stats.stackexchange.com/questions/29781/when-conducting-multiple-regression-when-should-you-center-your-predictor-varia

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

    【讨论】:

    • 虽然您的答案非常详细且很有帮助,但如果您清楚问题后发布答案会更好。应通过 cmets 或聊天请求澄清。
    • 刚从这里开始,直到 50 代表我才会评论主要问题。点。我想我可以聊天。禁止新成员使用 cmets 似乎有点违反直觉。我想他们有他们的理由。
    • 是的,起初我也觉得这很荒谬。然后,当我看到大量来自甚至不知道如何使用 Google 的人的低质量帖子时,我意识到这是有道理的,更不用说 StackOverflow 了。顺便说一句,这里给你 10 分 :)
    • 谢谢你 Ray- 非常好!希望前 50 个能快点到来,这样我就可以开始做真正的 cmets。如果我能提供帮助,我可能会看到 Andreus 说了什么,然后删除这个答案并提出一个新的答案。
    • (1) 见编辑。 (2) 我会玩更多,但我已经尝试了很多,包括 RBF(完全相同的结果,RationalQuadratic 也是 RBF 的超集)。 (3) 我没有,但怀疑它会起作用,因为我使用非线性 RBF 类内核来获得这个结果。 (4) 我有 300,000 点。结果与 1,000 到 4,000 个点的训练没有什么不同,并且在 10 个输入维度下,求解器会因更多数据而过载。
    猜你喜欢
    • 2018-06-20
    • 2020-12-20
    • 1970-01-01
    • 2021-10-07
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多