第6章 线性回归、岭回归、Lasso回归(算法原理+手编实现+库调用)


第6章 线性回归、岭回归、Lasso回归(算法原理+手编实现+库调用)_第1张图片

俯视机器学习


很多人想知道机器学习的那边是什么,其实机器学习的那边是数学。


第6章 线性回归

生活中充满了各种预测,比如输入踩油门的力,输出车的速度。输入学习的时间,输出考试分数。输入硫和碳的函数,输出铁的硬度。

1. 基本形式

对一个样本,有 d d d 个属性, x = [ x 1 ; ⋯   ; x d ] x=[x_1; \cdots; x_d] x=[x1;;xd],函数
f ( x ) = w 1 x 1 + ⋯ + w d x d + b f(x) = w_1 x_1 + \cdots + w_d x_d + b f(x)=w1x1++wdxd+b
写成向量形式
f ( x ) = w T x + b f(x) = w^T x + b f(x)=wTx+b
写成扩展形式
f ( x ) = w T x f(x) = w^T x f(x)=wTx
这里用同样记号,但实际上 w w w x x x 都多增加了一行( w w w x x x 均为列向量),下文中一律采样扩展形式。

补充: w w w 的权重分量绝对值越大,对应属性值对目标影响越大。

2. 线性回归

收集 m m m 个训练样本,第 i i i 个样本记为 x i ∈ R n + 1 x_i\in R^{n+1} xiRn+1(样本为扩展形式,此处 x i x_i xi 代表一个样本,注意与上文区别),其观测值为 y i ∈ R y_i \in R yiR。数据矩阵为
X = [ − − x 1 T − − − − ⋮ − − − − x m T − − ] X = \left[\begin{matrix} -- & x_1^T & -- \\ -- & \vdots & -- \\ -- & x_m^T & -- \\ \end{matrix}\right] X=x1TxmT

要求权重 w w w ,其实就是求解
X w = y (1) X w =y \tag{1} Xw=y(1)
方程 ( 1 ) (1) (1) 的解的个数有3种情况:

  • 情形1:唯一解。通常是 X X X 为方阵。

  • 情形2:无解。通常是 X X X 为细高型形矩阵。

  • 情形3:无穷多解。通常是 X X X 为扁胖形矩阵。

对只有唯一解的情形1,可以直接矩阵求逆 w = X − 1 y w = X^{-1} y w=X1y 获得权重。但更多遇到的是情形2和情形3. 对无解情况,通常采用最小二乘法。对无穷多解情况,通常采用岭回归和LASSO回归。下面分别叙述。

3. 最小二乘法

在无解的时候,寻找平方误差和最小的解当作最优解。最小二乘法衡量的平方误差:
∑ i = 1 m ( y i − x i T w ) 2 = ∥ y − X w ∥ 2 (2) \sum_{i=1}^m (y_i - x_i^T w)^2 = \Vert y - Xw\Vert ^2 \tag{2} i=1m(yixiTw)2=yXw2(2)

优化问题:
优化变量为 w w w
m i n i m i z e ∥ y − X w ∥ 2 (3) {\rm minimize} \quad \Vert y - Xw\Vert ^2 \tag{3} minimizeyXw2(3)

f ( w ) = ∥ y − X w ∥ 2 f(w) = \Vert y - Xw\Vert ^2 f(w)=yXw2,则最优解时
∇ f ( w ) = 2 X T ( X w − y ) = 0 (4) \nabla f(w) = 2X^T (Xw - y) = \boldsymbol 0 \tag{4} f(w)=2XT(Xwy)=0(4)
X T X X^T X XTX 满秩,则
w = ( X T X ) − 1 X T y (5) w = (X^T X)^{-1}X^T y \tag{5} w=(XTX)1XTy(5)

4. 岭回归

建模:

当有无穷多解的时候,通常找系数和最小的解。优化问题:
m i n i m i z e ∥ w ∥ 2 2 s u b j e c t   t o X w = y (6) \begin{aligned} {\rm minimize} &\quad \Vert w\Vert_2^2\\ {\rm subject\ to} &\quad Xw = y \end{aligned}\tag{6} minimizesubject tow22Xw=y(6)

通常会把这个问题转换成一个无约束问题,即
m i n i m i z e ∥ w ∥ 2 2 + γ ∥ X w − y ∥ 2 2 (7) {\rm minimize} \quad \Vert w\Vert_2^2 + \gamma\Vert Xw - y\Vert_2^2 \tag{7} minimizew22+γXwy22(7)
其中 w w w 为优化变量, γ > 0 \gamma>0 γ>0 为常数,当 γ → + ∞ \gamma\rightarrow +\infty γ+ 时,相当于 ( 6 ) (6) (6) 中的约束条件。此外,为了和最小二乘法类似,通常把式 ( 7 ) (7) (7) 改成如下的形式:
m i n i m i z e ∥ X w − y ∥ 2 2 + λ ∥ w ∥ 2 2 (8) {\rm minimize} \quad \Vert Xw - y\Vert_2^2 + \lambda \Vert w\Vert_2^2 \tag{8} minimizeXwy22+λw22(8)
其中 λ = 1 / γ > 0 \lambda = 1/\gamma > 0 λ=1/γ>0 。当 λ \lambda λ 比较小的时候,相当于 ( 6 ) (6) (6) 中约束,而当 λ \lambda λ 比较大时,会使 w w w 的模长尽可能小。

求解:

f ( w ) = ∥ y − X w ∥ 2 + λ ∥ w ∥ 2 f(w) = \Vert y - Xw\Vert ^2 +\lambda \Vert w\Vert ^2 f(w)=yXw2+λw2,则最优解时
∇ f ( w ) = 2 ( X T ( X w − y ) + λ w ) = 0 \nabla f(w) = 2(X^T (Xw - y) + \lambda w)= \boldsymbol 0 f(w)=2(XT(Xwy)+λw)=0
解得
w = ( X T X + λ I ) − 1 X T y w = (X^T X + \lambda I)^{-1}X^T y w=(XTX+λI)1XTy
这里 I I I 为单位矩阵, X T X + λ I X^T X + \lambda I XTX+λI 是一个半正定矩阵和一个正定矩阵的和,一定为正定矩阵,则可逆。

5. LASSO 回归

当问题 ( 6 ) (6) (6) 中的目标函数变成最小化 ∥ x ∥ 1 \Vert x\Vert_1 x1 的时候,类似上面推导,问题转如下形式:
m i n i m i z e ∥ y − X w ∥ 2 2 + λ ∥ w ∥ 1 {\rm minimize} \quad \Vert y - Xw\Vert_2^2 + \lambda \Vert w\Vert_1\\ minimizeyXw22+λw1
其中 λ > 0 \lambda > 0 λ>0 ,优化变量为 w w w

目标函数关于优化变量 w w w 并不处处可导,可以通过坐标轮换法进行求解。这里不作相关推导。

  • 劣势:不可求导。

  • 优势:可降维。

6. 评价指标

  • 直接使用误差平方和评价,取值 [ 0 , + ∞ ) [0, +\infty) [0,+),值越小越好。
    E r r = ∑ ( y t r u e − y p r e d ) 2 Err = \sum(y_{true} - y_{pred})^2 Err=(ytrueypred)2

  • 使用下面相关系数平均,取值 ( − ∞ , 1 ] (-\infty,1] (,1],值越大越好。

r = 1 − ∑ ( y t r u e − y p r e d ) 2 ∑ ( y t r u e − y t r u e − m e a n ) 2 r = 1- \frac{\sum (y_{true} - y_{pred})^2}{\sum (y_{true} - y_{true-mean})^2} r=1(ytrueytruemean)2(ytrueypred)2

7. 实战:徒手编写实现线性回归、岭回归

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(5, 20)
y = 2 * X + np.random.randint(-5, 5, X.shape)

X = X.reshape(-1, 1)
X = np.c_[X, np.ones((len(X), 1))]

# 求解
w = np.linalg.inv(X.T @ X) @ X.T @ y
print(w)
# 绘图
yy = X @ w
plt.plot(X[:,0], yy)
plt.show()
第6章 线性回归、岭回归、Lasso回归(算法原理+手编实现+库调用)_第2张图片

8. 实战:波士顿房价预测

数据集介绍:

  • 来源:Sklearn自带数据集
  • 概述:根据小镇的城镇人均犯罪率、住宅用地所用比例、城镇中非商业用地的比例、每栋住宅的房间数等 13 个属性,预测房价。
  • 502 个样本,13个数值属性,回归问题。
import numpy as np
from sklearn.datasets import load_boston

X, y = load_boston(return_X_y=True)
X = np.c_[X, np.ones((len(X), 1))] # 增加偏置项
print(X.shape, y.shape)


# 求解
lamb = 1.
w1 = np.linalg.inv(X.T @ X) @ X.T @ y
w2 = np.linalg.inv(X.T @ X + lamb * np.eye(X.shape[1])) @ X.T @ y

# 计算平方误差和
lse1 = 1 - ((y - X@w1)**2).sum() / ((y - y.mean())**2).sum()
lse2 = 1 - ((y - X@w2)**2).sum() / ((y - y.mean())**2).sum()

print(np.abs(w1[:-1]).sum(), np.abs(w2[:-1]).sum())
# print(np.abs(y - X@w1).sum(), np.abs(y - X@w2).sum())
print(lse1, lse2)

9. 实战:sklearn 中的线性回归、岭回归、LASSO回归

class sklearn.linear_model.LinearRegression(*, fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)

  • 参数
    • fit_intercept [bool, default=True] 拟合截距项
    • normalize [bool, default=False] 是否规范化。在 fit_intercept=True 时无效。
    • copy_X [bool, default=True] 是否拷贝数据,不拷贝可能改变原有数据
  • 属性
    • coef_ [array of shape (n_features, ) or (n_targets, n_features)] 系数
    • rank_ [int] 数据X 的秩
    • intercept_ [float or array of shape (n_targets,)] 截距
  • 方法
    • fit(X, y[, sample_weight])
    • predict(X)
    • score(X, y[, sample_weight]) 返回 R 2 R^2 R2

class sklearn.linear_model.Ridge(alpha=1.0, *, fit_intercept=True, normalize=False,copy_X=True, max_iter=None, tol=0.001, solver=’auto’,random_state=None)

  • 参数
    • solver [{‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’}, default=’auto’] 求解器
    • 其他同线性回归

class sklearn.linear_model.Lasso(alpha=1.0, *, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001,warm_start=False, positive=False, random_state=None, selection=’cyclic’)

  • 参数:
    • alpha [float, default=1.0] L 1 L_1 L1 范数项的系数
    • positive [bool, default=False] 当设为 True 时,迫使所有系数均为正数
import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, Ridge, Lasso

X, y = load_boston(return_X_y=True)
print(X.shape, y.shape)

# 线性回归
lg = LinearRegression()
lg.fit(X, y)

# 岭回归
lamb = 1.
ridge = Ridge(alpha=lamb)
ridge.fit(X, y)

# 计算相关系数
lg_lse = lg.score(X, y)
ridge_lse = ridge.score(X, y)

print(np.abs(lg.coef_).sum(), np.abs(ridge.coef_).sum())
print(lg_lse, ridge_lse)

第6章 线性回归、岭回归、Lasso回归(算法原理+手编实现+库调用)_第3张图片
版权申明:本教程版权归创作人所有,未经许可,谢绝转载!


交流讨论QQ群:784117704

部分视频观看地址:b站搜索“火力教育”

课件下载地址:QQ群文件(有最新更新) or 百度网盘PDF课件及代码

链接:https://pan.baidu.com/s/1lc8c7yDc30KY1L_ehJAfDg
提取码:u3ls


你可能感兴趣的:(俯视机器学习,机器学习,python,线性回归,岭回归,LASSO)