在机器学习领域,高斯过程分类(GPC)是一种基于概率的监督学习方法,它通过核函数来描述数据点之间的相似性。本文将探讨在径向基函数(RBF)核下,不同超参数选择对GPC预测概率的影响,以及优化对数边缘似然(LML)对模型性能的影响。
首先,通过生成一组数据来模拟GPC的应用场景。在这个例子中,使用了一个简单的一维数据集,其中包含100个样本点,每个样本点的特征值在0到5之间均匀分布。标签是根据特征值是否大于2.5来确定的,以此来模拟一个二分类问题。
import numpy as np
from matplotlib import pyplot as plt
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import RBF
from sklearn.metrics import accuracy_score, log_loss
# 生成数据
train_size = 50
rng = np.random.RandomState(0)
X = rng.uniform(0, 5, 100)[:, np.newaxis]
y = np.array(X[:, 0] > 2.5, dtype=int)
接下来,定义了两个高斯过程分类器:一个使用固定的超参数,另一个使用优化后的超参数。通过比较两者的对数边缘似然(LML)和在测试数据上的对数损失(log-loss),可以评估优化超参数的效果。
# 指定具有固定和优化超参数的高斯过程
gp_fix = GaussianProcessClassifier(kernel=1.0 * RBF(length_scale=1.0), optimizer=None)
gp_fix.fit(X[:train_size], y[:train_size])
gp_opt = GaussianProcessClassifier(kernel=1.0 * RBF(length_scale=1.0))
gp_opt.fit(X[:train_size], y[:train_size])
# 打印LML和准确率
print("Log Marginal Likelihood (initial): %.3f" % gp_fix.log_marginal_likelihood(gp_fix.kernel_.theta))
print("Log Marginal Likelihood (optimized): %.3f" % gp_opt.log_marginal_likelihood(gp_opt.kernel_.theta))
print("Accuracy: %.3f (initial) %.3f (optimized)" % (
accuracy_score(y[:train_size], gp_fix.predict(X[:train_size])),
accuracy_score(y[:train_size], gp_opt.predict(X[:train_size]))
))
print("Log-loss: %.3f (initial) %.3f (optimized)" % (
log_loss(y[:train_size], gp_fix.predict_proba(X[:train_size])[:, 1]),
log_loss(y[:train_size], gp_opt.predict_proba(X[:train_size])[:, 1]),
))
通过上述代码,可以看到优化后的超参数在LML上有显著提升,但在测试数据上的对数损失却有所增加。这可能是因为优化后的模型在类别边界附近预测概率变化剧烈,但在远离边界的区域预测概率接近0.5,这是不理想的。这种效果可能是由于GPC内部使用的拉普拉斯近似造成的。
为了进一步分析,绘制了不同核函数超参数选择下的对数边缘似然图。图中用黑点标出了之前讨论的两种超参数选择。从图中可以看出,优化后的超参数在LML上的表现优于初始选择,但在测试数据上的对数损失却有所增加。
# 绘制后验概率
plt.figure()
plt.scatter(X[:train_size, 0], y[:train_size], c="k", label="训练数据", edgecolors=(0, 0, 0))
plt.scatter(X[train_size:, 0], y[train_size:], c="g", label="测试数据", edgecolors=(0, 0, 0))
X_ = np.linspace(0, 5, 100)
plt.plot(X_, gp_fix.predict_proba(X_[:, np.newaxis])[:, 1], "r", label="初始核函数: %s" % gp_fix.kernel_)
plt.plot(X_, gp_opt.predict_proba(X_[:, np.newaxis])[:, 1], "b", label="优化核函数: %s" % gp_opt.kernel_)
plt.xlabel("特征")
plt.ylabel("类别1概率")
plt.xlim(0, 5)
plt.ylim(-0.25, 1.5)
plt.legend(loc="best")
# 绘制LML景观
plt.figure()
theta0 = np.logspace(0, 8, 30)
theta1 = np.logspace(-1, 1, 29)
Theta0, Theta1 = np.meshgrid(theta0, theta1)
LML = [[gp_opt.log_marginal_likelihood(np.log([Theta0[i, j], Theta1[i, j]])) for i in range(Theta0.shape[0])] for j in range(Theta0.shape[1])]
LML = np.array(LML).T
plt.plot(np.exp(gp_fix.kernel_.theta)[0], np.exp(gp_fix.kernel_.theta)[1], "ko", zorder=10)
plt.plot(np.exp(gp_opt.kernel_.theta)[0], np.exp(gp_opt.kernel_.theta)[1], "ko", zorder=10)
plt.pcolor(Theta0, Theta1, LML)
plt.xscale("log")
plt.yscale("log")
plt.colorbar()
plt.xlabel("幅度")
plt.ylabel("长度尺度")
plt.title("对数边缘似然")
plt.show()
通过这些分析,可以得出结论:虽然优化超参数可以提高模型的LML,但在某些情况下,这可能会导致在测试数据上的对数损失增加。因此,在实际应用中,需要权衡LML和对数损失,以选择最佳的超参数。