LR(Logistic Regression)算法详解

2024-08-21 11:08

本文主要是介绍LR(Logistic Regression)算法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Logistic Regression本质上还是Linear Regression的一种,只是用了一个Logistic Function将线性回归的连续值映射到了 { 0 , 1 } \{0, 1\} {0,1}空间。因此Linear Regression只能对具有线性边界的分类问题有很好的预测效果,对于非线性的边界是无能为力的。至于下面这张很经典的大家常用的图,只是做了一个feature mapping,根据已有的特征构造了其他的很多新的特征,跟Logistic Regression没有任何关系。而feature mapping的工作则是一项专门的工作,绝没有这么简单。
这里写图片描述
因此说白了,Logistic Regression就是试图找到不同类别之间的线性决策边界。

1. Logistic Regression的引出

对于 { 0 , 1 } \{0,1\} {0,1}二分类问题,使用Linear Regression难以模拟出一个合适的模型来拟合数据,因此我们试图采用另一种方法来拟合。对于二分类,其实就是某事件发生或者不发生。因此我们希望能计算出某事件发生的概率和不发生的概率。假设某事件发生的概率为 p p p,则不发生的概率为 1 − p 1-p 1p,定义一个让步值 o d d s odds odds为:
o d d s = P ( o c c u r i n g ) P ( n o t o c c u r i n g ) = p 1 − p odds=\frac {P(occuring)}{P(not occuring)}=\frac p{1-p} odds=P(notoccuring)P(occuring)=1pp
再定义一个让步比 O R ( o d d s r a t i o ) OR(odds ratio) OR(oddsratio)为两个事件 s 1 s_1 s1 s 2 s_2 s2 o d d s odds odds的比值:
O R = p 1 1 − p 1 p 0 1 − p 0 OR=\frac {\frac {p_1}{1-p_1}}{\frac {p_0}{1-p_0}} OR=1p0p01p1p1
其中 p 1 p_1 p1是实验组的事件发生概率,而 p 0 p_0 p0是对照组(一般事先已知)的事件发生概率。
在Logistic Regression问题中,因变量 y y y服从伯努利分布(又称二项分布),事件发生概率为 p p p。在Logistic Regression中,我们需要根据给定的一堆自变量,模拟出一个现象模型,来预测事件发生的概率 p p p。因此我们需要让自变量的分布和伯努利分布联系起来,这被称为 l o g i t logit logit。Logistic Regression的目标就是在统计学上预估出事件发生的概率 p ^ \hat p p^

基于以上思想,为了将自变量的线性模型和伯努利分布联系起来,我们需要一个函数来将线性模型映射到一个 { 0 , 1 } \{0, 1\} {0,1}伯努利分布上。因此上面提到的 O R OR OR的自然对数,就是我们需要的这样的一个完美的映射,也被称为 l o g i t logit logit
ln ⁡ ( o d d s ) = ln ⁡ ( p 1 − p ) \ln(odds)=\ln(\frac p{1-p}) ln(odds)=ln(1pp)
此时 p p p的范围是 ( 0 , 1 ) (0, 1) (0,1) ln ⁡ ( o d d s ) \ln(odds) ln(odds)的范围是 ( − ∞ , + ∞ ) (-\infty, +\infty) (,+)。我们需要求一下反函数:
p = l o g i t − 1 ( α ) = 1 1 + e − α p=logit^{-1}(\alpha)=\frac 1{1+e^{-\alpha}} p=logit1(α)=1+eα1
α \alpha α范围 ( − ∞ , + ∞ ) (-\infty, +\infty) (,+)。此时的 α \alpha α就是自变量的线性组合。图像为:
这里写图片描述
也就是著名的 s i g m o d sigmod sigmod函数,此函数极有利于数学计算。然后令:
ln ⁡ p 1 − p = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ j x j \ln\frac p{1-p}=\theta_0+\theta_1x_1+\theta_2x_2+\cdots+\theta_jx_j ln1pp=θ0+θ1x1+θ2x2++θjxj
其中 j j j为特征的总数量。选择这个式子的原因是:假设我们的样本拥有线性决策边界(这是Logistics Regression的前提),当一个样本的特征 x ( j ) x^{(j)} x(j)的特征给出时,能够通过 θ 0 + ∑ i = 1 j θ j x j \theta_0+\sum_{i=1}^j\theta_jx_j θ0+i=1jθjxj很强烈的判断出该样本属于1类还是0类。因此此时 p p p最好无限接近1或者0,因此 p 1 − p \frac p{1-p} 1pp无限接近 + ∞ +\infty +或者 − ∞ -\infty ,而 ln ⁡ p 1 − p \ln\frac p{1-p} ln1pp无限接近1或者0,刚好能够对应起来。另外选择 e e e为底数,是为了方便计算。

2. 极大似然估计( M L E MLE MLE)

对于给定的一堆样本点,若已知其为第1类,但是我们的模型并不会算出是1,而是会根据自变量得出一个概率值。此概率为: P ( Y = y i = 1 ∣ X = x i ) P(Y=y_i=1|X=x_i) P(Y=yi=1∣X=xi)。若已知其为第0类,模型预测的概率值为: P ( Y = y i = 0 ∣ X = x i ) P(Y=y_i=0|X=x_i) P(Y=yi=0∣X=xi)。好的模型当然是两个概率尽可能越大越好,因此我们把它们乘起来,求其最大值对应的参数,求出来的就是最佳拟合模型。因此极大似然估计其实就是使得我们的模型正确地分类数据集的可能性到达最大。
P = ∏ y i = 1 P ( Y = y i = 1 ∣ X = x i ) × ∏ y i = 0 P ( Y = y i = 0 ∣ X = x i ) = ∏ i = 1 n P ( Y = y i = 1 ∣ X = x i ) y i ( 1 − P ( Y = y i = 1 ∣ X = x i ) ) 1 − y i P=\prod_{y_i=1} {P(Y=y_i=1|X=x_i)}\times \prod_{y_i=0} P(Y=y_i=0|X=x_i)=\prod_{i=1}^n{P(Y=y_i=1|X=x_i)^{y_i}(1-P(Y=y_i=1|X=x_i))^{1-y_i}} P=yi=1P(Y=yi=1∣X=xi)×yi=0P(Y=yi=0∣X=xi)=i=1nP(Y=yi=1∣X=xi)yi(1P(Y=yi=1∣X=xi))1yi
因此逻辑回归就是要求 P P P的最大值。这就是极大似然估计。
假设概率 P P P个自变量 X X X之间存在关系:
P ( y = 1 ∣ x ; θ ) = h θ ( x ) P ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) P(y=1|x;\theta)=h_\theta(x)\\ P(y=0|x;\theta)=1-h_\theta(x) P(y=1∣x;θ)=hθ(x)P(y=0∣x;θ)=1hθ(x)
合并为:
P ( y ∣ x ; θ ) = h θ y ( x ) ( 1 − h θ ( x ) ) 1 − y P(y|x;\theta)=h_\theta^y(x)(1-h_\theta(x))^{1-y} P(yx;θ)=hθy(x)(1hθ(x))1y
损失函数为:
L ( θ ) = ∏ i = 1 m h θ ( x ( i ) ) y ( i ) ( 1 − h θ ( x ( i ) ) ) 1 − y ( i ) L(\theta)=\prod_{i=1}^mh_\theta(x^{(i)})^{y^{(i)}}(1-h_\theta(x^{(i)}))^{1-y^{(i)}} L(θ)=i=1mhθ(x(i))y(i)(1hθ(x(i)))1y(i)
这个式子计算不方便,我们对其进行求对数:
l ( θ ) = ln ⁡ ( L ( θ ) ) = ∑ i = 1 m [ y ( i ) ln ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ⁡ ( 1 − h θ ( x ( i ) ) ) ] \begin{align} l(\theta)&=\ln(L(\theta))\\ &=\sum_{i=1}^m[y^{(i)}\ln(h_\theta(x^{(i)}))+(1-y^{(i)})\ln(1-h_\theta(x^{(i)}))] \end{align} l(θ)=ln(L(θ))=i=1m[y(i)ln(hθ(x(i)))+(1y(i))ln(1hθ(x(i)))]
然后对 l ( θ ) l(\theta) l(θ)求偏导:
∂ ( l ( θ ) ) ∂ θ j = ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) ⋅ x j ( i ) ) \frac {\partial (l(\theta))}{\partial \theta_j}=\sum_{i=1}^m(y^{(i)}-h_\theta(x^{(i)})\cdot x_j^{(i)}) θj(l(θ))=i=1m(y(i)hθ(x(i))xj(i))
由于这里求最大值,因此是加号:
θ j : = θ j + α ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) ) ⋅ x j ( i ) \theta_j:=\theta_j+\alpha\sum_{i=1}^m(y^{(i)}-h_\theta(x{(i)}))\cdot x_j^{(i)} θj:=θj+αi=1m(y(i)hθ(x(i)))xj(i)
通过用类似线性回归的不断迭代,最终可以求出 θ ⃗ \vec \theta θ 的值(具体查看线性回归的求解,此处略去)。求解方法其实有很多,最常用的用是牛顿法。

3. 正则化

为了避免模型的过拟合,需要加上正则项,则:
l ′ ( θ ) = l ( θ ) + r e g u l a r i z a t i o n l'(\theta)=l(\theta)+regularization l(θ)=l(θ)+regularization
常用的正则化方法有2个,分别是

  • L1
    θ = arg ⁡ min ⁡ θ ∑ i = 1 m [ y ( i ) ln ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ⁡ ( 1 − h θ ( x ( i ) ) ) ] + λ ∑ i = 0 k ∣ θ i ∣ \theta=\arg\min_\theta\sum_{i=1}^m[y^{(i)}\ln(h_\theta(x^{(i)}))+(1-y^{(i)})\ln(1-h_\theta(x^{(i)}))]+\lambda\sum_{i=0}^k|\theta_i| θ=argθmini=1m[y(i)ln(hθ(x(i)))+(1y(i))ln(1hθ(x(i)))]+λi=0kθi

  • L2
    θ = arg ⁡ min ⁡ θ ∑ i = 1 m [ y ( i ) ln ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ⁡ ( 1 − h θ ( x ( i ) ) ) ] + λ ∑ i = 0 k θ i 2 \theta=\arg\min_\theta\sum_{i=1}^m[y^{(i)}\ln(h_\theta(x^{(i)}))+(1-y^{(i)})\ln(1-h_\theta(x^{(i)}))]+\lambda\sum_{i=0}^k\theta_i^2 θ=argθmini=1m[y(i)ln(hθ(x(i)))+(1y(i))ln(1hθ(x(i)))]+λi=0kθi2

适用情况如下:

L2L1
由于有分析解决方案,计算效率高数据不稀疏的时候计算效率不高
产生非稀疏的输出产生稀疏的输出
没有特征选择有内置的特征选择

4. 牛顿法求解

牛顿法是一种进行 M L E MLE MLE的优化方法,牛顿法在求解逻辑回归时比梯度下降法收敛速度快。

4.1 Hessian

Hessian是一个多变量实值函数的二阶偏导数组成的方块矩阵,假设有一实数函数 f ( x 1 , x 2 , ⋯ , x m ) f(x_1,x_2,\cdots, x_m) f(x1,x2,,xm)。如果 f f f 所有的二阶偏导数都存在,那么 f f f的海森矩阵的第 i j ij ij项即:
H ( f ) i j ( x ) = D i D j f ( x ) H(f)_{ij}(x)=D_iD_jf(x) H(f)ij(x)=DiDjf(x)
其中 x = ( x 1 , x 2 , ⋯ , x m ) x=(x_1,x_2,\cdots,x_m) x=(x1,x2,,xm),即
H ( f ) = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 x 2 ⋯ ∂ 2 f ∂ x 1 x m ∂ 2 f ∂ x 2 x 1 ∂ 2 f ∂ x 2 2 ⋯ ∂ 2 f ∂ x 2 x m ⋮ ∂ 2 f ∂ x m x 1 ∂ 2 f ∂ x m x 2 ⋯ ∂ 2 f ∂ x m 2 ] H(f)= \begin{bmatrix} \frac {\partial^2f}{\partial x_1^2} \frac {\partial^2f}{\partial x_1x_2} \cdots\frac {\partial^2f}{\partial x_1x_m}\\ \frac {\partial^2f}{\partial x_2x_1} \frac {\partial^2f}{\partial x_2^2} \cdots\frac {\partial^2f}{\partial x_2x_m}\\ \vdots\\ \frac {\partial^2f}{\partial x_mx_1} \frac {\partial^2f}{\partial x_mx_2} \cdots\frac {\partial^2f}{\partial x_m^2}\\ \end{bmatrix} H(f)= x122fx1x22fx1xm2fx2x12fx222fx2xm2fxmx12fxmx22fxm22f

Hessian matrix在用牛顿法解决大规模优化问题时经常用到。

4.2 牛顿法步骤:

不断进行下面的迭代:
β n e w = β o l d − H f ( β ) − 1 ∇ f ( β ) \beta^{new}=\beta^{old}-Hf(\beta)^{-1}\nabla f(\beta) βnew=βoldHf(β)1f(β)
其中 H f ( β ) = − X T W X Hf(\beta)=-X^TWX Hf(β)=XTWX,为函数 f ( x ) f(x) f(x)的海森矩阵。 ∇ f ( β ) = X T ( y − p ) \nabla f(\beta)=X^T(y-p) f(β)=XT(yp)是函数的梯度。 W : = d i a g ( p ( 1 − p ) ) W:=diag(p(1-p)) W:=diag(p(1p))是权重, p p p是在当前 β \beta β下的概率预测值。代码为:

def new_step(curr_beta, X, lam=None):p = np.array(sigmod(X.dot(curr[:,0])), ndmin=2).T #计算新的概率pW = np.diag((p(1-p))[:, 0]) #计算新的权重hessian = X.T.dot(W).dot(X) #计算当前权重的hessian矩阵grad = X.T.dot(y-p) #计算梯度if lam:#正则化step, *_ = np.linalg.lstsq(hessian + lam*np.eye(curr_beta.shape[0]), grad)else:step, *_ = np.linalg.lstsq(hessian, grad)beta_new = curr_beta + stepreturn beta_newbeta_old, beta = np.ones((len(X.columns),1)), np.zeros((len(X.columns),1))coefs_converged = Falsewhile not coefs_converges:beta_old = betabeta = newton_step(beta, X, lam=lam)coef_converged = check_coefs_convergence(beta_old, beta, tolerance, itercount)

这篇关于LR(Logistic Regression)算法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092984

相关文章

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)