📜  贝叶斯回归的实现

📅  最后修改于: 2022-05-13 01:55:39.549000             🧑  作者: Mango

贝叶斯回归的实现

与用于预测分类(离散)值的分类相比,回归是预测连续值(实数)的机器学习任务。要了解有关回归基础知识的更多信息,您可以点击此链接。

当您听到“贝叶斯”这个词时,您可能会想到朴素贝叶斯。然而,贝叶斯原理也可以用于执行回归。在本文中,我们将讨论和实现贝叶斯岭回归,它与常规的岭回归不同。要了解有关常规岭回归的更多信息,您可以点击此链接。

首先,您必须了解贝叶斯只是一种定义和估计统计模型的方法。当数据集中的数据不足或数据分布不佳时,贝叶斯回归会非常有用。与仅从每个属性的单个值获得输出的常规回归技术相比,贝叶斯回归模型的输出是从概率分布中获得的。输出“y”是从正态分布(均值和方差被归一化)生成的。贝叶斯线性回归的目的不是找到模型参数,而是找到模型参数的“后验”分布。不仅输出 y,而且模型参数也被假定来自分布。后验的表达式是:
\Large Posterior = {(Likelihood * Prior) \over Normalization}
在哪里

  • 后验:事件发生的概率;假设 H,假设另一个事件;比如说,E 已经发生了。即,P(H | E)。
  • 先验:事件 H 在另一事件之前发生的概率。即,P(H)
  • 似然性:它是一个似然函数,其中一些参数变量被边缘化。

这实际上相当于贝叶斯定理,它说,
\Large P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)}
其中 A 和 B 是事件,P(A) 是 A 发生的概率,P(A|B) 是在事件 B 已经发生的情况下 A 发生的概率。 P(B),事件B发生的概率不可能为0,因为它已经发生了。如果您想了解有关常规朴素贝叶斯和贝叶斯定理的更多信息,可以点击此链接。

查看上面的公式,我们可以看到,与普通最小二乘法 (OLS) 相比,我们有一个模型参数的后验分布,它与数据的可能性乘以参数的先验概率成正比。随着数据点数量的增加,似然值会增加并且会变得比之前的值大很多。在无限数量的数据点的情况下,参数值收敛到从 OLS 获得的值。因此,我们从初始估计(先验值)开始我们的回归过程。随着我们开始覆盖更多数据点,我们的模型变得更少错误。所以对于贝叶斯岭回归来说,需要大量的训练数据才能使模型准确。

现在,让我们对事物的数学方面进行简要概述。在线性模型中,如果 'y' 是预测值,则
\Large \hat{y}(w, x) = w_0 + w_1 x_1 + ... + w_p x_p
其中,'w' 是向量 w。 w 由 w 0 , w 1 , ... 组成。 “x”是权重的值。
\Large w = (w_1, ..., w_p)
因此,现在为了让贝叶斯回归获得一个完全概率模型,假设输出“y”是围绕 X w的高斯分布,如下所示:
\Large p(y|X, w, \alpha) = \mathcal{N}(y|X w, \alpha)
其中alpha是 Gamma 分布先验的超参数。它被视为从数据估计的随机变量。下面给出贝叶斯岭回归的实现。贝叶斯岭回归的数学表达式是:
\Large p(w|\lambda) = \mathcal{N}(w|0, \lambda^{-1}\mathbf{I}_{p})
其中alpha 是alpha 参数之前的 Gamma 分布的形状参数, lambda是 Lambda 参数之前的 Gamma 分布的形状参数。
这只是对贝叶斯岭回归器背后的数学的简要介绍。本文的目的是为您简要概述贝叶斯回归;何时使用它,优点,缺点,并向您展示如何实现它。因此,我们刚刚为您简要介绍了贝叶斯回归和贝叶斯岭回归背后的数学。我们不会深入探讨数学是如何工作的。

贝叶斯回归的优点:

  • 当数据集的大小很小时非常有效。
  • 特别适合基于在线的学习(实时接收数据),与基于批处理的学习相比,在我们开始训练模型之前,我们手上有整个数据集。这是因为贝叶斯回归不需要存储数据。
  • 贝叶斯方法是一种久经考验的方法,在数学上非常稳健。因此,无需对数据集有任何额外的先验知识即可使用它。

贝叶斯回归的缺点:

  • 模型的推断可能很耗时。
  • 如果我们的数据集有大量数据可用,贝叶斯方法不值得,而常规频率方法做得更有效

使用Python实现贝叶斯回归:
在本例中,我们将执行贝叶斯岭回归。然而,贝叶斯方法可以与任何回归技术一起使用,如线性回归、套索回归等。我们将使用 scikit-learn 库来实现贝叶斯岭回归。我们将使用 Boston Housing 数据集,该数据集包含有关波士顿地区房屋中值的信息。您可以在此处了解有关此数据集的更多信息。对于评估,我们将使用 r2 分数。 r2 分数的最佳可能值为 1.0。如果模型在不考虑属性的情况下进行恒定预测,则 r2 得分的值为 0。对于更差的模型,r2 得分也可能为负。要了解有关 r2 分数的更多信息,您可以点击此处的链接。

但在我们开始编写代码之前,您必须了解贝叶斯岭回归器的重要参数:

  • n_iter :迭代次数。默认值 = 100。
  • tol :鉴于模型已经收敛,何时停止算法。默认值 = 1e-3。
  • alpha_1 :回归线的形状参数(Gamma 分布)在 alpha 参数上(用于正则化)。默认值 = 1e-6。
  • alpha_2 : alpha 参数上 Gamma 分布的反比例参数。默认值 = 1e-6。
  • lambda_1 : lambda 参数上 Gamma 分布的形状参数。默认值 = 1e-6。
  • lambda_2 : lambda 参数上 Gamma 分布的反比例参数。默认值 = 1e-6。

注意:此代码可能无法在在线 IDE 上运行。在 Google Colab 或本地计算机上运行它。

代码:

Python3
# Importing modules that are required
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.linear_model import BayesianRidge
   
# Loading dataset
dataset = load_boston()
X, y = dataset.data, dataset.target
   
# Splitting dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.15, random_state = 42)
   
# Creating and training model
model = BayesianRidge()
model.fit(X_train, y_train)
   
# Model making a prediction on test data
prediction = model.predict(X_test)
   
# Evaluation of r2 score of the model against the test set
print(f"r2 Score Of Test Set : {r2_score(y_test, prediction)}")


输出:

r2 Score Of Test Set : 0.7943355984883815

我们在使用所有默认参数的贝叶斯岭回归的测试集上获得了大约 0.7934 的 r2 分数。这是一个可以接受的分数。但是,您可以更改上面讨论的alphalambda参数以获得更好的数据集结果。

结论:
因此,既然您已经了解了贝叶斯回归器的工作原理以及何时使用它,那么您应该在下次想要执行回归任务时尝试使用它,尤其是在数据集很小的情况下。

参考:

  • scikit-learn 文档。