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


机器学习

    • 1. 线性回归
      • 1.1 原理
      • 1.2 sklearn实现
    • 2. 岭回归
      • 2.1 原理
      • 2.2 sklearn实现
    • 3. Lasso回归
      • 3.1 原理
      • 3.2 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={(x1??x1???x1?,y1?),(x2??x2???x2?,y2?),.....,(xm??xm???xm?,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 xi??xi???xi?=(xi(1)?,xi(2)?,.....,xi(n)?)T, n为自变量(特征值)个数
线性回归通过求解线性模型对目标值进行预测,即假设:

f ( x i ) = w T x i + b f(\pmb{x_i}) = \pmb{w}^T\pmb{x_i}+b f(xi??xi???xi?)=wwwTxi??xi???xi?+b ,使得f ( x i ) ≈ y i f(\pmb{x_i})≈y_i f(xi??xi???xi?)≈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)=2m1?i=1∑m?(f(xi??xi???xi?)?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?=[1x0??x0???x0??1x1??x1???x1?????1xm??xm???xm??](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=??????y1?y2??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′=??????w0?w1??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}^T\pmb{X}^T \pmb {w'}+\pmb{Y}^T\pmb{Y}) \\ &= \frac{1}{2m}(\pmb {w'}^T \pmb{X}\pmb{X}^T \pmb {w'}-2\pmb {w'}^T \pmb{X}\pmb{Y}+\pmb{Y}^T\pmb{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(xi??xi???xi?)和目标值 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′argmin?L(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类实现
【机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现】
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

有关参数:
  • fit_intercept:是否计算线性回归模型的截距,即 w 0 / b w_0/b w0?/b
  • normalize:是否对输入自变量进行正则化;当fit_intercept为False时,忽略此参数;deprecated代表目前该参数已被弃用,需要正则化则使用StandardScaler类来实现
  • copy_X:是否复制输入自变量矩阵,否则会覆盖原输入自变量矩阵
  • n_jobs:用于计算的数量,默认为1
  • positive:是否使系数为正,即 w 1 ~ w n w_1\sim w_n w1?~wn?;仅适用于稠密矩阵
有关属性:
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

  • coef_:线性回归系数,即 w 1 ~ w n w_1\sim w_n w1?~wn?;当需求解多个目标系数时,返回2维数组
  • rank_:输入自变量矩阵的秩,仅适用于稠密矩阵
  • singular_:输入自变量矩阵的奇异值,仅适用于稠密矩阵
  • intercept_:线性回归模型的截距,即 w 0 / b w_0/b w0?/b
  • n_features_in_:自变量(特征值)的个数
  • feature_names_in_:自变量的名称,仅当输入自变量有(字符)名称时可用
有关方法:
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

  • fit:拟合线性回归模型,即计算即 w 0 ~ w n w_0\sim w_n w0?~wn?
  • get_params:获取对应模型参数
  • predict:对输入新的自变量进行预测
  • score:获取线性回归模型的相关系数 R 2 R^2 R2
  • 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_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(xi??xi???xi?)?yi?)2+αi=1∑n?wi2?](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)} [0000?000αIIIn×n??](n+1)×(n+1)?即可
2.2 sklearn实现
参考官方文档:点击查看
岭回归可通过sklearn库中linear_model下的Ridge类实现
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

有关参数:
  • alpha:控制L2正则项的权重 α \alpha α
  • max_iter:共轭梯度求解器的最大迭代次数
  • tol:求解精度
  • solver:选择用于计算的求解器(’svd’,'cholesky’等)
  • random_state:用于控制’sag’或‘saga’求解器的随机状态
  • 其余参数与LinearRegression类中相同参数名称的含义基本相同
有关属性:
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

  • n_iter_:实际迭代次数
  • 其余属性与LinearRegression类中相同属性名称的含义基本相同
有关方法:
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

  • 其中方法与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...

补充线性回归和岭回归对比:
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

  • 线性回归对数据集的噪声敏感,导致回归方程变化较大
  • 岭回归通过L2正则项某种程度上防止回归系数变化过大(惩罚回归系数大的权重),使回归方程更稳定
3. Lasso回归 3.1 原理
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)=2m1?i=1∑m?(f(xi??xi???xi?)?yi?)2+αi=1∑n?∣wi?∣(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类实现
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

有关参数:
  • alpha:控制L1正则项的权重 α \alpha α
  • precompute:是否提前计算Gram矩阵来加速运算
  • max_iter:最大迭代次数
  • tol:求解过程中的残差(当小于该值时停止计算)
  • warm_start:是否使用上一次计算结果来初始化
  • random_state:用于控制selection为random时的伪随机数生成器种子
  • selection:回归系数的更新方式(random和cyclic)
  • 其余参数与LinearRegression类中相同参数名称的含义基本相同
有关属性:
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

  • dual_gap:优化结束时的对偶间隙
  • sparse_coef_:回归系数的稀疏表示
  • n_iter_:满足残差要求时的迭代次数
  • 其余属性与LinearRegression类中相同属性名称的含义基本相同
有关方法:
机器学习|机器学习算法[1]--线性回归,岭回归,Lasso回归原理详解及sklearn实现
文章图片

  • 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

    推荐阅读