Press "Enter" to skip to content

机器学习应用之高斯过程(理论篇)

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.


AlphaGo Zero中,MCTS搜索的超参数由高斯过程优化决定。
高斯过程(Gaussian process, GP)在建模能力、以及不确定性估计等方面,具有很强的优势。
虽然它不是最热门的机器学习研究方向,但会应用到许多前沿技术研究中。

 

一、GP简介

 

(一)为什幺用GP

 

以回归为例。在实际工作中,我们经常遇到的问题就是通过模型来拟合自变量 X 与因变量 y 之间的关系,并据此模型进行预测,即 y=f(X)。

 

如果X和y的关系非常简单,那幺通过线性回归就能达到预期的目标。但是,实际情况往往是非常复杂的,高斯过程回归(GPR)就是解决这种复杂关系拟合问题的优秀方案。

 

机器学习中的很多技术都是基于参数化的函数,并对这些参数进行建模,比如上述回归问题的权重等等。而GP却是直接对函数建模的非参数模型,这种方法的好处是:既能对任意函数进行拟合,又能对不确定性进行拟合。对不确定性的量化是极其有价值的,这也符合贝叶斯优化的思想。正是GP具有严格的统计学理论基础,使其对于解决高维非线性的小样本复杂问题,具有良好的适应能力。

 

(二)GP初步理解

 

在统计学理论中,GP是这样的一个随机过程:其任意有限变量集合的分布都是高斯分析,即对任意整数n >= 1及任意的一族随机变量X,与其对应的t时刻的过程状态f(x)的联合概率分布服从 n维高斯分析。

 

在机器学习领域中,GP是在高斯随机过程与贝叶斯学习理论基础上发展起来的一种机器学习方法,可用于解决回归和分类问题。

 

GP背后的关键思想是可以使用无限维多元高斯分布拟合函数。即:输入空间中的每个点与一个随机变量相关联,并将多元高斯分布用来拟合这些点的联合分布。

 

仍以回归为例。回归的目的是为了找到一个函数来尽可能贴近地描述一组给定的数据点,这个过程叫做用函数拟合数据。对于一组既定的训练数据点,可能潜在无限多个函数可以用来做拟合。高斯过程则给每个函数分配了概率值。此概率分布的均值代表了数据最有可能的表征。同时,也可以将对预测的置信度融入到回归结果里去。

 

二、GP基本概念

 

(一)多元高斯分布

 

高斯分布是高斯过程的基础构件。在多元高斯分布中,其每个随机变量都呈高斯分布,且联合分布也是高斯分布。

 

多元高斯分布由均值向量 μ 和协方差矩阵Σ 定义。均值向量μ 描述了该分布的期望值,它的每个组件描述了对应维度的均值。Σ 对每个维度的方差进行建模,并确定不同随机变量之间的关联。

 

高斯分布的代数性质:它在条件作用和边缘化情况下是封闭的。即:经过这些运算后,在结果中得到的分布依旧是高斯分布。这两个运算是高斯过程的基础。边缘化可以理解为在高斯分布的一个维度上做累加,条件作用可以理解为在多元分布上进行切分,得到一个维数更少的高斯分布。

 

(二)高斯过程

 

在机器学习问题中,假设测试数据为 X,训练数据为 Y,所有的函数值都来源于多元高斯分布。这意味着联合概率分布P(X,Y) 跨越了预测函数的可能取值空间。这个测试数据和训练数据的联合分布有∣X∣+∣Y∣维,而我们的计算目标是条件概率 P(X|Y)。基于高斯分布的代数性质,P(X|Y) 也是正态分布的。

 

另外,还需要定义均值μ 和协方差矩阵Σ,这就需要通过核函数来实现。

 

(三)核函数

 

要建立高斯分布,首先要定义 μ 和 Σ。在高斯过程中,一般假设 μ =0,可以简化条件作用所需要的公式。协方差矩阵Σ描述了高斯分布的形状,也最终决定了要预测的函数所具有的特性。可以通过求核函数k的值来生成协方差矩阵,k通常也被称为协方差函数,作用在两两成对的所有测试点上,表达了两点之间的相似度。

 

核函数可分为平稳和非平稳的类型。平稳核函数,例如径向基函数核(RBF)或者周期核,都具有平移不变性,两点之间的协方差只取决于它们之间的相对位置。非平稳核函数,比如线性核,就没有这个限制且取决于绝对位置。核函数有很多种,分别描述不同类别的函数,使函数拥有我们所期望的形状。

 

三、GP应用示例

 

本文以波士顿房价公开数据集为例,介绍GP在多元回归场景下的应用。

 



顿房价数据集是20世纪70年代中期波

顿郊区房价的中位数,统计了当时教区部分的犯罪率、房产税等共计13个指标,试图找到这些指标与房价的关系,属于多元回归问题。数据集中共有506组数据。

 

在本文中,按9:1随机划分训练集和验证集,即训练集450组、验证集56组。同时采用多项式回归和决策树回归两种方案,作为对比。以MSE(均方误差)和平均准确率(1-MAPE)作为评价指标。

 

(一)结果对比

 

基于上述训练集和验证集,对三种算法进行评估,GP回归略优于决策树回归,均优于多项式回归。对比结果如下:

 

 

算法

 

 

训练集

 

MSE

 

 

训练集

 

准确率

 

 

验证集

 

MSE

 

 

验证集

 

准确率

 

 

GP回归

 

 

1.88

 

 

96.99%

 

 

11.93

 

 

85.73%

 

 

决策树回归

 

 

8.88

 

 

87.65%

 

 

12.66

 

 

84.19%

 

 

多项式回归

 

 

9.97

 

 

87.84%

 

 

45.14

 

 

52.88%

 

 

在此基础上,通过调整核函数,可以进一步优化模型。

 

(二)代码示例

 

1.GP回归

 

import operator
from functools import reduce
from scipy.optimize import minimize


#多维输入的高斯过程回归
class GPR:
  def __init__(self, optimize=True):
    self.is_fit = False
    self.train_X, self.train_y = None, None
    self.params = {"l": 0.5, "sigma_f": 0.2}
    self.optimize = optimize
  #模型训练
  def fit(self, X, y):
    self.train_X = np.asarray(X)
    self.train_y = np.asarray(y) 
    # hyper parameters optimization
    def negative_log_likelihood_loss(params):
      self.params["l"], self.params["sigma_f"] = params[0], params[1]
      Kyy = self.kernel(self.train_X, self.train_X) + 1e-8 * np.eye(len(self.train_X))
      loss = 0.5 * self.train_y.T.dot(np.linalg.inv(Kyy)).dot(self.train_y) + 0.5 * np.linalg.slogdet(Kyy)[1] + 0.5 * len(self.train_X) * np.log(2 * np.pi)
      return loss.ravel()
    if self.optimize:  
      res = minimize(negative_log_likelihood_loss, [self.params["l"], self.params["sigma_f"]],bounds=((1, 100), (1, 100)),method='L-BFGS-B')
      self.params["l"], self.params["sigma_f"] = res.x[0], res.x[1]
      self.is_fit = True
  #预测
  def predict(self, X):
    if not self.is_fit:
      print("GPR Model not fit yet.")
      return
    X = np.asarray(X)
    Kff = self.kernel(self.train_X, self.train_X)  # (N, N)
    Kyy = self.kernel(X, X)  # (k, k)
    Kfy = self.kernel(self.train_X, X)  # (N, k)
    Kff_inv = np.linalg.inv(Kff + 1e-8 * np.eye(len(self.train_X)))  # (N, N)
    print(len(self.train_X),len(Kff),len(Kyy),len(Kfy))
    mu = Kfy.T.dot(Kff_inv).dot(self.train_y)
    cov = Kyy - Kfy.T.dot(Kff_inv).dot(Kfy)
    return mu, cov
  #核函数
  def kernel(self, x1, x2):
    dist_matrix = np.sum(x1**2, 1).reshape(-1, 1) + np.sum(x2**2, 1) - 2 * np.dot(x1, x2.T)
    return self.params["sigma_f"] ** 2 * np.exp(-0.5 / self.params["l"] ** 2 * dist_matrix)


#在波士顿数据集上训练和验证
gpr = GPR(optimize=True)
gpr.fit(train_X, train_y)#模型训练
y_pred_valid, cov = gpr.predict(valid_X)#在验证集上预测

 

2.决策树回归

 

from sklearn.tree import DecisionTreeRegressor


dtr=DecisionTreeRegressor(max_depth=4)
dtr.fit(train_X, train_y) #模型训练
y_pred_valid=dtr.predict(valid_X) #在验证集上评估

 

3.多项式回归

 

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression


poly = PolynomialFeatures(degree=2) # 升维
poly.fit(train_X)
train_X_ = poly.transform(train_X)


#训练
lin_reg = LinearRegression()
lin_reg.fit(train_X_, train_y)


#在验证集上评估
poly.fit(valid_X)
valid_X_ = poly.transform(valid_X)
y_pred_valid = lin_reg.predict(valid_X_)

 

四、GP总结

 

(一)GP优缺点

 

与深度神经网络DNN对比,GP的优缺点如下。

 

GP优点

 

GP基于统计学理论,在解决高维非线性的小样本复杂问题上具有优势

 

因其概率推理的特点,GP
可以量化预测不确定性

 

GP只需优化超参数,在少量的样本下就能建模

 

GP对于梯度消失与爆炸问题具有健壮性

 

GP模型直观、可解释性较好

 

GP缺点

 

计算复杂度为O(n³),不支持大样本数据集

 

自动学习较少,在核函数选择上需要更多的设计

 

(二)大样本数据集下的解决方案

 

GP的计算复杂度为O(n³),随着数据量的增加而增加,在大样本数据集下会遇到计算瓶颈。

 

DeepMind 在两篇论文中探讨了结合神经网络与高斯过程的方法:

 

2018年在《Neural Processes》中讨论了使用神经网络学习逼近随机过程的方法,将时间复杂度降为O(n)。同时,模型可以直接通过数据学习隐式的核函数,克服了很多函数设计上的限制。

 

2019年在《Conditional Neural Processes》讨论了结合神经网络与高斯过程解决监督学习问题的端到端的方法,结合了神经网络和类似高斯过程的特征。

 

(三)GP在特来电的应用

 

特来电在充电、运维、运营等各个方向都积累了海量的数据,具有丰富的业务场景,为机器学习模型的应用和实践提供了充分的环境,其中就有GP在回归和分类上的多个案例,同时也采用多模型融合的方式,进一步提高模型的精度。随着业务需求的深耕和细化,将有更多的技术及其细节被应用和挖掘,持续为业务赋能。

 

限于篇幅,本篇侧重于GP理论,在《机器学习应用之高斯过程(实践篇)》中,将以充电安全和电站运营的两个实际案例,来具体介绍GP跟特来电业务在不同场景下的结合与应用。

 

参考:

 

1.https://mp.weixin.qq.com/s/Ct9en9jzmX3d4JCFb4Fc3g

 

2.西安邮电大学《基于高斯过程在机器学习中的应用》

 

3.https://zhuanlan.zhihu.com/p/75589452

 

4.https://blog.csdn.net/Francis_chang/article/details/106041392

 

5.https://36kr.com/p/1722194706433

 

6.https://www.zhihu.com/question/265638507

 

7.https://www.jiqizhixin.com/articles/2019-02-12-3

 

8.https://blog.csdn.net/deephub/article/details/120372938

 

9.https://zhuanlan.zhihu.com/p/39158179

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。