【导语】学习逻辑回归模型,今天的内容轻松带你从0到100!阿里巴巴达摩院算法专家、阿里巴巴技术发展专家、阿里巴巴数据架构师联合撰写,从技术原理、算法和工程实践3个维度系统展开,既适合零基础读者快速入门,又适合有基础读者理解其核心技术;写作方式上避开了艰涩的数学公式及其推导,深入浅出。 0、前言 简单理解逻辑回归,就是在线性回归基础上加一个 Sigmoid 函数对线性回归的结果进行压缩,令其最终预测值 y 在一个范围内。这里 Sigmoid 函数的作用就是将一个连续的数值压缩到一定范围内,它将最终预测值 y 的范围压缩到在 0 到 1 之间。虽然逻辑回归也有回归这个词,但由于这里的自变量和因变量呈现的是非线性关系,因此严格意义上讲逻辑回归模型属于非线性模型。逻辑回归模型通常用来处理二分类问题,如图 4-4 所示。在逻辑回归中,计算出的预测值是一个 0 到 1 的概率值,通常的,我们以 0.5 为分界线,如果预测的概率值大于 0.5 则会将最终结果归为 1 这个类别,如果预测的概率值小于等于 0.5 则会将最终结果归为 0 这个类别。而 1 和 0 在实际项目中可能代表了很多含义,比如 1 代表恶性肿瘤,0 代表良性肿瘤,1 代表银行可以给小王贷款,0 代表银行不能给小王贷款等等。 图4-4 逻辑回归分类示意图 虽然逻辑回归很简单,但它被广泛应用在实际生产之中,而且通过改造逻辑回归也可以处理多分类问题。逻辑回归不仅本身非常受欢迎,它同样也是我们将在第 5 章介绍的神经网络的基础。普通神经网络中,常常使用 Sigmoid 对神经元进行激活。关于神经网络的神经元,第 5 章会有详细的介绍(第 5 章会再次提到 Sigmoid 函数),这里只是先提一下逻辑回归和神经网络的关系,读者有个印象。 1、Sigmoid 函数Sigmoid 的函数表达式如下: 该公式中,e 约等于 2.718,z 则是线性回归的方程式,p 为计算出来的概率,范围在 0 到 1 之间。接下来我们将这个函数绘制出来,看看它的形状。使用 Python 的 Numpy 以及 Matplotlib 库进行编写,代码如下: import numpy as np import matplotlib.pyplot as plt
def sigmoid(x): y = 1.0 / (1.0 np.exp(-x)) return y
plot_x = np.linspace(-10, 10, 100) plot_y = sigmoid(plot_x) plt.plot(plot_x, plot_y) plt.show() 效果如图 4-5 所示: 图4-5 Sigmoid函数 我们对上图做一个解释,当 x 为 0 的时候,Sigmoid 函数值为 0.5,随着 x 的不断增大,对应的 Sigmoid 值将无线逼近于 1;而随着 x 的不断的减小,Sigmoid 值将不断逼近于 0 。所以它的值域是在 (0,1) 之间。由于 Sigmoid 函数将实数范围内的数值压缩到(0,1)之间,因此也被称为压缩函数。但这里多提一下,压缩函数其实可以有很多,比如 tanh 可以将实数范围内的数值压缩到(-1,1)之间,因此 tanh 有时也会被成为压缩函数。 2、 梯度下降法在学习 4.1.1 小节的时候,我们在介绍一元线性回归模型的数学表达之后又介绍了一元线性回归模型的训练过程。类似的,在 4.2.1 小节学习完逻辑回归模型的数学表达之后我们来学习逻辑回归模型的训练方法。首先与 4.1.1 小节类似,我们首先需要确定逻辑回归模型的评价方式,也就是模型的优化目标。有了这个目标,我们才能更好地“教”模型学习出我们想要的东西。这里的目标也和 4.1.1 一样,定义为 接下来是选择优化这个目标的方法,也就是本小节中重点要介绍的梯度下降法。 首先带大家简单认识一下梯度下降法。梯度下降算法(Gradient Descent Optimization)是常用的最优化方法之一。“最优化方法”属于运筹学方法,它指在某些约束条件下,为某些变量选取哪些的值,使得设定的目标函数达到最优的问题。最优化方法有很多,常见的有梯度下降法、牛顿法、共轭梯度法等等。由于本书重点在于带大家快速掌握“图像识别”技能,因此暂时不对最优化方法进行展开,感兴趣的读者可以自行查阅相关资料进行学习。由于梯度下降是一种比较常见的最优化方法,而且在后续第 5 章、第 7 章的神经网络中我们也将用到梯度下降来进行优化,因此我们将在本章详细介绍该方法。 接下来我们以图形化的方式带领读者学习梯度下降法。 我们在 Pycharm 新建一个 python 文件,然后键入以下代码:
通过上述代码,我们就能画出如图 4-6 所示的损失函数示意图,其中 x 轴代表的是我们待学习的参数 梯度下降中有个比较重要的参数:学习率 图4-6 损失函数示意图 接下来我们画图模拟梯度下降的过程。 1. 首先定义损失函数及其导数 def J(theta): #损失函数 return (theta-2.5)**2 -1
def dJ(theta): #损失函数的导数 return 2 * (theta - 2.5) 2. 通过 Matplotlib 绘制梯度下降迭代过程,具体代码如下:
我们来看下所绘制的图像是什么样子的,可以观察到 图4-7 一元二次损失函数梯度下降过程示意图 3、学习率的分析上一小节我们主要介绍了什么是梯度下降法,本小节主要介绍学习率对于梯度下降法的影响。 第一个例子,我们将 图4-8 学习率 第二个例子,我们将 图4-9 学习率 第三个例子,我们将 def J(theta): try: return (theta-2.5)**2 -1 except: return float('inf')
另外我们需要增加一下循环的次数。 我们可以很明显的看到,我们损失函数在最下面,学习到的损失函数的值在不断的增大,也就是说模型不会找到最优解。如图 4-10 所示: 图4-10 学习率 通过本小节的几个例子,简单讲解了梯度下降法,以及步长 4、逻辑回归的损失函数逻辑回归中的 Sigmoid 函数用来使值域在(0,1)之间,结合之前所讲的线性回归,我们所得到的完整的公式其实是: 现在的问题就比较简单明了了,对于给定的样本数据集 X,y,我们如何找到参数 theta ,来获得样本数据集 X 所对应分类输出 y(通过p的概率值) 需要求解上述这个问题,我们就需要先了解下逻辑回归中的损失函数,假设我们的预测值为: 损失函数假设为下面两种情况,y 表示真值;表示为预测值: 结合上述两个假设,我们来分析下,当 y 真值为 1 的时候,p 的概率值越小(越接近0),说明y的预测值 我们对上面这个函数做一定的解释,为了更直观的观察上述两个函数,我们通过 Python 中的 Numpy 以及 Matplotlib 库进行绘制。 我们先绘制下 import numpy as np import matplotlib.pyplot as plt
def logp(x): y = -np.log(x) return y
plot_x = np.linspace(0.001, 1, 50) #取0.001避免除数为0
plot_y = logp(plot_x) plt.plot(plot_x, plot_y) plt.show() 如下图4-9所示: 图4-9 损失函数if y=1 当p=0的时候,损失函数的值趋近于正无穷,根据 我们再来绘制一下
效果如图4-10所示: 图4-10 损失函数 if y=0 当p=1的时候,损失函数的值趋近于正无穷,根据 我们再对这两个函数稍微整理下,使之合成一个损失函数: 对这个函数稍微解释下,当 y=1 的时候,后面的式子 最后就变为了,对m个样本,求一组值使得损失函数最小。 公式如下: (其中 当公式变为上述的时候,对于我们来说,只需要求解一组 5、Python实现逻辑回归结合之前讲的理论,本小节开始动手实现一个逻辑回归算法。首先我们定义一个类,名字为 LogisticRegressionSelf ,其中初始化一些变量:维度、截距、theta 值,代码如下: class LogisticRegressionSelf:
def __init__(self): '''初始化Logistic regression模型''' self.coef_ = None #维度 self.intercept_ = None #截距 self._theta = None 接着我们实现下在损失函数中的 Sigmoid 函数那个小节已经实现过了,对于这个函数我们输入的值为多元线性回归中的
接着我们来实现损失函数, 代码如下: #计算损失函数 def J(theta,X_b,y): p_predcit = self._sigmoid(X_b.dot(theta)) try: return -np.sum(y*np.log(p_predcit) (1-y)*np.log(1-p_predcit)) / len(y) except: return float('inf') 然后我们需要实现下损失函数的导数。具体求导过程读者可以自行百度,我们这边直接给出结论,对于损失函数cost,得到的导数值为: 完整代码如下:
小结 以上内容主要讲述了线性回归模型和逻辑回归模型,并做了相应的实现。其中线性回归是逻辑回归的基础,而逻辑回归经常被当做神经网络的神经元,因此逻辑回归又是神经网络的基础。我们借逻辑回归模型介绍了机器学习中离不开的最优化方法,以及最常见的最优化方法——梯度下降。了解本节内容会对接下来第 5 章神经网络的学习有着很大的帮助。 以上内容主要讲述了线性回归模型和逻辑回归模型,并做了相应的实现。其中线性回归是逻辑回归的基础,而逻辑回归经常被当做神经网络的神经元,因此逻辑回归又是神经网络的基础。我们借逻辑回归模型介绍了机器学习中离不开的最优化方法,以及最常见的最优化方法——梯度下降。了解本节内容会对接下来第 5 章神经网络的学习有着很大的帮助。本文摘自《深度学习与图像识别:原理与实践》,经出版方授权发布。 |
|
来自: 昵称42427018 > 《参考案例》