浅谈Logisitic Regression
引言
这一篇呢主要是谈谈我自己对于Logisitic Regression的一些理解。这里呢,Regression虽然中文是回归的意思,但是Logisitic Regression可不是预测连续值的那个回归哦。它是主要用来分类的一种方法。(敲黑板) 这里的分类不仅仅可以进行二分类,多分类当然也是可以哒!只不过咱们进行一丢丢小的改进就ok啦!这个关于多分类的问题嘛,咱们后面再说哈,这里先以最简单的二分类为模型细细掰扯掰扯。
小tips:在学习Logisitic Regression回归之前,希望大家都已经对Linear Regression有所了解哦。
正文
Now, let’s begin!
首先,我们来看一张图:
这是一个二维的数据集,每个样本拥有两个特征(x1,x2),下面我们的任务就是用Logisitic Regression将这两类样本点用类似这一条红线分类开来:
在Linear Regression中,我们预测一个连续值的方法是先提取样本的特征,如x=(x0,x1,x2……xn),n属于正整数。然后训练每个特征的权重θ,使θT.x=y,y即为预测的连续值结果。然而,这个连续的结果并不能直接用于分类,而我们的分类也必须用到数据集的各个特征,使之能够表征到分类模型中,那么怎么办呢?我们现在引入一个函数名为sigmoid函数:
这个函数来源于一种分布名为逻辑斯谛分布(logisitic distribution)。关于这方面的知识,请参阅李航老师的《统计学习方法》,这里就不再深入讨论了。
g(z)
的函数图象如下:
该函数为单调递增函数,定义域为整个实数集,值域为(0,1) 横轴越大,越趋近于1,相反,越趋近于0。
看到这儿的时候有没有猛然想起《信号与系统》里的单位跃迁函数呀?(恩,你很机智^-^)
sigmoid函数中的z,其实就是我们用类似于Linear Regression中的 y=θTx (只是形式相同啊喂),我们将其代入到 g(z) 中就得到了:
不难看出,输出的结果
h
是个属于(0,1)的数。我们假设分类标签为{0,1},输出的标签为
下面一个比较关键的问题就是如何让这个model的分类效果最好呢?
这个问题里包含了两个方面:1.如何选取各个特征
其实这两个问题是可以统一到一起的,我们先定义目标函数,然后利用最优化算法求解其权重参数θ。
在一般模型中,会采用MSE(最小误差平方和的准则函数)来作为目标函数,若我们在Logisitic Regression中采用如下目标函数
J(θ)
:
Stanford的Andrew Ng老师说,这是一个关于θ的非凸函数,我们可能会得到如下图像:
所以,MSE就明显不适用于Logisitic Regression了。那我们怎么办呢?我们需要求得权重θ,那么也就是说我们需要估计θ,使θ最接近于实际值对吧?既然我们现在已经有了样本集了,那么……对!这不就是可以利用极大似然估计吗!下面的式子我们就信手拈来啦!
在这里假设类别标签为{0,1},那么
这个分段函数我们可以整合成一个式子:
Obviously,对于一个样本集,可以得到其似然函数 L(θ) :
将其转化为对数形式:
接下来我们求得这个对数似然函数的偏导,就可以为后面的最优化算法做铺垫啦!
有了这些条件之后,梯度上升算法已经饥渴难耐啦!(梯度上升算法可以求得 l(θ) 的最大值,属于最优化算法中一种常用的方法。在Andrew Ng老师视频中,他将目标函数 J(θ) 前加了”-“,使最小化目标函数,对应的,采用的应是梯度下降法。其实两者原理一样,只不过训练参数时一个是“+”,一个是“-”。关于梯度下降或者上升算法,希望不了解的同学看一下最优化方法方面的书籍哦,都会有介绍的。)
我们下面利用梯度上升算法开始训练权重参数θ:
Repeat until convergence{
θj:θj+α∑i=1m(y(i)−hθ(x(i)))x(i)j
}
这样,Logisitic Regression中的参数θ就训练出来啦!
但是注意!如果数据量很大的情况下,这种梯度算法就出问题了。因为每次更新都要遍历数据集,计算复杂度很高。所以每次用一个样本点更新权重的“随机梯度上升法”就更适用于数据量大的场景下。
随机梯度上升算法伪代码:
所有回归系数初始化为1
对数据集中每个样本
计算该样本的梯度
使用 alpha×gradient 更新回归系数值
返回回归系数值
但是再注意!等迭代次数多了以后会发现,回归系数会在一个稳定的数值上下震荡。这不难理解,产生这种现象的原因是存在一些不能正确分类的样本点(数据集并非线性可分),在每次迭代时会引发系数的剧烈改变。于是,我们再一次改进,使步长alpha随着迭代次数的增多变得越来越小,这样有利于回归系数值收敛,使收敛速度加快。
关于Logisitic Regression就先简单讲到这里啦,等后面其他的模型与之有联系的话,会再补充。如有错误和不正之处,恳请指正!