大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)

上一节中,我们讲解了逻辑回归的优化,本节的话我们讲解逻辑回归做多分类问题以及传统的多分类问题,我们用什么手段解决。

先看一个场景,假如我们现在的数据集有3个类别,我们想通过逻辑回归建模给它区分出来。但我们知道逻辑回归本质上是区分二分类的算法模型。难道没有解决办法了吗?办法还是有的,既然想分出3类,我们姑且称这3个类别号为0,1,2。想通过逻辑回归做二分类的话,那么我们就分别判断每一条样本数据属不属于0号类别,属不属于1号类别,属不属于2号类别去判断,这样相当于建立3个逻辑回归的模型,分别训练,既照顾了逻辑回归二分类的本质,也照顾了多分类的需求。假如我们训练出来的3个模型, 第一个模型判断是不是1号类别的概率是0.8  第二个模型判断是不是2号类别的概率是0.1  第三个模型判断是不是3号类别的概率是 0.6 ,综合来看0.8>0.6>0.1,所以我们对这条样本判别为1号类别。剩下的所有样本数据亦如此。这种用逻辑回归解决问题的方式就是OVR( ovr  one vs rest )。这里问个问题,这三个模型判断出来各自的概率相加结果是1 吗?肯定不是。因为我们是对每个模型单独训练出来的。

我们先总结一下OVR思路就是:1,修改数据的lable。2,然后训练N个逻辑回归模型。3,根据输出结果概率输出。

这里需要注意一个问题就是样本不均衡的问题。逻辑回归就怕样本不均衡,当负例比正例或者正列比负例多很多的时候,模型判断会不准确,逻辑回归,最喜欢的是1:1的正负例。 因为假如有一个训练集只有一条正例,其它的全都是负例,那么哪怕把所有的条目都判断为负例,正确率还是99%。因为在训练过程中,我们是找了一组w带来总的预测正确率最高,但这样情况下当样本不均衡的时候就会对正例特别的不公平,因为它只追求总的预测正确率最高,不管是正例还是负例,都会对少的那一部分很不公平,它会着重的想把多的预测准确了,获得更大的收益,对它来说这个w是更好的w。所以当样本不均衡的时候不一定会不好,但是很有可能的模型会不稳定。

怎么解决样本不均衡的问题?

通常的办法是对多的进行降采样。 比如说只有30%的正例,有70%是负例,第一对70%的负例里面进行一个降采样,不要全部的负例了。第二,创造一些新的正例样本,属性随机采样,就是说把正例样本的每个属性对应的值随机采取点出来,组合出一个新的正例样本来,这样凡是涉及到人工创建的训练集通常不太好,但是它是没办法的办法,已经不均衡了,没有更多的训练集了。按理说用降采样,但是发现不光负例多,正例还特别少,才几十条正例这会这已经很难了,只要样本少,谁也帮不了,神仙也救不了,唯一能自救的方法就是重采样一下。适当的生成出一些新的训练集,但生成的东西并不一定能代表客观规律,这是没办法的事儿,确实少,也只能试一试。所以可以通过对少的样本进行重采样,通过对多的样本进行降采样,来一定程度上缓和我们样本不均衡的问题。除此之外,使用决策树的方法。那么它对于样本不均衡,要比逻辑回归要坚固的多,鲁棒性要好得多,所以换句话说,需要选择其它的算法来解决这个问题。

除此之外,我们引入一种叫softmax的方式,它比OVR对样本不均衡的问题要稍好一些,而且它的分类效果更好。它其实就是一个跟逻辑回归类似的一个专门解决多分类的模型,它有自己的判别函数,也有自己的损失函数,是逻辑回归的一种拓展,逻辑回归是softmax的一种特例。

如果现在只让用一个模型去判断一个5分类任务,这个模型要输出什么?至少得输出5个概率出来,才能判断。只输出两个概率,我怎么判断剩下3个?输出形式一定要出现5个概率。于是它特别简单,它就搞出了5组w,其实就有点神经网络的感觉了。神经网络我们还没讲,不过没关系,你先有个大体的概念。以后我们再会对神经网络里面softmax函数详细解释,因为它很重要。几乎可以说是任何多分类问题最后的一步。我们这里就直到softmax就是一个单层的神经网络就可以了,以下关于神经网络解释softmax的问题听不懂没关系,后面在神经网络里面会详细说的。咱们说五分类,5组模型,W1,W2,W3,W4,W5,现在一个x扔进来之后,要同时交给每组W算出一个结果,得到了W1^Tx,W2^Tx,W3^Tx,W4^Tx,W5^Tx,接下来把得到的每一个结果概率化输出,为:

在 softmax回归中,我们解决的是多分类问题(相对于 logistic 回归解决的二分类问题),类标y可以取k个不同的值(而不是两个)因此,对于训练集,我们有,(注意此处的类别下标从 1 开始,而不是 0)。对于给定的测试输入x,我们想用假设函数针对每一个类别j估算出概率值p(y=j|x),也就是说,我们想估计x的每一种分类结果出现的概率。

因此,我们的假设函数将要输出一个k维(k个类别)的向量来表示这k个估计的概率值。具体地说,我们的假设函数h(θ)形式如下:

其中是模型的参数,这一项对概率分布进行归一化,使得所有概率之和为 1。实际上就是把一个x(i)丢在一个hθ里面要输出一组概率,比如这个例子里面要输出5个概率,每个概率实际上它的判别函数都是它们共用同一个分母,只不过分子部分不同,第一个概率就是第一组w算出来分数扔到e的上面得出来的结果,每一个都是每一组w对于同一个x(i)的运算结果,分母又是所有分子的加和,因此它们总体的加和一定是等于1的。这个就是softmax的判别函数。

为了方便起见,我们同样使用符号θ来表示全部的模型参数,将θ用一个k*n的矩阵来表示,k个类别,n个属性值,每一类这这些属性上面都对应着一组参数。该矩阵是将每组按照行罗列起来得到的。如下所示:


有了这一组θ,我们的h(x)就可以使用了,那怎么得到最好的一组θ?还是通过最大似然来推导损失函数。我们先来看下示性函数的表示就是1,其取值规则为:1{值为真的表达式}=1,1{值为假的表达式} =0。举例来说,表达式:1{2+2=4}的值为1 ,因为2+2=4是正确的值为真,所以1{2+2=4}的值为1。同理, 1{2+2=5}的值为 0。

回顾下逻辑回归的损失函数:

这个函数中,虽然每一项加和的部分是两部分yi*log h(x)+(1-yi)*log (1-h(x))组成,但是因为yi不是0就是1,前面在后面就没了,后面在前面就没了,所以对每一条样本来说就只能存活下来一项,这个是针对二分类来说的。把其写成示性函数的表达就是:

解释下:比如一条样本标签真实值yi是0,根据我们上面的描述yi*log h(x)+(1-yi)*log (1-h(x))这里面只能存在一项就是后面一项。而对于示性函数来说这个里面j是累加到1,两个取值,j先为0的时候,yi=j=0为真。1{值为真的表达式}=1,所以当j为0的时候值保留下来,当j为1的时候yi=j=1≠0,1{值为假的表达式} =0,所以当j为1的时候值没有累加。因此真正每一条样本计算的就是其对应真实y的时候那一部分概率值。

而对于多分类来说我们需要像推导逻辑回归损失函数一样,把每一条样本预测正确的概率连乘,使得似然最大。那多分类的每一条样本预测正确的概率就是:

在Softmax回归中将x分类为类别j的概率为:

举例来说,假如是3分类,这个预测就输出3个概率,也就是3个数,对每一条样本来说,其中第一个概率代表是我预测它最后类别是1的概率,第二个是代表我预测它类别为2的概率,第三个就是我预测它类别为3的概率,它实际的类别假如为1的话,我预测对了的概率是第一个数,第二个数还是第三个数?应该是第一个数。就从里边挑出应该预测正确的概率放在这,这就是它正确的概率,因为对每一个样本来说yi只能取一个值,所以里面的加和也只会存活下来一项。每一条样本yi等于多少其对应的hθ(x)的值就留下来。比如第一个样本真实分类是0,那就保留这一部分,第二个真实样本类别是1 ,那就保留这一部分,第三个真实样本分类是2,那就保留这一部分,损失函数只取决于预测对的那一项的概率,其它的概率其实损失函数角度是不关心的。所以它尽量,想让训练集上全部预测的总正确率最大,就需要把每条数据被预测正确的概率给连乘起来,求最大似然,加个log,连乘变连加,然后加个负号就得到这个损失函数了。最后推导出来的softmax损失函数如下:

可以看到,Softmax代价函数与logistic 代价函数在形式上非常类似,只是Softmax损失函数中对类标记的k个可能值进行了累加。

对于J(θ)的最小化问题,当前还没有闭式解法。因此,我们使用迭代的优化算法(例如梯度下降法,或 L-BFGS)。经过求导,我们得到梯度公式如下:

有了上面的偏导数公式以后,我们就可以将它代入到梯度下降法等算法中,来最小化J(θ)。例如,在梯度下降法的标准实现中,每一次迭代需要进行如下更新:

得到一组θ使得模型表现最好。此时得到θ就是softmax训练出来的结果。所以不管它是什么损失函数,你总可以交给sgd或者l-bfgs进行最小化,得到一组θ使得模型表现最好。

对于softmax,你它的本质是把好几个逻辑回归塞到一起去了,但是它判别函数又变了变,原来是1/{1+exp(-z)},现在变成了e的z求和,有多少个z就求和多少次,加起来之后当分母,然后分子为对应部分预测的概率,这样它们输出的每个概率就都进行了归一化。

softmax有一个有趣的特点:softmax的形式是有几个分类,就有几组w向量,比如三类,最终训练出来的参数实际上就是θ1,θ2,θ3,原来逻辑回归是一组θ,现在是三组θ。你把这三组θ都减去一个相同的向量φ,比如φ全是1。 假如这θ长度为五,φ是五个1也好,五个2也好,12345也好,只要把每一个θ的向量都减去同一个φ,你就会发现他们预测结果没有任何变化。假如我拿每一个θ都减去了同一个φ,我把θj-φ当作原来的θj,即:

通过上面公式展开,也就是说减φ与不减φ不影响最终的预测结果。这说明softmax参数有冗余,既然随便减一个φ可以,那我都给他减一个θ1,也可以,那么就是把θ1全变成零了,θ2变成θ2-θ1了,θ3变成θ3-θ1了。所以实际上我们只需要保存两组参数就够了。

我们再来看下Softmax回归与Logistic 回归的关系:当类别数k=2时,softmax 回归退化为 logistic 回归。这表明 softmax 回归是 logistic 回归的一般形式。具体地说,当k=2时,softmax 回归的假设函数为:

利用softmax回归参数冗余的特点,θ1全置为0,θ2变成θ2-θ1:那么h(x)会输出两个结果。即:

我们就会发现 softmax 回归器预测其中一个类别的概率为,另一个类别的概率就是

此时的softmax回归就是参数为θ2-θ1的逻辑回归

大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)的更多相关文章

  1. 大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out of bag data及代码(2)

              大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out  of  bag  data及代码(2) 上一节中我们讲解了随机森林的基本概念,本节的话我们讲解随机森 ...

  2. 大白话5分钟带你走进人工智能-第二十六节决策树系列之Cart回归树及其参数(5)

                                                    第二十六节决策树系列之Cart回归树及其参数(5) 上一节我们讲了不同的决策树对应的计算纯度的计算方法, ...

  3. 大白话5分钟带你走进人工智能-第32节集成学习之最通俗理解XGBoost原理和过程

    目录 1.回顾: 1.1 有监督学习中的相关概念 1.2  回归树概念 1.3 树的优点 2.怎么训练模型: 2.1 案例引入 2.2 XGBoost目标函数求解 3.XGBoost中正则项的显式表达 ...

  4. 大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程

    目录 1.前述 2.向量空间的梯度下降: 3.函数空间的梯度下降: 4.梯度下降的流程: 5.在向量空间的梯度下降和在函数空间的梯度下降有什么区别呢? 6.我们看下GBDT的流程图解: 7.我们看一个 ...

  5. 大白话5分钟带你走进人工智能-第36节神经网络之tensorflow的前世今生和DAG原理图解(4)

    目录 1.Tensorflow框架简介 2.安装Tensorflow 3.核心概念 4.代码实例和详细解释 5.拓扑图之有向无环图DAG 6.其他深度学习框架详细描述 6.1 Caffe框架: 6.2 ...

  6. 大白话5分钟带你走进人工智能-第十四节过拟合解决手段L1和L2正则

                                                                               第十四节过拟合解决手段L1和L2正则 第十三节中, ...

  7. 大白话5分钟带你走进人工智能-第30节集成学习之Boosting方式和Adaboost

    目录 1.前述: 2.Bosting方式介绍: 3.Adaboost例子: 4.adaboost整体流程: 5.待解决问题: 6.解决第一个问题:如何获得不同的g(x): 6.1 我们看下权重与函数的 ...

  8. 大白话5分钟带你走进人工智能-第35节神经网络之sklearn中的MLP实战(3)

    本节的话我们开始讲解sklearn里面的实战: 先看下代码: from sklearn.neural_network import MLPClassifier X = [[0, 0], [1, 1]] ...

  9. 大白话5分钟带你走进人工智能-第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归

    第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归 上一节中我们讲解了L1和L2正则的概念,知道了L1和L2都会使不重要的维度权重下降得多,重要的维度权重下降得少,引入 ...

随机推荐

  1. 转载:Android SQLite数据库版本升级原理解析

    Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHel ...

  2. PHP生成随机数函数rand(min,max)

    rand(min,max):生成min到max 的随机数,注意:包括边界rand() 返回 0 到 RAND_MAX 之间的伪随机整数.例如,想要 5 到 15(包括 5 和 15)之间的随机数,用 ...

  3. hdu 1846 Brave Game (博弈)

    Brave Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. CodeForces 549H | 二分答案

    参考了这个博客哇 #include<cstdio> #include<algorithm> #include<cstring> #define Max(a,b,c, ...

  5. Python实现求矩阵路径最小和,使用动态规划

    题目: 给定一些NxN的矩阵,对于任意的路线,定义其[和]为其线路上所有节点的数字的和,计算从左上角到右下角的路线和最小值.每条路线只能从某一点到其周围(上下左右)的点,不可斜行.例如: 4,6 2, ...

  6. tips 前端 点击事件

    新手总是时不时会纠结一下 点击事件 我们都知道这些小东西不难 但是偶尔难道不会想想我们可能对这些即使小kiss的问题的认知其实不够清晰 一个认识不清晰的东西使用时 总会有油然而生的不安感 从而用的不放 ...

  7. [bzoj1026][SCOI2009]windy数——数位dp

    题目 求[a,b]中的windy数个数. windy数指的是任意相邻两个数位上的数至少相差2的数,比如135是,134不是. 题解 感觉这个题比刚才做的那个简单多了...这个才真的应该是数位dp入门题 ...

  8. JavaEE中Filter实现用户登录拦截

    实现思路是编写过滤器,如果用户登录之后session中会存一个user.如果未登录就为null,就可以通过过滤器将用户重定向到登陆页面,让用户进行登陆,当然过滤器得判断用户访问的如果是登陆请求需要放行 ...

  9. android hook 框架 libinject2 简介、编译、运行

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

  10. jquery做一个表单验证

    正则表达式的写法: var re=new RegExp('规则', '可选参数');var re=/规则/参数;(这个最常用) 正则表达式的规则 和其他语言的正则表达式规则一样,可以参考我的另一边博文 ...