使用高斯过程分类进行概率预测

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,我们将探索使用径向基函数(RBF)核和不同超参数选择的高斯过程分类(GPC)。我们将生成数据,使用固定和优化后的超参数训练 GPC 模型,并绘制后验概率和对数边缘似然景观。我们还将评估模型的准确性和对数损失。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库

我们将为本实验导入必要的库。

import numpy as np
from matplotlib import pyplot as plt
from sklearn.metrics import accuracy_score, log_loss
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import RBF

生成数据

我们将使用 NumPy 生成数据。我们将生成 100 个数据点,其在 0 到 5 之间均匀分布。我们将阈值设置为 2.5,并使用布尔表达式生成标签。我们将前 50 个数据点用作训练数据,其余的用作测试数据。

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)

训练模型

我们将使用固定和优化后的超参数来训练高斯过程分类(GPC)模型。我们将打印模型的对数边缘似然、准确率和对数损失。

## 固定超参数
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("对数边缘似然(初始): %.3f" % gp_fix.log_marginal_likelihood(gp_fix.kernel_.theta))
print("对数边缘似然(优化后): %.3f" % gp_opt.log_marginal_likelihood(gp_opt.kernel_.theta))
print("准确率:%.3f(初始) %.3f(优化后)" % (accuracy_score(y[:train_size], gp_fix.predict(X[:train_size])), accuracy_score(y[:train_size], gp_opt.predict(X[:train_size]))))
print("对数损失:%.3f(初始) %.3f(优化后)" % (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])))

绘制后验概率

我们将使用固定和优化后的超参数来绘制高斯过程分类(GPC)模型的后验概率。我们将绘制训练数据、测试数据以及类别 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="最佳位置")

绘制对数边缘似然曲面

我们将使用不同的超参数选择来绘制高斯过程分类(GPC)模型的对数边缘似然曲面。我们将突出显示在前一个图中使用的超参数。我们还将为这些图添加标签。

## 绘制对数边缘似然曲面
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("对数边缘似然")

总结

在本实验中,我们探索了使用径向基函数(RBF)核以及不同超参数选择的高斯过程分类(GPC)。我们生成了数据,使用固定和优化后的超参数训练了 GPC 模型,并绘制了后验概率和对数边缘似然曲面。我们还评估了模型的准确率和对数损失。