Logistic Regression 对数几率回归
介绍
Logistic Regression 对数几率回归,虽然被称为回归,但其实际上是一种分类学习方法,并常用于二分类。
它有很多优点,例如它是直接对分类可能性进行建模,无需事先假设数据分布;它不是仅预测出类别,而是可得到近似概率预测,这对许多需利用概率辅助决策的任务很有用;此外,对率回归求解的目标函数是任意阶可导的凸函数,有很好的数学性质。
原理
考虑二分类任务,其输出标记
y
∈
{
0
,
1
}
y\in\{0,1\}
y∈{0,1},而线性回归产生的预测值
z
=
ω
T
x
+
b
z=\omega^Tx+b
z=ωTx+b是实值,我们需要将实值
z
z
z转换为0/1值,最理想的是“单位阶跃函数”(unit-step function)
y
=
{
0
z<0
0.5
z=0
1
z>0
y= \begin{cases} 0& \text{z<0}\\ 0.5& \text{z=0}\\ 1&\text{z>0} \end{cases}
y=⎩⎪⎨⎪⎧00.51z<0z=0z>0
即若预测值
z
z
z大于0就判为正例,小于0则判为反例,预测值为临界值则可随意判别。
但由于单位阶跃函数不连续,不能作为广义线性模型
y
=
g
−
1
(
ω
T
x
+
b
)
y=g^{-1}(\omega^Tx+b)
y=g−1(ωTx+b)中的
g
−
1
(
∗
)
g^{-1}(*)
g−1(∗),我们希望找到在一定程度上近似单位阶跃函数的替代函数,并且单调可微,对数几率函数(logistic function)正是这样一个常用的替代函数:
y
=
1
1
+
e
−
z
y=\frac{1}{1+e^{-z}}
y=1+e−z1
其可变化为:
l
n
y
1
−
y
=
ω
T
x
+
b
ln\frac{y}{1-y}=\omega^Tx+b
ln1−yy=ωTx+b
若将
y
y
y视为样本
x
x
x作为正例的可能性,
y
1
−
y
\frac{y}{1-y}
1−yy称为“几率”(odds),取对数即得“对数几率”(log odds / logit):
l
n
y
1
−
y
ln\frac{y}{1-y}
ln1−yy
将
y
y
y视为类后验概率估计
p
(
y
=
1
∣
x
)
p(y=1|x)
p(y=1∣x),则式子重写为:
l
n
p
(
y
=
1
∣
x
)
p
(
y
=
0
∣
x
)
=
ω
T
x
+
b
ln\frac{p(y=1|x)}{p(y=0|x)}=\omega^Tx+b
lnp(y=0∣x)p(y=1∣x)=ωTx+b
显然有:
p
(
y
=
1
∣
x
)
=
e
ω
T
+
b
1
+
e
ω
T
+
b
p
(
y
=
0
∣
x
)
=
1
1
+
e
ω
T
+
b
p(y=1|x)=\frac{e^{\omega^T+b}}{1+e^{\omega^T+b}}\\ p(y=0|x)=\frac{1}{1+e^{\omega^T+b}}
p(y=1∣x)=1+eωT+beωT+bp(y=0∣x)=1+eωT+b1
通过极大似然估计法来估计
ω
和
b
\omega和b
ω和b:
L
(
ω
,
b
)
=
∏
p
(
y
i
∣
x
i
;
ω
,
b
)
L(\omega,b)=\prod{p(y_i|x_i;\omega,b)}\\
L(ω,b)=∏p(yi∣xi;ω,b)
即
L
(
ω
,
b
)
=
∏
[
p
(
y
=
1
∣
x
i
;
ω
,
b
)
y
i
p
(
y
=
0
∣
x
i
;
ω
,
b
)
1
−
y
i
]
L(\omega,b) = \prod[{p(y=1|x_i;\omega,b)}^{y_i}{p(y=0|x_i;\omega,b)}^{1-y_i}]
L(ω,b)=∏[p(y=1∣xi;ω,b)yip(y=0∣xi;ω,b)1−yi]
令
β
=
(
ω
;
b
)
,
x
^
=
(
x
;
1
)
\beta=(\omega;b),\hat{x}=(x;1)
β=(ω;b),x^=(x;1),
p
(
x
^
i
)
=
p
(
y
=
1
∣
x
^
i
)
,
p(\hat{x}_i)=p(y=1|\hat{x}_i),
p(x^i)=p(y=1∣x^i),两边取对数,
l
n
L
(
ω
)
=
∑
[
l
n
[
p
(
x
i
^
)
]
y
i
+
l
n
[
(
1
−
p
(
x
i
^
)
]
1
−
y
i
]
=
∑
[
y
i
l
n
p
(
x
i
^
)
+
(
1
−
y
i
)
l
n
[
1
−
p
(
x
i
^
)
]
]
=
∑
[
y
i
l
n
e
β
T
x
i
^
1
+
e
β
T
x
i
^
+
(
1
−
y
i
)
l
n
(
1
1
+
e
β
T
x
i
^
)
]
=
∑
[
y
i
(
β
T
x
i
^
−
l
n
(
1
+
e
β
T
x
i
^
)
+
(
1
−
y
i
)
(
−
l
n
(
1
+
e
β
T
x
i
^
)
]
=
∑
[
y
i
β
T
x
i
−
l
n
(
1
+
e
β
T
x
i
^
)
]
\begin{aligned} lnL(\omega)&=\sum[ln[p(\hat{x_i})]^{y_i}+ln[(1-p(\hat{x_i})]^{1-y_i}]\\ &=\sum[{y_i}lnp(\hat{x_i})+(1-y_i)ln[1-p(\hat{x_i})]]\\ &=\sum[y_iln\frac{e^{\beta^T\hat{x_i}}}{1+e^{\beta^T\hat{x_i}}}+(1-y_i)ln(\frac{1}{1+e^{\beta^T\hat{x_i}}})]\\ &=\sum[y_i(\beta^T\hat{x_i}-ln(1+e^{\beta^T\hat{x_i}})+(1-y_i)(-ln(1+e^{\beta^T\hat{x_i}})]\\ &=\sum[y_i\beta^Tx_i-ln(1+e^{\beta^T\hat{x_i}})] \end{aligned}
lnL(ω)=∑[ln[p(xi^)]yi+ln[(1−p(xi^)]1−yi]=∑[yilnp(xi^)+(1−yi)ln[1−p(xi^)]]=∑[yiln1+eβTxi^eβTxi^+(1−yi)ln(1+eβTxi^1)]=∑[yi(βTxi^−ln(1+eβTxi^)+(1−yi)(−ln(1+eβTxi^)]=∑[yiβTxi−ln(1+eβTxi^)]最后要求解的问题就是
β
∗
=
a
r
g
m
i
n
J
(
ω
)
=
∑
[
−
y
i
β
T
x
^
i
+
l
n
(
1
+
e
β
T
x
i
^
)
]
\beta^*=arg\;min\;J(\omega)=\sum[-y_i\beta^T\hat{x}_i+ln(1+e^{\beta^T\hat{x_i}})]
β∗=argminJ(ω)=∑[−yiβTx^i+ln(1+eβTxi^)]
J
(
ω
)
J(\omega)
J(ω)是关于
β
\beta
β的高阶可导的连续凸函数,使用经典的数值优化方法,如梯度下降法、牛顿法等都可以求得其最优解。
以牛顿法为例:
Newton法步骤如下:
对
于
x
∗
=
a
r
g
m
i
n
f
(
x
)
(
1
)
取
初
始
点
x
1
,
置
精
度
要
求
ϵ
,
置
k
=
1.
(
2
)
i
f
∣
∣
▽
f
(
x
)
∣
∣
≤
ϵ
,
则
停
止
计
算
;
否
则
求
解
▽
2
f
(
x
k
)
d
=
−
▽
f
(
x
k
)
,
得
到
d
k
.
(
3
)
置
x
k
+
1
=
x
k
+
d
k
,
k
=
k
+
1
,
转
步
骤
(
2
)
.
\begin{aligned} &对于x^*=arg\;min\;f(x)\\ (1)&取初始点x^1,置精度要求\epsilon,置k=1.\\ (2)&if ||\triangledown{f(x)}||\leq\epsilon,则停止计算;否则求解\triangledown^2f(x^k)d=-\triangledown{f(x^k)},得到d^k.\\ (3)&置x^{k+1}=x^k+d^k,k=k+1,转步骤(2). \end{aligned}
(1)(2)(3)对于x∗=argminf(x)取初始点x1,置精度要求ϵ,置k=1.if∣∣▽f(x)∣∣≤ϵ,则停止计算;否则求解▽2f(xk)d=−▽f(xk),得到dk.置xk+1=xk+dk,k=k+1,转步骤(2).Newton法要求
f
(
x
)
f(x)
f(x)是二阶可微的。
对于
J
(
ω
)
,
J(\omega),
J(ω),
▽
J
(
ω
)
=
∑
x
^
i
(
p
(
x
^
i
)
−
y
i
)
▽
2
J
(
ω
)
=
∑
x
^
i
x
^
i
T
p
(
x
^
i
)
(
1
−
p
(
x
^
i
)
)
\begin{aligned} &\triangledown{J(\omega)=\sum}\hat{x}_i(p(\hat{x}_i)-y_i)\\ &\triangledown^2{J(\omega)=\sum\hat{x}_i\hat{x}^T_ip(\hat{x}_i)(1-p(\hat{x}_i))} \end{aligned}
▽J(ω)=∑x^i(p(x^i)−yi)▽2J(ω)=∑x^ix^iTp(x^i)(1−p(x^i))
以上,就是对数几率回归的大致过程了。
Python代码实现
下面以西瓜书P89的西瓜数据集3.0 α \alpha α为例,使用Python编程实现对率回归
import numpy as np
def Sigmoid(z):
return 1 / (1 + np.exp(-z))
def Graninet(X, Y, beta): # 求梯度
y = np.array(Sigmoid(np.dot(beta.T, X.T)))[0]
m, _ = X.shape
d = np.zeros((3, 1))
for i in range(m):
d += X[i].T * (y[i] - Y[i])
return d
def Hesse(X, beta): # 黑塞矩阵
y = np.array(Sigmoid(np.dot(beta.T, X.T)))[0]
m, _ = X.shape
dd = np.zeros((3, 3))
for i in range(m):
dd += np.dot(X[i].T, X[i]) * y[i] * (1 - y[i])
return np.mat(dd)
def Newton(X, Y, beta, epsi): # 牛顿法
d = Graninet(X, Y, beta)
dd = Hesse(X, beta)
while np.linalg.norm(d) > epsi:
beta = beta + np.dot(dd.I, -d)
d = Graninet(X, Y, beta)
dd = Hesse(X, beta)
return beta
def main():
X = np.mat([[0.697, 0.460, 1], [0.774, 0.376, 1], [0.634, 0.264, 1], [0.608, 0.318, 1], [0.556, 0.215, 1],
[0.403, 0.237, 1], [0.481, 0.149, 1], [0.437, 0.211, 1], [0.666, 0.091, 1], [0.243, 0.267, 1],
[0.245, 0.057, 1], [0.343, 0.099, 1], [0.639, 0.161, 1], [0.657, 0.198, 1], [0.360, 0.370, 1],
[0.593, 0.042, 1], [0.719, 0.103, 1]]) # 数据集
Y = np.array([1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])
epsi = 0.00001 # 精度
beta = np.random.rand(3, 1)
beta = Newton(X, Y, beta, epsi)
print(beta)
if __name__ == '__main__':
main()
#result: [[ 3.15832262]
[12.52116868]
[-4.42885484]]
参考资料
[1]周志华.机器学习[M].北京:清华大学出版社,2016:53-60.
[2]王燕军,梁治安,崔雪婷.最优化基础理论与方法[M].上海:复旦大学出版社,2018:48-49