1 - 利用线性模型进行二分类
1.1 - 线性模型
这一部分主要是为了证明为什么可以使用线性回归和逻辑斯蒂回归来做二元分类问题。
我们想要将已知的线性模型应用到二分类甚至是多分类的问题。我们已知的线性模型有如下的三种,它们有一个共同的地方是都会利用输入的特征计算一个加权和 s=wTxs=wTx。
线性分类linear classificationlinear classification不好解, 因为想要最小化E0/1(w)E0/1(w)(被分错的点的个数)被证明是一个NPNP难问题。但相比之下,线性回归和逻辑斯蒂回归很方便就可以最小化EinEin:线性回归使用平方误差square errorsquare error时有解析解(closed-form solution)(closed-form solution);逻辑斯蒂回归由于目标函数是凸函数所以可以使用梯度下降法来求解。所以我们想要做的是:因为linear classificationlinear classification不好做,而看起来linear regressionlinear regression或者是logistic regressionlogistic regression在最小化EinEin这件事情上还是比较简单的。所以我们想要使用线性回归或者是逻辑斯蒂回归作为线性分类的一个替代工具。也就是现在将所有的方法都用在分类问题上,这样的话输出都会被限制在集合{+1,−1}{+1,−1}里面。
1.2 - 损失函数(error function)
首先对三种error functionerror function进行整理, 得到从ss到的计算公式, 其中s=wTxs=wTx。
- 线性分类
h(x)err(h,x,y)err0/1(s,y)=sign(s)=|[h(x)≠y]|↓=|[sign(s)≠y]|=|[sign(ys)≠1]|(2577)(2578)(2579)(2580)(2581)(2577)h(x)=sign(s)(2578)err(h,x,y)=|[h(x)≠y]|(2579)↓(2580)err0/1(s,y)=|[sign(s)≠y]|(2581)=|[sign(ys)≠1]| - 线性回归
h(x)err(h,x,y)errSQR(s,y)=s=(h(x)−y)2↓=(s−y)2=(s−y)2y2=(sy−y2)2=(sy−1)2(2582)(2583)(2584)(2585)(2586)(2587)(2588)(2582)h(x)=s(2583)err(h,x,y)=(h(x)−y)2(2584)↓(2585)errSQR(s,y)=(s−y)2(2586)=(s−y)2y2(2587)=(sy−y2)2(2588)=(sy−1)2 - 逻辑斯蒂回归
h(x)err(h,x,y)errCE(s,y)=11+exp(−wTx)=θ(wTx)=θ(s)=−lnh(yx)↓=ln(1+exp(−ys))(2589)(2590)(2591)(2592)(2589)h(x)=11+exp(−wTx)=θ(wTx)=θ(s)(2590)err(h,x,y)=−lnh(yx)(2591)↓(2592)errCE(s,y)=ln(1+exp(−ys))
通过上面的这些操作,每一个模型的errorerror的计算方法中都出现了ysys,我们接下来要做的就是看看这些errorerror和ysys的关系。
为什么要关注ysys这个量呢?我们简单的看看ysys的物理意义:对于分类来说,我们希望ysys越大越好, 首先如果该值是正的, 说明起码分类正确了, 如果这个值还很大,那么说明置信度很高。
可视化一下我们得到了三个error funcitonerror funciton:横轴是ysys的值,纵轴是errerr的值。
- 0/1: err0/1(s,y)=|[sign(sy≠1)]|0/1: err0/1(s,y)=|[sign(sy≠1)]|
- sqr: errsqr(s,y)=(ys−1)2sqr: errsqr(s,y)=(ys−1)2
- ce: errce(s,y)=ln(1+exp(−ys))ce: errce(s,y)=ln(1+exp(−ys))
三个error function
通过比较在x = 1附近的0/1 error0/1 error和square errorsquare error可以得到:如果有一个样本在square errorsquare error上的值很低的话,那么这个样本在0/1 error0/1 error上也会得到比较低的值。但是如果样本在square errorsquare error上的值比较大, 很左边或者是很右边, 那么我们是没有办法判别这个样本的0/1 error0/1 error是小还是大的。所以当能把样本的square errorsquare error做到很低的时候,可以在一定的程度上保证0/1 error0/1 error也很低。
通过比较0/1 error0/1 error和corss entropy errorcorss entropy error的函数我们可以得到:当corss entropy errorcorss entropy error小的时候,0/1 error0/1 error也是很小的;0/1 error0/1 error比较小的时候,corss entropy errorcorss entropy error也是很小的。
将corss entropy errorcorss entropy error换底之后得到下面的scaled ce error:errsce(s,y)=log2(1+exp(−sy))scaled ce error:errsce(s,y)=log2(1+exp(−sy)),这样一来,corss entropy errorcorss entropy error就一定会是0/1 error0/1 error的上界。我们得到的新的图像如下:
上述是通过函数图像的直观理解,接下来开始利用以上提到的error functionerror function来说明为什么linear regressionlinear regression 或者是logistics regressionlogistics regression可以是一个好的二分类的方法。
如果想做要计算分类的错误的话,它的上限如下:
那么我们就可以得到:(err是E的平均)
同样也可以得到:
根据VC维的理论我们可以得到:
所以如果我们能够把逻辑斯蒂回归中的cross entropy errorcross entropy error做到最小的话,从某种角度上来说也就是把0/1 error0/1 error做到了最小。或者说把square errorsquare error最小化也是在间接的最小化0/1 error0/1 error, 只不过从图中可以看得出来,square errorsquare error是0/1error0/1error的一个更为宽松的上界,这就表示也可以把linear regressionlinear regression用在linear classificationlinear classification上。我们称之为regression for classification。regression for classification。
Regression for ClassificationRegression for Classification
- run logisitic/linear regression on D with yn∈{+1,−1} to get wregrun logisitic/linear regression on D with yn∈{+1,−1} to get wreg
- return g(x)=sign(wTregx)return g(x)=sign(wregTx)
1.3 - 小结
- 如果我们有一个二分类的问题,linear regressionlinear regression计算非常的方便,但是太为宽松(从图中可以得到),所以我们通常是使用linear regressionlinear regression的结果作为PLA/pocket/logistic regressionPLA/pocket/logistic regression的初始的w0w0值。linear regression sometimes used to set w0 for PLA/pocket/logistic regressionlinear regression sometimes used to set w0 for PLA/pocket/logistic regression
- 对于二分类这个其实比较困难的问题,在每一轮中logistic regressionlogistic regression和pocketpocket的时间复杂度其实是差不多的,所以我们通常选用logistic regressionlogistic regression而不使用pocketpocket来做binary classificationbinary classification, 由于它比较好的optimizationoptimization性质
2 - 随机梯度下降算法(SGD)
PLAPLA算法和gradient descentgradient descent算法都可以看成是iterative optimizationiterative optimization(一步一步的接近最佳的wOPTwOPT)。不同的是:PLAPLA算法每一次只看一个数据点来更新来ww(如果这个点被划分错误了);而在中的gradient descentgradient descent算法每一次对ww的更新都要扫描所有的样本。这一小节我们想要做的是优化梯度下降算法。让和PLAPLA一样快。目前来说,logistic regressionlogistic regression是和pocketpocket算法差不多快的。
2.1 - 逻辑斯蒂回归中的梯度下降算法
逻辑斯蒂回归使用梯度下降算法更新权重的规则:
我们看到在更新的时候有1N∑Nn=11N∑n=1N这样的操作,那么我们可以随机的抽取一个样本替代这个加和取平均的操作(比如这里有1w个数字,我们把这1w个数字求和取平均的值应该差不多等于我们只抽取几个数字来求和取平均的值,应该也差不多等于我们随机抽取一个数字的值)。只在这一个样本点上求取梯度值,即只针对一个点的errorerror求取偏微分,这个值称为随机梯度stochastic gradientstochastic gradient。这样的话整体的梯度可以看成是这个随机梯度的期望值。
2.2 - 随机梯度下降算法(stochastic gradient descent)
使用随机的梯度取代真正的梯度:
算法的优点:
- 如果迭代足够多次的话, 真实的梯度和随机的梯度应该是会差不多接近的。
- 简单,不再需要对所有的点计算梯度,而只计算一个点的梯度。在大数据的背景下这样的方式会很有用。
- 当资料本身就是一笔一笔的来的时候(online learningonline learning), stochastic gradient descentstochastic gradient descent会很适合这样的场景。
算法的缺点:
- 算法在性质上可能会不稳定。特别是当步长很大的时候。
公式(1)(1)和我们之前看到过的PLAPLA算法的更新规则非常的相似。
PLAPLA:
wt+1⟵wt+1⋅|[yn≠sign(wTtxn)]| (ynxn)wt+1⟵wt+1⋅|[yn≠sign(wtTxn)]| (ynxn)其中如果◯◯成立,|[◯]|=1|[◯]|=1, 否则|[◯]|=0|[◯]|=0
SGD logistic regressionSGD logistic regression:
wt+1⟵wt+η⋅θ(−ynwTtxn)(ynxn)wt+1⟵wt+η⋅θ(−ynwtTxn)(ynxn)
SGD logistic regression ≈'soft' PLASGD logistic regression ≈'soft' PLA
即使用SGDSGD算法的logistic regressionlogistic regression可以看成是‘软’的PLAPLA,因为不同于PLAPLA,不再只是看错了没有, 而是看看错了多少, 错的多就更新的多一点, 错的少就更新的少一点。
- 当ynwTtxn≪0ynwtTxn≪0,说明样本(xn,yn)(xn,yn)被划分错了, 此时θ(−ynwTtxn)≈1θ(−ynwtTxn)≈1,也就是说,错的多,更新的多。
- 当ynwTtxn≫0ynwtTxn≫0,说明样本(xn,yn)(xn,yn)被划分对了, 此时θ(−ynwTtxn)≈0θ(−ynwtTxn)≈0,也就是说,错的少,基本不用更新。
通过比对上面的两个式子我们可以得到
- 逻辑斯蒂回归使用随机梯度下降算法大概相当于是一个softsoft的PLAPLA算法。在PLAPLA算法中|[yn≠sign(wTtxn)]||[yn≠sign(wtTxn)]|的取值是0或者1,而在SGD logistic regressionSGD logistic regression中θ(−ynwTtxn)θ(−ynwtTxn)的取值在0和1之间。
- 当η=1η=1并且wTtxnwtTxn非常大的时候(这是θ=0/1θ=0/1),PLAPLA算法和SGD logistic regressionSGD logistic regression算法几乎是一样的。
现在有两个问题:
- 如何决定停止条件:因为不再扫描所有的点,所以不知道是不是已经梯度为0了,所以一般的停止条件是根据预先设定的迭代次数。
- 如何设置步长ηη:如果X的范围不是很糟糕的话,0.1还不错,不过这只是个经验值,会有专门的方法来帮助我们选择参数,我们之后也会介绍到。
- 如果把SGDSGD使用在linear regressionlinear regression上, 更新的方向如下:
2(yn−wTtxn)xn2(yn−wtTxn)xn
SGD linear regressionSGD linear regression
wt+1=wt+η(yn−wTtxn)xnwt+1=wt+η(yn−wtTxn)xn
也是朝着xx的方更新,真实值和预测值的差异越大,更新的越大。
3 - 利用逻辑斯蒂回归解决多分类问题
之前的内容只能用来解决是非题,即分类问题,现在我们想要做的是多选题。即判断一个样本属于多个类别中的哪一个,接下来我们想要做的是将二元分类的方法延伸到可以帮助我们求解多分类的问题。
具体的思想就是,将多元分类转化为多个二元分类问题, 每一次只识别一个类型。
我们可以把这个问题转换为一个二分类的问题,即首先我们关心数据是 或不是 □◻ ,是的话其label记为1, 不是的话其label记为0。 (对应到我们熟悉的二分类问题就是将 □◻ 记为 ◯◯, 将其他的记为 ××), 得到如下图所示的一个新的二分类问题,这个时候就可以使用binary classificationbinary classification算法来解决。
使用相同的方法解决以下的三个二分类问题,即针对每一个类别做一个该类别和其他的类别的二元分类问题,把该类和其他的类别分开。
通过这样的步骤我们就得到了如下的四个分类器:
将4次二元分类的结果综合起来得到如下图所示的多分类器:这个多远的分类器告诉我们一些结果:
- 在黑色圈起来的部分中的数据点可以很明确的知道自己属于哪一个类别;
- 在红色区域中的数据点会同时属于两个类别;
- 在蓝色区域中的数据点没有类别。
缺点:所以这样的分类器对于蓝色区域和红色区域中的样本是不确定的。
3.1 - 利用逻辑斯蒂回归进行改进
同样是上面的任务, 同样是每一次划分一个类别,但是不再是给出“是”或者“不是”的结果,而是使用logistic regressionlogistic regression给出一个模糊的边界。即给出每个数据点属于某个类别的概率(下图中颜色越蓝表示概率越接近1(正例),颜色越红表明概率越接近0(负例),颜色越白表明概率越接近0.5(难以辨别))。同样是进行4次二元分类分别得到如下的结果:
综合上述的结果,得到最后的一个多元的分类器如下:因为在每一个数据点(这个例子中是二维平面上的每一个点),上述的四个二元分类器都会给出该点属于某一个类别的一个概率,选取4个概率中值最高的分类器对该数据点的划分结果作为该点的类别就可以了。
分类器的表达式:
在上述的例子中k = 4, 或者不需要使用θθ, 因为该函数是单调的。
3.2 - 多元分类算法OVA Decomposition
One-Versus-All(OVA) Decomposition
- 对于每一个类别kk,通过在数据集上使用逻辑斯蒂回归得到wkwk,
其中Dk={(xn,y′n=2|[yn=k]|−1)}Nn=1Dk={(xn,yn′=2|[yn=k]|−1)}n=1N(是这个类的其yy为,不是这个类的其yy为) - 得到多元分类器 :g(x)=argmaxk∈y wTkxg(x)=argmaxk∈y wkTx
DecompositionDecomposition:是指将原来的多分类问题拆成多个二分类问题
OVAOVA:是指每次对一个类别和其他的所有的类别进行分类
优点:
- 有效率,可以使用任何和逻辑斯蒂回归相似的算法来进行计算,只要是分类的结果输出的也是可以比大小的实数值就行。
- 当面对的是一个K分类的问题的时候,我们其实要做的是KK个,每一个logistic regressionlogistic regression所用的资料和原来的资料其实并没有差太远,只是将labellabel换掉了而已。值得一提的是, 这KK个不同问题我们是可以分布在KK个不同的机器上运行的。所以这是一个很容易并行处理的算法。
缺点:
- 当很大,即类别很多的时候,会有数据不平衡的问题,
4 - 利用二元分类解决多分类问题
上一小节讲到使用OVA(One-Versus-All)OVA(One-Versus-All)进行多元分类的时候,当KK的数量很大的时候,很有可能会出现数据不平衡的问题。 也就是只有很少量的为11的数据, 其余的都是为00的数据。这样就会造成分类的结果不好。 为了避免这种情况的发生,我们采用的方法是:每一次只选择两个类别进行分类(例如对于猫, 狗,汽车这样的三分类问题,分别对(猫, 狗),(猫, 汽车),(狗, 汽车)做一次二元分类;而在每一次分类中所有的类都参与, 同样是上面的问题,OVAOVA要做的是(猫, (狗,汽车)), (狗, (猫, 汽车)), (汽车, (猫, 狗))这样的三个二分类问题)。在如下的四个类别的分类问题中,按照上述的思路,一共需要进行6次二元分类问题的求解。(每次选两个类进行划分C24=4!2!(4−2)!=6C42=4!2!(4−2)!=6)
6次二元分类问题的求解结果
将这些二元分类的结果进行合并得到如下最终的4元分类器,
得到了分类器之后怎么对新样本进行分类?
对于一个新的样本,分别使用这个6个分类器进行计算,计算得到的结果中,类别最多的类就该样本的类。具体的细节是,对于任意一个给定的数据点,分别使用上面得到的6个二元的分类器来进行类别的划分,选择6个划分结果中出现次数最多的作为该类的类别。例如6个分类器的分类结果分别是:□,□,□,◊,★,★◻,◻,◻,◊,★,★, 那么我们判断该点的最终的类别是 □◻。
4.1 - 多元分类算法OVO
One-versus-one(OVO) DecompositionOne-versus-one(OVO) Decomposition
- 对于数据集中的任意两个类别k,lk,l, 通过在数据集Dk,lDk,l上使用任一种二元分类算法来得到wk,lwk,l。
其中数据集如下:
Dk,l={(xn,y′n=2|[yn=k]|−1):yn=k or yn=l}Dk,l={(xn,yn′=2|[yn=k]|−1):yn=k or yn=l}。(是kk类的样本其设置为11,是类的样本其labellabel设置为00) - 在得到了所有的分类器之后,通过一个投票函数来决定一个新的数据的属类:g(x)=vote(wTk,lx)g(x)=vote(wk,lTx)
优点:
- 虽然如果共有4个类别,却要做C42=6C24=6次二元分类,但是每一次二元分类涉及到的数据量很少(只包括两个类的数据)。
- 可以使用任意的binary classificationbinary classification的方法。
- 可以并行计算
缺点:
- 预测的时间比较长:因为要使用得到的6个分类器来进行投票决定。
- 需要更多的存储:同样是因为有更多的ww,所以需要占用更多的空间。
5 - 小结
首先声明了三个都可以用来做binary classificationbinary classification。然后将解决logistics regressionlogistics regression的方法从GDGD算法改进到了SGDSGD算法,然后发现这样的话logistics regressionlogistics regression和PLAPLA算法看起来原理差不多。第三部分和第四部分给出了两种不同的做多类别分类的方法OVAOVA和OVOOVO。