机器学习求索之路(1)— 线性回归
@(Machine Learning)
文章目录
1. 定义
回归方法是为了对连续性的数据做出预测,其中最简单的方法当然就是线性回归。顾名思义,线性回归在假设特证满足线性关系,根据给定的训练数据来训练一个模型,用拟合出的线性方程对未知数据做出预测。线性回归的优点就是计算公式简单,计算结果容易理解,但是对非线性的数据拟合程度不够好。
2. 模型和损失函数
2.1. 基本形式
对于
n
n
n维特征的样本数据,给定由
n
n
n个属性描述的示例
x
=
(
x
1
,
x
2
,
.
.
.
,
x
n
)
x=\left ( x_{1},x_{2},...,x_{n} \right )
x=(x1,x2,...,xn),其中
x
i
x_{i}
xi是
x
x
x在第
i
i
i个属性上的取值,线性回归试图学得一个通过属性的线性组合来进行预测的函数,即
h
θ
(
x
1
,
x
2
,
.
.
.
x
n
)
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}
hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn
其中
θ
i
(
i
=
0
,
1
,
2...
n
)
\theta_i (i = 0,1,2... n)
θi(i=0,1,2...n)为模型参数,
x
i
(
i
=
0
,
1
,
2...
n
)
x_{i} (i = 0,1,2... n)
xi(i=0,1,2...n)为每个样本的n个特征值。这个表示可以简化,我们增加一个特征
x
0
=
1
x_{0}=1
x0=1 ,这样
h
θ
(
x
0
,
x
1
,
.
.
.
x
n
)
=
∑
i
=
0
n
θ
i
x
i
h_\theta(x_0, x_1, ...x_n) = \sum\limits_{i=0}^{n}\theta_{i}x_{i}
hθ(x0,x1,...xn)=i=0∑nθixi。
进一步用矩阵形式表达更加简洁如下:
h
θ
(
X
)
=
X
θ
h_\mathbf{\theta}(\mathbf{X}) = \mathbf{X\theta}
hθ(X)=Xθ
其中, 假设函数
h
θ
(
X
)
h_\mathbf{\theta}(\mathbf{X})
hθ(X)为
m
∗
1
m * 1
m∗1的向量,
θ
{\theta}
θ为
n
∗
1
n * 1
n∗1的向量,里面有
n
n
n个代数法的模型参数。
X
X
X为
m
∗
n
m * n
m∗n维的矩阵。
m
m
m代表样本的个数,
n
n
n代表样本的特征数。
2.2. 损失函数
得到了上述模型,我们需要求出需要的损失函数,一般线性回归我们用均方误差作为损失函数。损失函数的代数法表示如下:
J
(
θ
0
,
θ
1
.
.
.
,
θ
n
)
=
∑
i
=
0
m
(
h
θ
(
x
0
,
x
1
,
.
.
.
x
n
)
−
y
i
)
2
J(\theta_0, \theta_1..., \theta_n) = \sum\limits_{i=0}^{m}(h_\theta(x_0, x_1, ...x_n) - y_i)^2
J(θ0,θ1...,θn)=i=0∑m(hθ(x0,x1,...xn)−yi)2
进一步用矩阵形式表达损失函数:
J
(
θ
)
=
1
2
(
X
θ
−
Y
)
T
(
X
θ
−
Y
)
J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y})
J(θ)=21(Xθ−Y)T(Xθ−Y)
由于矩阵法表达比较的简洁,后面将采用矩阵方式表达模型函数和损失函数。
3. 模型求解
对于线性回归的损失函数 J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) J(θ)=21(Xθ−Y)T(Xθ−Y),我们常用的有两种方法来求损失函数最小化时候的 θ \theta θ参数:一种是梯度下降法,一种是最小二乘法。而这两种方式又都分别有代数解法和矩阵解法,由于时间关系这里只给出矩阵解法,后续有时间再将代数解法补上。
3.1. 梯度下降法
- 梯度下降的直观解释
首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。
从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。
- 梯度下降法的矩阵方式推导
- 先决条件: 需要确认优化模型的假设函数和损失函数。对于线性回归,假设函数
h
θ
(
x
1
,
x
2
,
.
.
.
x
n
)
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
h_\theta(x_1, x_2, ...x_n) = \theta_0 +\theta_{1}x_1 + ... +\theta_{n}x_{n}
hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn的矩阵表达方式为:
h
θ
(
X
)
=
X
θ
h_\mathbf{\theta}(\mathbf{X}) =\mathbf{X\theta}
hθ(X)=Xθ ,
其中, 假设函数 h θ ( X ) h_\mathbf{\theta}(\mathbf{X}) hθ(X)为 m ∗ 1 m * 1 m∗1的向量, θ \mathbf{\theta} θ为 ( n + 1 ) ∗ 1 (n+1) * 1 (n+1)∗1的向量,里面有 n + 1 n+1 n+1个代数法的模型参数。 X \mathbf{X} X为 m ∗ ( n + 1 ) m * (n+1) m∗(n+1)维的矩阵。m代表样本的个数,n+1代表样本的特征数。
损失函数的表达式为: J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} -\mathbf{Y})^T(\mathbf{X\theta} -\mathbf{Y}) J(θ)=21(Xθ−Y)T(Xθ−Y), 其中 Y \mathbf{Y} Y是样本的输出向量,维度为 m ∗ 1 m * 1 m∗1. - 算法相关参数初始化: θ \theta θ向量的初始化,算法终止距离 ε \varepsilon ε,步长 α \alpha α。在没有任何先验知识的时候,一般将所有的θ初始化为0, 将步长初始化为1。
- 算法过程:
1)确定当前位置的损失函数的梯度,对于 θ \theta θ向量,其梯度表达式如下:
∂ ∂ θ J ( θ ) \frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) ∂θ∂J(θ)
2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即 α ∂ ∂ θ J ( θ ) \alpha\frac{\partial}{\partial\theta}J(\theta) α∂θ∂J(θ)对应于前面登山例子中的某一步。
3)确定 θ \mathbf\theta θ向量里面的每个值,梯度下降的距离都小于 ε \varepsilon ε,如果小于 ε \varepsilon ε则算法终止,当前 θ \mathbf\theta θ向量即为最终结果。否则进入步骤4.
4)更新 θ \theta θ向量,其更新表达式如下。更新完毕后继续转入步骤1.
θ = θ − α ∂ ∂ θ J ( θ ) \mathbf\theta=\mathbf\theta -\alpha\frac{\partial}{\partial\theta}J(\mathbf\theta) θ=θ−α∂θ∂J(θ)
- 线性回归的具体算法过程:
损失函数对于 θ \theta θ向量的偏导数计算如下:
∂ ∂ θ J ( θ ) = ∂ ∂ θ 1 2 ( X θ − Y ) T ( X θ − Y ) \frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) = \frac{\partial}{\partial\mathbf\theta}\frac{1}{2}(\mathbf{X\theta} -\mathbf{Y})^T(\mathbf{X\theta} -\mathbf{Y}) ∂θ∂J(θ)=∂θ∂21(Xθ−Y)T(Xθ−Y)
= ∂ ∂ θ 1 2 ( θ T X T X θ − θ T X T Y − Y T X θ + Y T Y ) = \frac{\partial}{\partial\mathbf\theta}\frac{1}{2}(\theta^T\mathbf{X}^T\mathbf{X\theta} - \theta^T\mathbf{X}^T\mathbf{Y} - \mathbf{Y}^T\mathbf{X\theta} + \mathbf{Y}^T\mathbf{Y}) =∂θ∂21(θTXTXθ−θTXTY−YTXθ+YTY)
= ∂ ∂ θ 1 2 ( θ T X T X θ − 2 θ T X T Y + Y T Y ) = \frac{\partial}{\partial\mathbf\theta}\frac{1}{2}(\mathbf{\theta^TX^TX\theta} - 2\mathbf{\theta^TX^TY} + \mathbf{Y^TY}) =∂θ∂21(θTXTXθ−2θTXTY+YTY)
= 1 2 ( 2 X T X θ − 2 X T Y ) = \frac{1}{2}(2\mathbf{X^TX\theta} - 2\mathbf{X^TY}) =21(2XTXθ−2XTY)
可得
∂
∂
θ
J
(
θ
)
=
X
T
(
X
θ
−
Y
)
\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) = \mathbf{X}^T(\mathbf{X\theta} -\mathbf{Y})
∂θ∂J(θ)=XT(Xθ−Y)
步骤4中
θ
\theta
θ向量的更新表达式如下:
θ
=
θ
−
α
X
T
(
X
θ
−
Y
)
\mathbf\theta=\mathbf\theta -\alpha\mathbf{X}^T(\mathbf{X\theta} -\mathbf{Y})
θ=θ−αXT(Xθ−Y)
这里面用到了矩阵求导链式法则,和两个矩阵求导的公式。
- 公式1: ∂ ∂ X ( X X T ) = 2 X \frac{\partial}{\partial\mathbf{X}}(\mathbf{XX^T}) =2\mathbf{X} ∂X∂(XXT)=2X
- 公式2: ∂ ∂ θ ( X θ ) = X T \frac{\partial}{\partial\mathbf\theta}(\mathbf{X\theta}) =\mathbf{X^T} ∂θ∂(Xθ)=XT
3.2. 最小二乘法
最小二乘法原理的一般形式很简单,形式为:
目
标
函
数
=
∑
(
观
测
值
−
理
论
值
)
2
目标函数 = \sum(观测值 - 理论值)^2
目标函数=∑(观测值−理论值)2
观测值就是我们的多组样本,理论值就是我们的假设拟合函数。目标函数也就是在机器学习中常说的损失函数,我们的目标是得到使目标函数最小化时候的拟合函数的模型。
假设函数
h
θ
(
x
1
,
x
2
,
.
.
.
x
n
)
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
−
1
x
n
−
1
h_\theta(x_1, x_2, ...x_n) = \theta_0 +\theta_{1}x_1 + ... +\theta_{n-1}x_{n-1}
hθ(x1,x2,...xn)=θ0+θ1x1+...+θn−1xn−1的矩阵表达方式为:
h
θ
(
x
)
=
X
θ
h_\mathbf{\theta}(\mathbf{x}) =\mathbf{X\theta}
hθ(x)=Xθ
其中, 假设函数
h
θ
(
X
)
h_\mathbf{\theta}(\mathbf{X})
hθ(X)为mx1的向量,
θ
\mathbf{\theta}
θ为
n
∗
1
n * 1
n∗1的向量,里面有n个代数法的模型参数。
X
\mathbf{X}
X为
m
∗
n
m * n
m∗n维的矩阵。m代表样本的个数,n代表样本的特征数。
损失函数定义为:
J
(
θ
)
=
1
2
(
X
θ
−
Y
)
T
(
X
θ
−
Y
)
J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} -\mathbf{Y})^T(\mathbf{X\theta} -\mathbf{Y})
J(θ)=21(Xθ−Y)T(Xθ−Y)
其中
Y
\mathbf{Y}
Y是样本的输出向量,维度为
m
∗
1
m * 1
m∗1.
1
2
\frac{1}{2}
21在这主要是为了求导后系数为1,方便计算。
根据最小二乘法的原理,我们要对这个损失函数对
θ
\mathbf{\theta}
θ向量求导取0。结果如下式(推导过程同上):
∂
∂
θ
J
(
θ
)
=
X
T
(
X
θ
−
Y
)
=
0
\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) = \mathbf{X}^T(\mathbf{X\theta} -\mathbf{Y}) = 0
∂θ∂J(θ)=XT(Xθ−Y)=0
这里面用到了矩阵求导链式法则,和两个矩阵求导的公式。
- 公式1: ∂ ∂ X ( X X T ) = 2 X \frac{\partial}{\partial\mathbf{X}}(\mathbf{XX^T}) =2\mathbf{X} ∂X∂(XXT)=2X
- 公式2:
∂
∂
θ
(
X
θ
)
=
X
T
\frac{\partial}{\partial\mathbf\theta}(\mathbf{X\theta}) =\mathbf{X^T}
∂θ∂(Xθ)=XT
对上述求导等式整理后可得: X T X θ = X T Y \mathbf{X^{T}X\theta} =\mathbf{X^{T}Y} XTXθ=XTY
两边同时左乘 ( X T X ) − 1 (\mathbf{X^{T}X})^{-1} (XTX)−1可得: θ = ( X T X ) − 1 X T Y \mathbf{\theta} = (\mathbf{X^{T}X})^{-1}\mathbf{X^{T}Y} θ=(XTX)−1XTY
这样我们就一下子求出了 θ \theta θ向量表达式的公式,免去了代数法一个个去求导的麻烦。只要给了数据,我们就可以用 θ = ( X T X ) − 1 X T Y \mathbf{\theta} = (\mathbf{X^{T}X})^{-1}\mathbf{X^{T}Y} θ=(XTX)−1XTY算出 θ \theta θ。
4. 优缺点
- 优点:计算公式简单,求解快,计算结果容易理解(模型的可解释性在实际工作中极其重要!!!)。
- 缺点:对非线性的数据拟合程度不够好
一般来说,只要我们觉得数据有线性关系,LinearRegression类是我们首先尝试的。如果发现拟合或者预测的不好,再考虑用其他的线性回归库。
5. 正则化
为了防止模型的过拟合,我们在建立线性模型的时候经常需要加入正则化项。一般有L1正则化和L2正则化。
5.1. L1正则化
线性回归的L1正则化通常称为Lasso回归,它和一般线性回归的区别是在损失函数上增加了一个L1正则化的项,L1正则化的项有一个常数系数
α
\alpha
α来调节损失函数的均方差项和正则化项的权重,具体Lasso回归的损失函数表达式如下:
J
(
θ
)
=
1
2
(
X
θ
−
Y
)
T
(
X
θ
−
Y
)
+
α
∣
∣
θ
∣
∣
1
J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \alpha||\theta||_1
J(θ)=21(Xθ−Y)T(Xθ−Y)+α∣∣θ∣∣1
其中
n
n
n为样本个数,
α
\alpha
α为常数系数,需要进行调优。
∣
∣
θ
∣
∣
1
||\theta||_1
∣∣θ∣∣1为L1范数。假设损失函数在二维上求解,则可以画出图像:
Lasso回归可以使得一些特征的系数变小,甚至还是一些绝对值较小的系数直接变为0。增强模型的泛化能力。
Lasso回归的求解办法一般有坐标轴下降法(coordinate descent)和最小角回归法( Least Angle Regression)
5.2. L2正则化
线性回归的L2正则化通常称为Ridge回归或“权重衰减”(weight decay),它和一般线性回归的区别是在损失函数上增加了一个L2正则化的项,和Lasso回归的区别是Ridge回归的正则化项是L2范数,而Lasso回归的正则化项是L1范数。具体Ridge回归的损失函数表达式如下:
J
(
θ
)
=
1
2
(
X
θ
−
Y
)
T
(
X
θ
−
Y
)
+
1
2
α
∣
∣
θ
∣
∣
2
2
J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \frac{1}{2}\alpha||\theta||_2^2
J(θ)=21(Xθ−Y)T(Xθ−Y)+21α∣∣θ∣∣22
其中
α
\alpha
α为常数系数,需要进行调优。
∣
∣
θ
∣
∣
2
||\theta||_2
∣∣θ∣∣2为L2范数。假设损失函数在二维上求解,则可以画出图像:
Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使得模型相对而言比较的稳定,但和Lasso回归比,这会使得模型的特征留的特别多,模型解释性差。
Ridge回归的求解比较简单,一般用最小二乘法。这里给出用最小二乘法的矩阵推导形式,和普通线性回归类似。令
J
(
θ
)
J(\mathbf\theta)
J(θ)的导数为0,得到下式:
X
T
(
X
θ
−
Y
)
+
α
θ
=
0
\mathbf{X^T(X\theta - Y) + \alpha\theta} = 0
XT(Xθ−Y)+αθ=0
整理即可得到最后的
θ
\theta
θ的结果:
θ
=
(
X
T
X
+
α
E
)
−
1
X
T
Y
\mathbf{\theta = (X^TX + \alpha E)^{-1}X^TY}
θ=(XTX+αE)−1XTY
其中
E
E
E为单位矩阵。
5.3. L1正则和L2正则的区别
上图2 中彩色实线是 J 0 J_0 J0( J 0 = 1 2 ( X θ − Y ) T ( X θ − Y ) J_0=\frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) J0=21(Xθ−Y)T(Xθ−Y))的等值线,黑色实线是L1正则的等值线。二维空间(权重向量只有 θ 1 \theta_1 θ1和 θ 2 \theta_2 θ2)上,L1正则项的等值线是方形,方形与 J 0 J_0 J0的等值线相交时相交点为顶点的概率很大,所以或等于零的概率很大。所以使用L1正则项的解具有稀疏性。
上图3 中彩色实线是 J 0 J_0 J0的等值线,黑色实线是L2正则的等值线。二维空间(权重向量只有 θ 1 \theta_1 θ1和 θ 2 \theta_2 θ2)上,L2正则项的等值线是圆,与 J 0 J_0 J0的等值线相交时或等于零的概率很小。所以使用L2正则项的解不具有稀疏性。在求解过程中,L2通常倾向让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。参数足够小,数据偏移得多一点也不会对结果造成什么影响,可以说“抗扰动能力强”。
推广到更大维度空间也是同样道理,L2正则项的等值线或等值面是比较平滑的,而L1正则项的等值线或等值面是比较尖锐的,所以这些突出的点与 J 0 J_0 J0接触的机会更大,而在这些突出的点上,会有很多权值等于0。由L1正则化导出的稀疏性质已被广泛用于特征选择,特征选择可以从可用的特征子集中选择有意义的特征。
6. 线性回归的推广
6.1. 多项式回归
回到我们开始的线性模型,
h
θ
(
x
1
,
x
2
,
.
.
.
x
n
)
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}
hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn, 如果这里不仅仅是
x
x
x 的一次方,比如增加二次方,那么模型就变成了多项式回归。这里写一个只有两个特征的p次方多项式回归的模型:
h
θ
(
x
1
,
x
2
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
2
+
θ
4
x
2
2
+
θ
5
x
1
x
2
h_\theta(x_1, x_2) = \theta_0 + \theta_{1}x_1 + \theta_{2}x_{2} + \theta_{3}x_1^{2} + \theta_{4}x_2^{2} + \theta_{5}x_{1}x_2
hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x12+θ4x22+θ5x1x2
而令
x
0
=
1
,
x
1
=
x
1
,
x
2
=
x
2
,
x
3
=
x
1
2
,
x
4
=
x
2
2
,
x
5
=
x
1
x
2
x_0 = 1, x_1 = x_1, x_2 = x_2, x_3 =x_1^{2}, x_4 = x_2^{2}, x_5 = x_{1}x_2
x0=1,x1=x1,x2=x2,x3=x12,x4=x22,x5=x1x2,这样我们就得到了下式:
h
θ
(
x
1
,
x
2
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
3
+
θ
4
x
4
+
θ
5
x
5
h_\theta(x_1, x_2) = \theta_0 + \theta_{1}x_1 + \theta_{2}x_{2} + \theta_{3}x_3 + \theta_{4}x_4 + \theta_{5}x_5
hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x3+θ4x4+θ5x5
可以发现,我们又重新回到了线性回归,这是一个五元线性回归,可以用线性回归的方法来完成算法。对于每个二元样本特征
(
x
1
,
x
2
)
(x_1,x_2)
(x1,x2), 我们得到一个五元样本特征
(
1
,
x
1
,
x
2
,
x
1
2
,
x
2
2
,
x
1
x
2
)
(1, x_1, x_2, x_{1}^2, x_{2}^2, x_{1}x_2)
(1,x1,x2,x12,x22,x1x2), 通过这个改进的五元样本特征,我们重新把不是线性回归的函数变回线性回归。
6.2. 广义线性回归
在上一节的线性回归的推广中,我们对样本特征端做了推广,这里我们对于特征
y
y
y做推广。比如我们的输出
Y
Y
Y不满足和
X
X
X的线性关系,但是
l
n
Y
ln\mathbf{Y}
lnY和
X
X
X满足线性关系,模型函数如下:
l
n
Y
=
X
θ
ln\mathbf{Y} = \mathbf{X\theta}
lnY=Xθ
这样对与每个样本的输入
y
y
y,我们用
l
n
y
ln\mathbf{y}
lny去对应, 从而仍然可以用线性回归的算法去处理这个问题。我们把
l
n
y
ln\mathbf{y}
lny一般化,假设这个函数是单调可微函数
g
(
.
)
g(.)
g(.),则一般化的广义线性回归形式是:
g
(
Y
)
=
X
θ
或
Y
=
g
−
1
(
X
θ
)
\mathbf{g}(\mathbf{Y}) = \mathbf{X\theta} 或 \mathbf{Y} = \mathbf{g^{-1}}(\mathbf{X\theta})
g(Y)=Xθ或Y=g−1(Xθ)
这个函数
g
(
.
)
g(.)
g(.)我们通常称为联系函数。
7. Python调用及参数
from sklearn.linear_model import LinearRegression
clf = LinearRegression() #调用模型
clf.fit(X, y) #拟合模型
clf.predict(X_pre) #使用拟合的模型进行预测
参数解释
- fit_intercept : 是否存在截距,默认存在
- normalize : 标准化开关,默认关闭
- n_jobs : 计算所用到的job数量,默认为1。-1表示使用所有CPU计算
8. 写在最后
- 持续学习
- 模型可解释性
- 公式编辑