(学习笔记)Logistic Regression 对数几率回归

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=g1(ωTx+b)中的 g − 1 ( ∗ ) g^{-1}(*) g1(),我们希望找到在一定程度上近似单位阶跃函数的替代函数,并且单调可微,对数几率函数(logistic function)正是这样一个常用的替代函数:
y = 1 1 + e − z y=\frac{1}{1+e^{-z}} y=1+ez1
在这里插入图片描述

其可变化为:
l n y 1 − y = ω T x + b ln\frac{y}{1-y}=\omega^Tx+b ln1yy=ωTx+b
若将 y y y视为样本 x x x作为正例的可能性, y 1 − y \frac{y}{1-y} 1yy称为“几率”(odds),取对数即得“对数几率”(log odds / logit):
l n y 1 − y ln\frac{y}{1-y} ln1yy

y y y视为类后验概率估计 p ( y = 1 ∣ x ) p(y=1|x) p(y=1x),则式子重写为:
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=0x)p(y=1x)=ω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=1x)=1+eωT+beωT+bp(y=0x)=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(yixi;ω,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=1xi;ω,b)yip(y=0xi;ω,b)1yi]
β = ( ω ; 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=1x^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[(1p(xi^)]1yi]=[yilnp(xi^)+(1yi)ln[1p(xi^)]]=[yiln1+eβTxi^eβTxi^+(1yi)ln(1+eβTxi^1)]=[yi(βTxi^ln(1+eβTxi^)+(1yi)(ln(1+eβTxi^)]=[yiβTxiln(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.iff(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)(1p(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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值