高斯过程分类器是一种分类机器学习算法。
高斯过程是对高斯概率分布的推广,可用作用于分类和回归的复杂非参数机器学习算法的基础。
它们是一种核模型,类似于 SVM,与 SVM 不同的是,它们能够预测高度校准的类别成员概率,尽管选择和配置核心使用的核可能具有挑战性。
在本教程中,您将了解高斯过程分类器这一分类机器学习算法。
完成本教程后,您将了解:
- 高斯过程分类器是一种非参数算法,可应用于二元分类任务。
- 如何使用 Scikit-Learn 拟合、评估和预测高斯过程分类器模型。
- 如何在给定数据集上调整高斯过程分类器算法的超参数。
让我们开始吧。

使用 Python 进行高斯过程分类
照片由 Mark Kao 拍摄,保留部分权利。
教程概述
本教程分为三个部分;它们是:
- 高斯过程分类
- 使用 Scikit-Learn 的高斯过程
- 调整高斯过程超参数
高斯过程分类
高斯过程,简称 GP,是对 高斯概率分布(例如钟形函数)的推广。
高斯概率分布函数总结了随机变量的分布,而高斯过程总结了函数的属性,例如函数参数。因此,您可以将高斯过程视为比高斯函数高一个抽象或间接的层次。
高斯过程是对高斯概率分布的推广。概率分布描述的是标量或向量(对于多元分布)的随机变量,而随机过程则控制函数的属性。
— 第 2 页,《高斯过程机器学习》,2006 年。
高斯过程可用作分类预测建模的机器学习算法。
高斯过程是一种核方法,类似于 SVM,但它们能够预测高度校准的概率,而 SVM 不能。
高斯过程需要指定一个核来控制示例之间的关系;具体来说,它定义了数据的协方差函数。这被称为潜在函数或“琐碎”函数。
潜在函数 f 起着琐碎函数的作用:我们不直接观测 f 的值(我们只观测输入 X 和类别标签 y),而且我们并不特别关心 f 的值……
— 第 40 页,《高斯过程机器学习》,2006 年。
使用核函数对示例进行分组的方式控制着模型如何“感知”这些示例,因为它假定彼此“接近”的示例具有相同的类别标签。
因此,测试模型不同的核函数以及复杂核函数不同的配置非常重要。
……协方差函数是高斯过程预测器的关键组成部分,因为它包含了我们对希望学习的函数的假设。
— 第 79 页,《高斯过程机器学习》,2006 年。
它还需要一个链接函数来解释内部表示并预测类别成员的概率。可以使用逻辑函数,从而可以对二元分类的 二项概率分布 进行建模。
对于二元判别情况,一个简单的想法是使用响应函数(链接函数的逆函数)将回归模型的输出转换为类别概率,该函数将参数“压缩”到 [0, 1] 范围内(参数可以位于 (−inf, inf) 域),从而确保有效的概率解释。
— 第 35 页,《高斯过程机器学习》,2006 年。
高斯过程和高斯过程分类是一个复杂的主题。
要了解更多信息,请参阅书籍
- 高斯过程机器学习, 2006.
使用 Scikit-Learn 的高斯过程
高斯过程分类器可在 scikit-learn Python 机器学习库中通过 GaussianProcessClassifier 类 使用。
该类允许您通过“kernel”参数指定要使用的核,默认为 1 * RBF(1.0),即 RBF 核。
1 2 3 |
... # 定义模型 model = GaussianProcessClassifier(kernel=1*RBF(1.0)) |
在指定了核之后,模型将尝试根据训练数据集最佳配置该核。
这通过设置“optimizer”(优化器的迭代次数“max_iter_predict”),以及为了克服局部最优而执行此优化过程的重复次数“n_restarts_optimizer”来控制。
默认情况下,执行一次优化运行,可以通过将“optimize”设置为 None 来关闭此功能。
1 2 3 |
... # 定义模型 model = GaussianProcessClassifier(optimizer=None) |
我们可以通过一个实际示例来演示高斯过程分类器。
首先,让我们定义一个合成分类数据集。
我们将使用 make_classification() 函数 创建一个包含 100 个样本的数据集,每个样本有 20 个输入变量。
以下示例创建并总结了数据集。
1 2 3 4 5 6 |
# 测试分类数据集 from sklearn.datasets import make_classification # 定义数据集 X, y = make_classification(n_samples=100, n_features=20, n_informative=15, n_redundant=5, random_state=1) # 汇总数据集 print(X.shape, y.shape) |
运行示例创建数据集并确认数据集的行数和列数。
1 |
(100, 20) (100,) |
我们可以使用 RepeatedStratifiedKFold 类 通过重复分层 k 折交叉验证来拟合和评估高斯过程分类器模型。我们将在测试环境中进行 10 折和 3 次重复。
我们将使用默认配置。
1 2 3 |
... # 创建模型 model = GaussianProcessClassifier() |
下面列出了在合成二元分类任务上评估高斯过程分类器模型的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 在数据集上评估高斯过程分类器模型 from numpy import mean from numpy import std from sklearn.datasets import make_classification from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedStratifiedKFold from sklearn.gaussian_process import GaussianProcessClassifier # 定义数据集 X, y = make_classification(n_samples=100, n_features=20, n_informative=15, n_redundant=5, random_state=1) # 定义模型 model = GaussianProcessClassifier() # 定义模型评估方法 cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) # 评估模型 scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1) # 总结结果 print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores))) |
运行该示例,将在合成数据集上评估高斯过程分类器算法,并报告三次 10 折交叉验证重复的平均准确率。
鉴于学习算法的随机性,您的具体结果可能会有所不同。可以尝试运行几次示例。
在这种情况下,我们可以看到该模型达到了约 79.0% 的平均准确率。
1 |
平均准确率:0.790 (0.101) |
我们可以决定使用高斯过程分类器作为最终模型,并对新数据进行预测。
这可以通过在所有可用数据上拟合模型管道并调用 predict() 函数来完成,将新数据行传入。
我们可以在下面列出的完整示例中演示这一点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 在数据集上使用高斯过程分类器模型进行预测 from sklearn.datasets import make_classification from sklearn.gaussian_process import GaussianProcessClassifier # 定义数据集 X, y = make_classification(n_samples=100, n_features=20, n_informative=15, n_redundant=5, random_state=1) # 定义模型 model = GaussianProcessClassifier() # 拟合模型 model.fit(X, y) # 定义新数据 row = [2.47475454,0.40165523,1.68081787,2.88940715,0.91704519,-3.07950644,4.39961206,0.72464273,-4.86563631,-6.06338084,-1.22209949,-0.4699618,1.01222748,-0.6899355,-0.53000581,6.86966784,-3.27211075,-6.59044146,-2.21290585,-3.139579] # 进行预测 yhat = model.predict([row]) # 总结预测 print('Predicted Class: %d' % yhat) |
运行示例后,模型将被拟合,并对新数据行进行类别标签预测。
1 |
预测类别:0 |
接下来,我们可以看看如何配置模型超参数。
调整高斯过程超参数
高斯过程分类器方法的超参数必须针对您的特定数据集进行配置。
也许最重要的超参数是通过“kernel”参数控制的核。scikit-learn 库提供了许多内置的核函数可供使用。
也许一些更常见的例子包括:
- RBF
- DotProduct
- Matern
- RationalQuadratic
- WhiteKernel
您可以在此处了解有关该库提供的核的更多信息
我们将使用这些常见的核函数,默认参数,来评估高斯过程分类器的性能。
1 2 3 4 |
... # 定义网格 grid = dict() grid['kernel'] = [1*RBF(), 1*DotProduct(), 1*Matern(), 1*RationalQuadratic(), 1*WhiteKernel()] |
下面的示例使用我们定义的网格值的 GridSearchCV 类来演示这一点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# 为高斯过程分类器进行核网格搜索 from sklearn.datasets import make_classification from sklearn.model_selection import GridSearchCV from sklearn.model_selection import RepeatedStratifiedKFold from sklearn.gaussian_process import GaussianProcessClassifier from sklearn.gaussian_process.kernels import RBF from sklearn.gaussian_process.kernels import DotProduct from sklearn.gaussian_process.kernels import Matern from sklearn.gaussian_process.kernels import RationalQuadratic from sklearn.gaussian_process.kernels import WhiteKernel # 定义数据集 X, y = make_classification(n_samples=100, n_features=20, n_informative=15, n_redundant=5, random_state=1) # 定义模型 model = GaussianProcessClassifier() # 定义模型评估方法 cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) # 定义网格 grid = dict() grid['kernel'] = [1*RBF(), 1*DotProduct(), 1*Matern(), 1*RationalQuadratic(), 1*WhiteKernel()] # 定义搜索 search = GridSearchCV(model, grid, scoring='accuracy', cv=cv, n_jobs=-1) # 执行搜索 results = search.fit(X, y) # 总结最佳结果 print('Best Mean Accuracy: %.3f' % results.best_score_) print('Best Config: %s' % results.best_params_) # 总结所有结果 means = results.cv_results_['mean_test_score'] params = results.cv_results_['params'] for mean, param in zip(means, params): print(">%.3f with: %r" % (mean, param)) |
运行示例将使用重复交叉验证评估每种配置组合。
鉴于学习算法的随机性,您的具体结果可能会有所不同。尝试运行几次示例。
在这种情况下,我们可以看到 RationalQuadratic 核的性能有所提升,准确率达到了约 91.3%,而上一节中 RBF 核的准确率为 79.0%。
1 2 3 4 5 6 7 |
最佳平均准确率:0.913 最佳配置:{'kernel': 1**2 * RationalQuadratic(alpha=1, length_scale=1)} >0.790 with: {'kernel': 1**2 * RBF(length_scale=1)} >0.800 with: {'kernel': 1**2 * DotProduct(sigma_0=1)} >0.830 with: {'kernel': 1**2 * Matern(length_scale=1, nu=1.5)} >0.913 with: {'kernel': 1**2 * RationalQuadratic(alpha=1, length_scale=1)} >0.510 with: {'kernel': 1**2 * WhiteKernel(noise_level=1)} |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 高斯过程机器学习, 2006.
- 高斯过程机器学习,主页.
- 机器学习:概率视角, 2012.
- 模式识别与机器学习, 2006.
API
- sklearn.gaussian_process.GaussianProcessClassifier API.
- sklearn.gaussian_process.GaussianProcessRegressor API.
- 高斯过程,Scikit-Learn 用户指南.
- 高斯过程核函数 API.
文章
总结
在本教程中,您了解了高斯过程分类器这一分类机器学习算法。
具体来说,你学到了:
- 高斯过程分类器是一种非参数算法,可应用于二元分类任务。
- 如何使用 Scikit-Learn 拟合、评估和预测高斯过程分类器模型。
- 如何在给定数据集上调整高斯过程分类器算法的超参数。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
尊敬的Jason博士,
您能否详细说明用于网格搜索的字典?
在上面的代码中,grid 定义为:
1*RBF(), 1*DotProduct() 是什么意思?是的,我知道 RBF 和 DotProduct 是代码前面定义的函数。
但是当我打印 grid 时,我得到的是看起来不像定义的:
之前,例如 RBF
当你打印 grid 时,你会得到额外的信息,例如 1**2*RBF,参数设置为 length_score = 1. 。这些额外的信息从何而来?
总而言之
在网格中设置 RBF 时,它的含义是什么?
打印 grid 时,您会获得额外信息
谢谢你,
悉尼的Anthony
问得好,您可以在这里了解更多关于 GP 中使用的核的信息
https://scikit-learn.cn/stable/modules/gaussian_process.html#kernels-for-gaussian-processes
嘿,感谢这篇信息丰富的博客
我非常喜欢它,学到了很多东西
不客气!
尊敬的Jason博士,
您在这里展示了一个使用 scikit learn 的高斯过程回归模块进行的分类问题。您能否详细介绍一个使用相同 scikit-learn 模块进行回归的项目,并附带代码?
感谢您的建议!
嗨,Jason先生,
我们能用高斯过程进行时间序列聚类吗?
如果可能,您能否解释一下如何操作?
谢谢。
也许可以,我没有范例,很抱歉。
嗨,Jason,
请查看这篇文章:https://medium.com/ai-in-plain-english/gaussian-processes-for-classification-cdd6e25a37e0
没有给您任何署名。这是对您这篇博文的完全复制。
这太令人失望了。而且非常普遍。有些人不知耻。
如何创建用于多类问题的高斯过程?
也许您可以尝试 OVR 或 OVO 方法。
https://machinelearning.org.cn/one-vs-rest-and-one-vs-one-for-multi-class-classification/
对于多类问题,我们是否可以使用二项观测似然?特别是当类别的数量因样本而异时。
不完全是,对于多于两个类别的情况,请使用多项分布。
我们能否为多类问题利用二项感知概率?尤其是在类别数量对于不同样本不同时。
如果您考虑 OvR(一对多)分类,则可以使用二项概率。有关概念,请参阅此帖子:https://machinelearning.org.cn/one-vs-rest-and-one-vs-one-for-multi-class-classification/