Logistic回归(一)+https://developer.aliyun.com/article/1544675?spm=a2c6h.13148508.setting.30.2a1e4f0euIPhgb
对数几率模型与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的困难程度。和信息熵类似,相对熵越小,表示两种分布越相似。