我正在对一些非常嘈杂的数据运行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行为,即,当我通过" 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)
答案 0 :(得分:2)
老评论: 核函数中超参数的初始值(即长度和alpha)非常重要。在fit()期间,超参数被优化,并且可以找到超局部的局部最大值,这可能反过来影响您的结果。根据您为这些超参数设置的范围,可以根据初始条件找到许多局部最大值。 在sklearn网站上,它说: "由于LML可能有多个局部最优,因此可以通过指定n_restarts_optimizer重复启动优化器。" 您可以尝试使用RBF功能,因为它是GP的一个非常传统的内核功能。