# 机器学习（七）岭回归

## 正则化(Regularization)

• 概念及原因

• 正则化代价函数

L1正则化：

J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n ∣ θ j ∣ ] J(\theta)=\frac{1}{2 m}\left[\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+\lambda \sum_{j=1}^{n}\left|\theta_{j}\right|\right]
L2正则化：

J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ] J(\theta)=\frac{1}{2 m}\left[\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+\lambda \sum_{j=1}^{n} \theta_{j}^{2}\right]

## 岭回归（Ridge Regression）

• 概念及原理

w = ( X T X + λ I ) − 1 X T y \mathrm{w}=\left(X^{T} X+\lambda I\right)^{-1} X^{T} \mathrm{y}
λ \lambda 为岭系数, I 为单位矩阵(对角线上全为1 , 其他元素全为 0 )

• 参数推导

J ( θ ) = 1 2 ∑ i = 1 n ( h θ ( x i ) − y i ) 2 J(\theta)=\frac{1}{2} \sum_{i=1}^{n}\left(h_{\theta}\left(x_{i}\right)-y_{i}\right)^{2}

J ( θ ) = 1 2 ∑ i = 1 n ( h θ ( x i ) − y i ) 2 + λ ∑ i n θ i 2 J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) + λ θ T θ = 1 2 ( θ T X T X θ − θ T X T Y − Y T X θ + Y T Y ) + λ θ T θ ∂ J ( θ ) ∂ θ = X T X θ − X T Y + λ θ θ = ( X T X + λ I ) − 1 X T Y \begin{aligned} J(\theta) &=\frac{1}{2} \sum_{i=1}^{n}\left(h_{\theta}\left(x_{i}\right)-y_{i}\right)^{2}+\lambda \sum_{i}^{n} \theta_{i}^{2} \\ J(\theta) &=\frac{1}{2}(X \theta-Y)^{T}(X \theta-Y)+\lambda \theta^{T} \theta \\ &=\frac{1}{2}\left(\theta^{T} X^{T} X \theta-\theta^{T} X^{T} Y-Y^{T} X \theta+Y^{T} Y\right)+\lambda \theta^{T} \theta \\ \frac{\partial J(\theta)}{\partial \theta} &=X^{T} X \theta-X^{T} Y+\lambda \theta \\ \theta &=\left(X^{T} X+\lambda I\right)^{-1} X^{T} Y \end{aligned}

1.各回归系数的岭估计基本稳定。

2.残差平方和增大不太多。

{ argmin ⁡ { ∑ ( y − X β 2 ) } ∑ β 2 ≤ t \left\{\begin{array}{l} \operatorname{argmin}\left\{\sum\left(y-X \beta^{2}\right)\right\} \\ \sum \beta^{2} \leq t \end{array}\right.

（1）岭迹法确定λ值(定性)

β = ( X T X + λ I ) − 1 X T y \beta=\left(X^{T} X+\lambda I\right)^{-1} X^{T} y 可知β是λ的函数，当 λ ∈ [ 0 , ∞ ) \lambda \in[0, \infty) 时,在平面直角坐标系中的β−λ曲线称为岭迹曲线。当β趋于稳定的点就是所要寻找的λ值。

import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import Ridge
import matplotlib.pyplot as plt

#拆分为训练集和测试集
predictors=data.columns[:-1]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.Y,
test_size=0.2,random_state=1234)
#构造不同的lambda值
Lambdas=np.logspace(-5,2,200)
#存放偏回归系数
ridge_cofficients=[]
for Lambda in Lambdas:
ridge=Ridge(alpha=Lambda,normalize=True)
ridge.fit(x_train,y_train)
ridge_cofficients.append(ridge.coef_)

#绘制岭迹曲线
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
plt.rcParams['axes.unicode_minus']=False
plt.style.use('ggplot')
plt.plot(Lambdas,ridge_cofficients)
#x轴做对数处理
plt.xscale('log')
plt.xlabel('Log(Lambda)')
plt.ylabel('Cofficients')
plt.show()



（2）交叉验证法确定λλ值

RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, scoring=None, cv=None, gcv_mode=None, store_cv_values=False)
• lambdas：用于指定多个λλ值的元组或数组对象，默认包含0.1,1,10三种值。
• fit_intercept：bool类型，是否需要拟合截距项，默认为True。
• normalize：bool类型，建模时是否对数据集做标准化处理，默认为False。
• scoring：指定用于模型评估的度量方法。
• cv：指定交叉验证的重数。
• gcv_mode：指定广义交叉验证的方法。
• store_cv_values：bool类型，是否保存每个λλ下交叉验证的评估信息，默认为False，只有cv为None时有效。

import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import RidgeCV

#拆分为训练集和测试集
predictors=data.columns[:-1]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.Y,
test_size=0.2,random_state=1234)
#构造不同的lambda值
Lambdas=np.logspace(-5,2,200)
#设置交叉验证的参数，使用均方误差评估
ridge_cv=RidgeCV(alphas=Lambdas,normalize=True,scoring='neg_mean_squared_error',cv=10)
ridge_cv.fit(x_train,y_train)
print(ridge_cv.alpha_)


09-24
05-31 157

07-20 2796
11-12 2059
08-24 922
11-24 285