【发布时间】: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