《机器学习---逻辑回归(一)(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函数:

     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。

机器学习---逻辑回归(二)(Machine Learning Logistic Regression II)的更多相关文章

  1. matlab-逻辑回归二分类(Logistic Regression)

    逻辑回归二分类 今天尝试写了一下逻辑回归分类,把代码分享给大家,至于原理的的话请戳这里 https://blog.csdn.net/laobai1015/article/details/7811321 ...

  2. 机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)

    逻辑回归(Logistic Regression)是一种经典的线性分类算法.逻辑回归虽然叫回归,但是其模型是用来分类的. 让我们先从最简单的二分类问题开始.给定特征向量x=([x1,x2,...,xn ...

  3. [Machine learning] Logistic regression

    1. Variable definitions m : training examples' count \(X\) : design matrix. each row of \(X\) is a t ...

  4. 逻辑回归的分布式实现 [Logistic Regression / Machine Learning / Spark ]

    1- 问题提出 2- 逻辑回归 3- 理论推导 4- Python/Spark实现 # -*- coding: utf-8 -*- from pyspark import SparkContext f ...

  5. 机器学习系统设计(Building Machine Learning Systems with Python)- Willi Richert Luis Pedro Coelho

    机器学习系统设计(Building Machine Learning Systems with Python)- Willi Richert Luis Pedro Coelho 总述 本书是 2014 ...

  6. 逻辑回归与神经网络还有Softmax regression的关系与区别

    本文讨论的关键词:Logistic Regression(逻辑回归).Neural Networks(神经网络) 之前在学习LR和NN的时候,一直对它们独立学习思考,就简单当做是机器学习中的两个不同的 ...

  7. Machine Learning—Linear Regression

    Evernote的同步分享:Machine Learning-Linear Regression 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  8. 机器学习---三种线性算法的比较(线性回归,感知机,逻辑回归)(Machine Learning Linear Regression Perceptron Logistic Regression Comparison)

    最小二乘线性回归,感知机,逻辑回归的比较:   最小二乘线性回归 Least Squares Linear Regression 感知机 Perceptron 二分类逻辑回归 Binary Logis ...

  9. 机器学习/逻辑回归(logistic regression)/--附python代码

    个人分类: 机器学习 本文为吴恩达<机器学习>课程的读书笔记,并用python实现. 前一篇讲了线性回归,这一篇讲逻辑回归,有了上一篇的基础,这一篇的内容会显得比较简单. 逻辑回归(log ...

随机推荐

  1. MySQL8.0 下载安装启动(Windows10)

    2019年6月13日20:13:21 MySQL8.0 下载安装启动(Windows10) 下载 下载地址:https://dev.mysql.com/downloads/mysql/8.0.html ...

  2. mybatis逆向生成dao mapper和example.java文件

    mabatis插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>myba ...

  3. loadbalance轮询算法 java实现

    /** * <html> * <body> * <P> Copyright JasonInternational</p> * <p> All ...

  4. 表单提交学习笔记(二)—使用jquery.validate.js进行表单验证

    一.官网下载地址:http://plugins.jquery.com/validate/ 二.用法 1.在页面上进行引用 <script src="~/scripts/jquery-1 ...

  5. 4.matplotlib绘制直方图

      # coding=utf-8 from matplotlib import pyplot as plt from matplotlib import font_manager a=[131, ...

  6. 关于django数据库迁移 以及显示未检测到更改的问题

    No changes detected 显示这样的原因 数据库迁移代码步骤: 今天在所有数据库的时候对数据库进行了删除,重新迁移数据库映射,但是却发现终端给出了这样的信息. '>>> ...

  7. python抓取贝壳房源信息

    分析了贝壳的房源信息数据,发现地址链接的参数传递是有规律的 https://tj.ke.com/chengjiao/a3l4/ a3 实际表示的 l4 表示的是 然后 将复合条件拼成一个字符串,带过去 ...

  8. 换个语言学一下 Golang (6)——控制流程

    Go语言的控制结构关键字只有if..else if..else ,for 和 switch. 而且在Go中,为了避免格式化战争,对程序结构做了统一的强制的规定.看下下面的例子. 请比较一下A程序和B程 ...

  9. 手写MQ框架(一)-准备启程

    一.背景 很久以前写了DAO框架和MVC框架,前段时间又重写了DAO框架-GDAO(手写DAO框架(一)-从“1”开始,源码:https://github.com/shuimutong/gdao.gi ...

  10. 遍历js对象中的属性

    可以使用js自带的for in.也可以使用Ext JS中的方法来遍历js对象中的属性 代码如下: /** 遍历对象 */ var person = {name:'张泰松',age:28}; //js方 ...