在数据分析中,经常会遇到数据点较少的情况,尤其是在高维空间中。在这种情况下,使用线性回归模型时,由于观测数据中的噪声,会导致模型预测的方差非常大。这是因为线性回归试图通过一条直线来拟合这些点,而噪声的存在使得每次预测的斜率都可能有很大的变化。
与普通最小二乘法(Ordinary Least Squares, OLS)相比,岭回归(Ridge Regression)通过最小化一个带有惩罚项的最小二乘函数来解决这个问题。这种惩罚项会缩小回归系数的值,从而减少模型预测的方差。即使在每个维度中数据点很少的情况下,岭回归预测的斜率也更加稳定,与标准线性回归相比,其预测线的方差大大降低。
以下是一个使用Python的scikit-learn库来比较线性回归和岭回归方差的示例代码。首先,导入必要的库,并创建训练和测试数据集。然后,定义了两种回归模型:一个是普通最小二乘回归,另一个是岭回归。接着,对每个模型进行训练,并在测试数据集上进行预测,最后绘制出预测结果。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
# 创建训练和测试数据集
X_train = np.c_[0.5, 1].T
y_train = [0.5, 1]
X_test = np.c_[0, 2].T
# 设置随机种子以保证结果的可重复性
np.random.seed(0)
# 定义两种回归模型
classifiers = dict(ols=linear_model.LinearRegression(), ridge=linear_model.Ridge(alpha=0.1))
# 循环训练和预测
for name, clf in classifiers.items():
fig, ax = plt.subplots(figsize=(4, 3))
for _ in range(6):
this_X = 0.1 * np.random.normal(size=(2, 1)) + X_train
clf.fit(this_X, y_train)
ax.plot(X_test, clf.predict(X_test), color="gray")
ax.scatter(this_X, y_train, s=3, c="gray", marker="o", zorder=10)
clf.fit(X_train, y_train)
ax.plot(X_test, clf.predict(X_test), linewidth=2, color="blue")
ax.scatter(X_train, y_train, s=30, c="red", marker="+", zorder=10)
ax.set_title(name)
ax.set_xlim(0, 2)
ax.set_ylim((0, 1.6))
ax.set_xlabel("X")
ax.set_ylabel("y")
fig.tight_layout()
plt.show()
从上面的代码中可以看出,首先导入了matplotlib.pyplot用于绘图,numpy用于数据处理,以及scikit-learn库中的linear_model模块用于创建回归模型。然后,创建了训练和测试数据集,并设置了随机种子以保证结果的可重复性。接着,定义了两种回归模型:普通最小二乘回归和岭回归。在循环中,对每个模型进行了多次训练和预测,并在测试数据集上绘制了预测结果。最后,设置了图表的标题、坐标轴范围和标签,并显示了图表。
通过比较两种回归模型的预测结果,可以清楚地看到,在数据点较少的情况下,岭回归模型的预测方差明显小于普通最小二乘回归模型。这表明,在处理高维数据或数据点较少的情况时,岭回归是一种更加稳健的回归方法。