线性回归:这可能是机器学习中最简单的一个模型了
本文是《机器学习宝典》第 7 篇,读完本文你能够掌握机器学习中线性回归模型。
在《机器学习宝典》前 6 篇的内容主要都是聊一些关于机器学习中的一些基础常识、模型评估指标、模型评估方法以及数据泄露问题,从这一篇开始聊一些模型的原理的事情。这篇带来的是关于线性回归模型的原理介绍。
什么是线性回归
线性回归模型算是机器学习中非常简单的一个模型了,它主要用于寻找变量之间的因果关系,希望能够通过一个线性组合来表述特征与目标之间存在的关系。假定数据中的 x \boldsymbol{x} x 包含 n 个特征: x = ( x 1 , x 2 , . . . , x n ) \boldsymbol{x} = (x_{1}, x_{2}, ..., x_{n}) x=(x1,x2,...,xn),其中 x i x_{i} xi 表示第 i 个特征对应的取值。我们可以用下面的公式来表示线性回归:
y ≈ f ω , b ( x ) = ω 1 x 1 + ω 2 x 2 + . . . + ω n x n + b y \approx f_{\omega,b}(x) = \omega_{1} x_{1} + \omega_{2} x_{2} + ... + \omega_{n} x_{n} + b y≈fω,b(x)=ω1x1+ω2x2+...+ωnxn+b
其中,
y
y
y 表示目标真实值,
f
ω
,
b
(
x
)
f_{\omega, b}(\boldsymbol{x})
fω,b(x) 表示目标预测值,如果写成向量形式的话,则:
f
ω
,
b
(
x
)
=
ω
T
x
+
b
f_{\boldsymbol{\omega},b}(\boldsymbol{x}) = \boldsymbol{\omega}^{T} \boldsymbol{x} + b
fω,b(x)=ωTx+b
其中, ω = ( ω 1 , ω 2 , . . . , ω n ) \boldsymbol{\omega} = (\omega_{1}, \omega_{2}, ..., \omega_{n}) ω=(ω1,ω2,...,ωn), b b b 表示一个常数。一旦能够确定参数 ω \boldsymbol{\omega} ω 和 b b b ,那么模型就能够确定下来,所以训练的过程其实就是寻找 ω \boldsymbol{\omega} ω 和 b b b 的过程。此外,由于 ω \boldsymbol{\omega} ω 直观地表达了各个特征在预测中的重要性,因此线性模型具有很好的可解释性。
最简单的线性回归就是一元线性回归了,也就是只有一个特征的时候;如果特征个数超过一个,那就是多元线性回归了。我们来直观的体验下线性回归模型到底长什么样子。比如我们想要根据披萨的直径来预测披萨的价格,通过线性回归我们拟合出了下面的的图形。
一元线性回归对应的图形其实就是一条直线,其中,蓝色的小圆点表示披萨价格的真实值,绿色的直线对应训练的模型,红色的竖直的线表示披萨价格的预测值与真实值的差异。可以看到,只要能够确定了参数 ω \boldsymbol{\omega} ω 和 b b b ,那么就能够使用模型根据披萨直径预测出披萨的价格。
线性回归的损失函数
实际上,参数 ω \boldsymbol{\omega} ω 和 b b b 可以取很多值,我们要解决的就是如何去确定参数 ω \boldsymbol{\omega} ω 和 b b b 的最佳值,确定最佳值的原则是使得模型对目标的预测值与真实值的差异尽可能的小,关于如何衡量预测值 f ω , b ( x ) f_{\boldsymbol{\omega},b}(\boldsymbol{x}) fω,b(x) 和 真实值 y y y 之间的差异,我们可以使用损失函数(loss function)来衡量。
J ( ω , b ) = ∑ i = 1 m ( y ( i ) − f ω , b ( x ( i ) ) ) 2 = ∑ i = 1 m ( y ( i ) − ω x ( i ) − b ) 2 J(\boldsymbol{\omega}, b) = \sum_{i=1}^{m}(y^{(i)} - f_{\boldsymbol{\omega},b}(x^{(i)}))^{2} = \sum_{i=1}^{m}(y^{(i)} - \boldsymbol{\omega} x^{(i)} - b)^{2} J(ω,b)=i=1∑m(y(i)−fω,b(x(i)))2=i=1∑m(y(i)−ωx(i)−b)2
其中,m 表示样本的个数, y ( i ) y^{(i)} y(i) 表示第 i 个样本的真实值, f ω , b ( x ( i ) ) f_{\boldsymbol{\omega},b}(\boldsymbol{x}^{(i)}) fω,b(x(i)) 表示第 i 个样本的预测值。整个公式表示的意思是求出 m 个样本中的真实值与预测值之差的平方和。
为什么要将损失函数要采用真实值与预测值之差的平方和,而不是绝对值、三次方、四次方形式呢?这里做一个解释。
我们将真实值、预测值以及误差之间的关系设为:
y = f ω , b ( x ) + ε y = f_{\boldsymbol{\omega}, b}(\boldsymbol{x}) + \varepsilon y=fω,b(x)+ε
回归模型的最终目标是建立特征 x \boldsymbol{x} x 与目标 y y y 之间的关系(通过函数表达式),希望通过 x \boldsymbol{x} x 能较准确的表示目标 y y y。在实际生活中,我们基本上不太可能将所有导致目标 y y y 出现的特征 x \boldsymbol{x} x 都找出来,模型的预测值与真实值的误差也是因为这些没有找出来的特征导致的,假设这些没有找出来的特征互相独立,根据中心极限定理,可以知道这些没有找出来的特征之和服从正态分布,那么:
ε = y − f ω , b ( x ) → N ( u , σ 2 ) \varepsilon = y - f_{\boldsymbol{\omega}, b}(\boldsymbol{x}) \rightarrow \mathcal{N}(u, \sigma^2) ε=y−fω,b(x)→N(u,σ2)
所以可以得到误差的概率密度函数:
P ( ε ; ω , b ) = 1 2 π σ exp ( − ( ε − u ) 2 2 σ 2 ) = 1 2 π σ exp ( − ( y − f ω , b ( x ) − u ) 2 2 σ 2 ) P(\varepsilon; \boldsymbol{\omega}, b) = \frac{1}{\sqrt{2 \pi} \sigma} \exp (- \frac{(\varepsilon - u) ^ {2}}{2 \sigma^{2}}) = \frac{1}{\sqrt{2 \pi} \sigma} \exp (- \frac{(y - f_{\boldsymbol{\omega}, b}(\boldsymbol{x}) - u) ^ {2}}{2 \sigma^{2}}) P(ε;ω,b)=2πσ1exp(−2σ2(ε−u)2)=2πσ1exp(−2σ2(y−fω,b(x)−u)2)
有了误差的概率密度函数之后,我们希望利用 m 个训练样本(观测样本)的误差分布,求解导致出现这种分布的最佳参数 ω \boldsymbol{\omega} ω 和 b b b ,使得出现这种分布出现概率最大,这时候我们得到在 m 个样本下参数 ω \boldsymbol{\omega} ω 和 b b b 的的似然函数为:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ L(\boldsymbol{…
接下来要做的就是使得 L ( ω , b ) L(\boldsymbol{\omega}, b) L(ω,b) 最大,为了方便求解,对等式两边取 log,可以得到:
log L ( ω , b ) = − m log ( 2 π σ ) − 1 2 σ 2 ∑ i = 0 m ( y ( i ) − ω T x − b − u ) 2 \log L(\boldsymbol{\omega}, b) = -m \log(\sqrt{2 \pi} \sigma) - \frac{1}{2 \sigma^{2}} \sum\limits_{i=0}^{m}(y^{(i)} - \boldsymbol{\omega}^{T}x - b - u)^2 logL(ω,b)=−mlog(2πσ)−2σ21i=0∑m(y(i)−ωTx−b−u)2
当数据(m)趋于无穷大时,期望 u u u 和方差 σ 2 \sigma^2 σ2 都是一个常数,所以只需要最小化 ∑ i = 1 m ( y ( i ) − ω x ( i ) − b ) 2 \sum\limits_{i=1}^{m}(y^{(i)} - \boldsymbol{\omega} x^{(i)} - b)^{2} i=1∑m(y(i)−ωx(i)−b)2 即可,这也就是我们前面要优化的损失函数。
当有了损失函数之后,问题就变为了一个优化损失函数的问题,关于优化方法有很多种,这里介绍一种常见的一种优化算法:最小二乘法。
最小二乘法
针对一元线性回归,将损失函数 J ( ω , b ) J(\boldsymbol{\omega}, b) J(ω,b) 分别对 ω \boldsymbol{\omega} ω 和 b b b 求一阶偏导,然后将一阶偏导为 0 可以得出 ω \boldsymbol{\omega} ω 和 b b b 的求解公式,如下:
ω
=
∑
i
=
1
m
(
x
(
i
)
−
x
ˉ
)
(
y
(
i
)
−
y
ˉ
)
∑
i
=
1
m
(
x
(
i
)
−
x
ˉ
)
2
\boldsymbol{\omega} = \frac{\sum\limits_{i = 1}^{m}(x^{(i)} - \bar{x})(y^{(i)} - \bar{y})}{\sum\limits_{i = 1}^{m}(x^{(i)} - \bar{x})^2}
ω=i=1∑m(x(i)−xˉ)2i=1∑m(x(i)−xˉ)(y(i)−yˉ)
b
=
y
ˉ
−
ω
x
ˉ
b = \bar{y} - \boldsymbol{\omega} \bar{x}
b=yˉ−ωxˉ
实际生活中更多的是多元线性回归,为了方便后面描述,我们将数据集 D 表示为一个 m x (n + 1) 大小的矩阵 X, 其中每行对应于一个样本,每行的第一列为 1,其他为对应的特征的取值。将 ω \boldsymbol{\omega} ω 和 b 吸入到向量 ω ^ = ( b , ω ) \hat{\boldsymbol{\omega}} = (b, \boldsymbol{\omega}) ω^=(b,ω),即 ω ^ \hat{\boldsymbol{\omega}} ω^ 为一个 (n + 1) 的列向量,目标 y 是一个 m 的列向量,则可以得到多元线性回归的矩阵形式为:
[ y 1 y 2 ⋮ y m ] = [ 1 x 11 x 12 ⋯ x 1 n 1 x 21 x 22 ⋯ x 2 n 1 ⋮ ⋮ ⋱ ⋮ 1 x m 1 x m 2 ⋯ x m n ] [ b ω 1 ⋮ ω n ] \begin{bmatrix} y_{1} \\ y_{2} \\ \vdots \\ y_{m} \\ \end{bmatrix} = \begin{bmatrix} 1 & x_{11} & x_{12} & \cdots & x_{1n} \\ 1 & x_{21} & x_{22} & \cdots & x_{2n} \\ 1 & \vdots & \vdots & \ddots & \vdots \\ 1 & x_{m1} & x_{m2} & \cdots & x_{mn} \\ \end{bmatrix} \begin{bmatrix} b \\ \boldsymbol{\omega}_{1} \\ \vdots \\ \boldsymbol{\omega}_{n} \\ \end{bmatrix} ⎣⎢⎢⎢⎡y1y2⋮ym⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1111x11x21⋮xm1x12x22⋮xm2⋯⋯⋱⋯x1nx2n⋮xmn⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡bω1⋮ωn⎦⎥⎥⎥⎤
简写就是:
y
=
X
ω
^
\boldsymbol{y} = \boldsymbol{X} \hat{\boldsymbol{\omega}}
y=Xω^
对应的损失函数为:
J
(
ω
^
)
=
(
y
−
X
ω
^
)
T
(
y
−
X
ω
^
)
J(\hat{\boldsymbol{\omega}}) = (\boldsymbol{y} - \boldsymbol{X} \hat{\boldsymbol{\omega}})^{T} (\boldsymbol{y} - \boldsymbol{X} \hat{\boldsymbol{\omega}})
J(ω^)=(y−Xω^)T(y−Xω^)
经过一系列推导可以得到: ω ^ = ( X T X ) − 1 X T y \hat{\boldsymbol{\omega}} = (\boldsymbol{X}^{T} \boldsymbol{X})^{-1} \boldsymbol{X}^{T} \boldsymbol{y} ω^=(XTX)−1XTy
可以看到,使用最小二乘法来求解损失函数最小值时很方便,不过当数据量较大或者特征较多时,最小二乘法的计算效率会比较低,另外使用最小二乘法有一个前提是 X T X \boldsymbol{X}^{T} \boldsymbol{X} XTX 必须是可逆矩阵,但实际生活中很多情况下特征的个数超过样本的个数,导致 X \boldsymbol{X} X 的列数多于行数, X T X \boldsymbol{X}^{T} \boldsymbol{X} XTX 显然不是可逆矩阵,常见的一种解决方案是引入正则化(regularization)。
正则化
当样本数量较少并且特征较多时,优化上面的损失函数时得到的参数 ω \boldsymbol{\omega} ω 和 b b b 很容易使得模型陷入过拟合,我们可以对损失函数引入正则化项的来解决它。常用的正则化有:L1 正则化项和 L2 正则化项。
使用 L1 正则化项的模型叫做 Lasso 回归,损失函数如下:
J ( ω , b ) = ∑ i = 1 m ( y ( i ) − f ω , b ( x ( i ) ) ) 2 + λ ∥ ω ∥ 1 , ∥ ω ∥ 1 = ∑ j = 1 n ∣ ω j ∣ J(\boldsymbol{\omega}, b) = \sum_{i=1}^{m}(y^{(i)} - f_{\boldsymbol{\omega},b}(\boldsymbol{x}^{(i)}))^{2} + \lambda {\Vert \boldsymbol{\omega} \Vert}_{1}, \qquad {\Vert \boldsymbol{\omega} \Vert}_{1}=\sum_{j = 1}^{n} |\omega_{j}| J(ω,b)=i=1∑m(y(i)−fω,b(x(i)))2+λ∥ω∥1,∥ω∥1=j=1∑n∣ωj∣
其中, λ > 0 \lambda > 0 λ>0, 表示正则化参数,可以看到,L1 正则化项计算的是所有的权重 ω \boldsymbol{\omega} ω 的绝对值之和,使用 L1 正则化项可以使得学习到的权重 ω \boldsymbol{\omega} ω 产生很多 0,也就是可以得到权重非常稀疏,常用于特征选择,在一定程度上也可以防止过拟合。
使用 L2 正则化项的模型叫做 Ridge(岭) 回归,损失函数如下:
J ( ω , b ) = ∑ i = 1 m ( y ( i ) − f ω , b ( x ( i ) ) ) 2 + λ ∥ ω ∥ 2 2 , ∥ ω ∥ 2 2 = ∑ j = 1 n ω j 2 J(\boldsymbol{\omega}, b) = \sum_{i=1}^{m}(y^{(i)} - f_{\boldsymbol{\omega},b}(\boldsymbol{x}^{(i)}))^{2} + \lambda {\Vert \boldsymbol{\omega} \Vert}_{2}^2, \qquad {\Vert \boldsymbol{\omega} \Vert}_{2}^2=\sum_{j = 1}^{n} \omega_{j}^{2} J(ω,b)=i=1∑m(y(i)−fω,b(x(i)))2+λ∥ω∥22,∥ω∥22=j=1∑nωj2
其中, λ > 0 \lambda > 0 λ>0, 表示正则化参数,可以看到,L2 正则化项计算的是所有的权重 ω \boldsymbol{\omega} ω 的平方之和,使用 L2 正则化项可以使得学习到的权重 ω \boldsymbol{\omega} ω 变得非常小,防止过拟合。为什么这么说呢?因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。可以设想一下对于一个线性回归方程,若参数很大,那么只要数据偏移一点点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什么影响。
线性回归模型如何处理分类特征
从公式 f ω , b ( x ) = ω T x + b f_{\boldsymbol{\omega},b}(\boldsymbol{x}) = \boldsymbol{\omega}^{T} \boldsymbol{x} + b fω,b(x)=ωTx+b 可以看出,线性回归能够处理的都是数值特征,但实际生活中存在很多分类特征,比如血型就是一个分类特征,它的取值有:A、B、O 以及 AB 这四种,想要被线性回归模型所使用,通常将它进行 One-Hot 编码,得到 4 维向量,经过处理后原来的一个特征就成为了线性回归模型中的 4 个特征。
原始值 | One-Hot值 |
---|---|
A | [1, 0, 0, 0] |
B | [0, 1, 0, 0] |
O | [0, 0, 1, 0] |
AB | [0, 0, 0, 1] |
参考: