【MachineLearning】之 岭回归(Ridge Regression)

Topic:
  1. 为什么需要岭回归?
  2. 岭回归如何防止模型出现过拟合
  3. 岭回归代码


一、为什么需要岭回归?


(1) 线性回归不好?

线性回归主要根据 最小二乘法

那么,哪里出了问题呢?
  • 最小二乘法的目标:使得训练集中的真实集与回归模型的估计值的均方差最小;
  • 我们的目标:测试集中的真实值与回归模型的估计值的差异最小

最小二乘法的目标 == 我们的目标?

举个栗子:

有一系列参数 w i

w 0 w 1 w 2 w 3 w 4
1 1 1 1 6

w 4 过大,且其他参数对其影响很微小时候,那么这个 w 4 独裁

即,只要 w 4 稍微变动都会对最后的值产生重大影响,导致均方差波动很大。



那么如何防止 w 4 这个变量独裁呢?

如果内部无法调控,那么就从外部入手,给它加个“手柄”( λ i = 1 n ( w i ) 2

(1) F R i d g e = i = 1 n ( y i w T x ) 2 + λ i = 1 n ( w i ) 2

扫描二维码关注公众号,回复: 2745160 查看本文章




(2) 什么是岭回归?

普通最小二乘法带来的局限性,导致许多时候不能直接使用其进行线性回归拟合。特别以下两种情况:

  • 数据集的列(特征)数量 > 数据量(行数量),即 X 不是列满秩。
  • 数据集列(特征)数据之间存在较强的线性相关性,即模型容易出现过拟合。

为了解决上述两种情况中出现的问题,岭回归(Ridge Regression)应运而生

岭回归 : 可以被看作为一种改良后的最小二乘估计法,它通过向损失函数中添加 L2 正则项(2-范数)有效防止模型出现过拟合,且以助于解决非满秩条件下求逆困难的问题,从而提升模型的解释能力。

(1) F R i d g e = i = 1 n ( y i w T x ) 2 + λ i = 1 n ( w i ) 2






二、岭回归如何防止模型出现过拟合


对应的损失函数变为:

(1) F R i d g e = i = 1 n ( y i w T x ) 2 + λ i = 1 n ( w i ) 2

其中 红色项 被称为二次正则化项,也称为权重衰减项

( 1 ) 式改写为向量表示:

(2) F R i d g e = y X w 2 2 + λ w 2 2

公式 ( 2 ) 中回归系数 w 的解析解为:

(3) w ^ R i d g e = ( X T X + λ I ) 1 X T Y

通过给 X T X 增加一个单位矩阵,从而使得矩阵变成满秩,完善普通最小二乘法的不足。

公式 ( 1 ) 也等价于:

F R i d g e = y X w 2 2

(4) s . t . w 2 t

其中, t λ 对应的一个常数,这里通过限制 w 2 的大小来避免过拟合的发生。所以,假设我们有 2 个变量, 残差平方和 ( y 1 w 1 T x ) 2 + ( y 2 w 2 T x ) 2 是一个二次函数,代表三维空间中的抛物面,几何上用等值线表示(下图红色)。

当抛物面受到 w 1 2 + w 2 2 t 2 约束条件时,就相当于在二维平面下的圆(下图蓝色)。这个时候等值线与圆相切的点便是在约束条件下的最优点,如下图所示。






三、岭回归代码


通过 scikit-learn 提供的岭回归方法 Ridge() j进行数据拟合。

sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, 
                           max_iter=None, tol=0.001, solver='auto', random_state=None)
  • alpha: 正则化强度,默认为 1.0,对应公式 ( 1 ) 中的 λ
  • fit_intercept: 默认为 True,计算截距项。
  • normalize: 默认为 False,不针对数据进行标准化处理。
  • copy_X: 默认为 True,即使用数据的副本进行操作,防止影响原数据。
  • max_iter: 最大迭代次数,默认为 None。
  • tol: 数据解算精度。
  • solver: 根据数据类型自动选择求解器。
  • random_state: 随机数发生器。
"""使用岭回归拟合
"""
from sklearn.linear_model import Ridge

ridge_model = Ridge(fit_intercept=False) # 参数代表不增加截距项
ridge_model.fit(x, y)

ridge_model.coef_ # 打印模型参数


"""不同 alpha 参数拟合
"""
alphas = np.linspace(-3,2,20)

coefs = []
for a in alphas:
    ridge = Ridge(alpha=a, fit_intercept=False)
    ridge.fit(x, y)
    coefs.append(ridge.coef_)


"""绘制不同 alpha 参数结果
"""
from matplotlib import pyplot as plt
%matplotlib inline

plt.plot(alphas, coefs) # 绘制不同 alpha 参数下的 w 拟合值
plt.scatter(np.linspace(0,0,10), parameters[0]) # 普通最小二乘法拟合的 w 值放入图中
plt.xlabel('alpha')
plt.ylabel('w')
plt.title('Ridge Regression')


在此使用sklearn.linear_model.LinearRegression()构建线性回归模型去求解参数时,你会发现得到的参数和岭回归拟合接近,而与上文中使用最小二乘法相差较大,为什么呢?

其实这就说明像 scikit-learn 提供封装好的线性回归类LinearRegression()并不只是实现了简单的最小二乘法。
可能是为了方便使用,也会在某些条件下默认使用正则化等手段,所以才会出现和普通最小二乘法结果不一的情况。
scikit-learn 是一个十分成熟的模块

猜你喜欢

转载自blog.csdn.net/fanfan4569/article/details/81592043
今日推荐