【机器学习】一文带你入门贝叶斯回归
【精选优质专栏推荐】
- 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用
- 《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看
- 《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解
- 《网安渗透工具使用教程(全)》 —— 一站式工具手册
- 《CTF 新手入门实战教程》 —— 从题目讲解到实战技巧
- 《前后端项目开发(新手必知必会)》 —— 实战驱动快速上手
每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

在本文中,你将学习到:
- 传统回归与贝叶斯回归的根本区别:传统回归使用单一固定值作为参数,而贝叶斯回归将参数建模为概率分布。
- 这种概率方法如何让模型生成可能结果的完整分布,从而量化预测的不确定性。
- 如何使用 Python 中的 scikit-learn 实现一个简单的贝叶斯回归模型。
引言
在机器学习中,回归模型是一类广泛使用的模型,用于对数值型连续变量进行预测,例如房价、温度或股票价格。传统回归模型由精确的参数或权重定义,并且通常假设这些估计没有不确定性。贝叶斯回归则以概率方式建模预测变量与目标变量之间的关系,在建模过程中引入了不确定性。
传统回归模型
传统回归模型对目标连续变量(如房价)进行预测,其输出形式为一个单一明确的估计值
y ^ \hat{y} y^,即模型根据输入属性预测的房价。例如,具有 n 个输入变量(如房屋属性)的线性回归模型可表示为以下线性方程:
y ^ = β 0 + β 1 x 1 + β 2 x 2 + ⋯ + β n x n + ϵ \hat{y} = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_n x_n + \epsilon y^=β0+β1x1+β2x2+⋯+βnxn+ϵ
其中 ϵ \epsilon ϵ 是误差项, β 0 , … , β n \beta_0, \dots, \beta_n β0,…,βn 是与输入变量相关的权重,以及偏置项 β 0 \beta_0 β0。
一个实际应用到预测房价的具体模型可能如下:
y ^ = 50000 + 150 ⋅ x 1 + 10000 ⋅ x 2 − 2000 ⋅ x 3 + ϵ \hat{y} = 50000 + 150 \cdot x_1 + 10000 \cdot x_2 - 2000 \cdot x_3 + \epsilon y^=50000+150⋅x1+10000⋅x2−2000⋅x3+ϵ
其中:
- x 1 x_1 x1 为房屋面积(平方米)。
- x 2 x_2 x2 为卧室数量。
- x 3 x_3 x3 为房龄(年),注意该特征权重为负,意味着房龄较大的房屋会降低预测价格,这符合实际情况,因为老房子通常价格较低。
上述模型中的 50000、150、10000 和 -2000 即为模型的参数值或权重。这一点在后续理解贝叶斯回归时非常重要。
贝叶斯回归是如何工作的?
那么,贝叶斯回归与传统回归有何不同呢?与返回单一预测值且权重以精确数值学习的传统回归不同,贝叶斯回归模型对可能的参数值使用概率分布进行建模,从而在预测中考虑不确定性。换句话说,在贝叶斯回归模型中,每个权重 β i \beta_i βi 都成为一个带有相应概率分布的随机变量。
学习过程也随之调整:不再寻求一组“最佳拟合”的 n + 1 n+1 n+1 个权重 β 0 , β 1 , β 2 , … , β n \beta_0, \beta_1, \beta_2, \dots, \beta_n β0,β1,β2,…,βn,而是试图在给定训练数据(包含已知输出或目标值的实例集合)的情况下找到参数的后验分布。
值得注意的是,由于权重被建模为分布,得到的预测 y ^ \hat{y} y^ 也成为分布,而非单一确定值,因此预测存在不确定性。
为什么我们会对存在不确定性的预测感兴趣,而非精确预测呢?
贝叶斯回归在理解和量化不确定性与进行预测同样重要的场景下非常有意义。例如,在高风险场景如医疗诊断中,我们不仅希望知道模型的预测结果,还希望了解模型对该预测的置信度或不确定性。当置信度较低时,医疗专业人员可以根据自身专业判断来解读结果。贝叶斯回归在自动驾驶和金融预测等场景中也具有实际价值:在这些情况下,如果基于可能错误的精确预测做出决策,可能会造成重大损失或产生危险后果;因此,将预测建模为概率分布是一种更具信息量的方法,可帮助平衡潜在风险或在必要时寻求更多信息。
贝叶斯回归:一个简单示例
下面通过一个简单示例来理解贝叶斯回归的工作原理。
假设我们希望仅基于一个属性估计房价:房屋面积,记为 x 1 x_1 x1。针对该问题的传统回归模型可能如下:
y ^ = 50000 + 150 ⋅ x 1 \hat{y} = 50000 + 150 \cdot x_1 y^=50000+150⋅x1
在贝叶斯回归中,两个模型权重 β 0 \beta_0 β0 和 β 1 \beta_1 β1 不再取 50000 和 150 这样的精确值,而是以概率分布的形式学习。例如:
- 偏置项(也称截距) β 0 \beta_0 β0 服从正态分布:
β 0 ∼ N ( 50000 , 500 0 2 ) \beta_0 \sim N(50000, 5000^2) β0∼N(50000,50002)
- 与输入特征相关的斜率或权重 β 1 \beta_1 β1 也服从正态分布:
β 1 ∼ N ( 150 , 2 0 2 ) \beta_1 \sim N(150, 20^2) β1∼N(150,202)
回忆一下,正态分布的两个参数分别是均值和方差。
那么,房价是如何预测的呢?模型不会返回单一价格,而是通过从权重的概率分布中采样进行推理,从而生成可能预测值的范围。例如,对于一栋 100 平方米的房子,两个采样结果可能为:
- 采样 1: β 0 = 52000 \beta_0 = 52000 β0=52000, β 1 = 160 \beta_1 = 160 β1=160,预测价格
y ^ = 52000 + 160 ⋅ 100 = 68 , 000 USD \hat{y} = 52000 + 160 \cdot 100 = 68,000 \text{ USD} y^=52000+160⋅100=68,000 USD
- 采样 2: β 0 = 49000 \beta_0 = 49000 β0=49000, β 1 = 140 \beta_1 = 140 β1=140,预测价格
y ^ = 49000 + 140 ⋅ 100 = 63 , 000 USD \hat{y} = 49000 + 140 \cdot 100 = 63,000 \text{ USD} y^=49000+140⋅100=63,000 USD
通过大量采样,我们最终得到预测房价的分布,其中某些价格区间出现频率更高,因此概率更大。基于此,我们可以将预测表示为置信区间,例如:
该房屋的预测价格约为 65,500 美元,95% 置信区间为 61,000 至 70,000 美元。
如前所述,在某些实际应用中,这种存在不确定性的预测比单一精确预测更有价值,有助于做出有效且信息充分的决策。
使用 Python 与 Scikit-learn 实现贝叶斯回归
幸运的是,使用 scikit-learn 在 Python 中实现贝叶斯回归非常简单。linear_model 模块提供了 BayesianRidge 对象,用于执行贝叶斯回归。该对象的使用方式与其他 scikit-learn 模型类似:创建模型实例、拟合训练数据,然后用于预测。关键区别在于,调用 predict 方法时,可以同时请求预测的标准差,从而获得模型不确定性的度量。
下面是一个简单示例,演示如何使用 BayesianRidge 拟合示例数据并进行预测,同时量化不确定性:
import numpy as np
from sklearn.linear_model import BayesianRidge
np.random.seed(42)
# 示例数据(房屋面积),添加噪声以展示不确定性
X = np.array([[50], [100], [150], [200], [250]])
# 目标值(房价),添加随机噪声
y = (np.array([100000, 200000, 300000, 400000, 500000]) + np.random.normal(0, 30000, X.shape[0]))
# 创建并拟合模型,调整参数以突出不确定性
# alpha_1, alpha_2, lambda_1, lambda_2 控制权重与噪声精度的先验分布
model = BayesianRidge(alpha_1=1e-6, alpha_2=1e-6, lambda_1=1e-6, lambda_2=1e-6)
model.fit(X, y)
# 对新房屋(120 m²)预测价格及不确定性
new_house_sqft = np.array([[120]])
mean_prediction, std_prediction = model.predict(new_house_sqft, return_std=True)
print(f"Predicted price for 120 m^2: ${mean_prediction[0]:,.2f}")
print(f"Uncertainty (std dev) for 120 m^2: ${std_prediction[0]:,.2f}")
# 对外推值(350 m²)预测以显示不确定性增加
extrapolated_sqft = np.array([[350]])
mean_extrapolated, std_extrapolated = model.predict(extrapolated_sqft, return_std=True)
print(f"Predicted price for 350 m^2 (extrapolated): ${mean_extrapolated[0]:,.2f}")
print(f"Uncertainty (std dev) for 350 m^2: ${std_extrapolated[0]:,.2f}")
输出示例:
Predicted price for 120 m^2: $253,679.60
Uncertainty (std dev) for 120 m^2: $26,625.02
Predicted price for 350 m^2 (extrapolated): $714,373.37
Uncertainty (std dev) for 350 m^2: $51,462.04
在上述代码中:
alpha_1:通过影响模型权重,设置对输入与输出关系复杂度的初始假设。alpha_2:与alpha_1配合,控制模型在多大程度上坚持初始假设,还是根据数据进行学习。lambda_1:设置对训练数据中“噪声”或随机误差的初始假设。lambda_2:与lambda_1配合,控制模型在多大程度上坚持噪声假设。
下面的可视化展示了训练数据中的噪声、最佳拟合线,以及最重要的一点:随着离训练数据点越来越远,尤其在外推时,不确定性带(uncertainty band)逐渐扩大。这直观地展示了贝叶斯回归的核心优势——能够量化预测不确定性。
import matplotlib.pyplot as plt
# 生成更宽的面积范围用于绘图,包括外推
X_plot = np.linspace(0, 400, 200).reshape(-1, 1)
# 获取预测均值与标准差
y_mean, y_std = model.predict(X_plot, return_std=True)
# 绘图
plt.figure(figsize=(10, 6))
# 绘制带噪声的训练数据点
plt.scatter(X, y, color='blue', label='Training Data (with noise)')
# 绘制回归线
plt.plot(X_plot, y_mean, color='red', label='Bayesian Ridge Mean Prediction')
# 绘制不确定性区域(1 标准差)
plt.fill_between(X_plot.ravel(), y_mean - y_std, y_mean + y_std, color='pink', alpha=0.5, label='Uncertainty (1 std dev)')
# 绘制 95% 置信区间(约 2 标准差)以丰富展示
plt.fill_between(X_plot.ravel(), y_mean - 2 * y_std, y_mean + 2 * y_std, color='lightcoral', alpha=0.2, label='Uncertainty (2 std dev / 95% CI)')
# 图表标签与展示
plt.title('Bayesian Regression with Quantified Uncertainty')
plt.xlabel('Square Footage')
plt.ylabel('House Price')
plt.legend()
plt.grid(True)
plt.show()
生成的可视化结果:

结束语
贝叶斯回归可以被视为经典回归模型的不确定性和概率化对应方法,而经典回归是许多实际应用中最广泛使用的机器学习预测模型类型之一。本文对这一回归技术的基础知识及其应用价值进行了温和入门式的介绍。
如果你对具体的贝叶斯回归方法和模型感兴趣,最常见的包括贝叶斯线性回归(Bayesian Linear Regression)、贝叶斯岭回归(Bayesian Ridge Regression)以及高斯过程回归(Gaussian Process Regression, GPR)。
更多推荐


所有评论(0)