如何使用sklearn设置高斯过程均值函数形式并对比预测误差
在sklearn的GaussianProcessRegressor中设置不同均值函数的方法
嘿,我刚好对sklearn里的高斯过程回归这块比较熟,你问的怎么设置线性/多项式均值函数来对比预测误差的问题,其实GaussianProcessRegressor是支持自定义或预定义均值函数的,normalize_y只是对目标变量做标准化的预处理步骤,和模型的均值函数完全是两回事~下面我给你一步步讲清楚怎么操作:
核心知识点:mean_function参数
sklearn的GaussianProcessRegressor提供了mean_function参数,专门用来指定高斯过程的先验均值函数。这个参数可以接受两种类型的输入:
- sklearn官方预定义的均值函数类(比如线性、多项式均值,在
sklearn.gaussian_process.mean_functions模块下) - 自定义的可调用函数(或者继承
BaseMeanFunction的自定义类,支持参数学习)
实操代码示例:对比线性与多项式均值的预测误差
我用模拟数据来演示完整流程,你可以直接套用到自己的数据集上:
1. 导入所需模块
import numpy as np from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C from sklearn.gaussian_process.mean_functions import LinearMean, PolynomialMean from sklearn.metrics import mean_squared_error
2. 生成模拟数据
我们造一个包含线性+二次项的带噪声数据,方便后续对比不同均值函数的效果:
np.random.seed(42) # 固定随机种子保证可复现 X = np.linspace(0, 10, 100).reshape(-1, 1) # 特征数据,形状(100,1) y_true = 2 * X + 3 * X**2 + np.random.normal(0, 5, size=X.shape) # 真实标签
3. 训练带线性均值的GP模型
# 初始化线性均值函数(会自动学习线性系数) linear_mean = LinearMean() # 定义核函数(这里用常数核×RBF核,你可以根据需求换其他核) kernel_linear = C(1.0, (1e-3, 1e3)) * RBF(1.0, (1e-2, 1e2)) # 构建GP回归器 gp_linear = GaussianProcessRegressor( kernel=kernel_linear, mean_function=linear_mean, normalize_y=True, # 标准化y是预处理,和均值函数不冲突 random_state=42 ) # 拟合模型并预测 gp_linear.fit(X, y_true) y_pred_linear = gp_linear.predict(X) # 计算MSE误差 mse_linear = mean_squared_error(y_true, y_pred_linear) print(f"线性均值模型的MSE: {mse_linear:.2f}")
4. 训练带多项式均值的GP模型
我们以二次多项式为例:
# 初始化二次多项式均值函数(degree指定多项式次数,会自动学习系数) poly_mean = PolynomialMean(degree=2) # 核函数可以和线性均值的一样,也可以换 kernel_poly = C(1.0, (1e-3, 1e3)) * RBF(1.0, (1e-2, 1e2)) # 构建GP回归器 gp_poly = GaussianProcessRegressor( kernel=kernel_poly, mean_function=poly_mean, normalize_y=True, random_state=42 ) # 拟合模型并预测 gp_poly.fit(X, y_true) y_pred_poly = gp_poly.predict(X) # 计算MSE误差 mse_poly = mean_squared_error(y_true, y_pred_poly) print(f"二次多项式均值模型的MSE: {mse_poly:.2f}")
5. 自定义均值函数(可选)
如果官方的均值函数满足不了你的需求,比如想要三次多项式均值,你可以自己写一个:
# 自定义固定形式的均值函数 def cubic_mean(X): return 1*X**3 + 2*X**2 + 3*X # 构建带自定义均值的GP模型 gp_custom = GaussianProcessRegressor( kernel=kernel_poly, mean_function=cubic_mean, normalize_y=True, random_state=42 ) gp_custom.fit(X, y_true)
如果想要让自定义均值函数的参数可学习(比如自动拟合三次项的系数),可以继承BaseMeanFunction基类来实现,这里就不展开了,官方的PolynomialMean其实已经支持任意次数的可学习均值。
注意事项
normalize_y是对目标变量y做标准化(减去均值除以标准差),属于数据预处理步骤,和模型的先验均值函数是独立的,两者可以同时使用。- 均值函数必须接受形状为
(n_samples, n_features)的特征数组X,返回形状为(n_samples,)的均值数组。 - 如果你用的sklearn版本较旧,可能没有
sklearn.gaussian_process.mean_functions模块,这时候可以用自定义函数替代,或者升级sklearn到较新版本。
内容的提问来源于stack exchange,提问作者Wiles Dai
相关产品推荐
相关产品推荐

