机器学习算法[1]–线性回归,岭回归,Lasso回归原理详解及sklearn实现
1. 线性回归
1.1 原理
线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模拟合的一种分析方式。
如给定一个大小为
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=1∑m(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=[1x0x0x01x1x1x1⋯⋯1xmxmxm](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=⎣⎢⎢⎢⎡y1y2⋮ym⎦⎥⎥⎥⎤m×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}
w′w′w′=⎣⎢⎢⎢⎡w0w1⋮wn⎦⎥⎥⎥⎤(n+1)×1,其中
w
0
=
b
w_0=b
w0=b
则式(1)变为
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(w′w′w′)=2m1(w′w′w′TXXX−YYYT)(w′w′w′TXXX−YYYT)T=2m1(w′w′w′TXXX−YYYT)(XXXTw′w′w′−YYY)=2m1(w′w′w′TXXXXXXTw′w′w′−w′w′w′TXXXYYY−YYYTXXXTw′w′w′+YYYTYYY)=2m1(w′w′w′TXXXXXXTw′w′w′−2w′w′w′TXXXYYY+YYYTYYY)
求解
w
′
pmb{w'}
w′w′w′使预测值
f
(
x
i
)
f(pmb{x_i})
f(xixixi)和目标值
y
i
y_i
yi误差最小,即对
L
(
w
′
)
L(pmb {w'})
L(w′w′w′)关于
w
′
pmb{w'}
w′w′w′求导:
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}
w′w′w′=w′argminL(w′w′w′)⇒∂w′∂L(w′w′w′)=0⇒2XXXXXXTw′w′w′−2XXXYYY=0⇒w′=(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实现
参考官方文档:点击查看
线性回归可通过sklearn库中linear_model下的LinearRegression类实现
有关参数:
-
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
- 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 原理
岭(Ridge)回归用来解决
X
X
T
pmb{X}pmb{X}^T
XXXXXXT为非满秩矩阵(不可逆)的情况;通过在线性回归的MSE损失基础上增加L2正则项对回归系数
w
1
∼
w
n
w_1sim w_n
w1∼wn产生惩罚(一般不包含
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=1∑m(f(xixixi)−yi)2+αi=1∑nwi2](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(w′w′w′)=2m1[(w′w′w′TXXX−YYYT)(w′w′w′TXXX−YYYT)T+αw′w′w′Tw′w′w′]
∂
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}
∂w′∂L(w′w′w′)⇒w′w′w′=2XXXXXXTw′w′w′−2XXXYYY+αw′w′w′=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
w1∼wn越小);
选择
α
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实现
参考官方文档:点击查看
岭回归可通过sklearn库中linear_model下的Ridge类实现
有关参数:
-
alpha:控制L2正则项的权重
α
alpha
- max_iter:共轭梯度求解器的最大迭代次数
- tol:求解精度
- solver:选择用于计算的求解器(’svd’,'cholesky’等)
- random_state:用于控制’sag’或‘saga’求解器的随机状态
- 其余参数与LinearRegression类中相同参数名称的含义基本相同
有关属性:
- n_iter_:实际迭代次数
- 其余属性与LinearRegression类中相同属性名称的含义基本相同
有关方法:
- 其中方法与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
w1∼wn产生惩罚(一般不包含
w
0
/
b
w_0/b
w0/b);与岭回归类似Lasso回归中的L1正则项也是解决过拟合的方式
所有参数定义与线性回归相同,Lasso回归的损失函数定义如下:
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=1∑m(f(xixixi)−yi)2+αi=1∑n∣wi∣(3)
由于存在绝对值,故无矩阵表达形式;并且绝对值的存在导致其不是连续可导
- 比较Lasso回归与岭回归差异:相比岭回归,Lasso回归更倾向于将部分回归系数归0,能够忽略部分自变量(特征值)起到稀疏(降维)作用;并且岭回归有解析解而Lasso无解析解,因此求解方式存在不同
- 产生差异的原因:岭回归中L2正则项的平方项会进一步扩大回归系数大的部分,缩减回归系数小的部分(如2
⇒
Rightarrow
⇒
Rightarrow
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