主要内容:
一、逻辑回归的原理
二、极大似然估计
三、逻辑回归的极大似然估计
四、Python中的逻辑回归
预告:
本文将会带领大家一步步理解逻辑回归的原理,并且会用几行代码快速实现一个逻辑回归模型训练和预测的例子。
之后,我计划专门用一篇文章来演示如何评估逻辑回归模型的表现以及如何调优,这部分内容会更加偏重于实战,感兴趣的同学欢迎关注后续的更新!
目前来看,逻辑回归这一经典算法的应用极为广泛。如果要按照应用广度来做个排名的话,它很可能就是一哥了。从垃圾邮件分类到广告点击预测,从商品推荐到信用欺诈检测,到处都是它的身影。
它能得到如此广泛的应用,除了其分类效果良好之外,最大的原因就是在输出分类的结果时,它还能给出样本属于预测分类的概率,这就给了模型极好的解释性。很多分类模型类似黑盒,我们只能知道调整了某些参数之后分类效果可能明显提升了或者下降了,但是并不清楚某一个样本为什么被分到了某一类,而逻辑回归则不存在这一问题。今天我们就从理论到应用来扒掉逻辑回归的外衣,嘿嘿。
一、逻辑回归的原理
首先,我们知道线性回归的输出值域为负无穷到正无穷,因此它不太适合直接应用于分类,一个很好的办法就是通过一个函数,将大于0的值映射为1,小于0的值映射为0,这样我们就可以达到分类的目的。
我们先将线性回归模型写作:
![6b8cd0226acee4002fe4ea0ac1fca9ad.png](https://i-blog.csdnimg.cn/blog_migrate/310732a81da6e332b5d9d821776da12d.jpeg)
现在我们要对线性回归的值做一个变换,即:
![e0ed5fe1f659ecc9203ea96afbb0095c.png](https://i-blog.csdnimg.cn/blog_migrate/5884c1cdd9f9c155d5d732372753853e.jpeg)
一种方法是令g(z)为单位阶跃函数,即:
![ecb89f53799bd963cab3dd7fe1654f40.png](https://i-blog.csdnimg.cn/blog_migrate/1a460b14ff416b412f4654d495428a04.jpeg)
但是我们发现,它并不连续,也就不满足单调可导的性质。因此我们找到了更好的替代品:对数几率函数,即:
![e6a66d423ca0356c6e48f42dc095f86d.png](https://i-blog.csdnimg.cn/blog_migrate/48662812bd7060bdeeecf06fb3cb6ac1.jpeg)
对数几率函数的分布形态为:
![bab492a3b1534bf772c602aeb5ec5089.png](https://i-blog.csdnimg.cn/blog_migrate/4105cefc6a11734880d18dae516666a9.jpeg)
可以看到,对数几率函数是一种“Sigmoid”函数,它将z值转化为一个接近0或1的y值,且当z值远离0时,y值迅速靠近0或1。
如果我们将y视为样本x作为正例的可能性,则1-y就是其作为反例的可能性,两者的比值被称作“几率”(odds,又名发生比、优势比等),反映了x作为正例的相对可能性。对数几率则是对几率取对数:
![80439ebc7300f226172913a1f7e88bae.png](https://i-blog.csdnimg.cn/blog_migrate/81c60a810fd42b3dc4c30062f7a8bb6a.jpeg)
我们可以将(2)式中的y视为类后验概率估计p(y=1|x),于是(2)可以重写为:
![55aac4e199657196e6b8e4846ffc977c.png](https://i-blog.csdnimg.cn/blog_migrate/19efaecf2b0401d9a4dff6c3c753c7e9.jpeg)
从(1)中我们知道:
![1c566300494902b48b90a735d68cf7c3.png](https://i-blog.csdnimg.cn/blog_migrate/9247bb32c77dab32d1ea2535bb696f9e.jpeg)
于是:
![56ab49b09d7377dc544696a31fd2f1b4.png](https://i-blog.csdnimg.cn/blog_migrate/8d699993f2cecb9bfe2f3e3f052c34e8.jpeg)
也就是说,线性函数(0)中z的值越接近正无穷,几率就越大,样本属于正例的概率值就越接近1;反之,z的值越接近负无穷,样本属于正例的概率就越接近0。
二、极大似然估计
我们用极大似然估计法(Maximum Likelihood Estimate)来估计逻辑回归模型的参数,这里我们有必要先简单解释一下极大似然估计。
极大似然估计的原理是找出与样本分布最接近的概率分布模型,似然是指在已知结果的前提下,随机变量分布的最大可能。我们用经典的抛硬币例子来理解极大似然估计。
假如我们抛了10次硬币,其中6次为正,4次为反,那么发生这一事件的概率为:
![3d2feea73cb4eee719492c2a81e10313.png](https://i-blog.csdnimg.cn/blog_migrate/cce43bc74700d394f31732717ac98efa.jpeg)
这里等号右边的部分就是似然函数,极大似然估计就是找到这样一个P正,使得似然函数的值最大。我们用下图来观察随着P正取值的变化,似然函数大小的变化趋势:
![072a5ea7db1cd9c53e6b5ed86c923b09.png](https://i-blog.csdnimg.cn/blog_migrate/20744cf35597efc4c69403ed0084b85b.jpeg)
可以看到,当P正为0.6时,似然函数达到最大,因此我们估计的P正就是0.6。这就是极大似然估计的过程。
一般来说,对于参数θ和训练数据集X,似然函数的一般形式为:
![2e2d41130673582af73710d9385e3a56.png](https://i-blog.csdnimg.cn/blog_migrate/2c3bc145ac3483535a8813c73cd6ea14.jpeg)
不过在实际的计算过程中,我们常对似然函数取对数,得到对数似然函数:
![d0a1958af270a97dc835ec3455d5bc0f.png](https://i-blog.csdnimg.cn/blog_migrate/6929cf2c99efe0bb0917d4bbb1db246d.jpeg)
我们的数据集往往由大小为N的特征集X与目标集(分类变量)Y组成,因此(10)更常被写作如下形式:
![60e8d5cea89c19ac1ff3404f7528bc73.png](https://i-blog.csdnimg.cn/blog_migrate/75adde3f146dc14f4148ff7eef220b8b.jpeg)
而极大似然估计的一般形式为:
![8931788fbde02e76003d50b970d05dc5.png](https://i-blog.csdnimg.cn/blog_migrate/cc28f836a0ca17b8da088a7e27f22e7d.jpeg)
三、逻辑回归的极大似然估计
我们根据(10)来写出逻辑回归的对数似然函数:
![48c9efa9c9cfbf37fe1ccdcf68939f70.png](https://i-blog.csdnimg.cn/blog_migrate/c5ed0cb72bc83dc8a408c06cd31e7266.jpeg)
其中,
![d4dbcab623868d17983004bc47bb4f25.png](https://i-blog.csdnimg.cn/blog_migrate/e209fedf6cd3baa297f6c2ddff6205d4.jpeg)
可以看到,不管yi是0还是1,式(13)都成立(代入一下就知道了)。然后我们把(4)(5)代入(13),然后再整体代入(12),得到:
![3af2d56dc21265c3695aa505cf84c8d1.png](https://i-blog.csdnimg.cn/blog_migrate/ca725711cd6b94202f6aeadd558038f7.jpeg)
在最后一步,分别考虑yi=0和yi=1的情况即可得到。到了这一步以后,我们就可以通过梯度下降法、牛顿法等数值优化算法来对(14)式求解得到参数(w,b)了。关于数值优化算法这里就不再赘述,接下来我们看一下如何在Python中完成逻辑回归模型的训练和预测。
四、Python中的逻辑回归
这里我们仍然选择经典的iris数据集(鸢尾花)来演示如何在Python中应用逻辑回归模型。需要注意的是,虽然我们上边演示的推导过程为二元逻辑回归,但是其推导是可以推广到多元逻辑回归过程的。这里的鸢尾花数据集中,目标变量有三种分类水平,就是一个多元逻辑回归的例子,而强大的sklearn对于多元逻辑回归提供了原生的支持。
from sklearn.datasets import load_irisfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitiris = load_iris()X = iris.datay = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)logr = LogisticRegression(solver='newton-cg', multi_class='multinomial')logr.fit(X_train, y_train)y_pred = logr.predict(X_test)acc = sum(y_pred == y_test)/len(y_pred)print('准确率:{0:.2f}%'.format(acc * 100))
输出为:
准确率:97.37%
表现还不错哦!这只是一个最简单的例子,我计划在后边专门用一篇文章来演示如何评估逻辑回归模型的表现以及如何调优,感兴趣的同学欢迎关注哦!