• 机器学习---逻辑回归(二)(Machine Learning Logistic Regression II)


    《机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)》一文中,我们讨论了如何用逻辑回归解决二分类问题以及逻辑回归算法的本质。现在来看一下多分类的情况。

    现实中相对于二分类问题,我们更常遇到的是多分类问题。多分类问题如何求解呢?有两种方式。一种是方式是修改原有模型,另一种方式是将多分类问题拆分成一个个二分类问题解决。


    先来看一下第一种方式:修改原有模型。即:把二分类逻辑回归模型变为多分类逻辑回归模型。

    二分类逻辑回归称为binary logistic regression,其目标y只有两种可能的类别,符合伯努利分布;而多分类逻辑回归称为multinomial logistic regression,其目标y有超过两种可能的类别,符合多项分布。)

    在原有的二分类逻辑回归模型中,目标y只有两种类别。并且如果样本 P(y=1 | x) > P(y=0 | x),就表示样本属于 y=1这一类别的概率更高。现在我们要把目标y扩展为K种类别(K=0,1,2,...,k-1),我们想要知道给定特征x,其目标属于每一种类别的概率分别是多少,这样我们就能判断样本最有可能属于哪个类别。并且这些概率相加总和应该为1,即:。那么我们就应该从这些目标类别中找一个类别作为baseline,然后计算其他类别相对于这个baseline的对数几率。

    我们把类别0作为baseline,定为负类,其余K-1类中的一类分别定为正类。那么一共可以进行k-1次二分类逻辑回归,按照其公式,将对数几率写成线性组合的形式:

    .................(1)

    从式子(1)我们可以得知:

    .................(2)

    因为给定特征x,其目标属于每一种类别的概率相加总和为1,因此:

    然后可以得到:

    .................(3)

    将式子(3)代入式子(2):

    .................(4)

    可以看出,当K=2时,上式变为逻辑函数的形式:

    因此,二分类逻辑回归是多分类逻辑回归的特例,多分类逻辑回归是二分类逻辑回归的扩展。

    又因为当K=2时,,因此可以得出:

    将这一结果代入式子(4),转换整合可以得到:

    (其中c表示当前类别,k表示总类别数,即:类别一共K类,从0到k-1)

    此条件概率公式对应的函数称为softmax函数(softmax function)。因此,其对应的模型也被称为softmax回归模型。

    softmax函数:

    sigma (mathbf {z} )_{j}={frac {e^{z_{j}}}{sum _{k=1}^{K}e^{z_{k}}}}     for j = 1, 2,…, K.

     
    因为我们想要得到样本目标属于各个类别的概率,因此我们需要输出一个k维的向量来表示这k个估计的概率值,且此向量元素相加之和为1。所以假设函数的形式如下:

    总结来说就是:多分类逻辑回归模型有多个输出,输出的个数与类别个数相同,输出的值为目标属于各个类别的概率,概率最高的那个类别就是目标最有可能的类别。

     
    接下来需要求解参数w。
     

    因为目标y是多个分类标签,因此我们假设y服从多项分布,那么目标y的概率质量函数就是:,将其写成条件概率表达式就是:

    (注:1{y=c}表示当y属于类别c时,值为1,否则为0)

    假设有m个独立样本,那么m个y之间也是相互独立的。因此,目标y的联合概率为:

    然后还是用极大似然估计法,对似然函数取自然对数及负号,推导出的损失函数如下:
     
    这个损失函数的原理是:对于样本(xi,yi),它的正确分类类别是c,那么如果它计算出的目标属于类别c的分类概率的值为1,则说明分类完全正确,这种情况下对损失函数没有贡献(ln1=0);而如果分类错误,则它计算出的目标属于类别c的的分类概率将是一个小于1的值,这种情况下将对损失函数有所贡献。
     
    对比二分类逻辑回归的损失函数:。是不是很相似?只不过多分类逻辑回归是用的所有k项的累和,而二分类逻辑回归只有0和1类的累和。
    继续把损失函数L展开:

    现在损失函数看起来还是很复杂,但是其实只有yi=c这一项有数值(也就是样本目标是正确类别的情况),其余项都为0。因此,我们可以继续简化损失函数。

    简化后的损失函数为:

    现在用wt对损失函数L求偏导(wt是w0~wk-1中的一个,是(n+1)*1的向量)。这里分为两种情况:

    1. t=c:

    2. t≠c:

    两种情况综合在一起,损失函数L的梯度就是:

           for t = 0, 1,…, k-1.

    为简便起见,把参数w记成(n+1)*k的矩阵,把yi记成1*k的向量:

      (其中n表示特征数量,k表示类别数量)

    这样梯度可以写成:

    批量梯度下降法的参数更新公式为:


    现在让我们来思考几个问题:

    1. softmax函数是怎么得来的?(摘自:https://blog.csdn.net/acdreamers/article/details/44663305

    因为目标y是多个分类标签,因此我们假设y服从多项分布,那么目标y的概率质量函数就是:,将其写成条件概率表达式就是:

    k个类别的概率用k个变量…,表示。这个k变量和为1,即满足:

    可以用前k-1个变量来表示,即:

    和sigmoid函数一样,softmax函数也是从证明目标的联合分布属于指数分布族而得来的。

    先引入,它是一个维的向量,那么:

       

    应用于一般线性模型,必然是属于个类中的一种。用表示为真,同样当为假时,有,那么进一步得到y的联合概率为:

          

    对比指数分布族的一般表达式,可以得到:

             

    既然:

    那么最终可以得到:

           

    2. 为什么softmax函数上的点可以用来表示分类概率?

    因为wx的值域从负无穷大到正无穷大,我们要想让softmax函数表示概率,那么就需要把wx的值域先变成正数,再归一化到(0,1)区间。指数函数正好能把wx的值域变成正数,且指数函数是严格递增的。把wx映射到指数函数上后,再把其除以它们的累和,就相当于将每个分类概率进行了归一化,使得所有分类概率之和为 1。

    softmax函数的本质就是将一个K维的任意实数向量压缩(映射)成另一个K维的实数向量,使得向量中的每个元素取值都介于(0,1)之间,并且所有元素的和为1。


    再来看一下第二种方式:将多分类问题拆分成二分类问题。即:将多分类问题拆分成一个个二分类问题,然后为每个拆出的二分类任务训练出一个二分类逻辑回归模型,然后对这些模型的预测结果进行集成以获得最终的多分类结果。这里面的关键是如何对问题进行拆分,即拆分的策略。

    下面是三种拆分策略:

    1. 一对其余(One vs. Rest,简称OvR)

    每次将一个类别作为正类,其余所有类作为反类,训练出N个二分类逻辑回归模型。新样本提交给所有二分类逻辑回归模型,若仅有一个模型预测为正类,则该类的类别为最终结果。若有多个分类器标记为正类,则考虑预置置信度。

    2. 一对一(One vs. One,简称OvO)

    每次将N个类别两两配对,其中一个类别作为正类,另一个作为反类,训练出N(N-1)/2个二分类逻辑回归模型。新样本同时提交给所有二分类逻辑回归模型,得到N(N-1)/2个分类结果,预测最多的类别为最终结果。

    3. 多对多(Many vs. Many,简称MvM)

    每次将若干个类别作为正类,其他作为反类。MvM的正、反类构造必须有特殊的设计,不能随意选取,最常用的技术是“纠错输出码“Error Correcting Output Codes(ECOC)。(ECOC编码对分类器错误有一定的容忍修正能力,即使某个分类器预测出错,也不一定会影响结果)

    ECOC:

    编码:将N个类别做M次划分,每次将一部分作为正例,其余作为反例,训练出M个二分类模型。

    解码:新样本提交给M个二分类模型,得到M个结果,组成一个编码,将其和每个类别各自的编码进行比较,距离最小的类别为最终结果。


    OvR和OvO这两种拆分策略比较简单且使用较多,因此下面详细介绍一下这两种拆分策略。

    1. OvR:

    如下图所示,假如目标一共有4个类别。每次将某一类分为正类,其余三类分为负类,进行二分类任务,新样本提交给模型,得到新样本分别属于正负两类的概率值。像这样一共进行4次二分类任务,最后得到新样本分别属于这四类的概率,最大概率对应哪一类,就将这点估计为哪一类。

    OvR有个问题就是如果数据类别很多,那么每次二分类问题中,正类和负类的数量差别就很大,数据不平衡,这样会影响分类效果。

    2. OvO:

    如下图所示,假如目标一共有4个类别。每次将某一类分为正类,另一类分为负类,进行二分类任务,新样本提交给模型,估计出新样本属于正类还是负类。像这样一共进行次二分类任务,最后投票决定新样本属于哪个类别(投票数最多的类别)。

    OvO的优点是虽然需要进行的分类任务增多了,但是每次只需要进行两个类别的比较,也就是说单次分类的数量减少了,因此一般不会出现数据不平衡的情况。缺点是分类任务增多,且每次需要记住分类结果,时间复杂度和空间复杂度都比较高。

    OvR和OvO对比总结:

    OvR只需训练N个分类器,而OvO需训练N(N - 1)/2个分类器, 因此,OvO的存储开销和测试时间开销通常比OvR更大。但在训练时,OvR的每个分类器均使用全部训练样本,而OvO的每个分类器仅用到两个类别的样本,因此,在类别很多时,OvO的训练时间通常比OvR小。至于预测性能,则取决于具体的数据分布,在多数情形下两者差不多。

    综上:

    • OvR的优点是,分类器个数少,存储开销和测试时间比OvO少。缺点是,类别很多时,训练时间长,且有数据不平衡带来的影响。
    • OvO的优点是,在类别很多时,训练时间要比OvR少。缺点是,分类器个数多。

    方式一(softmax)和方式二(多个logistic回归)有什么区别呢?

    •   softmax回归进行的是单个多分类任务,类与类之间是互斥的,即一个输入只能被归为一类
    •   多个logistic回归进行的是多个二分类任务,类与类之间并不是互斥的

    总结:如果类别之间是互斥的,那么用softmax回归会比较合适;如果类别之间不是互斥的(可以同时属于不同类别,比如"苹果"可以既属于"水果"类也属于"3C"类),同时类别较少时,用OVR比较合适;如果类别较多,或者你需要看任意两类之间的区分,那么就用OVO。

  • 相关阅读:
    [Angular 9] Built-in template syntax $any
    [Angular 9] Improved Dependency Injection with the new providedIn scopes 'any' and 'platform'
    [Angular 9 Unit testing] Stronger typing for dependency injection in tests
    [Angular] Preserve the current route’s query parameters when navigating with the Angular Router
    [Angular] Do relative routing inside component
    [Typescript] Make your optional fields required in TypeScript
    [Typescript] Exclude Properties from a Type in TypeScript
    [Javascript] Hide Properties from Showing Up in "for ... in" Loops in JavaScript
    [Debug] Set and remove DOM breakpoints
    【职业素养】4种让你显得没教养的做法
  • 原文地址:https://www.cnblogs.com/HuZihu/p/10960677.html
Copyright © 2020-2023  润新知