内容导读:文章中主要介绍了 逻辑回归的基本原理,详细易懂的公式推导,对损失函数的理解 等几个方面。
1. 基本思想 在线性回归内容的讲解中,主要建立了多元自变量与因变量之间的线性关系,即多个输入与对应输出的关系。比较常见的线性回归模型如下:
h
Θ
(
x
)
=
Θ
0
+
Θ
1
x
1
+
Θ
2
x
2
+
⋯
+
Θ
n
x
n
h_\Theta(x)=\Theta_0+\Theta_1x_1+\Theta_2x_2+\cdots+\Theta_nx_n
hΘ(x)=Θ0+Θ1x1+Θ2x2+⋯+Θnxn
正如在线性回归中经常提到的例子,根据一个人的工资和年龄情况预测其在某银行的贷款额度,又比如根据房屋的位置、面积、楼层以及采光等属性预测房价。
然而这里要提到的逻辑回归却与之不同,逻辑回归这个叫法主要来源于Logistic Regression,作为机器学习的经典算法之一,虽然名字叫回归,但其实是一个经典的二分类算法。
依然举个例子来形象地说明一下,通过分析年龄、性别、体质指数、平均血压、疾病指数等指标,判断一个人是否患糖尿病,Y=0表示未患病,Y=1表示患病。可以看出,这里最终的输出结果只有两个,包括0和1,因此不能再像线性回归一样,通过函数模型预测所得到的连续值来预测因变量Y(只能取0或1)。
在讲解逻辑回归之前,我们首先介绍一个函数(sigmoid函数):
g
(
z
)
=
1
1
+
e
−
z
(1)
g(z)=\frac{1}{1+e^{-z}}\tag{1}
g(z)=1+e−z1(1)
直接看这个函数,可能会觉得还挺复杂的,不容易理解,别着急,我们先来一起看看他的函数图像( Fig.1)。
可以看出,其自变量的取值范围为 [ − ∞ , + ∞ ] [-\infty,+\infty] [−∞,+∞],值域的范围为 [ 0 , 1 ] [0,1] [0,1]。这一下是不是就明白多了,此函数的意义就是把任意的输入映射到 [ 0 , 1 ] [0,1] [0,1]区间。在二分类任务以及机器学习的很多经典算法中,都有可能用到sigmoid函数,只要记住这幅图,在使用的过程中,自然很容易就想清楚了。
另外补充一点,在分析机器学习算法时,可能还要考虑很多的情况,比如sigmoid函数可能会出现梯度消失或者梯度爆炸,从而影响整个训练过程难以收敛等问题,这个不作为我们这部分的重点,有兴趣可以浏览我的这篇博客(待更新链接)。
回到本文来,引入这个函数之后,我们要用来干什么呢?
回想一下,在线性回归中,我们可以通过多个特征属性(变量)得到一个预测值。然而,在逻辑回归中,我们只需要将该值映射到sigmoid函数上,这样就将原来的值映射到 [ 0 , 1 ] [0,1] [0,1]区间了,也可以看成完成了由值到概率的转换,然后通过设定合适的阈值,从而完成整个分类任务。
到现在,逻辑回归的基本思想算是交代清楚了,那么接下来,我们需要着重考虑的是如何建立模型?如何训练模型?又如何设定阈值?
2. 模型建立 首先,根据刚刚我们引入的sigmoid函数,我们可以写出我们的预测函数:
h
Θ
(
x
)
=
g
(
Θ
T
x
)
=
1
1
+
e
−
Θ
T
x
(2)
h_\Theta(x)=g(\Theta^Tx)=\frac{1}{1+e^{-\Theta^Tx}}\tag{2}
hΘ(x)=g(ΘTx)=1+e−ΘTx1(2)
其中,(这里的
Θ
T
x
\Theta^Tx
ΘTx与线性回归中的内容是类似的)
Θ
0
+
Θ
1
x
1
+
Θ
2
x
2
+
⋯
+
Θ
n
x
n
=
∑
i
=
1
n
Θ
i
x
i
=
Θ
T
x
(3)
\Theta_0+\Theta_1x_1+\Theta_2x_2+\cdots+\Theta_nx_n=\sum_{i=1}^n\Theta_ix_i=\Theta^Tx\tag{3}
Θ0+Θ1x1+Θ2x2+⋯+Θnxn=i=1∑nΘixi=ΘTx(3)
以上两个公式其实就是将式(3)计算出来的值映射到式(2)sigmoid函数上,从而完成预测值到概率的转换(逻辑回归模型本身是假设数据满足伯努利分布的,因此这里可以将其看作概率值)。
得到预测函数后,再来看我们的这个逻辑回归问题。换句话再强调一遍,我们的做法是,先算出在满足相应特征属性 x x x的情况下,其对应类别( y = 1 y=1 y=1或 y = 0 y=0 y=0)的概率值,然后通过设定的阈值(第4部分有讲解,不用着急),进行最终的分类。
相当于我们求出的 h Θ ( x ) h_\Theta(x) hΘ(x)为一个概率值,其范围在 [ 0 , 1 ] [0,1] [0,1]区间,由于逻辑回归是个二分类问题,那么在给定 x x x的情况下, y = 1 y=1 y=1或 y = 0 y=0 y=0的概率公式可如下表示
P ( y = 1 ∣ x ; Θ ) = h Θ ( x ) (4) P(y=1|x;\Theta)=h_\Theta(x)\tag{4} P(y=1∣x;Θ)=hΘ(x)(4)
P ( y = 0 ∣ x ; Θ ) = 1 − h Θ ( x ) (5) P(y=0|x;\Theta)=1-h_\Theta(x)\tag{5} P(y=0∣x;Θ)=1−hΘ(x)(5)
整合式(4)和式(5)可得
P
(
y
∣
x
;
Θ
)
=
(
h
Θ
(
x
)
)
y
(
1
−
h
Θ
(
x
)
)
1
−
y
(6)
P(y|x;\Theta)=(h_\Theta(x))^y(1-h_\Theta(x))^{1-y}\tag{6}
P(y∣x;Θ)=(hΘ(x))y(1−hΘ(x))1−y(6)
我们分析一下整合出来的式(6),对于二分类任务(0,1),在该式中,若 y = 0 y=0 y=0,则只保留了 ( 1 − h Θ ( x ) ) (1-h_\Theta(x)) (1−hΘ(x)),若 y = 1 y=1 y=1,则只保留了 h Θ ( x ) h_\Theta(x) hΘ(x),因此式(6)和式(4)、(5)表达的是一个意思。
3. 模型训练由以上模型建立,我们得到了关于 y ( i ) y^{(i)} y(i)的条件概率 p ( y ( i ) ∣ x ( i ) ; Θ ) p(y^{(i)}|x^{(i)};\Theta) p(y(i)∣x(i);Θ),这里要使得预测值更接近于真实值,即条件概率 p ( y ( i ) ∣ x ( i ) ; Θ ) p(y^{(i)}|x^{(i)};\Theta) p(y(i)∣x(i);Θ)越大越好。
我们假设用于训练的样本为 m m m个,那么可通过找到最大似然估计,得到最优的解。
首先我们写出似然函数
L
(
Θ
)
=
∏
i
=
1
m
p
(
y
i
∣
x
i
;
Θ
)
=
∏
i
=
1
m
(
h
Θ
(
x
i
)
)
y
i
(
1
−
h
Θ
(
x
i
)
)
1
−
y
i
L(\Theta)=\prod _{i=1}^{m}p(y_i|x_i;\Theta)=\prod _{i=1}^{m}(h_\Theta(x_i))^{y_i}(1-h_\Theta(x_i))^{1-y_i}
L(Θ)=i=1∏mp(yi∣xi;Θ)=i=1∏m(hΘ(xi))yi(1−hΘ(xi))1−yi
由于似然函数中包含了累乘,计算过程是很复杂的,这里将其转换为对数似然,做这样的处理似然函数的单调性并无影响,却大大改善了其计算复杂度。对数似然函数如下
l
(
Θ
)
=
l
o
g
L
(
Θ
)
=
∑
i
=
1
m
(
y
i
l
o
g
h
Θ
(
x
i
)
+
(
1
−
y
i
)
l
o
g
(
1
−
h
Θ
(
x
i
)
)
)
l(\Theta)=logL(\Theta)=\sum_{i=1}^m(y_ilogh_\Theta(x_i)+(1-y_i)log(1-h_\Theta(x_i)))
l(Θ)=logL(Θ)=i=1∑m(yiloghΘ(xi)+(1−yi)log(1−hΘ(xi)))
在这里,我们需要找到的是最大似然估计,那么可以应用梯度上升求最大值,引入 J ( Θ ) = − 1 m l ( Θ ) J(\Theta)=-\frac{1}{m}l(\Theta) J(Θ)=−m1l(Θ) 转换为梯度下降任务。此处 J ( Θ ) J(\Theta) J(Θ) 即为逻辑回归的损失函数(交叉熵损失函数),最大化 似然估计 也就是 最小化 损失函数。
J ( Θ ) = − 1 m ∑ i = 1 m ( y i l o g h Θ ( x i ) + ( 1 − y i ) l o g ( 1 − h Θ ( x i ) ) ) J(\Theta)=-\frac{1}{m}\sum_{i=1}^m(y_ilogh_\Theta(x_i)+(1-y_i)log(1-h_\Theta(x_i))) J(Θ)=−m1i=1∑m(yiloghΘ(xi)+(1−yi)log(1−hΘ(xi)))
补充:简单介绍一下在逻辑回归模型中,对 交叉熵损失函数 的理解。
首先,对于某一样本,其交叉熵损失函数为
J ( Θ ) = − ( y i l o g h Θ ( x i ) + ( 1 − y i ) l o g ( 1 − h Θ ( x i ) ) ) J(\Theta)=-(y_ilogh_\Theta(x_i)+(1-y_i)log(1-h_\Theta(x_i))) J(Θ)=−(yiloghΘ(xi)+(1−yi)log(1−hΘ(xi)))
当 y i = 0 y_i=0 yi=0 时,此时 J ( Θ ) = − l o g ( 1 − h Θ ( x i ) ) J(\Theta)=-log(1-h_\Theta(x_i)) J(Θ)=−log(1−hΘ(xi));要使得 J ( Θ ) J(\Theta) J(Θ) 越小,即 h Θ ( x i ) h_\Theta(x_i) hΘ(xi) 越小;又因为 h Θ ( x i ) h_\Theta(x_i) hΘ(xi) 由 sigmoid 函数得到,范围为[0,1];因此,当 h Θ ( x i ) h_\Theta(x_i) hΘ(xi) 越接近 0(即越接近真实值 y i y_i yi ), J ( Θ ) J(\Theta) J(Θ) 就越小,模型也就越好。
当 y i = 1 y_i=1 yi=1 时,此时 J ( Θ ) = − h Θ ( x i ) J(\Theta)=-h_\Theta(x_i) J(Θ)=−hΘ(xi);要使得 J ( Θ ) J(\Theta) J(Θ) 越小,即 h Θ ( x i ) h_\Theta(x_i) hΘ(xi) 越大;又因为 h Θ ( x i ) h_\Theta(x_i) hΘ(xi) 由 sigmoid 函数得到,范围为[0,1];因此,当 h Θ ( x i ) h_\Theta(x_i) hΘ(xi) 越接近 1(即越接近真实值 y i y_i yi ), J ( Θ ) J(\Theta) J(Θ) 就越小,模型也就越好。
由以上分析可以看出,交叉熵损失函数可以较好地评价逻辑回归模型的效果。
当然,也有提到将 “平方误差和” 作为逻辑回归的损失函数,但由于使用 平方误差和 在优化参数时,后面的优化问题可能变得非凸,从而出现较多局部最优解,使得梯度下降法无法准确找到最优解。
对上式求导,数学功底还行的可以仔细看看下面的推导过程,要是数学比较弱,干脆直接用最后的结果:
δ
δ
Θ
j
J
(
Θ
)
=
−
1
m
∑
i
=
1
m
(
y
i
1
h
Θ
(
x
i
)
δ
δ
Θ
j
h
Θ
(
x
i
)
−
(
1
−
y
i
)
1
1
−
h
Θ
(
x
i
)
δ
δ
Θ
j
h
Θ
(
x
i
)
)
=
−
1
m
∑
i
=
1
m
(
y
i
1
g
(
Θ
T
x
i
)
−
(
1
−
y
i
)
1
1
−
g
(
Θ
T
x
i
)
)
δ
δ
Θ
j
g
(
Θ
T
x
i
)
=
−
1
m
∑
i
=
1
m
(
y
i
1
g
(
Θ
T
x
i
)
−
(
1
−
y
i
)
1
1
−
g
(
Θ
T
x
i
)
)
g
(
Θ
T
x
i
)
(
1
−
g
(
Θ
T
x
i
)
)
δ
δ
Θ
j
Θ
T
x
i
=
−
1
m
∑
i
=
1
m
(
y
i
(
1
−
g
(
Θ
T
x
i
)
)
−
(
1
−
y
i
)
g
(
Θ
T
x
i
)
)
x
i
j
=
−
1
m
∑
i
=
1
m
(
y
i
−
g
(
Θ
T
x
i
)
)
x
i
j
=
1
m
∑
i
=
1
m
(
h
Θ
(
x
i
)
−
y
i
)
x
i
j
\begin{aligned} \frac{\delta}{\delta_{\Theta_j}}J(\Theta)&=-\frac{1}{m}\sum_{i=1}^m(y_i\frac{1}{h_\Theta(x_i)}\frac{\delta}{\delta_{\Theta_j}}h_\Theta(x_i)-(1-y_i)\frac{1}{1-h_\Theta(x_i)}\frac{\delta}{\delta_{\Theta_j}}h_\Theta(x_i)) \\ &=-\frac{1}{m}\sum_{i=1}^m(y_i\frac{1}{g(\Theta^Tx_i)}-(1-y_i)\frac{1}{1-g(\Theta^Tx_i)})\frac{\delta}{\delta_{\Theta_j}}g(\Theta^Tx_i)\\ &=-\frac{1}{m}\sum_{i=1}^m(y_i\frac{1}{g(\Theta^Tx_i)}-(1-y_i)\frac{1}{1-g(\Theta^Tx_i)})g(\Theta^Tx_i)(1-g(\Theta^Tx_i))\frac{\delta}{\delta_{\Theta_j}}\Theta^Tx_i\\ &=-\frac{1}{m}\sum_{i=1}^m(y_i(1-g(\Theta^Tx_i))-(1-y_i)g(\Theta^Tx_i))x_i^j\\ &=-\frac{1}{m}\sum_{i=1}^m(y_i-g(\Theta^Tx_i))x_i^j\\ &=\frac{1}{m}\sum_{i=1}^m(h_\Theta(x_i)-y_i)x_i^j \end{aligned}
δΘjδJ(Θ)=−m1i=1∑m(yihΘ(xi)1δΘjδhΘ(xi)−(1−yi)1−hΘ(xi)1δΘjδhΘ(xi))=−m1i=1∑m(yig(ΘTxi)1−(1−yi)1−g(ΘTxi)1)δΘjδg(ΘTxi)=−m1i=1∑m(yig(ΘTxi)1−(1−yi)1−g(ΘTxi)1)g(ΘTxi)(1−g(ΘTxi))δΘjδΘTxi=−m1i=1∑m(yi(1−g(ΘTxi))−(1−yi)g(ΘTxi))xij=−m1i=1∑m(yi−g(ΘTxi))xij=m1i=1∑m(hΘ(xi)−yi)xij
这里的 x i j x_i^j xij是地 i i i个样本的第 j j j个特征属性值,对应这里的 Θ j \Theta_j Θj。
接下来对参数进行更新,即梯度下降中沿着最快的方向(梯度方向)走一步,
α
\alpha
α为学习率,在这里相当于控制了梯度下降的步长:
Θ
j
=
Θ
j
−
α
δ
δ
Θ
j
J
(
Θ
)
=
Θ
j
−
α
1
m
∑
i
=
1
m
(
h
Θ
(
x
i
)
−
y
i
)
x
i
j
\Theta_j=\Theta_j-\alpha\frac{\delta}{\delta_{\Theta_j}}J(\Theta)=\Theta_j-\alpha\frac{1}{m}\sum_{i=1}^m(h_\Theta(x_i)-y_i)x_i^j
Θj=Θj−αδΘjδJ(Θ)=Θj−αm1i=1∑m(hΘ(xi)−yi)xij
经过多轮的迭代训练,整个过程收敛,得到最优的 Θ \Theta Θ值。
4. 阈值选择阈值的选择并没有一个固定的标准,一般看来,选择中间值0.5,即概率为50%,比较合适。但是在某些任务中显得并不那么合适,比如在前面的例子中,预测患糖尿病,如果将阈值设为0.5,那么对于小于50%却非常接近50%的概率患了糖尿病的人,却被诊断为未患糖尿病。若是将阈值设置为0.3,那么有30%的概率,就诊断为患病,这对整个病的预防效果也是很好的。