高斯过程分类的概率预测

在机器学习领域,高斯过程分类GPC)是一种基于概率的监督学习方法,它能够提供关于分类结果的不确定性估计。本文将探讨使用径向基函数(RBF)核的GPC模型,并分析不同超参数选择对模型性能的影响。

首先,通过生成一组简单的数据来模拟分类问题。数据集中的每个样本都只有一个特征,并且根据该特征值是否大于2.5来分配类别标签。接着,使用固定的超参数和优化后的超参数来训练两个GPC模型,并比较它们的对数边际似然(LML)和在测试集上的对数损失(log-loss)。

在第一个图中,展示了使用任意选择的超参数和优化后的超参数的GPC模型的预测概率。尽管优化后的超参数具有更高的LML值,但在测试数据上的对数损失却略高。这是因为优化后的模型在类别边界附近预测的概率变化剧烈(这是好的),但在远离边界的地方预测的概率接近0.5(这是不好的)。这种不良效应是由GPC内部使用的拉普拉斯近似引起的。

第二个图展示了不同核超参数选择的对数边际似然,并通过黑色点突出显示了第一个图中使用的两种超参数选择。可以看到,尽管优化后的模型在LML上表现更好,但在测试集上的准确性和对数损失上却略逊一筹。

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) # 指定具有固定和优化超参数的高斯过程 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]) 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]), )) # 绘制后验概率 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()

通过上述代码,可以看到GPC模型在不同超参数设置下的表现。优化后的模型虽然在LML上表现更好,但在实际的分类任务中,其性能可能并不总是优于使用固定超参数的模型。这说明在实际应用中,需要综合考虑模型的LML值和在测试集上的表现,以选择最佳的超参数。

此外,还可以通过绘制LML景观来直观地观察不同超参数组合对模型性能的影响。这种可视化方法可以帮助更好地理解模型的行为,并指导进行超参数的选择和调整。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485