Logistic regression(简称LR)是机器学习最常用的算法,经常用来处理二分类问题
我们举一个生活案例,毕业的学生都要求职,如果你看上了一家企业,并把你的简历投递给该企业的hr,我们省略中间N轮的面试笔试经过,那么这件事情对于你会产生两个结果,你被录取了或者你被淘汰了。假设我们有一个模型算法用来预测这件事情的结果,那么你通过这个模型来预测结果,但是你会发现,模型只会直接告诉你你被录取(你很开心)或者你被淘汰(你很绝望),这样不免会显得太粗鲁太直接,你更希望模型可以告诉你一个可能性,比如说你非常有希望,有一点希望,不怎么有希望,你想都不用想了等等信息,这样会使得结果更加人
我们的世界是随机的,比如今天会不会下雨,今天去散步会偶遇到谁,开车走这条路会不会拥堵,有哪几家企业相中你的offer,玩游戏掉落的装备,同一间办公室两个人生日相同的可能性,甚至蝴蝶效应等,每一件事件的发生都可以用可能性或者几率来表达,而促使该事件发生的条件越充分,事件发生的可能性也就越大,所以人类发明了概率来描述这一现象
假设y是我们想要的结果概率,而简历有m个因素可以理解成m个因变量,我们将m个因变量表示为x1,x2,...,xm,那么公司会怎么考虑这些因素呢?最快速的方式就是把这些因素对应的得分进行求和,和的结果越大表示录用,也就是属于录用这个类别,反之和的结果越小,就属于淘汰这个类别。我们将每个因变量对应的权值表示为θ1,θ2,...,θm,将因变量乘以相应的权值得到的加权和就是最后的得分,根据得分就可以进行归类
本章知识点:
1、多项式逻辑函数
2、sigmoid非线性函数
3、分类任务函数
4、最大似然函数和其对数化处理
5、最大似然函数的偏导数求解
6、梯度上升法
7、随机梯度上升法
一. 逻辑函数
假设我们的数据有n个独立的维度,我们用x1,x2,...,xn来表示,用w1,w2,...,wn表示每个维度的权值,我们叫做回归系数,分类结果y=0或者y=1表示两个类别,显然w1,w2,...,wn就是模型待求解的参数列表
首先我们需要拟合出一个多项式逻辑函数f(x),用来表示其加权和结果
上式的右边我们用W表示这n个回归系数向量,X表示n维样本特征向量,则根据向量的乘法,W的转置和X的点积就可以表示加权和结果。
二. sigmoid非线性函数
现在我们希望f(x)具有良好的逻辑判断性质,最好可以直接表达出样本被分到某类的概率,比如f(x) > 0.5的时候表示x被分到正类,f(x) < 0.5表示分到反类,并且我们希望f(x)的结果总是在[0,1]之间可以直接表示概率,那么我们需要一个函数g(z)来映射f(x),于是我们会用到sigmoid函数:
很明显,sigmoid满足我们对g(z)的一切要求,定义域为任意实数R,值域正好在[0,1]之间,并且在x=0处值为0.5,整个函数单调递增且非线性变化,我们就可以根据g(z)的值是否大于0.5来判断样本x属于正类还是反类
现在我们设预测函数h(x)来计算样本x的类别,那么怎么映射h(x)到sigmoid函数上呢?
设h(x)表示预测出样本x属于正类的概率,那么样本x属于反类的概率就为1 - h(x),我们定义让步比为正类和反类的比值,那么引入对数后我们得到下面关系
我们利用对数来求解出h(x)
从上面式子可以看出,我们可以用g(z)来直接映射f(x)就可以得到h(x),即h(x) = g(f(x)),且h(x)拥有sigmoid函数的一切特性,h(x)即为模型的预测函数
从上面两个模型我们也可以证明出:逻辑回归的本质就是一个线性分类模型,它通过一个非线性化映射输出一个概率值来评判分类的标准
三. 分类任务函数
设P(y=1|x)表示样本x属于正类的概率,那么P(y=0|x) 表示反类的概率,我们需要用一个分类函数用来表示P(y|x)是属于正类还是反类的概率,于是得到下面分类函数
仔细观察上式,当yi=1时,p(y|x)即表示样本x属于正类的概率,而当yi=0时,p(y|x)即表示样本x属于反类的概率,而P(y=1|x)我们可以用之前的预测函数h(x)来表示,于是分类函数可以整合为
四. 最大似然函数及其对数化
现在我们写出了预测函数和分类函数,以及拥有二分类数据样本集做训练,而回归因子W未知,那么怎么求解出W呢?下一步,我们需要构造出损失函数Loss(代价函数)
那么我们的损失函数为什么不用最小二乘法了呢?(请比较线性回归的损失函数思考)
我们知道,逻辑回归可以被视为一个广义上的线性模型,而它的外层函数g是sigmoid函数,问题就在这里,g是一个非线性函数,如果我们把预测函数h(x)带入最小二乘法函数中,会发现损失函数图像是非凸函数
由于g的非线性使得用最小二乘法表示的loss拥有多个局部极小值,这样会影响我们使用梯度下降法求解最小值时,有非常大的概率不是全局最优解,只是得到局部最小值,这也就解释了我们不能使用最小二乘法来表示损失
那我们需要找到什么样的函数来表示模型的损失呢?
回想我们从小做数学题,大多都是根据一些已知条件来推算结果,而当下的模型是已经知道了结果,需要寻找使得该结果出现的概率最大的条件,而这个条件就是W
显然,我们需要构造的函数是统计模型中参数的函数,而这个函数就是似然函数。它在观察到结果的时候,对产生该结果的参数列表进行估计,使得该参数列表最具有合理性
通过之前的分析,我们需要找到一个凸函数给预测函数h(x)作为损失函数,为此我们写出似然函数L(w),因为每个样本互相独立,那么n个样本出现的似然度为
显然,似然函数就是我们的损失函数,我们需要求出使得似然函数L(w)最大的系数组合,该组合即为W,即问题转化为求解最大似然函数
我们先准备尝试用数学知识直接对L(w)求导,计算其导数为0的解析解,如何存在解析解,那么我们就可以直接对损失函数进行优化了,为此我们需要变换L(w):取自然对数,然后化简
我们将预测函数h(x)和逻辑函数f(x)带入上式l(w)再次化简可得
至此,我们终于找到了损失函数Loss和逻辑函数f(x)的关系,最优化Loss函数,求出相对的f(x),也就找到了回归因子W,下面我们需要对参数W求偏导数
五. 最大似然函数的偏导数
至此,我们一步步推导出了最大似然函数的偏导数,令该导数为0可以得到极值,但是很不幸的是,它无法通过直接解析来求解,所以我们需要利用迭代逼近,也就是梯度下降(上升)法来求解极值
六. 梯度上升算法
机器学习中梯度下降似乎已经无处不在使用了,它是求解最优化函数问题中最常见的算法,显然,在似然函数作为损失函数的模型中,我们需要计算梯度上升(和梯度下降方向相反)来得到最大似然值
我们从构造逻辑函数f(x)、预测函数h(x)、分类函数P(y|x)、似然函数L(w),对数化似然函数得到和f(x)相关的l(w)作为损失函数,最后对l(w)求偏导数,才可以写出梯度上升式子
上式就是最基本的梯度上升法,其中α设置为学习率,表示每次迭代上升的幅度(步长),这个式子的作用即是每次迭代更新回归因子W来逼近最大值(最合理的参数列表)
从结果中可以看到模型在梯度上升算法优化后,准确率大概在95%左右
七. 随机梯度上升法
已经有了梯度上升,为什么还需要随机梯度上升呢,这二者有什么区别呢?
我们来分析一下代码中梯度上升式子,weights = weights + alpha * x.T * (y - hx),显然,每一次的迭代更新都需要计算所有数据的损失函数,当训练数据较小还好,但是如果有数十亿样本,那么上式的矩阵乘法消耗的时间将会非常大,于是我们考虑使用随机梯度上升来更新参数列表
所谓的随机梯度上升,指的是每次迭代更新参数时不需要用到所有的数据样本矩阵x和y,而是使用样本中随机选出的一个数据点来计算梯度并更新参数,这样可以在新的样本到来时对模型进行增量式更新
可以看出随机梯度上升法是一个在线学习算法,相比之前的梯度上升法一次性处理整个数据样本可以被称作批处理,训练之前我们一般将训练数据随机打乱在进行随机梯度算法
从结果中可以看到模型在随机梯度上升算法优化后,准确率大概在98%左右
最后从一元线性回归到逻辑回归的原理分析过程中,我们可以总结出机器学习算法的基本步骤如下:
1、对于一个实际问题,我们需要使用数学语言来描述并建立数学模型,比如回归模型还是分类模型等
2、对训练数据进行数据清洗/补充
3、建立模型的预测函数来描述问题的解(线性模型,非线性模型)
4、建立模型的损失(代价)函数来最优化问题的解(比如最小二乘法,似然函数等)
5、纯数学推导出损失函数关于带求解参数的偏导数表达式
6、在偏导数无法计算出其解析解或者无法求导的情况下,借助迭代算法一步步逼近最优解(梯度下降,随机梯度下降等)
7、编程实现整个算法,并尝试调整超参数组合得到最优模型
逻辑回归代码见:逻辑回归的基本原理