scikit-learn中GaussianProcessRegressor固定核参数无法复现结果
问题根源分析及解决方法
你遇到的结果差异核心原因有两个,按优先级排序:
1. 训练数据集完全不一致
原模型训练时用的是6个带噪声的采样样本:
gaussian_process.fit(X_train, y_train_noisy)
而固定参数后的模型错误地使用了全量无噪声的真实数据训练:
gaussian_process_fixed.fit(X,y)
这直接导致两个模型的拟合目标完全不同——原模型是拟合少量带噪声的观测值,而固定参数模型是拟合完整的真实函数,结果自然天差地别。
2. 核参数的精度损失
你手动截取的参数和实际优化值存在微小偏差:
- 实际
k1__constant_value为18.30421069841903,你用了18.30 - 实际
k2__length_scale为1.1043558649730463,你用了1.1043
虽然偏差很小,但高斯过程对核参数的变化可能比较敏感,尤其是当训练数据量很小时(比如这里只有6个样本),微小的参数差异也可能放大预测结果的不同。
修正后的代码
将固定参数模型的训练数据改为和原模型一致的X_train和y_train_noisy,同时保留完整的参数精度:
# 使用完整的优化后参数 kernel_fixed = ConstantKernel(constant_value=18.30421069841903, constant_value_bounds='fixed') * \ RBF(length_scale=1.1043558649730463, length_scale_bounds='fixed') gaussian_process_fixed = GaussianProcessRegressor(kernel=kernel_fixed, alpha=noise_std**2, n_restarts_optimizer=9) # 用相同的训练数据拟合 gaussian_process_fixed.fit(X_train, y_train_noisy) mean_prediction, std_prediction = gaussian_process_fixed.predict(X, return_std=True) # 绘图代码和原模型一致 plt.plot(X, y, label=r"$f(x) = x \sin(x)$", linestyle="dotted") plt.errorbar( X_train, y_train_noisy, noise_std, linestyle="None", color="tab:blue", marker=".", markersize=10, label="Observations", ) plt.plot(X, mean_prediction, label="Mean prediction") plt.fill_between( X.ravel(), mean_prediction - 1.96 * std_prediction, mean_prediction + 1.96 * std_prediction, color="tab:orange", alpha=0.5, label=r"95% confidence interval", ) plt.legend() plt.xlabel("$x$") plt.ylabel("$f(x)$") _ = plt.title("Gaussian process regression with fixed optimized kernel parameters")
这样修改后,固定参数模型的预测结果会和原模型几乎完全一致。
内容的提问来源于stack exchange,提问作者user37292
相关产品推荐
相关产品推荐

