机器学习算法[1]–线性回归，岭回归，Lasso回归原理详解及sklearn实现

1. 线性回归

1.1 原理

m

m

m的数据集：

D

=

{

(

x

1

,

y

1

)

,

(

x

2

,

y

2

)

,

.

.

.

.

.

,

(

x

m

,

y

m

)

}

boldsymbol{D} = { (pmb{x_1},y_1), (pmb{x_2}, y_2),.....,(pmb{x_m}, y_m) }

D={(x1x1x1,y1),(x2x2x2,y2),.....,(xmxmxm,ym)}

x

i

=

(

x

i

(

1

)

,

x

i

(

2

)

,

.

.

.

.

.

,

x

i

(

n

)

)

T

pmb{x_i} = (x_i^{(1)}, x_i^{(2)},..... ,x_i^{(n)})^T

xixixi=(xi(1),xi(2),.....,xi(n))T
n为自变量(特征值)个数

f

(

x

i

)

=

w

T

x

i

+

b

f(pmb{x_i}) = pmb{w}^Tpmb{x_i}+b

f(xixixi)=wwwTxixixi+b ，使得

f

(

x

i

)

y

i

f(pmb{x_i})≈y_i

f(xixixi)yi，其中

w

=

(

w

1

,

w

2

,

.

.

.

.

.

,

w

n

)

T

pmb{w} = (w_1, w_2, .....,w_n)^T

www=(w1,w2,.....,wn)T

w

pmb w

www

b

b

b采用最小二乘法，其通过均方误差损失(MSE)，即L2-Loss，损失函数定义如下：

L

(

w

,

b

)

=

1

2

m

i

=

1

m

(

f

(

x

i

)

y

i

)

2

(1)

L(pmb w,b) = frac{1}{2m} sum_{i=1}^{m}(f(pmb {x_i}) - y_i)^2 tag{1}

L(www,b)=2m1i=1m(f(xixixi)yi)2(1)

1

2

frac{1}{2}

21便与后续梯度求解

X

=

[

1

1

1

x

1

(

1

)

x

2

(

1

)

x

m

(

1

)

x

1

(

n

)

x

2

(

n

)

x

m

(

n

)

]

(

n

+

1

)

×

m

=

[

1

1

1

x

0

x

1

x

m

]

(

n

+

1

)

×

m

pmb{X} = left[ begin{matrix} 1 & 1& cdots &1\ x_1^{(1)} & x_2^{(1)} & cdots & x_m^{(1)} \ vdots & vdots & ddots & vdots \ x_1^{(n)} & x_2^{(n)} & cdots & x_m^{(n)} \ end{matrix} right]_{(n+1)×m}= left[ begin{matrix} 1 & 1 & cdots & 1 \ pmb {x_0} & pmb {x_1} & cdots & pmb {x_m} \ end{matrix} right]_{(n+1)×m}

XXX=1x1(1)x1(n)1x2(1)x2(n)1xm(1)xm(n)(n+1)×m=[1x0x0x01x1x1x11xmxmxm](n+1)×m

Y

=

[

y

1

y

2

y

m

]

m

×

1

pmb Y=left[begin{matrix} y_1 \ y_2 \ vdots \ y_m \ end{matrix}right]_{m×1}

YYY=y1y2ymm×1，为方便计算将

(

w

,

b

)

(pmb w, b)

(www,b)合并为

w

=

[

w

0

w

1

w

n

]

(

n

+

1

)

×

1

pmb {w'}=left[begin{matrix} w_0 \ w_1 \ vdots \ w_n \ end{matrix}right]_{(n+1)×1}

www=w0w1wn(n+1)×1，其中

w

0

=

b

w_0=b

w0=b

L

(

w

)

=

1

2

m

(

w

T

X

Y

T

)

(

w

T

X

Y

T

)

T

=

1

2

m

(

w

T

X

Y

T

)

(

X

T

w

Y

)

=

1

2

m

(

w

T

X

X

T

w

w

T

X

Y

Y

T

X

T

w

+

Y

T

Y

)

=

1

2

m

(

w

T

X

X

T

w

2

w

T

X

Y

+

Y

T

Y

)

begin{aligned}L(pmb {w'}) &= frac{1}{2m} (pmb {w'}^T pmb{X} - pmb{Y}^T)(pmb {w'}^T pmb{X} - pmb{Y}^T)^T=frac{1}{2m} (pmb {w'}^T pmb{X} - pmb{Y}^T)(pmb{X}^T pmb {w'}- pmb{Y}) \ &= frac{1}{2m}(pmb {w'}^T pmb{X}pmb{X}^T pmb {w'}-pmb {w'}^T pmb{X}pmb{Y}-pmb{Y}^Tpmb{X}^T pmb {w'}+pmb{Y}^Tpmb{Y}) \ &= frac{1}{2m}(pmb {w'}^T pmb{X}pmb{X}^T pmb {w'}-2pmb {w'}^T pmb{X}pmb{Y}+pmb{Y}^Tpmb{Y}) end{aligned}

L(www)=2m1(wwwTXXXYYYT)(wwwTXXXYYYT)T=2m1(wwwTXXXYYYT)(XXXTwwwYYY)=2m1(wwwTXXXXXXTwwwwwwTXXXYYYYYYTXXXTwww+YYYTYYY)=2m1(wwwTXXXXXXTwww2wwwTXXXYYY+YYYTYYY)

w

pmb{w'}

www使预测值

f

(

x

i

)

f(pmb{x_i})

f(xixixi)和目标值

y

i

y_i

yi误差最小，即对

L

(

w

)

L(pmb {w'})

L(www)关于

w

pmb{w'}

www求导：

w

=

arg

min

w

L

(

w

)

L

(

w

)

w

=

0

2

X

X

T

w

2

X

Y

=

0

w

=

(

X

X

T

)

1

X

Y

begin{aligned} pmb {w'} =underset{boldsymbol{w'}} {argmin } L(pmb {w'}) &Rightarrowfrac {partial{L(pmb {w'})}} {partial {boldsymbol{w'}}}=0 \ &Rightarrow2pmb{X}pmb{X}^T pmb {w'} - 2pmb{X}pmb{Y} = 0 \ & Rightarrowboldsymbol{w'} = (pmb{X}pmb{X}^T)^{-1}pmb{X}pmb{Y} end{aligned}

www=wargminL(www)wL(www)=02XXXXXXTwww2XXXYYY=0w=(XXXXXXT)1XXXYYY

X

X

T

pmb{X}pmb{X}^T

XXXXXXT为满秩矩阵时，则

w

boldsymbol{w'}

w存在唯一解，可根据公式直接求解；在实际问题中存在

X

X

T

pmb{X}pmb{X}^T

XXXXXXT为非满秩矩阵(如当自变量(特征值)个数

n

n

n大于数据集大小

m

m

m，此时未知量个数大于给定样本数量)，则

w

boldsymbol{w'}

w的解不唯一，需要对

X

pmb X

XXX进行奇异值分解(SVD)，最终的解将由具体奇异值求解算法的归纳偏好所决定

1.2 sklearn实现

• fit_intercept：是否计算线性回归模型的截距，即

w

0

/

b

w_0/b

• normalize：是否对输入自变量进行正则化；当fit_intercept为False时，忽略此参数；deprecated代表目前该参数已被弃用，需要正则化则使用StandardScaler类来实现
• copy_X：是否复制输入自变量矩阵，否则会覆盖原输入自变量矩阵
• n_jobs：用于计算的数量，默认为1
• positive：是否使系数为正，即

w

1

w

n

w_1sim w_n

；仅适用于稠密矩阵

• coef_：线性回归系数，即

w

1

w

n

w_1sim w_n

；当需求解多个目标系数时，返回2维数组

• rank_：输入自变量矩阵的秩，仅适用于稠密矩阵
• singular_：输入自变量矩阵的奇异值，仅适用于稠密矩阵
• intercept_：线性回归模型的截距，即

w

0

/

b

w_0/b

• n_features_in_：自变量(特征值)的个数
• feature_names_in_：自变量的名称，仅当输入自变量有(字符)名称时可用

• fit：拟合线性回归模型，即计算即

w

0

w

n

w_0sim w_n

• get_params：获取对应模型参数
• predict：对输入新的自变量进行预测
• score：获取线性回归模型的相关系数

R

2

R^2

• set_params：设置对应模型参数

>>> import numpy as np
>>> from sklearn import linear_model

>>> #假设 y = 1 + x_0
>>> reg = linear_model.LinearRegression() #实例化线性回归模型对象
>>> X = np.array([[1], [2]]) #自变量矩阵
>>> y = np.array([2, 3]) #因变量向量
>>> reg.fit(X, y) #拟合求解
>>> reg.coef_
[1.,]
>>> reg.intercept_
1.0
>>> reg.n_features_in_
1
>>> reg.get_params()
{'copy_X': True, 'fit_intercept': True, 'n_jobs': None, 'normalize': False, 'positive': False}
>>> reg.predict([[3], [4]])
[4., 5.]
>>> reg.score(X, y)
1.0


2. 岭回归

2.1 原理

X

X

T

pmb{X}pmb{X}^T

XXXXXXT非满秩矩阵(不可逆)的情况；通过在线性回归的MSE损失基础上增加L2正则项对回归系数

w

1

w

n

w_1sim w_n

w1wn产生惩罚(一般不包含

w

0

/

b

w_0/b

w0/b)；同时岭回归中的L2正则项是一种解决过拟合的方式

L

(

w

,

b

)

=

1

2

m

[

i

=

1

m

(

f

(

x

i

)

y

i

)

2

+

α

i

=

1

n

w

i

2

]

(2)

L(pmb w,b) = frac{1}{2m}left[ sum_{i=1}^{m}(f(pmb {x_i}) - y_i)^2 + alpha sum_{i=1}^{n}w_i^2right] tag{2}

L(www,b)=2m1[i=1m(f(xixixi)yi)2+αi=1nwi2](2)

w

0

/

b

w_0/b

w0/b(截距)也增加L2正则项，转换为矩阵形式：

L

(

w

)

=

1

2

m

[

(

w

T

X

Y

T

)

(

w

T

X

Y

T

)

T

+

α

w

T

w

]

begin{aligned}L(pmb {w'}) &= frac{1}{2m}left[ (pmb {w'}^T pmb{X} - pmb{Y}^T)(pmb {w'}^T pmb{X} - pmb{Y}^T)^T + alpha pmb{w'}^Tpmb{w'}right]end{aligned}

L(www)=2m1[(wwwTXXXYYYT)(wwwTXXXYYYT)T+αwwwTwww]

L

(

w

)

w

=

2

X

X

T

w

2

X

Y

+

α

w

=

0

w

=

(

X

X

T

+

α

I

)

1

X

Y

begin{aligned}frac {partial{L(pmb {w'})}} {partial {boldsymbol{w'}}}&=2pmb{X}pmb{X}^T pmb {w'} - 2pmb{X}pmb{Y}+alpha pmb{w'}=0 \ Rightarrowpmb{w'} &= (pmb{X}pmb{X}^T + alpha pmb{I})^{-1}pmb{X}pmb{Y} end{aligned}

wL(www)www=2XXXXXXTwww2XXXYYY+αwww=0=(XXXXXXT+αIII)1XXXYYY

X

X

T

+

α

I

pmb{X}pmb{X}^T + alpha pmb{I}

XXXXXXT+αIII必可逆，避免了线性回归中

X

X

T

pmb{X}pmb{X}^T

XXXXXXT不可逆的问题，其中

I

pmb {I}

III

n

+

1

n+1

n+1维的单位矩阵(主对角线上全为1，其他元素全为0)，

α

alpha

α为岭回归中的超参数(一般

α

alpha

α越大，回归系数

w

1

w

n

w_1sim w_n

w1wn越小)；

α

pmb{alpha}

ααα原则：当各回归系数基本保持恒定时的

α

pmb{alpha}

ααα

：一般对

w

0

/

b

w_0/b

w0/b(截距)不包含L2正则项，将

α

I

alpha pmb{I}

αIII转换为

[

0

0

0

α

I

n

×

n

]

(

n

+

1

)

×

(

n

+

1

)

left[ begin{matrix} 0 & pmb {0} \ pmb{0} &alpha pmb{I}_{n×n} end{matrix} right]_{(n+1)×(n+1)}

[0000000αIIIn×n](n+1)×(n+1)即可

2.2 sklearn实现

• alpha：控制L2正则项的权重

α

alpha

• max_iter：共轭梯度求解器的最大迭代次数
• tol：求解精度
• solver：选择用于计算的求解器(’svd’,'cholesky’等)
• random_state：用于控制’sag’或‘saga’求解器的随机状态
• 其余参数与LinearRegression类中相同参数名称的含义基本相同

• n_iter_：实际迭代次数
• 其余属性与LinearRegression类中相同属性名称的含义基本相同

>>> import numpy as np
>>> from sklearn import linear_model

>>> #由于引入L2正则化(α=1.0)，回归方程变为：y = 2 + 0.33x_0 --> 可以解决模型复杂引起的过拟合
>>> reg = linear_model.Ridge(alpha=1.0) #实例化岭回归模型对象
>>> X = np.array([[1], [2]]) #自变量矩阵
>>> y = np.array([2, 3]) #因变量向量
>>> reg.fit(X, y) #拟合求解
>>> reg.coef_
[0.33...,]
>>> reg.intercept_
2.0
>>> reg.n_features_in_
1
>>> reg.get_params()
{'alpha': 1.0, 'copy_X': True, 'fit_intercept': True, 'max_iter': None, 'normalize': 'deprecated',
'positive': False, 'random_state': None, 'solver': 'auto', 'tol': 0.001}
>>> reg.predict([[3], [4]])
[3., 3.33...]
>>> reg.score(X, y)
0.55...


• 线性回归对数据集的噪声敏感，导致回归方程变化较大
• 岭回归通过L2正则项某种程度上防止回归系数变化过大(惩罚回归系数大的权重)，使回归方程更稳定

3. Lasso回归

3.1 原理

Lasso回归通过在线性回归的MSE损失基础上增加L1正则项对回归系数

w

1

w

n

w_1sim w_n

w1wn产生惩罚(一般不包含

w

0

/

b

w_0/b

w0/b)；与岭回归类似Lasso回归中的L1正则项也是解决过拟合的方式

L

(

w

,

b

)

=

1

2

m

i

=

1

m

(

f

(

x

i

)

y

i

)

2

+

α

i

=

1

n

w

i

(3)

L(pmb w,b) = frac{1}{2m}sum_{i=1}^{m}(f(pmb {x_i}) - y_i)^2 + alpha sum_{i=1}^{n}lvert w_i rverttag{3}

L(www,b)=2m1i=1m(f(xixixi)yi)2+αi=1nwi(3)

• 比较Lasso回归与岭回归差异：相比岭回归，Lasso回归更倾向于将部分回归系数归0，能够忽略部分自变量(特征值)起到稀疏(降维)作用；并且岭回归有解析解而Lasso无解析解，因此求解方式存在不同
• 产生差异的原因：岭回归中L2正则项的平方项会进一步扩大回归系数大的部分，缩减回归系数小的部分(如2

Rightarrow

4，0.2

Rightarrow

0.04)，因此岭回归中的L2正则项会更关注回归系数大的部分；而Lasso回归中L1正则项的绝对值对回归系数不会进一步扩大或缩小回归系数，因此相比岭回归，Lasso回归更关注回归系数小的部分

3.2 sklearn实现

Lasso回归可通过sklearn库中linear_model下的Lasso类实现

• alpha：控制L1正则项的权重

α

alpha

• precompute：是否提前计算Gram矩阵来加速运算
• max_iter：最大迭代次数
• tol：求解过程中的残差(当小于该值时停止计算)
• warm_start：是否使用上一次计算结果来初始化
• random_state：用于控制selection为random时的伪随机数生成器种子
• selection：回归系数的更新方式(random和cyclic)
• 其余参数与LinearRegression类中相同参数名称的含义基本相同

• dual_gap：优化结束时的对偶间隙
• sparse_coef_：回归系数的稀疏表示
• n_iter_：满足残差要求时的迭代次数
• 其余属性与LinearRegression类中相同属性名称的含义基本相同

• path：计算弹性网络(elastic net)路径(弹性网络同时考虑L1和L2正则项，相关内容点击查看)
• 其余方法与LinearRegression类中相同方法名称的功能基本相同

>>> import numpy as np
>>> from sklearn import linear_model

>>> #由于引入L1正则化(α=1.0)，回归方程变为：y = 2.5 --> 可以解决模型复杂引起的过拟合
>>> reg = linear_model.Ridge(alpha=1.0) #实例化Lasso回归模型对象
>>> X = np.array([[1], [2]]) #自变量矩阵
>>> y = np.array([2, 3]) #因变量向量
>>> reg.fit(X, y) #拟合求解
>>> reg.coef_
[0.,]
>>> reg.intercept_
2.5
>>> reg.n_features_in_
1
>>> reg.get_params()
{'alpha': 1.0, 'copy_X': True, 'fit_intercept': True, 'max_iter': 1000, 'normalize': 'deprecated',
'positive': False, 'precompute': False, 'random_state': None, 'selection': 'cyclic', 'tol': 0.0001,
'warm_start': False}
>>> reg.predict([[3], [4]])
[2.5, 2.5]
>>> reg.score(X, y)
0.0


THE END

)">