前言
这是自学习机器学习以来第一次接触到最优化算法,首先必须要有一定的概率论理论基础才更好的理解该回归的原理以及意义。本篇将详细说明该模型的原理以及用途,结合例子更好理解Logistic回归。本篇大幅度引用logistic回归模型这篇优质博客作为前期基础理论引入方便大家理解,在理解之后在进行建模和实战。
一、Logistic回归模型
logistic回归(Logistic Regression)是一种广义线性回归(Generalized Linear Model),在机器学习中是最常见的一种用于二分类的算法模型,由于数学原理简单,方便理解,作用高效,其实际运用相当广泛。为了通过自变量的线性组合来预测类别因变量的取值,logistic回归模型应运而生。logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。虽然带有回归二字,但实则是分类模型,下面从最基础的logit变换开始理解。
二、Logit模型
对于研究因变量(结果)与引发其变化的因素自变量(因素)的关系时,我们想到最基础的方法就是建立因变量与自变量的多元线性关系:
其中为模型的参数,可视为该一变量的权重。如果因变量是数值型的话,可以解释为不同变量变化导致结果Y因此而变化多少。如果因变量是用来刻画结果是否发生或者更一般的来刻画某特定结果发生的概率的情况,一个自变量的改变可能会让Y结果改变的微乎其微,有时候甚至忽略不计。然而实际生活中,我们知道某些关键因素会直接导致某一结果的发生,例如最典型的算法AHP中影响去不同的景点的因素权重不同导致选取方向发生改变几率大不相同。我们需要让不显著的线性关系变得显著,使得模型能够很好解释随因素的变化,结果也会发生较显著的变化,这时候,人们想到了logit变换,下图是对数函数图像:
从对数函数的图像来看,其在之间的因变量的变化是很迅速的,也就是说自变量的微小变化会导致因变量的巨大变化,这就符合了之前想要的效果。于是,对因变量进行对数变换,右边依然保持线性关系,有下面式子:
虽然上式解决了因变量随自变量变化的敏感性问题,同时也约束了y的取值范围为( 0 , + ∞ )。我们知道概率是用来描述某件事发生的可能性,一件事情发生与否,更应该是调和对称的,也就是说该事件发生与不发生有对立性,结果可以走向必然发生(概率为1),也可以走向必然不发生(概率为0),概率的取值范围为( 0 , 1 ) ,而等式左边 y 的取值范围是( 0 , + ∞ ),所以需要进一步压缩,又引进了几率。
三、几率
几率和机率是两个不同的词,前者是指事件发生的概率与不发生的概率之比,而后者只是指事情发生的概率。
假设事件 A 发生的概率为 ,不发生的概率为,那么事件 A 的几率为
几率恰好反应了某一事件两个对立面,具有很好的对称性,下面我们再来看一下概率和几率的关系:
首先,我们看到概率从0.01不断增大到 0.99,几率也从0.01随之不断变大到99,两者具有很好的正相关系,我们再对 p 向两端取极限有:
于是,几率的取值范围就在( 0 , + ∞ ),这符合我们之前的因变量取值范围的假设。
四、Logistic模型
从上述推到可以发现,我们可以利用几率来代替Y结果,二者范围都为(0,+∞)。且几率与概率密切对等。这样既能满足结果对特定因素的敏感性,又能满足对称性 。于是便可推导出:
现在对这个公式进行化简:让等式左边对数变成自然对数ln=log_{e},等式右边改为向量乘积的形式,便有
其中,我们解得
其中e是自然常数,保留5位小数是2.71828。这就是我们常见的logistic模型表达式,作出其函数图像如下
import matplotlib.pyplot as plt import math import numpy as np def sigmoid(z): y=[] for i in z: y.append(1/(1+math.exp(-i))) return y if __name__ == '__main__': x=np.arange(-10,10) y=sigmoid(x) ax=plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.spines['bottom'].set_position(('data', 0)) ax.spines['left'].set_position(('data', 0)) plt.plot(x,y) plt.show()
我们看到logistic函数图像是一条S型曲线,又名sigmoid曲线,以 ( 0 , 0.5 ) 为对称中心,随着自变量 x 不断增大,其函数值不断增大接近1,随自变量 x 不断减小,其函数值不断降低接近0,函数的取值范围在 ( 0 , 1 ) 之间,且函数曲线在中心位置变化速度最快,在两端的变化速率较慢。
从上面的操作,我们可以看到逻辑回归模型从最初的线性回归模型基础上对因变量进行 logit 变换,使得因变量对自变量显著,同时约束因变量取值范围为0到正无穷大,然后用概率表示几率,最后求出概率关于自变量的表达式,把线性回归的结果压缩在 ( 0 , 1 ) 范围内,这样最后计算出的结果是一个0到1之间的概率值,表示某事件发生的可能性大小,可以做概率建模,这也是为什么逻辑回归叫逻辑回归,而不叫逻辑分类了。
五、基于最优化方法的最佳回归系数确定
根据上述推导我们已知其中的向量x是分类器的输入数据,向量也就是我们要找的最佳参数系数,从而使得分类器尽可能地精确。为了寻找最佳参数,需要用到最优化理论的一些知识。
5.1梯度上升算法
要理解该算法推荐看一篇博客较详细理解:梯度算法之梯度上升和梯度下降,这里仅作简单解释。
5.1.1梯度
梯度上升算法基于的思想是:要找到函数的最大值,最好的方法是沿着该函数的梯度方向探寻。对此我们需要明白代表函数变化快慢的导数以及偏导数,在此基础上我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。梯度与方向导数有一定的关联性,在微积分里面,对多元函数的参数求\delta偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。
例如我们对函数求得它的梯度:
对其求偏导可知:
所以
函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。
5.1.2使用梯度上升找到最佳参数
可以假设为爬山运动,我们总是往向着山顶的方向攀爬,当爬到一定角度以后也会驻足停留下观察自身角度是否是朝着山顶的角度上攀爬。并且我们需要总是指向攀爬速度最快的方向爬。
关于梯度上升的几个概念:
)步长(learning rate):步长决定了在梯度下降迭代过程中,每一步沿梯度负方向前进的长度
2)特征(feature):指的是样本中输入部门,比如样本(x0,y0),(x1,y1),则样本特征为x,样本输出为y
3)假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为。比如对于样本(i=1,2,...n),可以采用拟合函数如下
4)损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于样本(,)(i=1,2,...n),采用线性回归,损失函数为:
其中表示样本特征x的第i个元素,表示样本输出y的第i个元素, 为假设函数。
梯度上升算法的基本思想是:要找到某函数的最大值,最好的方法就是沿着该函数的梯度方向搜寻。我们假设步长为,用向量来表示的话,梯度上升算法的迭代公式如下:
。该公式停止的条件是迭代次数达到某个指定值或者算法达到某个允许的误差范围。
关于梯度算法将直接用代码演示,这里不作详细解释,在之后会详细说明这一算法,先直接进入实战:
先给出数据文件:《机器学习实战Logistic回归举例数据》
这里我们可以看看数据分布,制作散点图: