GaussianProcess回归结果正确...达到比例因子?

时间:2017-06-23 20:18:55

标签: python scikit-learn

我正在对一些非常嘈杂的数据运行GaussianProcess回归。当我分散情节预测(我知道,手段的预测)与实际情况相比时,我得到了一个美丽的,只是略微嘈杂的y = x线。

只有一个问题:坡度完全错误。有没有办法在不构建第二阶段线性回归量的情况下解决这个问题?

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

添加:下图是预测与实际的对比。鉴于我使用的是非线性内核,我发现奇怪的是,GP回归量可以找到一个精确到乘数(斜率)的关系。

enter image description here

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行为,即,当我通过" pretraining&#34给出大量数据时,优化让我很难过。 ;在少量数据上,使用优化器为内核参数找到合理的值,然后" training"更大量的数据。这允许我扩展参数搜索并在优化器上使用多次重启,找到一个更通用的模型......这几乎都是噪声。这真是我所期待的。

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)

1 个答案:

答案 0 :(得分:2)

编辑:在进行回归之前,您是否尝试将数据居中? (从每个输出中减去所有输出值的平均值)。我知道Matlab中的Gp工具箱并不需要数据居中,但我不确定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的一个非常传统的内核功能。