文章目录
一、广义线性模型(Generalized liner model)的基本定义
二、对数几率模型与逻辑回归
1. 对数几率模型(logit model)
2. 逻辑回归与 Sigmoid 函数
3. Sigmoid 函数性质
三、逻辑回归模型输出结果与模型可解释性
四、多分类学习与多分类逻辑回归
1. OvO 策略
2. OvR 策略
3. MvM 策略
首先,我们来讨论关于逻辑回归的基本原理。
逻辑回归的基本原理,从整体上来划分可以分为两个部分,其一是关于模型方程的构建,也就是方程的基本形态,当然也包括模型的基本性质及其结果解读;其二则是模型参数求解,即在构建完模型之后如何利用数学工具求解最佳参数。基本划分情况如下:
模型构建部分:可以从广义线性回归(Generalized liner model)+ 对数几率函数(logit function)角度理解,也可以从随机变量的逻辑斯蒂分布(logistic distribution)角度出发进行理解。
参数求解部分:可以借助极大似然估计(Maximum Likelihood Estimate)方法求解,可以借助 KL 离散度基本理论构建二分类交叉熵损失函数求解。
# 科学计算模块 import numpy as np import pandas as pd # 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt # 自定义模块 from ML_basic_function import *
一、广义线性模型(Generalized liner model)的基本定义
在前文中我们了解到关于线性回归的局限性,这种局限性的根本由模型本身的简单线性结构(自变量加权求和预测因变量)导致的。
如果说线性回归是在一个相对严格的条件下建立的简单模型,那么在后续实践应用过程中,人们根据实际情况的不同,在线性回归的基础上又衍生出了种类繁多的线性类模型。
其中,有一类线性模型,是在线性回归基础上,在等号的左边或右边加上了一个函数,从而能够让模型更好的捕捉一般规律,此时该模型就被称为广义线性模型,该函数就被称为联系函数。
广义线性模型的提出初衷上还是为了解决非线性相关的预测问题,例如,现在有数据分布如下:
# 数据集特征 np.random.seed(24) x = np.linspace(0, 4, 20).reshape(-1, 1) x = np.concatenate((x, np.ones_like(x)), axis=1) x #array([[0. , 1. ], # [0.21052632, 1. ], # [0.42105263, 1. ], # [0.63157895, 1. ], # [0.84210526, 1. ], # [1.05263158, 1. ], # [1.26315789, 1. ], # [1.47368421, 1. ], # [1.68421053, 1. ], # [1.89473684, 1. ], # [2.10526316, 1. ], # [2.31578947, 1. ], # [2.52631579, 1. ], # [2.73684211, 1. ], # [2.94736842, 1. ], # [3.15789474, 1. ], # [3.36842105, 1. ], # [3.57894737, 1. ], # [3.78947368, 1. ], # [4. , 1. ]]) # 数据集标签 y = np.exp(x[:, 0] + 1).reshape(-1, 1) y #array([[ 2.71828183], # [ 3.35525011], # [ 4.1414776 ], # [ 5.11193983], # [ 6.30980809], # [ 7.78836987], # [ 9.61339939], # [ 11.86608357], # [ 14.64663368], # [ 18.07874325], # [ 22.31509059], # [ 27.54413077], # [ 33.99847904], # [ 41.96525883], # [ 51.79887449], # [ 63.93677707], # [ 78.91892444], # [ 97.41180148], # [120.23806881], # [148.4131591 ]])
np.linalg.lstsq(x, y, rcond=-1)[0] #array([[ 30.44214742], # [-22.37576724]])
y=30.44x−22.38
- 则模型预测结果为:
yhat = x[:, 0] * 30.44 - 22.38 yhat #array([-22.38 , -15.97157895, -9.56315789, -3.15473684, # 3.25368421, 9.66210526, 16.07052632, 22.47894737, # 28.88736842, 35.29578947, 41.70421053, 48.11263158, # 54.52105263, 60.92947368, 67.33789474, 73.74631579, # 80.15473684, 86.56315789, 92.97157895, 99.38 ]) # 观察模型预测和真实结果 plt.plot(x[:, 0], y, 'o') plt.plot(x[:, 0], yhat, 'r-')
能够发现,线性模型预测结果和真实结果差距较大。
但此时如果我们在等号右边加上以 e ee 为底的指数运算,也就是将线性方程输出结果进行以 e ee 为底的指数运算转换之后去预测 y,即将方程改写为
y=e(w^T⋅x^)
等价于
lny=w^T⋅x^
即相当于是线性方程输出结果去预测 y yy 取以 e ee 为底的对数运算之后的结果。此时我们可以带入 l n y lnylny 进行建模。
————————————————
版权声明:本文为CSDN博主「虚心求知的熊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45891612/article/details/128738247
np.linalg.lstsq(x, np.log(y), rcond=-1)[0] #array([[1.], # [1.]])
可得到方程lny=x+1
等价于y=e(x+1)
即解出原方程。
通过上面的过程,我们不难发现,通过在模型左右两端加上某些函数,能够让线性模型也具备捕捉非线性规律的能力。而在上例中,这种捕捉非线性规律的本质,是在方程加入 ln 对数函数之后,能够使得模型的输入空间(特征所在空间)到输出空间(标签所在空间)进行了非线性的函数映射。
而这种连接线性方程左右两端、并且实际上能够拓展模型性能的函数,就被称为联系函数,而加入了联系函数的模型也被称为广义线性模型。广义线性模型的一般形式可表示如下:
g(y)=w^T⋅x^
等价于y=g−1(w^T⋅x^)
其中 g ( ⋅ ) 为联系函数(link function),g − 1 ( ⋅ ) 为联系函数的反函数。而如上例中的情况,也就是当联系函数为自然底数的对数函数时,该模型也被称为对数线性模型(logit linear model)。
这里需要注意,一般来说广义线性模型要求联系函数必须是单调可微函数。
从广义线性模型的角度出发,当联系函数为 g ( x ) = x 时就退化成了线性模型。而能够通过联系函数拓展模型捕捉规律的范围,这也就是广义的由来。
二、对数几率模型与逻辑回归
- 逻辑回归也被称为对数几率回归。接下来,我们从广义线性模型角度理解逻辑回归。
1. 对数几率模型(logit model)
- 几率(odd)与对数几率
- 此时模型就被称为对数几率回归(logistic regression),也被称为逻辑回归。
2. 逻辑回归与 Sigmoid 函数
- 对数几率函数与 Sigmoid 函数
- 我们可以简单观察该函数的函数图像:
np.random.seed(24) x = np.linspace(-10, 10, 100) y = 1 / (1 + np.exp(-x)) plt.plot(x, y)
3. Sigmoid 函数性质
- Sigmoid 函数性质与一阶导函数
对于 Sigmoid 函数来说,函数是单调递增函数,并且自变量在实数域上取值时,因变量取值范围在 (0,1) 之间。并且当自变量取值小于 0 时,因变量取值小于 0.5,当自变量取值大于 0时,因变量取值大于 0.5。
并且,我们简单查看 Sigmoid 导函数性质。
- 我们发现,Sigmoid 函数的导函数可以简单的用 Sigmoid 函数本身来表示。接下来我们验证 Sigmoid 导函数特性,首先简单定义 Sigmoid 函数:
def sigmoid(x): return (1 / (1 + np.exp(-x))) sigmoid(10) #0.9999546021312976
- 据此可定义 Sigmoid 导函数的函数:
def sigmoid_deri(x): return (sigmoid(x)*(1-sigmoid(x))) sigmoid_deri(10) #4.5395807735907655e-05
- 进一步,我们可以绘制 Sigmoid 导函数图像:
plt.plot(x, sigmoid_deri(x))
- 我们发现,Sigmoid 导函数在实数域上取值大于 0,并且函数图像先递增后递减,并在 0 点取得最大值。据此我们也可以进一步讨论 Sigmoid 函数性质:
plt.plot(x, sigmoid(x))
由于导函数始终大于 0,因此 Sigmoid 函数始终递增,并且导函数在 0 点取得最大值,因此 Sigmoid 在 0 点变化率最快,而在远离零点的点,Sigmoid 导函数取值较小,因此该区间 Sigmoid 函数变化缓慢。该区间也被称为 Sigmoid 的饱和区间。
总结 Sigmoid 函数性质如下:
性质 | 说明 |
单调性 | 单调递增 |
变化率 | 0点变化率最大,越远离0点变化率越小 |
取值范围 | (0,1) |
凹凸性 | 0点为函数拐点,0点之前函数为凸函数,此后函数为凹函数 |