前言
线性回归回顾
在介绍岭回归之前,回顾一下线性回归(Linear Regression)。线性回归是一种用于建立输入特征(自变量)和输出目标(因变量)之间关系的方法。其基本公式如下:
Y = β 0 + β 1 X 1 + β 2 X 2 + … + β p X p + ϵ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + \ldots + \beta_pX_p + \epsilon Y=β0+β1X1+β2X2+…+βpXp+ϵ
其中, Y Y Y 是目标变量, X 1 , X 2 , … , X p X_1, X_2, \ldots, X_p X1,X2,…,Xp 是特征变量, β 0 , β 1 , β 2 , … , β p \beta_0, \beta_1, \beta_2, \ldots, \beta_p β0,β1,β2,…,βp 是回归系数, ϵ \epsilon ϵ 是误差项。线性回归的目标是找到最佳的回归系数,使得预测值与实际值之间的残差平方和最小化。
多重共线性问题
多重共线性是指在线性回归中,特征变量之间存在高度相关性的情况。这会导致回归系数的估计变得不稳定,因为存在多个可能的系数组合可以得到相似的拟合效果。多重共线性的存在使得模型在新数据上的泛化性能下降,容易过拟合。
岭回归的提出
岭回归是由统计学家Arthur E. Hoerl和Robert W. Kennard于1970年提出的,它的目标是解决多重共线性问题。岭回归的核心思想是在线性回归的损失函数中添加一个正则化项,以限制回归系数的大小。这个正则化项通常是L2范数(欧几里得范数)的平方,即:
L2 正则化项 = α ∑ i = 1 p β i 2 \text{L2 正则化项} = \alpha \sum_{i=1}^{p} \beta_i^2 L2 正则化项=αi=1∑pβi2
其中, α \alpha α 是正则化参数,用于控制正则化的强度。增大 α \alpha α会导致回归系数趋向于零,从而减小多重共线性的影响。
岭回归的优点
-
解决多重共线性:岭回归可以有效地处理特征变量之间的高度相关性,提高模型的稳定性。
-
防止过拟合:通过正则化项,岭回归可以限制回归系数的大小,防止模型在训练数据上过度拟合。
-
可调参数:正则化参数 α \alpha α可以根据需要进行调整,以平衡模型的拟合度和泛化能力。
岭回归的实现
在实际应用中,岭回归可以使用各种机器学习框架和库来实现,例如Scikit-Learn(Python)等。
from sklearn.linear_model import Ridge
# 创建岭回归模型
ridge_reg = Ridge(alpha=1.0)
# 拟合模型
ridge_reg.fit(X_train, y_train)
# 预测
y_pred = ridge_reg.predict(X_test)
实战
数据准备
首先,我们需要获取波士顿房价数据集,并对数据进行处理。我们从CMU统计学习数据集库中获取数据,并将其划分为训练集和测试集。
import pandas as pd
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(data, target)
然后,我们对数据进行标准化处理,确保特征在相同的尺度范围内。这是为了避免模型训练过程中特征权重的不合理变化。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
岭回归
岭回归是一种线性回归的正则化方法,它通过在损失函数中添加L2范数的惩罚项,对模型参数进行限制。我们将使用岭回归作为梯度下降的优化方式。
from sklearn.linear_model import Ridge
ridge = Ridge()
ridge.fit(X_train, y_train)
训练完成后,我们可以查看岭回归模型的参数和截距,并评估模型在训练集和测试集上的性能。
print("岭回归模型参数:{}".format(ridge.coef_))
print("岭回归模型截距:{}".format(ridge.intercept_))
print("岭回归模型训练集得分:{:.2f}".format(ridge.score(X_train, y_train)))
print("岭回归模型测试集得分:{:.2f}".format(ridge.score(X_test, y_test)))
模型评估
我们使用均方误差(Mean Squared Error, MSE)来评估模型的性能,MSE越小表示模型拟合效果越好。
from sklearn.metrics import mean_squared_error
y_pred = ridge.predict(X_test)
print("岭回归模型均方误差:{:.2f}".format(mean_squared_error(y_test, y_pred)))
可视化展示
最后,我们使用可视化工具matplotlib展示测试集的真实房价和预测房价,直观地观察模型的预测效果。
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(range(len(y_test)), y_test, "r", label="y_test")
plt.plot(range(len(y_pred)), y_pred, "b--", label="y_pred")
plt.legend()
plt.show()
在图中,红色的曲线代表测试集中的真实房价,蓝色的虚线代表岭回归模型对测试集的房价预测结果。我们可以直观地看到预测结果是否与真实房价趋势一致。