Regression
Input & output (Data set)
首先来看一下我们的数据集的形式。假设我们有一个数据集包含
m
m
m 个数据
{
(
x
(
1
)
,
y
(
1
)
)
,
(
x
(
2
)
,
y
(
2
)
)
,
.
.
.
,
(
x
(
m
)
,
y
(
m
)
)
}
\{(\boldsymbol{x}^{(1)},y^{(1)}),(\boldsymbol{x}^{(2)},y^{(2)}),...,(\boldsymbol{x}^{(m)},y^{(m)})\}
{(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))} ,上标表示第
i
i
i 个数据的输入或输出。其中第
i
i
i 个数据的输入
x
(
i
)
\boldsymbol x^{(i)}
x(i) 是含
n
n
n 个特征的,记成一个向量,则他的第
j
j
j 个特征为
x
j
(
i
)
x^{(i)}_j
xj(i) ,整个向量记为:
x
(
i
)
=
[
x
1
(
i
)
x
2
(
i
)
⋮
x
n
(
i
)
]
n
×
1
\boldsymbol x^{(i)} = \begin{bmatrix} x^{(i)}_1 \\ x^{(i)}_2 \\ \vdots \\ x^{(i)}_n \end{bmatrix}_{n \times 1}
x(i)=⎣⎢⎢⎢⎢⎡x1(i)x2(i)⋮xn(i)⎦⎥⎥⎥⎥⎤n×1
若用
x
\pmb x
xxx 矩阵来表示整个数据集的输入值,则矩阵的第
i
i
i 行为
x
(
i
)
\boldsymbol x^{(i)}
x(i) 的转置,整个矩阵如下表示:
x
=
[
−
−
−
(
x
(
1
)
)
T
−
−
−
−
−
−
(
x
(
2
)
)
T
−
−
−
⋮
−
−
−
(
x
(
m
)
)
T
−
−
−
]
m
×
n
\boldsymbol x = \begin{bmatrix} ---(\boldsymbol x^{(1)})^T--- \\ ---(\boldsymbol x^{(2)})^T--- \\ \vdots \\ ---(\boldsymbol x^{(m)})^T--- \end{bmatrix}_{m\times n}
x=⎣⎢⎢⎢⎡−−−(x(1))T−−−−−−(x(2))T−−−⋮−−−(x(m))T−−−⎦⎥⎥⎥⎤m×n
若每个数据集的输出
y
(
i
)
y^{(i)}
y(i) 只是一个数值的话,则所有的输出可以构成一个向量
y
\boldsymbol y
y ,记为:
y
=
[
y
(
1
)
y
(
2
)
⋮
y
(
m
)
]
m
×
1
\boldsymbol y = \begin{bmatrix} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(m)} \end{bmatrix}_{m \times 1}
y=⎣⎢⎢⎢⎡y(1)y(2)⋮y(m)⎦⎥⎥⎥⎤m×1
Linear regression model
在说线性回归之前,先来谈一谈更为宏观的概念——回归,其实在高中数学中我们就已经接触过了回归,我们学过用最小二乘法来构建回归方程的表达式,那个时候我只是单纯的记住了那个计算公式,而并没有思考其中的原理。我们想做回归其实是想利用一部分已知的数据来对未知的数据做预测。其实这里面有一个隐含的前提条件,就是我们想用回归来解决的这个问题是有规律的,也就是说是有一个函数能够大体表现出这个问题的输入与输出的关系的。比如说一个房价预测,输入是房子的大小、地理位置、建造商等等参数,输出就是这个房子的房价。这个问题的输入和输出是有一个映射关系的,回归的目的就是根据一些已知的数据来尽可能的找出这个映射关系。所以这里还隐含了第二个条件才能尽可能好的找到这个整体的模型 (我们拿到的数据只是整体的一个子集) ,那就是我们拥有的数据与整体的分布应该是类似的,因为整体的分布是不可知的,样本的分布是可知的。
接下来来谈一谈什么是线性回归。线性回归其实就是首先假设了模型的输入输出关系是线性的,然后在让模型在训练集的输出与标注的输出之间的误差最小时得到的模型。下面来具体解释:
Linear model (hypothesis)
首先是线性模型,假设一个样本有
n
n
n 个特征,那么输入输出的线性关系的函数则为:
y
p
r
e
d
=
θ
0
+
θ
1
x
1
+
⋯
+
θ
n
x
n
y_{pred} = \theta_0 + \theta_1 x_1 + \cdots + \theta_n x_n
ypred=θ0+θ1x1+⋯+θnxn
其中,
θ
i
\theta_i
θi 是特征
x
i
x_i
xi 的系数,所有的系数构成了一个系数向量
θ
\boldsymbol \theta
θ ,上面的式子写成向量的形式则为:
y
p
r
e
d
(
i
)
=
θ
T
x
(
i
)
y^{(i)}_{pred} = \boldsymbol \theta^T \boldsymbol x^{(i)}
ypred(i)=θTx(i)
因为
θ
\pmb \theta
θθθ 的取值有无穷多种,所以我们的线性模型其实也是有无穷多种的,所以问题的关键是,如何找到我们所想要的
θ
\boldsymbol \theta
θ 呢?那么回想我们的目的,其实我们想要的是我们的预测值
y
p
r
e
d
(
i
)
y^{(i)}_{pred}
ypred(i) 和我们的实际值
y
(
i
)
y^{(i)}
y(i) 尽可能的类似,所以我们可以定义一个表示预测值与实际值相偏离的程度的函数,然后找到这个函数取值最小时所对应的
θ
\boldsymbol \theta
θ 应该就是我们想要的了,这样也就得到了我们想要的线性模型,这个偏离程度的函数也被称为损失函数 (loss function)
J
(
θ
)
J(\boldsymbol \theta)
J(θ) (也有记为
L
L
L 的),我们的模型也被记为假设函数 (Hypothesis)
h
θ
(
x
)
h_{\boldsymbol \theta} (\boldsymbol x)
hθ(x) ,对
x
(
i
)
\boldsymbol x^{(i)}
x(i) 的预测结果 $y^{(i)}_{pred} $ 就是
h
θ
(
x
(
i
)
)
h_{\boldsymbol \theta} (\boldsymbol x^{(i)})
hθ(x(i)) 的结果。
Loss function
我们称预测结果与实际结果的偏差为损失,那么如何度量这个损失呢?最简单的我们可以想到用差值来度量,还可以用差的绝对值来度量,还可以用差的平方来度量,用差的平方来度量的损失记为:
c
o
s
t
(
h
θ
(
x
(
i
)
)
,
y
(
i
)
)
=
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
cost(h_{\boldsymbol \theta}(\boldsymbol x^{(i)}),y^{(i)}) = (h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)})^2
cost(hθ(x(i)),y(i))=(hθ(x(i))−y(i))2
我们不能只让
θ
\boldsymbol \theta
θ 使某一个样本的损失最小,而应该让整个测试集的所有样本的数据的整体损失最小,很容易想到的一个朴素的度量整体损失方法那就是取每个样本的损失的均值,即:
J
(
θ
)
=
1
m
∑
i
=
1
m
c
o
s
t
(
h
θ
(
x
(
i
)
)
,
y
(
i
)
)
J(\boldsymbol \theta) = \frac 1 m \sum_{i = 1}^m cost(h_{\boldsymbol \theta}(\boldsymbol x^{(i)}),y^{(i)})
J(θ)=m1i=1∑mcost(hθ(x(i)),y(i))
那么我们选哪种损失的度量方法来计算整体的损失呢?我们来一个一个看,首先是差值,差值可能不太好,因为正负差值可能会抵消掉而使总体差值看起来不错而每个样本的偏差都很大。接下来是差值的绝对值,差值的绝对值不会有上面的问题,是个备选项,差值的平方看起来也是一个不错的选择。其实具体用哪个还是要根据使用场景的,没有单纯的说哪个一定比另一个好,常用的还是差值的平方,所以整个损失函数就是(有的还会再除以一个2,我猜是为了后面计算偏导的时候与产生的一个乘2相抵消而设的):
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\boldsymbol \theta) = \frac 1 {2m} \sum_{i = 1}^m (h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)})^2
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
所以我们的目标就是找到是
J
(
θ
)
J(\boldsymbol \theta)
J(θ) 最小时的
θ
\boldsymbol \theta
θ ,此时得到的模型
h
θ
(
x
)
h_{\boldsymbol \theta}(\boldsymbol x)
hθ(x) 就是我们想要的结果:
h
θ
(
x
)
=
θ
T
x
h_{\boldsymbol \theta}(\boldsymbol x) = \boldsymbol \theta^T \boldsymbol x
hθ(x)=θTx
min θ J ( θ ) \min_{\boldsymbol \theta} J(\boldsymbol \theta) θminJ(θ)
Gradient descent
有了模型,有了损失函数和优化目标后,接下来的问题就是怎么求解这个最优条件下的 θ \boldsymbol \theta θ 了。在微积分中,我们知道一个函数的最小值点可能在他的极小值点或者是取值范围的边界。这个函数取值范围是无穷的,所以只可能在极小值点,我们是可以通过求极小值点来找最优条件下的 θ \boldsymbol \theta θ 的,但是这并不是一个“万能”的方法,因为别的模型会有别的函数表达式,当函数表达式非常复杂的时候求解极小值点并不容易,所以这里介绍一种梯度下降的方法来找最优解。
在微积分中,梯度是函数在各个元上的偏导,也就是该曲线上的斜率。我们想象在一个三维的平面上(在一座上上),我们只能看到自己脚下的路的情况,但我们想要走到山的谷底。很容易想到朝着下山最快的地方一步一步走是最有可能找到谷底的(贪心的思想)。在这个面上,我们能走的所有方向都可以分解为往前或后加上往左或右。在前后方向的偏导及在左右方向的偏导所构成的向量就是我们应该走的方向的反方向,然后我们朝着这个反方向走一步就实现了下降了一点。(注意:梯度下降的方向也可能会让损失增加,见 Gradient descent3 那里我的世界的拿个视频),接下来是推导线性回归下的偏导公式,首先是
∂
J
(
θ
)
/
∂
θ
0
{\partial J(\boldsymbol \theta)} / {\partial \theta_0}
∂J(θ)/∂θ0
∂
J
(
θ
)
∂
θ
0
=
1
2
m
∑
i
=
1
m
2
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
′
\begin{aligned} \frac {\partial J(\boldsymbol \theta)} {\partial \theta_0} &= \frac 1 {2m} \sum_{i=1}^m 2(h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)})(h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)})' \\ \end{aligned}
∂θ0∂J(θ)=2m1i=1∑m2(hθ(x(i))−y(i))(hθ(x(i))−y(i))′
其中,因为
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
=
(
θ
0
+
θ
1
x
1
(
i
)
+
⋯
+
θ
n
x
n
(
i
)
−
y
(
i
)
)
(h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)}) = (\theta_0+\theta_1x_1^{(i)}+\cdots+\theta_nx_n^{(i)}-y^{(i)})
(hθ(x(i))−y(i))=(θ0+θ1x1(i)+⋯+θnxn(i)−y(i)) ,除
(
θ
0
)
′
=
1
(\theta_0)'=1
(θ0)′=1 外,其他的偏导都为0,所以
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
′
=
1
(h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)})'=1
(hθ(x(i))−y(i))′=1 ,所以:
∂
J
(
θ
)
∂
θ
0
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
\begin{aligned} \frac {\partial J(\boldsymbol \theta)} {\partial \theta_0} &= \frac 1 {m} \sum_{i=1}^m (h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)}) \\ \end{aligned}
∂θ0∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))
对于
j
≠
0
j \neq 0
j=0 时
∂
J
(
θ
)
/
∂
θ
j
{\partial J(\boldsymbol \theta)} / {\partial \theta_j}
∂J(θ)/∂θj 为:
∂
J
(
θ
)
∂
θ
j
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
′
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
(
θ
0
+
θ
1
x
1
(
i
)
+
⋯
+
θ
j
x
j
(
i
)
+
⋯
+
θ
n
x
n
(
i
)
−
y
(
i
)
)
′
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
(
0
+
0
+
⋯
+
x
j
(
i
)
+
⋯
+
0
−
0
)
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\begin{aligned} \frac {\partial J(\pmb\theta)} {\partial \theta_j} &= \frac 1 {m} \sum_{i=1}^m (h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)})(h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)})' \\ & =\frac 1 {m} \sum_{i=1}^m (h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)})(\theta_0+\theta_1x_1^{(i)}+\cdots+\theta_jx^{(i)}_j+\cdots+\theta_nx_n^{(i)}-y^{(i)})' \\ & =\frac 1 {m} \sum_{i=1}^m (h_{\boldsymbol \theta}(\pmb x^{(i)})-y^{(i)})(0+0+\cdots+x^{(i)}_j+\cdots+0-0) \\ & =\frac 1 {m} \sum_{i=1}^m (h_{\boldsymbol \theta}(\pmb x^{(i)})-y^{(i)}) x^{(i)}_j \end{aligned}
∂θj∂J(θθθ)=m1i=1∑m(hθ(x(i))−y(i))(hθ(x(i))−y(i))′=m1i=1∑m(hθ(x(i))−y(i))(θ0+θ1x1(i)+⋯+θjxj(i)+⋯+θnxn(i)−y(i))′=m1i=1∑m(hθ(xxx(i))−y(i))(0+0+⋯+xj(i)+⋯+0−0)=m1i=1∑m(hθ(xxx(i))−y(i))xj(i)
综上,各个系数的梯度计算公式:
∂
J
(
θ
)
∂
θ
0
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
∂
J
(
θ
)
∂
θ
j
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
(
j
≠
0
)
\begin{aligned} \frac {\partial J(\boldsymbol \theta)} {\partial \theta_0} &= \frac 1 {m} \sum_{i=1}^m (h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)}) \\ \frac {\partial J(\boldsymbol \theta)} {\partial \theta_j}& =\frac 1 {m} \sum_{i=1}^m (h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)}) x^{(i)}_j \ \ \ \ \ \ \ \ \ \ \ \ (j\neq 0) \end{aligned}
∂θ0∂J(θ)∂θj∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))=m1i=1∑m(hθ(x(i))−y(i))xj(i) (j=0)
有了梯度以后就是更新系数了,更新的方式就是新的位置等于原来的位置减去梯度,为了控制每步改变的大小,引入一个参数
α
\alpha
α ,该参数也称为学习率,更新系数的公式如下:
θ
j
:
=
θ
j
−
α
∂
J
(
θ
)
∂
θ
j
\theta_j:=\theta_j - \alpha \frac {\partial J(\boldsymbol \theta)} {\partial \theta_j}
θj:=θj−α∂θj∂J(θ)
从上式可以看出,每次更新改变的量不仅与
α
\alpha
α 有关,也与梯度的取值有关。整个梯度下降的过程就是不断的迭代计算梯度,更新系数的过程。可以想象,梯度下降每次都朝着当前最优的方向走一步,最终可以走到一个“谷底”,但这个谷底可能只是区域最低的地方,而不是全局最低的,所以梯度下降有陷入局部最优的风险(这也是贪心思想的算法的特征之一),但是在线性回归中,没有这个风险,因为线性函数是一个凸函数,只有一个极小值点,所以也是最小值点。
Polynomial regression
输入输出用线性关系就能刻画的情况还是非常少的,很多时候是非线性的关系,例如多项式的关系,那么怎么来回归拟合一个多项式函数呢?例如对于一个二元函数有如下多项式时:
h
θ
(
x
1
,
x
2
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
x
2
+
θ
4
x
1
2
+
θ
5
x
2
2
h_{\boldsymbol \theta}(x_1,x_2) = \theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_1x_2+\theta_4x_1^2+\theta_5x_2^2
hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x1x2+θ4x12+θ5x22
如何来拟合其中的
θ
\boldsymbol \theta
θ 呢,其实只需将后面的多项式部分看成是一个新的特征即可,即
θ
3
\theta_3
θ3 是特征
(
x
1
x
2
)
(x_1x_2)
(x1x2) 的系数,将
(
x
1
x
2
)
(x_1x_2)
(x1x2) 看成是一个整体,提前计算出
x
1
x
2
x_1x_2
x1x2 作为一个新特征即可,
θ
4
、
θ
5
\theta_4、\theta_5
θ4、θ5 同理。不知道会不会有人也和我一开始一样有这样的疑问,将多次项提前计算出来作为一个新特征,其实会抹去一次项在这里的痕迹,那么进行梯度下降求偏导的时候不会出问题吗?其实仔细观察偏导的公式可以知道,不会有问题的,因为求的不是
x
x
x 项的偏导而是
θ
\theta
θ 的偏导,
x
x
x 在求偏导时会被看作是常数。
Generalization
我们训练一个回归模型的目的不是想要他在训练集上有很好的表现,而是希望他在实际中能有很好的表现,我们使用测试集来模拟在新数据上的表现。在测试集上的表现被称为泛化能力。所以我们希望的是一个泛化能力好的模型,既能在训练集上有好的表现,也能在测试集上有好的表现。
在测试集上有好的表现一般来说很容易做到,将多项式的次数提高即可更好的拟合训练集。但是也可能造成过拟合,降低过拟合的一个方法就是正则化。
Regularization
正则化的方法是在损失函数后面增加正则化项,则损失函数变为:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
2
m
∑
j
=
1
n
θ
j
2
J(\boldsymbol \theta) = \frac 1 {2m} \sum_{i = 1}^m (h_{\boldsymbol \theta}(\pmb x^{(i)})-y^{(i)})^2 + \frac \lambda {2m} \sum_{j=1}^n\theta_j^2
J(θ)=2m1i=1∑m(hθ(xxx(i))−y(i))2+2mλj=1∑nθj2
注意求和从
j
=
1
j = 1
j=1 开始,偏执项(常数
θ
0
\theta_0
θ0)不加入到正则化项,因为加了效果可能反而会不好。梯度下降的偏导公式变为:
∂
J
(
θ
)
∂
θ
0
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
∂
J
(
θ
)
∂
θ
j
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
+
λ
m
θ
j
(
j
≠
0
)
\begin{aligned} \frac {\partial J(\boldsymbol \theta)} {\partial \theta_0} &= \frac 1 {m} \sum_{i=1}^m (h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)}) \\ \frac {\partial J(\boldsymbol \theta)} {\partial \theta_j}& =\frac 1 {m} \sum_{i=1}^m (h_{\boldsymbol \theta}(\boldsymbol x^{(i)})-y^{(i)}) x^{(i)}_j + \frac \lambda m \theta_j\ \ \ \ \ \ \ \ \ \ \ \ (j\neq 0) \end{aligned}
∂θ0∂J(θ)∂θj∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))=m1i=1∑m(hθ(x(i))−y(i))xj(i)+mλθj (j=0)
仔细观察正则化后的系数更新公式和正则化前的,若
λ
m
\frac\lambda m
mλ 是一个很小的数,那么正则化其实就是每次在更新
θ
j
\theta_j
θj 时,都先让
θ
j
\theta_j
θj 缩小一点点,然后在减去原来的值。