Logistic回归理论知识补充
建模流程
假设我们建立一个二分类模型。假设有两个人A、B在争论如何对一个新样本 x x x进行0-1二分类,他们两个分别对新样本进行打分,如果A的分数大于B的分数,则样本被预测为1,反之则被预测为0。
假设两人的打分分数可以通过线性回归进行预测建模
y
1
=
θ
1
x
+
ϵ
1
,
ϵ
1
∼
N
1
(
0
,
δ
)
y
2
=
θ
2
x
+
ϵ
2
,
ϵ
2
∼
N
2
(
0
,
δ
)
\begin{aligned} &y_{1}=\theta_{1} x+\epsilon_{1}, \epsilon_{1} \sim N_{1}(0, \delta) \\ &y_{2}=\theta_{2} x+\epsilon_{2}, \epsilon_{2} \sim N_{2}(0, \delta) \end{aligned}
y1=θ1x+ϵ1,ϵ1∼N1(0,δ)y2=θ2x+ϵ2,ϵ2∼N2(0,δ)
这里两个模型的残差都服从高斯分布。
现在我们研究
y
1
y_1
y1和
y
2
y_2
y2的大小关系
y
1
−
y
2
=
(
θ
1
−
θ
2
)
x
+
(
ϵ
1
−
ϵ
2
)
y_{1}-y_{2}=\left(\theta_{1}-\theta_{2}\right) x+\left(\epsilon_{1}-\epsilon_{2}\right)
y1−y2=(θ1−θ2)x+(ϵ1−ϵ2)
于是有
y
′
=
θ
′
x
+
ϵ
′
,
ϵ
′
∼
N
(
0
,
δ
)
y^{\prime}=\theta^{\prime} x+\epsilon^{\prime}, \epsilon^{\prime} \sim N(0, \delta)
y′=θ′x+ϵ′,ϵ′∼N(0,δ)
进一步,根据我们的假设,A的分数大于B的分数,则样本被预测为1,也就是
y
′
>
0
y^{\prime}>0
y′>0的情况
P
(
y
=
1
)
=
P
′
(
θ
′
x
+
ϵ
′
>
=
0
)
=
1
−
P
′
(
ϵ
′
<
−
θ
′
x
)
P(y=1)=P^{\prime}\left(\theta^{\prime} x+\epsilon^{\prime}>=0\right)=1-P^{\prime}\left(\epsilon^{\prime}<-\theta^{\prime} x\right)
P(y=1)=P′(θ′x+ϵ′>=0)=1−P′(ϵ′<−θ′x)
所以问题就转化为了求
P
′
(
ϵ
′
<
−
θ
′
x
)
P^{\prime}\left(\epsilon^{\prime}<-\theta^{\prime} x\right)
P′(ϵ′<−θ′x),也就是高斯分布的累积分布函数。这种建模方式叫做prohit回归。
但是高斯分布的累积分布不可解析求出,用概率密度函数表示为 F ( x ; μ , σ ) = 1 σ 2 π ∫ − ∞ x exp ( − ( t − μ ) 2 2 σ 2 ) d t F(x ; \mu, \sigma)=\dfrac{1}{\sigma \sqrt{2 \pi}} \int_{-\infty}^{x} \exp \left(-\dfrac{(t-\mu)^{2}}{2 \sigma^{2}}\right) d t F(x;μ,σ)=σ2π1∫−∞xexp(−2σ2(t−μ)2)dt,我们只能大致看出高斯分布的累积分布函数长啥样
(source: https://www.wikiwand.com/zh-sg/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83)
可见其形状与sigmoid函数非常类似,我们就直接用sigmoid函数近似表示它
P
(
y
=
1
)
=
P
′
(
θ
′
x
+
ϵ
′
>
=
0
)
=
1
−
P
′
(
ϵ
′
<
−
θ
′
x
)
=
1
−
1
1
+
exp
(
−
z
)
=
1
+
exp
(
−
z
)
−
1
1
+
exp
(
−
z
)
=
1
1
+
exp
z
=
1
1
+
exp
(
−
θ
′
x
)
P(y=1)=P^{\prime}\left(\theta^{\prime} x+\epsilon^{\prime}>=0\right)=1-P^{\prime}\left(\epsilon^{\prime}<-\theta^{\prime} x\right)\\ =1-\dfrac{1}{1+\exp(-z)}=\dfrac{1+\exp(-z)-1}{1+\exp(-z)}\\ =\dfrac{1}{1+\exp{z}}=\dfrac{1}{1+\exp(-\theta^{\prime} x)}
P(y=1)=P′(θ′x+ϵ′>=0)=1−P′(ϵ′<−θ′x)=1−1+exp(−z)1=1+exp(−z)1+exp(−z)−1=1+expz1=1+exp(−θ′x)1
这正是Logistic二分类表达式。
损失函数
Logistic回归的损失函数是通过最大似然估计(存在即合理)得到的。这个损失函数叫做交叉熵。其实对于他的损失函数的推导,并不一定需要假设模型符合logistic回归。
假设
l
l
l表示(0, 1)标签,
y
y
y表示样本预测的概率。则该样本存在的概率可表示为:
y
l
(
1
−
y
)
1
−
l
y^{l}(1-y)^{1-l}
yl(1−y)1−l
也就是满足伯努利分布。
由最大似然估计,可得我们需要最小化如下函数
−
(
l
log
y
+
(
1
−
l
)
log
(
1
−
y
)
)
-(l \log y+(1-l) \log (1-y))
−(llogy+(1−l)log(1−y))
当标签
l
=
1
l=1
l=1时,
(
1
−
l
)
log
(
1
−
y
)
)
=
0
(1-l) \log (1-y))=0
(1−l)log(1−y))=0,最小化公式等价于最小化
−
log
y
-\log y
−logy,即让
y
→
1
y\rightarrow1
y→1.
当标签 l = 0 l=0 l=0时, l log y = 0 l \log y=0 llogy=0,最小化公式等价于最小化 − ( 1 − l ) log ( 1 − y ) -(1-l) \log (1-y) −(1−l)log(1−y),即让 y → 0 y\rightarrow0 y→0.
【注意最大似然估计时,我们其实是把所有样本的概率相加,也就是 ∑ i = 1 N y l ( 1 − y ) 1 − l \sum_{i=1}^{N}y^{l}(1-y)^{1-l} ∑i=1Nyl(1−y)1−l,然后取对数】
现在我们思考一个问题,如果我们选择下面这个损失函数,是否也满足上面的这种直觉性结论呢?
L
o
s
s
=
−
(
l
−
y
)
2
Loss = -(l-y)^{2}
Loss=−(l−y)2
即
l
=
1
l=1
l=1时,
y
→
1
y\rightarrow1
y→1,
l
=
0
l=0
l=0时,
y
→
0
y\rightarrow0
y→0。
梯度下降优化算法
当建立好模型后,最终需要对损失函数进行优化。这种对待优化的参数没有限制的优化问题叫做无约束优化问题。
min
f
(
x
)
\min f(x)
minf(x)
其中
x
x
x为待求参数
如果要理解梯度下降法,我们要从泰勒展开开始理解。针对
f
(
x
)
f(x)
f(x)做一阶泰勒展开,有
f
(
x
)
=
f
(
x
k
)
+
∇
f
(
x
k
)
T
(
x
−
x
k
)
+
o
(
∥
x
−
x
k
∥
)
f(x)=f\left(x_{k}\right)+\nabla f\left(x_{k}\right)^{T}\left(x-x_{k}\right)+o\left(\left\|x-x_{k}\right\|\right)
f(x)=f(xk)+∇f(xk)T(x−xk)+o(∥x−xk∥)
其中高阶量
o
o
o是在
(
x
−
x
k
)
(x-x_k)
(x−xk)的前提下才趋向于0,如果
(
x
−
x
k
)
(x-x_k)
(x−xk)太大,高阶量就会影响等式右边前两项。
如果我们把
x
x
x看做空间中的向量,那么
(
x
−
x
k
)
(x-x_k)
(x−xk)也是向量,梯度
f
′
(
x
k
)
f^{\prime}(x_k)
f′(xk)也是向量。我们可以把上式写为
f
(
x
)
≈
f
(
x
k
)
+
λ
∗
d
∗
f
′
(
x
k
)
f\left(x\right) \approx f\left(x_{k}\right)+\lambda * \boldsymbol{d} * f^{\prime}\left(x_{k}\right)
f(x)≈f(xk)+λ∗d∗f′(xk)
这里
d
\boldsymbol{d}
d表示沿着
x
x
x方向的单位向量,
λ
\lambda
λ表示单位向量长度。根据向量乘积规则,我们有
f
(
x
)
≈
f
(
x
k
)
+
λ
∗
∣
d
∣
∗
∣
f
′
(
x
k
)
∣
∗
cos
(
θ
)
f\left(x\right) \approx f\left(x_{k}\right)+\lambda * |\boldsymbol{d}| *\left|f^{\prime}\left(x_{k}\right)\right| * \cos (\theta)
f(x)≈f(xk)+λ∗∣d∣∗∣f′(xk)∣∗cos(θ)
这里
θ
\theta
θ表示梯度向量和
(
x
−
x
k
)
(x-x_k)
(x−xk)这个向量的夹角。因为我们企图最小化
f
(
x
)
f(x)
f(x),而
f
(
x
k
)
=
f
(
x
0
)
f(x_k)=f(x_0)
f(xk)=f(x0)随机初始化后模型的输出,这就意味着它与
λ
,
d
\lambda, d
λ,d一样也是个常量,如果要是整个式子最小,显然要让
θ
=
π
,
cos
(
θ
)
=
−
1
\theta=\pi, \cos(\theta)=-1
θ=π,cos(θ)=−1,也就是
x
k
x_k
xk无限靠近
x
x
x时,两个向量方向相反的时刻。此时我们有
d
=
−
f
′
(
x
k
)
∥
f
′
(
x
k
)
∥
d=\frac{-f^{\prime}\left(x_{k}\right)}{\left\|f^{\prime}\left(x_{k}\right)\right\|}
d=∥f′(xk)∥−f′(xk)
于是我们有
x
−
x
k
=
λ
∗
d
=
λ
∗
−
f
′
(
x
k
)
∥
f
′
(
x
k
)
∥
⇒
x
=
x
k
−
λ
∗
f
′
(
x
k
)
∥
f
′
(
x
k
)
∥
x-x_{k}=\lambda * d = \lambda * \frac{-f^{\prime}\left(x_{k}\right)}{\left\|f^{\prime}\left(x_{k}\right)\right\|}\\ \Rightarrow x=x_{k}-\lambda *\frac{f^{\prime}\left(x_{k}\right)}{\left\|f^{\prime}\left(x_{k}\right)\right\|}
x−xk=λ∗d=λ∗∥f′(xk)∥−f′(xk)⇒x=xk−λ∗∥f′(xk)∥f′(xk)
又因为
∥
f
′
(
x
k
)
∥
=
∥
f
′
(
x
0
)
∥
\left\|f^{\prime}\left(x_{k}\right)\right\|=\left\|f^{\prime}\left(x_{0}\right)\right\|
∥f′(xk)∥=∥f′(x0)∥是个常数,因为
x
0
x_{0}
x0如果是随机初始化确定下来的,那么其梯度也肯定是常数。(比如线性回归使用梯度下降法的时候,第一轮我们随机初始化权重参数,此时这些参数是固定的),那么我们就可以把
λ
\lambda
λ与
∥
f
′
(
x
k
)
∥
=
∥
f
′
(
x
0
)
∥
\left\|f^{\prime}\left(x_{k}\right)\right\|=\left\|f^{\prime}\left(x_{0}\right)\right\|
∥f′(xk)∥=∥f′(x0)∥合并为一个常数,也即是学习率。于是最后公式转化为
x
=
x
k
+
1
=
x
k
−
λ
∗
f
′
(
x
k
)
∥
f
′
(
x
k
)
∥
=
x
k
−
η
∗
f
′
(
x
k
)
=
x
k
−
η
∇
f
(
x
k
)
T
x=x_{k+1}=x_{k}-\lambda *\frac{f^{\prime}\left(x_{k}\right)}{\left\|f^{\prime}\left(x_{k}\right)\right\|}=x_{k}-\eta* f^{\prime}(x_{k})=x_{k}-\eta \nabla f\left(x_{k}\right)^{T}
x=xk+1=xk−λ∗∥f′(xk)∥f′(xk)=xk−η∗f′(xk)=xk−η∇f(xk)T
这里
η
\eta
η的作用就是控制每一步移动的步长,因为我们说过,只有
x
−
x
k
x-x_{k}
x−xk足够小,也就是当前一步和上一步的距离足够小,一阶泰勒展开的高阶量才会很小,不影响头两项。
对于梯度下降法要注意
- 学习率不能太小,也不能太大
- 要注意损失函数曲线的鞍马点,鞍马点与局部最小点都会让梯度无法下降
- 如果输入变量 x 1 , x 2 x_{1},x_{2} x1,x2尺度相同,比如 l = x 1 2 + x 2 2 l=x_{1}^{2} + x_{2}^{2} l=x12+x22,那么梯度就是等高线的法向量,梯度下降就会沿着等高线法向量以最快速度向最低点移动。但是如果输入变量 x 1 , x 2 x_{1}, x_{2} x1,x2尺度不同,比如 l = x 1 2 + 100 x 2 2 l=x_{1}^{2} + 100x_{2}^{2} l=x12+100x22,那么梯度就会实时扭动变化,无法最快移动到最低点,此时要做输入变量的尺度归一化。
【《机器学习实战》。sklearn代码分为三种封装方式,纯python写,C++写加python封装,fortran写加python(pyc)封装。】