我正在对一些非常嘈杂的数据进行GaussianProcess回归。当我将图预测(我知道,这是对均值的预测)和实际值相比较时,我得到了一条只有轻微噪音的y=x线。
只有一个问题:斜坡完全错了。有什么办法,我可以解决这个问题,而无需建立第二阶段线性回归?
我很遗憾我不能分享我的数据,但我的模型是相当基本的。X是10列的矩阵,y是1列的矩阵。我用1000个例子来训练和策划。
补充:下面的情节是绘图,预测和实际。考虑到我使用的是一个非线性核,我觉得奇怪的是,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行为,也就是说,当我对少量数据进行“预培训”,使用优化器为内核参数找到合理的值,然后“训练”大量的数据时,优化会让我很难过。这使我能够扩大参数搜索范围,并在优化器上使用多个重新启动,找到一个更具通用性的model...which几乎都是杂讯。这正是我所期望的,真的。
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)
发布于 2017-06-24 02:47:22
编辑:在进行回归之前,您是否尝试过将数据对齐?(从每个输出中减去所有输出值的平均值)。我知道,在Matlab中的Gp工具箱不需要数据的中心,但我不确定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的一个非常传统的内核函数。
https://stackoverflow.com/questions/44729373
复制相似问题