Logistic Regression(简称LR模型)是比较经典的分类方法,虽然名字中有回归两个字,但主要是用来解决分类问题的判别概率问题。话不多说,直入正题。
LR模型的常规步骤:
1.构造预测函数;
2.构造损失函数;
3.损失函数最小,并求得参数;
4.编程。
1. 构造预测函数
我们知道,在处理线性模型时,函数方程为
在处理二分类问题时,我们希望能够将上述函数的值映射到(0,1)中,这时我们需要一个阶跃函数:sigmoid函数。
函数表达式:
观察函数图像,我们可以知道,该函数值域为(0,1)。在处理二分类问题时,我们可以假设当函数值大于等于0.5时,该类别属于1类;小于0.5时,该类别属于0类。既然知道了预测函数,以及怎么处理预测值,下一步开始构造损失函数吧。
2. 构造损失函数
sigmoid函数还有一重特殊的含义,那就是它本身表示的是该函数取1时的值,因此表示1,0时的概率分别为:
LR模型,有一个特点,我们用1时的概率值,除以0时的概率值,可以得到。我们把这个叫做一个事情的几率,指一个事情发生与不发生的概率比值。
有了1,0时的概率值,我们可以用来表示一个0,1问题的计算概率综合值了。
这个公式,可以理解为,当y取1时,概率值为公式的前半部分;当y取0时,概率值为公式后半部分。一个分类问题,我们可以理解为M重0,1问题。样本概率最大时,我们可以得到最好的分类模型。那怎么求这个M重问题的最大概率P呢?在大学上概率论时,对于这种问题,我们一般用最大似然函数来求极值。首先,构造似然函数,然后变形为对数似然函数形式,然后求导,求极值点。
当时在实际分类问题中,对数似然函数是无法通过求导获取解析解的。通常我们构造损失函数,通过梯度下降来使损失函数最小来构造分类器,以及获取变量的值。梯度下降是用来求函数最小值的,故我们在似然函数前加负号来达到我们的目的。通常我们在实际操作时,还会对损失函数求平均。此时,损失函数为
3. 损失函数最小,并求得参数
使用梯度下降法来求解。梯度下降法的求解过程为
梯度下降法的原理可以参考:https://zhuanlan.zhihu.com/p/52003491。为了让梯度下降进行下去,下面需要通过损失函数对变量求导。
举两个例子,来说明一下梯度下降求解的过程。
1.单标量:y(x)=x^2;对x求导为2x。假设起点为x0=1,学习步长a = 0.4,那么
x1=x0 - a*(2*x0) = 1-0.4*2 = 0.2
x2 = x1 - a*(2*x1) = 0.2 - 0.4*0.4 = 0.04
...
2.多变量:y(x) = x1^2 + x2^2; 对x求导为<2*x1,2*x2>,此时表示一个向量。假设X0 = (1,3),a=0.1,那么,
X1=(1,3) - 0.1*(2,6) = (0.8,2.4)
X2 = (0.8,2.4) - 0.1*(1.6,4.8) = (0.64,1.92)
...
现在我们东风都不欠了,我们可以开始LR模型的编程了。
4. 编程
对于机器学习模型,我个人的看法最好是能够自己把代码写一遍。刚开始,没头绪的时候,可以看看别人的代码,理解后,自己再写,最好能够采用矢量化编程的方式。我实在不知道怎么把代码复制进来,格式还跟编译器里面的一样。写到这里我查了一下,需要把富文本改成MArkdown,还只对新建文本生效,好烦,这次还是截图吧,以后的文章通通使用markdown的。
首先加载数据,在这里,我们让x0=1,可以说将函数的常数项b变成了变量的了。
构建预测函数:
梯度下降迭代求:
我设置的迭代20000次,学习率为0.001,到最后极值已经很小且下降已经非常不明显了,我们可以认为模型已经达到比较好的收敛效果。由于我比较懒,没有造测试数据,进行测试,朋友们就将就一下吧。
逻辑回归其实是一个浅层的神经网络,我们不妨用tensorflow来实现一下,展示一下逼格。我在看深度学习交叉熵部分时,上面有句话这么说,交叉熵一般用在分类问题上,表达的意思为预测输入样本属于某一类的概率。其中Y代表真实值,layer_1表示预测值。下面的代码损失函数我用的就是交叉熵。
好了,以上就是关于LR模型的介绍,以及有关LR模型的编程。
本文Github:https://github.com/NLPxiaoxu/Easy_Machine-Learning
参考:
https://blog.csdn.net/qq_38923076/article/details/82925183
https://segmentfault.com/a/1190000009954640
李航 《统计学习方法》
李金洪等 《深度学习之TensorFlow入门、原理与进阶实战》