一、逻辑回归来源
据线性可分可以使用线性分类器,如果数据线性不可分,可以使用非线性分类器,这里似乎没有逻辑回归什么事情。但是如果我们想知道对于一个二类分类问题,对于具体的一个样例,我们不仅想知道该类属于某一类,而且还想知道该类属于某一类的概率多大,有什么办法呢?
线性回归和非线性回归的分类问题都不能给予解答,因为线性回归和非线性回归的问题,假设其分类函数如下:
y的阈值处于(−∞,+∞),此时不能很好的给出属于某一类的概率,因为概率的范围是[0,1],我们需要一个更好的映射函数,能够将分类的结果很好的映射成为[0,1]之间的概率,并且这个函数能够具有很好的可微分性。在这种需求下,人们找到了这个映射函数,即逻辑斯谛函数,也就是我们常说的sigmoid函数,其形式如下:
sigmoid函数完美的解决了上述需求,而且sigmoid函数连续可微分。
假设数据离散二类可分,分为0类和1类,如果概率值大于1/2,我们就将该类划分为1类,如果概率值低于1/2,我们就将该类划分为0类。当z取值为0的时候,概率值为1/2,这时候需要人为规定划分为哪一类。
二、逻辑回归定义
逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,达到将数据二分类的目的。
定义中包含了五点:1、逻辑回归的假设;2、逻辑回归的损失函数;3、逻辑回归的目的;4、逻辑回归的求解方法;5、逻辑回归如何分类。
1、逻辑回归的基本假设
任何的模型都是有自己的假设,在这个假设下模型才是适用的。逻辑回归的第一个基本假设是假设数据服从伯努利分布。伯努利分布有一个简单的例子是抛硬币,抛中为正面的概率是,抛中为负面的概率是.在逻辑回归这个模型里面是假设 为样本为正的概率,为样本为负的概率。那么整个模型可以描述为
逻辑回归的第二个假设是假设样本为正的概率是
所以逻辑回归的最终形式
2、逻辑回归的损失函数
逻辑回归的损失函数是它的极大似然函数
3、逻辑回归的求解方法
由于该极大似然函数无法直接求解,我们一般通过对该函数进行梯度下降来不断逼急最优解。在这个地方其实会有个加分的项,考察你对其他优化方法的了解。因为就梯度下降本身来看的话就有随机梯度下降,批梯度下降,small batch 梯度下降三种方式,面试官可能会问这三种方式的优劣以及如何选择最合适的梯度下降方式。
简单来说 批梯度下降会获得全局最优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量会很大,并且会有很多的冗余计算,导致的结果是当数据量大的时候,每个参数的更新都会很慢。
随机梯度下降是以高方差频繁更新,优点是使得sgd会跳到新的和潜在更好的局部最优解,缺点是使得收敛到局部最优解的过程更加的复杂。
小批量梯度下降结合了sgd和batch gd的优点,每次更新的时候使用n个样本。减少了参数更新的次数,可以达到更加稳定收敛结果,一般在深度学习当中我们采用这种方法。
其实这里还有一个隐藏的更加深的加分项,看你了不了解诸如Adam,动量法等优化方法。因为上述方法其实还有两个致命的问题。
第一个是如何对模型选择合适的学习率。自始至终保持同样的学习率其实不太合适。因为一开始参数刚刚开始学习的时候,此时的参数和最优解隔的比较远,需要保持一个较大的学习率尽快逼近最优解。但是学习到后面的时候,参数和最优解已经隔的比较近了,你还保持最初的学习率,容易越过最优点,在最优点附近来回振荡,通俗一点说,就很容易学过头了,跑偏了。
第二个是如何对参数选择合适的学习率。在实践中,对每个参数都保持的同样的学习率也是很不合理的。有些参数更新频繁,那么学习率可以适当小一点。有些参数更新缓慢,那么学习率就应该大一点。这里我们不展开,有空我会专门出一个专题介绍。
逻辑回归的目的
该函数的目的便是将数据二分类,提高准确率。
逻辑回归如何分类
逻辑回归作为一个回归(也就是y值是连续的),如何应用到分类上去呢。y值确实是一个连续的变量。逻辑回归的做法是划定一个阈值,y值大于这个阈值的是一类,y值小于这个阈值的是另外一类。阈值具体如何调整根据实际情况选择。一般会选择0.5做为阈值来划分。
三、逻辑回归推导(Loss Function/Cost Function)
在二类分类中,我们假定sigmoid输出结果表示属于1类的概率值,我们很容易想到用平方损失函数,即
在这种情况下,我们φ(z(i))表示sigmoid对第i个值的预测结果,我们将sigmoid函数带入上述成本函数中,绘制其图像,发现这个成本函数的函数图像是一个非凸函数,如下图所示,这个函数里面有很多极小值,如果采用梯度下降法,则会导致陷入局部最优解中,有没有一个凸函数的成本函数呢?
假设sigmoid函数φ(z)表示属于1类的概率,于是做出如下的定义:
将两个式子综合来,可以改写为下式:
上式将分类为0和分类和1的概率计算公式合二为一。假设分类器分类足够准确,此时对于一个样本,如果它是属于1类,分类器求出的属于1类的概率应该尽可能大,即p(y=1lx)尽可能接近1;如果它是0类,分类器求出的属于0类的概率应该尽可能大,即p(y=0lx)尽可能接近1。
通过上述公式对二类分类的情况分析,可知我们的目的是求取参数w和b,使得p(ylx)对0类和1类的分类结果尽可能取最大值,然而实际上我们定义的损失函数的是求最小值,于是,很自然的,我们想到对p(ylx)式子加一个负号,就变成了求最小值的问题,这就得到了逻辑回归中的损失函数。
不过,为了计算方便,我们通常对上述式子取log,因而得到下式:
公式(1)是对概率公式取log,公式(2)是对公式(1)取相反数。上述公式的函数图像如下图所示。这是一个凸函数(斜率是非单调递减的函数即凸函数),因此可以用梯度下降法求其最小值。
根据损失函数是单个样本的预测值和实际值的误差,而成本函数是全部样本的预测值和实际值之间的误差,于是对所有样本的损失值取平均数,得到我们的成本函数:
损失函数是凸函数,m个损失函数的和仍然是凸函数,因而可以用梯度下降法求最小值。
极大似然法求解逻辑回归
还可以用我们熟知的统计学知识——极大似然法估计逻辑回归中的参数w和b,上述得到的logp(y|w,x),假设目前有m组样本,分别为(x1,y1),(x2,y2)...(xm,ym) (x_1,y_1),(x_2,y_2)...(x_m,y_m),其中xi表示第i个样本的特征,yi表示第i个样本的类别,yi = 0或者1,利用极大似然法的原则,假设所有训练样本独立同分布,则联合概率为所有样本概率的乘积,即:
对上述公式两边取对数,得到下述公式,是不是对这个公式优点熟悉呢?这个公式就是我们的成本函数的和,对于这个公式和成本函数来说,取平均值和不取平均值没有影响。
按照极大似然法求极值的方法,分别对w的每个参数求偏导数使其为0,得到对数似然方程组,求解该方程,便可以到的w的参数。只是如果参数很多,求解方程组就会很复杂,此时可以考虑梯度下降法来求解。
具体推导:
归纳推导
对于多分类中softmax交叉熵损失函数求导,这里不详细介绍,附上求导流程
四、逻辑回归中的问题
1、逻辑回归的损失函数为什么要使用极大似然函数作为损失函数?
损失函数一般有四种,平方损失函数,对数损失函数,HingeLoss0-1损失函数,绝对值损失函数。将极大似然函数取对数以后等同于对数损失函数。在逻辑回归这个模型下,对数损失函数的训练求解参数的速度是比较快的。至于原因大家可以求出这个式子的梯度更新
这个式子的更新速度只和,相关。和sigmod函数本身的梯度是无关的。这样更新的速度是可以自始至终都比较的稳定。
为什么不选平方损失函数的呢?其一是因为如果你使用平方损失函数,你会发现梯度更新的速度和sigmod函数本身的梯度是很相关的。sigmod函数在它在定义域内的梯度都不大于0.25。这样训练会非常的慢。
2、逻辑回归在训练的过程当中,如果有很多的特征高度相关或者说有一个特征重复了100遍,会造成怎样的影响?
如果在损失函数最终收敛的情况下,其实就算有很多特征高度相关也不会影响分类器的效果。
但是对特征本身来说的话,假设只有一个特征,在不考虑采样的情况下,你现在将它重复100遍。训练以后完以后,数据还是这么多,但是这个特征本身重复了100遍,实质上将原来的特征分成了100份,每一个特征都是原来特征权重值的百分之一。
如果在随机采样的情况下,其实训练收敛完以后,还是可以认为这100个特征和原来那一个特征扮演的效果一样,只是可能中间很多特征的值正负相消了。
3、为什么我们还是会在训练的过程当中将高度相关的特征去掉?
去掉高度相关的特征会让模型的可解释性更好
可以大大提高训练的速度。如果模型当中有很多特征高度相关的话,就算损失函数本身收敛了,但实际上参数是没有收敛的,这样会拉低训练的速度。其次是特征多了,本身就会增大训练的时间。
五、优缺点总结
逻辑回归应用到工业界当中一些优点:
形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。
训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
资源占用小,尤其是内存。因为只需要存储各个维度的特征值,。
方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。
但是逻辑回归本身也有许多的缺点:
准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 。
逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。
3. 工程应用经验
逻辑斯特回归(LR)是个比较基础的算法,在它只会有很多算法SVM/GBDT/RandomForest。复杂的算法比较难以把握,工业界更偏向于用简单的算法。
3.1 LR优点与应用
LR的优点:
1) LR是以概率的形式输出结果,不只是0和1的判定;
2) LR的可解释强,可控性高;
3) 训练快,feature engineering之后效果赞;
4) 因为结果是概率,可以做ranking model;
5) 添加feature简单。
LR的应用场景很多哈:
1) CTR预估、推荐系统的learning to rank;
2) 一些电商搜索排序基线;
3) 一些电商的购物搭配推荐;
4) 新闻app排序基线。
3.2 关于样本处理
样本太大怎么处理?
1) 对特征离散化,离散化后用one-hot编码处理成0,1值,再用LR处理会较快收敛;
2) 如果一定要用连续值的话,可以做scaling;
3) 工具的话有 spark Mllib,它损失了一小部分的准确度达到速度的提升;
4) 如果没有并行化平台,想做大数据就试试采样。需要注意采样数据,最好不要随机取,可以按照日期/用户/行为,来分层抽样。
怎么使样本平衡?
1) 如果样本不均衡,样本充足的情况下可以做下采样——抽样,样本不足的情况下做上采样——对样本少的做重复;
2) 修改损失函数,给不同权重。比如负样本少,就可以给负样本大一点的权重;
3) 采样后的predict结果,用作判定请还原。
3.3 关于特征处理
1) 离散化优点:映射到高维空间,用linear的LR(快,且兼具更好的分割性);稀疏化,0,1向量内积乘法运算速度快,计算结果方 便存储,容易扩展;离散化后,给线性模型带来一定的非线性;模型稳定,收敛度高,鲁棒性好;在一定程度上降低了过拟合风险
2) 通过组合特征引入个性化因素:比如uuid+tag
3) 注意特征的频度: 区分特征重要度,可以用重要特征产出层次判定模型
3.4 算法调优
假设只看模型的话:
1) 选择合适的正则化:L2准确度高,训练时间长;L1可以做一定的特征选择,适合大量数据
2) 收敛阈值e,控制迭代轮数
3) 样本不均匀时调整loss function,给不同权重
4) Bagging或其他方式的模型融合
5) 选择最优化算法:liblinear、sag、newton-cg等
参考资料1
参考资料2