Logistic回归

目录

引入 

对数几率模型与Logistic回归 

逻辑回归 

逻辑回归损失函数 

交叉熵

相对熵 


本章节讲解逻辑回归的基本原理、逻辑回归模型构建过程。课程环境使用Jupyter notebook环境

引入 

首先,在引入LR(Logistic Regression)模型之前,非常重要的一个概念是,该模型在设计之初是用来解决0/1二分类问题,虽然它的名字中有回归二字,但只是在其线性部分隐含地做了一个回归,最终目标还是以解决分类问题为主。

# 科学计算模块
import numpy as np
import pandas as pd

# 绘图模块
import matplotlib as mpl
import matplotlib.pyplot as plt

之前我们研究了线性回归模型的原理与应用,线性回归模型可以简写为:f(x) = w^Tx + b

当我们希望线性模型的预测值逼近真实标记Y,这样就是线性模型,那可否令模型的预测值逼近y的衍生物呢? 比如,是在线性回归基础上,在等号的左边或右边加上了一个函数,这个函数对线性结果进行了一系列的非线性转换,从而能够让模型更好的捕捉一般规律,此时该模型就被称为广义线性模型,y的衍生物生成函数,我们称之为联系函数。

y = e^{w^Tx+b}这就是对数线性回归(log-linear regression),它实际上是在e^{w^Tx+b}试图让逼近,上式形式上是线性回归,但实际上已是在求输入空间到输出空间的非线性函数映射。

我们通过一个例子先来熟一下线性回归模型的不足:

 先看一下方法:np.linalg.lstsq(x, y, rcond=-1)

  • NumPy 中用于求解最小二乘问题的函数,它返回最小二乘解,即找到一个最接近输入数据的解,使得残差平方和最小。
# 随机生成100个数
np.random.seed(216)
x = np.linspace(0,10,100).reshape(-1,1)  # ...行1列

 该模型还需要引入一个截距参数:

x = np.concatenate((x, np.ones_like(x)), axis=1)
# 在给定的轴(axis)上将两个数组合并

数据标签:

y = np.exp(x[:,0] + 1).reshape(-1,1)

如果我们使用简单线性回归模型来对数据进行预测 y= w^T X + b

  • # 权重向量 ( w ) 的转置,与自变量向量 ( x ) 进行点积运算

使用最小二乘法来进行计算,则模型输出结果为: 

np.linalg.lstsq(x, y, rcond=-1)


(array([[ 2968.68189529],
        [-8611.71543123]]),
 array([8.22208992e+09]),
 2,
 array([58.52647642,  4.9819583 ]))

通过结果发现,通过最小二乘法计算出模型参数为 2968.68和-8611.71,即 y=2968.68x-8611.71

我们最后将原始数据导入模型中,计算出模型预测值,再进行可视化:

yhat = x[:,0] * 2968.68 - 8611.71

plt.scatter(x[:,0], y)
plt.plot(x[:,0], yhat,'r')

红色的是我们预测出的模型,蓝色的点是真实的数,可以将方程改写为:

np.linalg.lstsq(x, np.log(y), rcond=-1) 

 按照输出结果, 我们得到模型方程:lny=x+1,即解出原方程。

对数几率模型与Logistic回归 

Logistic 回归也被称为“对数几率”回归

几率的概念与概率不同,几率是指:将y记作正例(某事件)发生的概率,而1-y作为负例的概率,那么两者的比值 称之为该事件的几率,在几率的基础之上,我们取对数进行操作,则构成了该事件的对数几率(logit):

大家可以这么理解,几率表示“一件事情成功的几率”, 可以定义为成功的概率/失败的概率,如果明天晴天的概率是60%,则非晴天的概率是40%,则几率就是1.5 。

那么对数几率就是log1.5,从0.1到0.9的几率:

此时的广义线性模型就是 对数几率回归 logistic regression,也被称为逻辑回归。

逻辑回归 

得到逻辑回归基本模型方程:

此时,y表示在现有样本的条件下,结果正例的概率

np.random.seed(216)
x = np.linspace(-15, 15, 100)
y = 1 / (1 + np.exp(-x))
plt.plot(x, y)
plt.show()

我们称这种有着优美的S型曲线的数学函数为Sigmoid函数,当然,Sigmoid函数是一类函数,但是逻辑回归函数在机器学习中是非常常见普遍的函数。

逻辑回归损失函数 

交叉熵

我们又需要引入一个数学概念,熵(entropy)

第一个问题,如何量化信息?

信息论是应用数学的一个分支,主要研究的是对一个信号包含信息的多少进行量化。信息论的基本想法是一个不太可能的事件发生了,要比一个非常可能的事件发生,能提供更多的信息。

我们需要衡量信息的多少,第一步就是如何衡量信息量,信息量实际上是事件不确定度的度量,越不确定的事件,对其的描述就包含越多信息,假设我们听到了两件事,分别如下:

事件A:阿根廷进入了2022世界杯决赛圈。

事件B:中国队进入了2022世界杯决赛圈。

仅凭直觉来说,显而易见事件B的信息量比事件A的信息量要大。究其原因,是因为事件A发生的概率很大,事件B发生的概率很小。所以当越不可能的事件发生了,我们获取到的信息量就越大。越可能发生的事件发生了,我们获取到的信息量就越小。那么信息量应该和事件发生的概率有关。

我们可以总结一下:

  • 信息量小,概率大的事件发生了
  • 信息量大,概率小的事件发生了

越不可能的事件发生时,我们获取到的信息量就越大。越可能发生的事件发生了,我们获取到的信息量就越小,一个简单的例子就是,“明天太阳东边升起”,这句话是没有任何信息量的,因为我们都知道太阳总是东升西落。

在信息论中,总结了信息量的计算方法,我们假设X是一个离散型随机变量,概率分布函数:I(x_0) = - \log(p(x_0)):

x = np.linspace(0,1,100)
y = - np.log2(x)
plt.plot(x,y)
plt.show()

  • 横坐标为概率p,纵坐标为信息量 I。概率越小,信息量越大,概率越大,信息量越小。 

了解了信息量的计算方法之后,存在一个问题,对于某种事件,我们有很多可能性,每一种可能性都有概率,那么我们就可以计算出某一种可能性的信息量,举个列子,周末你和家人在公园放风筝,当松手的时候,我们假设预测有几种可能:

def entropy(ps):
    def getI(p):
        return -p * np.log2(p)
    ent = 0
    if ps.sum() != 1 :
        print("输入值错误")
        return np.nan
    for p in ps:
        if p == 0 or p == 1:
            ent = 0
        else:
            ent += getI(p)
    return ent

信息量只能处理单个的输出。我们可以使用香农熵(Shannon entropy)来对整个概率分布中的不确定性总量进行量化!用熵来表示所有信息量的期望:

通过这个公式,计算一下放风筝这个事件的熵,我们可以得到熵值是:0.8841。 

在分类问题中,我们也可以使用熵来计算样本集的信息熵值 

为了后续计算方便,我们也可以定义信息熵的计算公式:

def entropy(ps):
    def getI(p):
        return -p * np.log2(p)
    ent = 0
    if ps.sum() != 1 :
        print("输入值错误")
        return np.nan
    for p in ps:
        if p == 0 or p == 1:
            ent = 0
        else:
            ent += getI(p)
    return ent
## 如果是二分类,那么熵的计算公式可以改一下。
def entropy_bin(p):
    def getI(p):
        return -p * np.log2(p)
    if p == 0 or p == 1:
        ent = 0
    else:
        ent = getI(p) + getI(1-p)
    return ent

p = np.linspace(0, 1, 50)
ent_l = [entropy_bin(x) for x in p]

plt.plot(p, ent_l)
plt.scatter(0.5,entropy_bin(0.5))
plt.xlabel('P')
plt.ylabel('Entropy')

可以发现当P值为0.5的时候,熵值最大,也就是指,在二分类中,如果0、1类样本各占50%,那么熵值是最大的,也就是标签随机变量的不确定性已经达到峰值!如果Labels全为1,或者全为0,那么系统的熵值是最小的,是0,也就代表标签的取值整体呈现非常确定的状态,系统信息规整。也可以推测出,此时的熵的范围是【0,1】 

相对熵 

在机器学习过程中,我们其实可以得到两种数据集的分布,一种是原始特征和真实标签的数据集,一种是原始特征和模型预测值组成的数据集,我们如何比较真实标签和我们预测值的差异呢?这个也是损失函数的核心问题?这个又和现在讲解的熵有什么关系呢?

在这里我们需要引入另一个概念,就是相对熵

相对熵也被称为Kullback-Leibler散度(KL散度)或者信息散度(information divergence)。通常用来衡量两个随机变量分布的差异性。假设对同一个随机变量X,有两个单独的概率分布P(x)和Q(x),当X是离散变量时,我们可以通过如下相对熵计算公式来衡量二者差异:

在机器学习中,P往往用来表示样本的真实分布,比如[1,0,0]表示当前样本属于第一类。Q用来表示模型所预测的分布,比如[0.7,0.2,0.1],直观的理解就是如果用P来描述样本,那么就非常完美。而用Q来描述样本,虽然可以大致描述,但是不是那么的完美,信息量不足,需要额外的一些“信息增量”才能达到和P一样完美的描述,这个信息增量可以理解为两种数据分布的差异,从本质上来说,相对熵刻画的是用概率分布Q来刻画概率分布P的困难程度。和信息熵类似,相对熵越小,表示两种分布越相似。 

  • 37
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森( ﹡ˆoˆ﹡ )

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值