一、前言
之前我们说到有关线性回归的一些内容,有兴趣的小伙伴可以去看一下。
这一章我们主要说一下逻辑回归。逻辑回归和线性回归有区别但是更有联系。
就从逻辑回归的作用来看,我觉得它不应该叫逻辑回归,而应该叫回归逻辑,或者更直白一点叫:线性回归后的逻辑化分类算法。
没错,逻辑回归不是回归算法,而是分类算法。
为什么我们得出了线性回归的结构之后还要记性逻辑回归呢,其实很简单,这个就像我们大学考试拿等级一样,比如
90
90
90分以上的人可以拿到A,
90
90
90分以下的是B,而只有A等级在最后计算绩点时可以加分,这个时候你的考试分数往往不够直观,我们就需要等级化,这里的具体的考试分数可以看成线性回归的结果,而A、B等级就是逻辑回归的结果,这个90分就是一个阈值。
或者在看一个例子,又是借贷款的问题,借贷银行对你的综合情况进行评估(线性回归过程),最终得出了一个可贷估计值(假设范围是0~1),如果可贷估计值在
[
0
,
0.5
)
[0,0.5)
[0,0.5),银行不借贷,如果在
[
0.5
,
1
]
[0.5,1]
[0.5,1],银行借贷(逻辑回归过程)。
二、sigmoid 函数
我们说过,逻辑回归就是将线性回归产生的结果进行二分化,既然是二分化我们就需要寻找一个阈值作为二分的标准,这个时候就需要用到
s
i
g
m
o
i
d
sigmoid
sigmoid函数,
s
i
g
m
o
i
d
sigmoid
sigmoid函数不光可以实现一个阈值对数据进行二分化,由于其值域是0~1,所以
s
i
g
m
o
i
d
sigmoid
sigmoid函数可以很好的表示概率。
s
i
g
m
o
i
d
sigmoid
sigmoid 函数的表达式为:
g
(
z
)
=
1
1
+
e
−
z
g(z)={1\over{1+e^{-z}}}
g(z)=1+e−z1
讲
y
=
θ
T
x
y=\theta^Tx
y=θTx代入其中便可以得到:
h
θ
(
x
)
=
g
(
θ
T
x
)
=
1
1
+
e
−
θ
T
x
h_\theta(x)=g(\theta^Tx)={1\over{1+e^{-{\theta^Tx}}}}
hθ(x)=g(θTx)=1+e−θTx1
函数的图像如下所示:
三、逻辑回归的损失函数(目标函数)
由于逻辑回归是一个分类算法,所以我们的损失函数也显得很离散:
c
o
s
t
(
h
θ
(
x
)
,
y
)
=
{
−
l
o
g
(
h
θ
(
x
)
)
y
=
1
−
l
o
g
(
1
−
h
θ
(
x
)
)
y
=
0
cost(h_\theta (x),y)=\begin{cases} -log(h_\theta (x))&y=1\\ -log(1-h_\theta (x))&y=0 \end{cases}
cost(hθ(x),y)={−log(hθ(x))−log(1−hθ(x))y=1y=0
完整的损失函数为:
c
o
s
t
(
h
θ
(
x
)
,
y
)
=
∑
i
=
1
n
−
y
i
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
i
)
l
o
g
(
1
−
h
θ
(
x
)
)
cost(h_\theta (x),y)=\sum_{i=1}^n-y_ilog(h_\theta (x))-{(1-y_i)}log(1-h_\theta (x))
cost(hθ(x),y)=i=1∑n−yilog(hθ(x))−(1−yi)log(1−hθ(x))
看到这里是不是觉得特别抽象,那么我就来带大家理一下:
假设有一个老师对四位同学分别根据平时表现,对专业的态度,学习效率等多方面进行学习成绩评估得出了预测结果(也就是下表的线性回归结果),并将90分以上定为等级A(也就是二分类中的类别1),90分以下定为等级B(也就是二分类中的类别0),好了,考试结果出来了,几位同学的成绩和老师的预测结果存在一些一些出入,现在需要对评估标准进行调整,我们将产生的偏置代入
s
i
g
m
o
i
d
sigmoid
sigmoid函数计算出概率,我们还知道有的预测对了有的预测错了。
样本 | 线性回归结果 | 真实结果 | 偏置 | sigmoid结果(概率) | 预测对错 |
---|---|---|---|---|---|
小红 | 88 | 91 | -2 | 0.112 | 错 |
小橙 | 91 | 93 | 1 | 0.734 | 对 |
小橙 | 99 | 100 | 9 | 0.999 | 对 |
小橙 | 81 | 89 | -9 | 0.0001 | 对 |
那么损失函数值是多少呢?
c
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
(
1
∗
l
o
g
(
0.112
)
+
1
∗
l
o
g
(
0.734
)
+
1
∗
l
o
g
(
0.999
)
+
0
∗
l
o
g
(
0.0001
)
)
=
1.09
cost(h_\theta (x),y)=-(1*log(0.112)+1*log(0.734)+1*log(0.999)+0*log(0.0001))=1.09
cost(hθ(x),y)=−(1∗log(0.112)+1∗log(0.734)+1∗log(0.999)+0∗log(0.0001))=1.09
三、梯度下降法优化逻辑回归算法
这一下节如果看不懂,建议复习线性回归。
梯度下降法不仅可以用在逻辑回归上,还可以用在线性回归上。他的主要思想是通过迭代的方法让函数收敛到一个最小值。
具体算法如下:
首先选取一个初始点
求这一点在几个方向上的梯度最大值
设置学习率更新初始点
下面我们从一个二维函数开始看起
假设我们有一个二次函数:
y
=
x
2
y=x^2
y=x2,并且我们不知道它的最低点是
(
0
,
0
)
(0,0)
(0,0)
那么我们首先选取一个初始点为
(
1
,
1
)
(1,1)
(1,1)
然后我们发现这一点的导数:
y
′
=
2
x
y'=2x
y′=2x,二维情况下肯定也就只有这个方向梯度最大(毕竟只有这一个梯度)。
然后又我们设置一个学习率:
α
=
0.4
\alpha=0.4
α=0.4
所以此时便可以迭代出一个新的点的横坐标():
x
(
1
)
=
x
−
α
⋅
y
′
(
1
)
=
0.2
x^{(1)}=x-\alpha\cdot y'(1)=0.2
x(1)=x−α⋅y′(1)=0.2
以此类推:
x
(
2
)
=
x
(
1
)
−
α
⋅
y
′
(
0.2
)
=
0.04
x
(
3
)
=
x
(
2
)
−
α
⋅
y
′
(
0.04
)
=
0.008
.
.
.
\begin{array}{cc} x^{(2)}=x^{(1)}-\alpha\cdot y'(0.2)=0.04\\ x^{(3)}=x^{(2)}-\alpha\cdot y'(0.04)=0.008\\ ... \end{array}
x(2)=x(1)−α⋅y′(0.2)=0.04x(3)=x(2)−α⋅y′(0.04)=0.008...
你会发现,迭代之后逐渐趋近最低点
这里我们需要的就是目标函数的梯度(对于一维来说也就是导数),梯度的方向就是变化率最大的方向,梯度的值就是变化率最大方向对应的变化率,上面小节我们已经知道了目标函数以及梯度:
J
(
θ
)
=
1
2
∑
i
=
1
n
(
y
(
i
)
−
θ
T
x
(
i
)
)
2
=
1
2
(
X
θ
−
y
)
T
(
X
θ
−
y
)
∇
θ
J
(
θ
)
=
X
T
X
θ
−
X
T
y
\begin{array}{cc} J(\theta)={1\over2}\sum_{i=1}^n{({y^{(i)}-\theta^Tx^{(i)}})^2}={1\over2}(X\theta-y)^T(X\theta-y)\\ \nabla_\theta J(\theta)=X^TX\theta-X^Ty \end{array}
J(θ)=21∑i=1n(y(i)−θTx(i))2=21(Xθ−y)T(Xθ−y)∇θJ(θ)=XTXθ−XTy
这个时候我们就可以按照上面的思路对
θ
\theta
θ进行迭代,此时
X
X
X以及
y
y
y均是已知的常数矩阵。
但是啊但是,梯度下降法很容易陷入局部最优,这个问题目前也比较棘手,没有特别好的解决方法。