1.7. 高斯过程#

高斯过程 (GP) 是一种非参数监督学习方法,用于解决回归概率分类问题。

高斯过程的优点包括:

  • 预测会内插观测值(至少对于常规核而言)。

  • 预测是概率性的(高斯),因此可以计算经验置信区间,并根据这些区间决定是否应在感兴趣的区域中重新拟合(在线拟合、自适应拟合)预测。

  • 多功能:可以指定不同的。提供了常见的核,但也可以指定自定义核。

高斯过程的缺点包括:

  • 我们的实现不是稀疏的,即它们使用全部样本/特征信息来执行预测。

  • 它们在高维空间中效率会降低——即当特征数量超过几十个时。

1.7.1. 高斯过程回归 (GPR)#

为了回归目的,GaussianProcessRegressor 实现了高斯过程(GP)。为此,需要指定 GP 的先验。GP 将结合此先验和基于训练样本的似然函数。它通过在预测时输出均值和标准差,提供了一种概率预测方法。

../_images/sphx_glr_plot_gpr_noisy_targets_002.png

先验均值假定为常数且为零(对于 normalize_y=False)或训练数据的均值(对于 normalize_y=True)。先验的协方差通过传递一个对象来指定。核的超参数在拟合GaussianProcessRegressor时,通过最大化基于传入optimizer的对数边缘似然(LML)来优化。由于 LML 可能有多个局部最优解,可以通过指定n_restarts_optimizer来重复启动优化器。第一次运行总是从核的初始超参数值开始;后续运行则从允许值范围内随机选择的超参数值开始。如果初始超参数应保持固定,可以将None作为优化器传入。

目标中的噪声水平可以通过参数 alpha 来指定,可以是全局标量或每个数据点独立设置。请注意,适度的噪声水平也有助于处理拟合过程中的数值不稳定性,因为它实际上是作为 Tikhonov 正则化实现的,即通过将其添加到核矩阵的对角线上。明确指定噪声水平的替代方法是在核中包含一个WhiteKernel分量,它可以从数据中估计全局噪声水平(参见下面的示例)。下图显示了通过设置参数alpha处理噪声目标的效果。

../_images/sphx_glr_plot_gpr_noisy_targets_003.png

该实现基于 [RW2006] 的算法 2.1。除了标准 scikit-learn 估计器的 API 之外,GaussianProcessRegressor

  • 允许无需预先拟合的预测(基于 GP 先验)

  • 提供了一个额外的方法 sample_y(X),该方法根据给定输入评估从 GPR(先验或后验)中抽取的样本

  • 公开了一个方法 log_marginal_likelihood(theta),该方法可用于外部的其他超参数选择方式,例如通过马尔可夫链蒙特卡罗。

示例

1.7.2. 高斯过程分类 (GPC)#

为了分类目的,GaussianProcessClassifier 实现了高斯过程 (GP),更具体地说是用于概率分类,其中测试预测以类别概率的形式给出。GaussianProcessClassifier 在一个潜在函数 \(f\) 上设置一个 GP 先验,然后通过一个链接函数 \(\pi\) 进行挤压,以获得概率分类。潜在函数 \(f\) 是一个所谓的干扰函数,其值未被观测到,且本身不相关。它的目的是为了方便模型的表达,并且在预测时 \(f\) 被移除(积分出去)。GaussianProcessClassifier 实现了逻辑链接函数,对于该函数,积分无法解析计算,但在二元情况下很容易进行近似。

与回归设置不同,即使对于 GP 先验,潜在函数 \(f\) 的后验也不是高斯分布,因为高斯似然不适用于离散类别标签。相反,使用的是对应于逻辑链接函数(logit)的非高斯似然。GaussianProcessClassifier 基于拉普拉斯近似,用高斯分布近似非高斯后验。更多详细信息请参见 [RW2006] 第 3 章。

GP 先验均值假定为零。先验的协方差通过传递一个对象来指定。核的超参数在拟合 GaussianProcessRegressor 期间,通过最大化基于传入optimizer的对数边缘似然(LML)来优化。由于 LML 可能有多个局部最优解,可以通过指定n_restarts_optimizer来重复启动优化器。第一次运行总是从核的初始超参数值开始;后续运行则从允许值范围内随机选择的超参数值开始。如果初始超参数应保持固定,可以将None作为优化器传入。

在某些场景中,需要关于潜在函数 \(f\) 的信息(即 [RW2006] 公式 (3.21) 和 (3.24) 中描述的均值 \(\bar{f_*}\) 和方差 \(\text{Var}[f_*]\))。GaussianProcessClassifier 通过 latent_mean_and_variance 方法提供对这些量的访问。

GaussianProcessClassifier 通过执行基于一对多(one-versus-rest)或一对一(one-versus-one)的训练和预测来支持多类别分类。在一对多中,为每个类别拟合一个二元高斯过程分类器,该分类器旨在将该类别与其余类别分开。在“一对一”中,为每对类别拟合一个二元高斯过程分类器,该分类器旨在将这两个类别分开。这些二元预测器的预测结果被组合成多类别预测。有关更多详细信息,请参阅多类别分类部分。

在高斯过程分类中,“一对一”在计算上可能更便宜,因为它需要解决许多只涉及整个训练集子集的问题,而不是整个数据集上的少数问题。由于高斯过程分类的计算复杂度与数据集大小的立方成正比,这可能会显著加快速度。然而,请注意,“一对一”不支持预测概率估计,只支持普通预测。此外,请注意GaussianProcessClassifier(尚)未在内部实现真正的多类别拉普拉斯近似,但如上所述,它是基于内部解决多个二元分类任务,并使用一对多或一对一进行组合。

1.7.3. GPC 示例#

1.7.3.1. 使用 GPC 进行概率预测#

此示例说明了在不同超参数选择下,GPC 对于 RBF 核的预测概率。第一个图显示了 GPC 在任意选择的超参数以及对应于最大对数边缘似然(LML)的超参数下的预测概率。

虽然通过优化 LML 选择的超参数具有明显更大的 LML,但它们在测试数据上的对数损失方面表现稍差。图中显示,这是因为它们在类别边界处表现出类别概率的急剧变化(这是好的),但在远离类别边界的地方预测概率接近 0.5(这是不好的)。这种不良影响是由 GPC 内部使用的拉普拉斯近似引起的。

第二个图显示了核超参数不同选择下的对数边缘似然,用黑点标示出第一个图中使用的两种超参数选择。

../_images/sphx_glr_plot_gpc_001.png
../_images/sphx_glr_plot_gpc_002.png

1.7.3.2. XOR 数据集上的 GPC 示例#

此示例说明了 XOR 数据上的 GPC。比较了一个平稳、各向同性核(RBF)和一个非平稳核(DotProduct)。在这个特定数据集上,DotProduct 核获得了明显更好的结果,因为类别边界是线性的并与坐标轴重合。然而,在实践中,RBF 等平稳核通常能获得更好的结果。

../_images/sphx_glr_plot_gpc_xor_001.png

1.7.3.3. 鸢尾花数据集上的高斯过程分类 (GPC)#

此示例说明了在鸢尾花数据集的二维版本上,GPC 对于各向同性和各向异性 RBF 核的预测概率。这说明了 GPC 在非二元分类中的适用性。各向异性 RBF 核通过为两个特征维度分配不同的长度尺度,获得了略高的对数边缘似然。

../_images/sphx_glr_plot_gpc_iris_001.png

1.7.4. 高斯过程核#

核(在高斯过程背景下也称为“协方差函数”)是高斯过程的关键组成部分,它们决定了高斯过程先验和后验的形状。它们通过定义两个数据点之间的“相似性”以及相似数据点应具有相似目标值的假设来编码学习函数的假设。核可以分为两类:平稳核仅取决于两个数据点之间的距离,而不取决于它们的绝对值 \(k(x_i, x_j)= k(d(x_i, x_j))\),因此对输入空间中的平移不变;而非平稳核也取决于数据点的具体值。平稳核还可以进一步细分为各向同性核和各向异性核,其中各向同性核对输入空间中的旋转也不变。有关更多详细信息,请参阅 [RW2006] 第 4 章。此示例 展示了如何在离散数据上定义自定义核。有关如何最好地组合不同核的指导,请参阅 [Duv2014]

高斯过程核 API#

Kernel的主要用途是计算 GP 中数据点之间的协方差。为此,可以调用核的 __call__ 方法。此方法可用于计算二维数组 X 中所有数据点对的“自协方差”,或二维数组 X 中的数据点与二维数组 Y 中的数据点所有组合的“交叉协方差”。对于所有核 k(WhiteKernel除外),以下恒等式成立:k(X) == K(X, Y=X)

如果仅使用自协方差的对角线,可以调用核的 diag() 方法,这比等效调用 __call__ 的计算效率更高:np.diag(k(X, X)) == k.diag(X)

核由超参数向量 \(\theta\) 参数化。这些超参数例如可以控制核的长度尺度或周期性(见下文)。所有核都支持通过在 __call__ 方法中设置 eval_gradient=True 来计算核的自协方差对 \(log(\theta)\) 的解析梯度。也就是说,返回一个 (len(X), len(X), len(theta)) 数组,其中条目 [i, j, l] 包含 \(\frac{\partial k_\theta(x_i, x_j)}{\partial log(\theta_l)}\)。此梯度被高斯过程(回归器和分类器)用于计算对数边缘似然的梯度,该梯度又通过梯度上升法用于确定使对数边缘似然最大化的 \(\theta\) 值。对于每个超参数,在创建核实例时需要指定初始值和边界。通过核对象的 theta 属性可以获取和设置 \(\theta\) 的当前值。此外,可以通过核的 bounds 属性访问超参数的边界。请注意,这两个属性(theta 和 bounds)都返回内部使用值的对数变换值,因为这些值通常更适合基于梯度的优化。每个超参数的规范以Hyperparameter实例的形式存储在相应的核中。请注意,使用名为“x”的超参数的核必须具有 self.x 和 self.x_bounds 属性。

所有核的抽象基类是KernelKernel 实现了类似于BaseEstimator的接口,提供了 get_params()set_params()clone() 方法。这允许通过元估计器(如PipelineGridSearchCV)设置核值。请注意,由于核的嵌套结构(通过应用核运算符,见下文),核参数的名称可能会变得相对复杂。通常,对于二元核运算符,左操作数的参数前缀为k1__,右操作数的参数前缀为k2__。另一个便利方法是clone_with_theta(theta),它返回核的克隆版本,但超参数设置为theta。一个说明性示例

>>> from sklearn.gaussian_process.kernels import ConstantKernel, RBF
>>> kernel = ConstantKernel(constant_value=1.0, constant_value_bounds=(0.0, 10.0)) * RBF(length_scale=0.5, length_scale_bounds=(0.0, 10.0)) + RBF(length_scale=2.0, length_scale_bounds=(0.0, 10.0))
>>> for hyperparameter in kernel.hyperparameters: print(hyperparameter)
Hyperparameter(name='k1__k1__constant_value', value_type='numeric', bounds=array([[ 0., 10.]]), n_elements=1, fixed=False)
Hyperparameter(name='k1__k2__length_scale', value_type='numeric', bounds=array([[ 0., 10.]]), n_elements=1, fixed=False)
Hyperparameter(name='k2__length_scale', value_type='numeric', bounds=array([[ 0., 10.]]), n_elements=1, fixed=False)
>>> params = kernel.get_params()
>>> for key in sorted(params): print("%s : %s" % (key, params[key]))
k1 : 1**2 * RBF(length_scale=0.5)
k1__k1 : 1**2
k1__k1__constant_value : 1.0
k1__k1__constant_value_bounds : (0.0, 10.0)
k1__k2 : RBF(length_scale=0.5)
k1__k2__length_scale : 0.5
k1__k2__length_scale_bounds : (0.0, 10.0)
k2 : RBF(length_scale=2)
k2__length_scale : 2.0
k2__length_scale_bounds : (0.0, 10.0)
>>> print(kernel.theta)  # Note: log-transformed
[ 0.         -0.69314718  0.69314718]
>>> print(kernel.bounds)  # Note: log-transformed
[[      -inf 2.30258509]
[      -inf 2.30258509]
[      -inf 2.30258509]]

所有高斯过程核都与 sklearn.metrics.pairwise 互操作,反之亦然:Kernel 子类的实例可以作为 metric 传递给 sklearn.metrics.pairwise 中的 pairwise_kernels。此外,pairwise 中的核函数可以通过使用包装类 PairwiseKernel 作为 GP 核使用。唯一需要注意的是,超参数的梯度不是解析的而是数值的,并且所有这些核都只支持各向同性距离。参数 gamma 被视为超参数,并且可以进行优化。其他核参数在初始化时直接设置并保持固定。

1.7.4.1. 基本核#

ConstantKernel核可以用作Product核的一部分,用于缩放其他因子(核)的幅度;或者用作Sum核的一部分,用于修改高斯过程的均值。它依赖于参数\(constant\_value\)。其定义为:

\[k(x_i, x_j) = constant\_value \;\forall\; x_1, x_2\]

WhiteKernel核的主要用例是作为和核的一部分,它解释了信号的噪声分量。调整其参数 \(noise\_level\) 对应于估计噪声水平。其定义为:

\[k(x_i, x_j) = noise\_level \text{ if } x_i == x_j \text{ else } 0\]

1.7.4.2. 核运算符#

核运算符接受一个或两个基本核并将它们组合成一个新的核。Sum核接受两个核 \(k_1\)\(k_2\) 并通过 \(k_{sum}(X, Y) = k_1(X, Y) + k_2(X, Y)\) 将它们组合。 Product核接受两个核 \(k_1\)\(k_2\) 并通过 \(k_{product}(X, Y) = k_1(X, Y) * k_2(X, Y)\) 将它们组合。Exponentiation核接受一个基本核和一个标量参数 \(p\) 并通过 \(k_{exp}(X, Y) = k(X, Y)^p\) 将它们组合。请注意,Kernel 对象上的魔术方法 __add____mul_____pow__ 已被重写,因此可以使用例如 RBF() + RBF() 作为 Sum(RBF(), RBF()) 的快捷方式。

1.7.4.3. 径向基函数 (RBF) 核#

RBF核是一个平稳核。它也被称为“平方指数”核。它由一个长度尺度参数 \(l>0\) 参数化,该参数可以是标量(核的各向同性变体)或与输入 \(x\) 具有相同维数的向量(核的各向异性变体)。该核由以下公式给出:

\[k(x_i, x_j) = \text{exp}\left(- \frac{d(x_i, x_j)^2}{2l^2} \right)\]

其中 \(d(\cdot, \cdot)\) 是欧几里得距离。该核是无限可微的,这意味着以该核作为协方差函数的高斯过程具有所有阶的均方导数,因此非常平滑。RBF 核产生的高斯过程的先验和后验如下图所示:

../_images/sphx_glr_plot_gpr_prior_posterior_001.png

1.7.4.4. Matérn 核#

Matérn核是一种平稳核,是RBF核的推广。它有一个额外的参数 \(\nu\),用于控制结果函数的平滑度。它由一个长度尺度参数 \(l>0\) 参数化,该参数可以是标量(核的各向同性变体)或与输入 \(x\) 具有相同维数的向量(核的各向异性变体)。

Matérn 核的数学实现#

该核由以下公式给出:

\[k(x_i, x_j) = \frac{1}{\Gamma(\nu)2^{\nu-1}}\Bigg(\frac{\sqrt{2\nu}}{l} d(x_i , x_j )\Bigg)^\nu K_\nu\Bigg(\frac{\sqrt{2\nu}}{l} d(x_i , x_j )\Bigg),\]

其中 \(d(\cdot,\cdot)\) 是欧几里得距离,\(K_\nu(\cdot)\) 是修正贝塞尔函数,\(\Gamma(\cdot)\) 是伽马函数。当 \(\nu\rightarrow\infty\) 时,Matérn 核收敛到 RBF 核。当 \(\nu = 1/2\) 时,Matérn 核变得与绝对指数核相同,即:

\[k(x_i, x_j) = \exp \Bigg(- \frac{1}{l} d(x_i , x_j ) \Bigg) \quad \quad \nu= \tfrac{1}{2}\]

特别是,当 \(\nu = 3/2\)

\[k(x_i, x_j) = \Bigg(1 + \frac{\sqrt{3}}{l} d(x_i , x_j )\Bigg) \exp \Bigg(-\frac{\sqrt{3}}{l} d(x_i , x_j ) \Bigg) \quad \quad \nu= \tfrac{3}{2}\]

以及 \(\nu = 5/2\)

\[k(x_i, x_j) = \Bigg(1 + \frac{\sqrt{5}}{l} d(x_i , x_j ) +\frac{5}{3l} d(x_i , x_j )^2 \Bigg) \exp \Bigg(-\frac{\sqrt{5}}{l} d(x_i , x_j ) \Bigg) \quad \quad \nu= \tfrac{5}{2}\]

是学习非无限可微(如RBF核所假设)但至少一次(\(\nu = 3/2\))或两次可微(\(\nu = 5/2\))的函数的流行选择。

通过 \(\nu\) 控制学习函数平滑度的灵活性,可以适应真实底层函数关系的特性。

Matérn 核产生的高斯过程的先验和后验如下图所示:

../_images/sphx_glr_plot_gpr_prior_posterior_005.png

有关 Matérn 核不同变体的更多详细信息,请参见 [RW2006],第 84 页。

1.7.4.5. 有理二次核#

RationalQuadratic核可以看作是不同特征长度尺度RBF核的尺度混合(无限和)。它由一个长度尺度参数\(l>0\)和一个尺度混合参数\(\alpha>0\)参数化。目前只支持\(l\)为标量的各向同性变体。该核由以下公式给出:

\[k(x_i, x_j) = \left(1 + \frac{d(x_i, x_j)^2}{2\alpha l^2}\right)^{-\alpha}\]

RationalQuadratic核产生的高斯过程的先验和后验如下图所示:

../_images/sphx_glr_plot_gpr_prior_posterior_002.png

1.7.4.6. 指数正弦平方核#

ExpSineSquared核允许对周期函数进行建模。它由一个长度尺度参数 \(l>0\) 和一个周期性参数 \(p>0\) 参数化。目前只支持 \(l\) 为标量的各向同性变体。该核由以下公式给出:

\[k(x_i, x_j) = \text{exp}\left(- \frac{ 2\sin^2(\pi d(x_i, x_j) / p) }{ l^ 2} \right)\]

指数正弦平方核产生的高斯过程的先验和后验如下图所示:

../_images/sphx_glr_plot_gpr_prior_posterior_003.png

1.7.4.7. 点积核#

DotProduct核是非平稳的,可以通过在线性回归中对 \(x_d (d = 1, . . . , D)\) 的系数施加 \(N(0, 1)\) 先验,并对偏差施加 \(N(0, \sigma_0^2)\) 先验来获得。DotProduct核对坐标绕原点的旋转不变,但对平移不敏感。它由参数 \(\sigma_0^2\) 参数化。当 \(\sigma_0^2 = 0\) 时,该核被称为齐次线性核,否则为非齐次。该核由以下公式给出:

\[k(x_i, x_j) = \sigma_0 ^ 2 + x_i \cdot x_j\]

DotProduct核通常与指数运算结合使用。指数为 2 的示例如下图所示:

../_images/sphx_glr_plot_gpr_prior_posterior_004.png

1.7.4.8. 参考文献#