线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模拟合的一种分析方式。
如给定一个大小为 m m m的数据集:
线性回归通过求解线性模型对目标值进行预测,即假设:
线性回归对于求解 w \pmb w www和 b b b采用最小二乘法,其通过均方误差损失(MSE),即L2-Loss,损失函数定义如下:
其中增加系数 1 2 \frac{1}{2} 21便与后续梯度求解
令:
则式(1)变为
求解 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'}} {\arg\min } L(\pmb {w'}) &\Rightarrow\frac {\partial{L(\pmb {w'})}} {\partial {\boldsymbol{w'}}}=0 \\ &\Rightarrow2\pmb{X}\pmb{X}^T \pmb {w'} - 2\pmb{X}\pmb{Y} = 0 \\ & \Rightarrow\boldsymbol{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),最终的解将由具体奇异值求解算法的归纳偏好所决定
参考官方文档:点击查看
线性回归可通过sklearn库中linear_model下的LinearRegression类实现
有关参数:
有关属性:
使用案例
>>> 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
岭(Ridge)回归用来解决 X X T \pmb{X}\pmb{X}^T XXXXXXT为非满秩矩阵(不可逆)的情况;通过在线性回归的MSE损失基础上增加L2正则项对回归系数 w 1 ∼ w n w_1\sim 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^2\right] \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'}^T\pmb{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'}}}&=2\pmb{X}\pmb{X}^T \pmb {w'} - 2\pmb{X}\pmb{Y}+\alpha \pmb{w'}=0 \\ \Rightarrow\pmb{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_1\sim 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)即可
参考官方文档:点击查看
岭回归可通过sklearn库中linear_model下的Ridge类实现
有关参数:
使用案例
>>> 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...
Lasso回归通过在线性回归的MSE损失基础上增加L1正则项对回归系数 w 1 ∼ w n w_1\sim 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 \rvert\tag{3} L(www,b)=2m1i=1∑m(f(xixixi)−yi)2+αi=1∑n∣wi∣(3)
由于存在绝对值,故无矩阵表达形式;并且绝对值的存在导致其不是连续可导
参考官方文档:点击查看
Lasso回归可通过sklearn库中linear_model下的Lasso类实现
有关参数:
使用案例
>>> 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