07贝叶斯回归
7.1 简介
贝叶斯回归将贝叶斯统计的思想应用于回归分析中,通过先验分布和似然函数来推断后验分布。在贝叶斯回归中,模型参数被视为随机变量,并且有自己的分布。通过贝叶斯公式,可以更新这些参数的分布,从而得到后验分布。
7.2 线性回归中的贝叶斯方法
在贝叶斯线性回归中,我们假设参数 β\betaβ 的先验分布是正态分布,即:
β∼N(μ0,Σ0)\beta \sim \mathcal{N}(\mu_0, \Sigma_0)β∼N(μ0,Σ0)
给定数据 yyy 和 XXX,我们可以使用贝叶斯公式计算后验分布:
p(β∣y,X)∝p(y∣X,β)×p(β)p(\beta \mid y, X) \propto p(y \mid X, \beta) \times p(\beta)p(β∣y,X)∝p(y∣X,β)×p(β)
其中,p(y∣X,β)p(y \mid X, \beta)p(y∣X,β) 是似然函数,通常假设是高斯分布。
7.3 贝叶斯线性回归的实现
在Python中,我们可以使用scikit-learn
的BayesianRidge
类来实现贝叶斯线性回归。BayesianRidge
会自动估计模型参数的先验分布和后验分布。
from sklearn.linear_model import BayesianRidge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 生成模拟数据
np.random.seed(42)
X = np.random.rand(100, 1)
y = 4 + 3 * X[:, 0] + np.random.randn(100)
# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 构建贝叶斯线性回归模型
model = BayesianRidge()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")
7.4 解释贝叶斯回归结果
贝叶斯回归的结果不仅提供了模型参数的点估计,还提供了参数的不确定性估计。BayesianRidge
类中的coef_
属性表示模型参数的估计值,而sigma_
属性表示参数估计的标准差。
# 输出模型参数和不确定性
print(f"Coefficients: {model.coef_}")
print(f"Coefficient standard deviations: {np.sqrt(np.diag(model.sigma_))}")
7.5 先验选择与模型评估
先验分布的选择对贝叶斯回归结果有重要影响。在实际应用中,选择适当的先验分布需要结合领域知识和数据特征。scikit-learn
的BayesianRidge
提供了一个默认的先验分布,但用户也可以通过调整模型参数来改变先验的形式。
为了评估贝叶斯回归模型的效果,我们可以使用交叉验证或后验预测检查(posterior predictive checks)等方法。
from sklearn.model_selection import cross_val_score
# 交叉验证评估模型
scores = cross_val_score(model, X, y, scoring='neg_mean_squared_error', cv=5)
print(f"Cross-validated MSE: {-scores.mean():.2f}")
7.6 示例:股票价格预测
我们通过一个实际的例子来应用贝叶斯回归。假设我们有一组股票的历史价格数据,并且希望利用这些数据预测未来的价格走势。
# 生成模拟股票数据
np.random.seed(42)
days = np.arange(1, 101)
prices = 100 + np.cumsum(np.random.randn(100))
# 特征为时间(天数),目标为价格
X = days.reshape(-1, 1)
y = prices
# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 构建贝叶斯线性回归模型
model = BayesianRidge()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")
# 可视化结果
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(X, y, 'o', label='Observed prices')
plt.plot(X_test, y_pred, 'r-', label='Predicted prices')
plt.xlabel('Days')
plt.ylabel('Stock Price')
plt.legend()
plt.show()
7.7 贝叶斯方法的优势与局限
贝叶斯回归提供了对参数不确定性的自然表达,使得模型更加稳健,并且能够更好地处理小样本数据。然而,贝叶斯方法的计算复杂度较高,尤其是在高维数据或复杂模型中。此外,先验分布的选择也可能对结果产生较大影响。