目录
逻辑回归也叫逻辑斯蒂回归、对数几率回归、对率回归。
1、逻辑回归与线性回归的联系与区别
- 由线性回归到逻辑回归
1)线性模型如何用在回归学习中?
广义线性模型:找到一个单调可微的函数将分类任务的实际标记与线性回归模型的预测值联系起来。
2)如何联系?
对于二分类任务,标记为{0,1},线性模型预测值为
最理想的情况时单位阶跃函数,即:
3)考虑到连续性和可导性,用对数几率函数(一种Sigmoid函数)来做替代函数。
即:,带入z可得:
4)变为广义线性模型的形式:
称为‘几率’,称为‘对数几率’。所以称为对数几率回归。
- 区别
1)逻辑回归用于分类,线性回归多用于回归问题。
2)线性回归做分类因为考虑了所有样本点到分类决策面的距离,所以在两类数据分布不均匀的时候将导致误差非常大;LR克服了这个缺点,其中LR将所有数据采用sigmod函数进行了非线性映射,使得远离分类决策面的数据作用减弱。
3)线性回归是拟合函数,逻辑回归是预测函数
4)线性回归的参数计算方法是最小二乘法,逻辑回归的参数计算方法是梯度下降
2、 逻辑回归的原理
1)Sigmoid函数
2)LR模型
3)多项LR模型:
4)模型参数估计
由极大似然估计得到损失函数,由梯度下降等方法求取参数
参考:https://blog.csdn.net/touch_dream/article/details/79371462
3、逻辑回归损失函数推导及优化
在机器学习理论中,损失函数(loss function)是用来衡量模型的预测值f(x)f(x)与真实值YY的不一致程度,它是一个非负实值函数,损失函数越小,模型越优(还需考虑过拟合等问题)。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。模型的结构风险函数包括了经验风险项和正则项。
对于逻辑回归,其loss function是log损失,这可以通过极大似然估计进行推导得到。
预测函数的表达式为:
则有:和。归纳为
- 极大似然推导
极大似然函数:
两边取对数,可得:
损失函数可以通过最小化负的似然函数得到:
将sigmiod函数代入hω(xi),并使用ln代替log则有:
- 梯度下降求参数
迭代公式推导:
w的更新,批梯度下降:
随机梯度下降:
- 另一种形式的损失函数和梯度
同样有:
二分类样本标记为{-1,1},则有:
并且:
所以有:
采用极大似然估计:
取负对数如下:
可以得到梯度为:
参考:https://blog.csdn.net/jediael_lu/article/details/77852060
4、 正则化与模型评估指标
正则化的方法,就是给代价函数后面加个“惩罚项”……来降低它对数据的拟合能力。我没希望得到不那么复杂的模型,参数不要太多,或者参数不要过大。
L1正则化和L2正则化都能再一定程度上缓解过拟合。L1可以选择稀松特征。
- 评估指标
- accuracy 精度
分类正确的样本占总样本的比例:
(概率密度p(.))
- precision 准确率(查准率)
预测为正例的样本中有多少是真正例。(西瓜书上的说法:挑出的瓜中(表示你认为是好瓜)有多少是好瓜。)
混淆矩阵:
- recall 召回率(查全率)
正例中有多少样本被成功预测为正例。(西瓜书上的说法:所有的好瓜中有多少比例被挑了出来)
查准率和查全率是一对矛盾的度量。
- P-R曲线
根据学习器的预测结果对样例进行排序,排在前面的为最可能的正例,排在最后面的是最不可能的正例。逐个吧样本作为正例进行预测,根据此时的查准率查全率可以得到查准率-查全率曲线(P-R曲线)
采用P-R曲线下的面积在一定程度上反应了查准率和查全率取得双高的比例。单这个值不容易估算。
平衡点(Break-Event Point,BEP)查准率=查全率的点。过于简化。
- F1-score
查准率和查全率的调和平均:
更一般的形式,表达出对查准率和查全率的不同偏好:
- auc值(Area Under ROC Curve)
ROC曲线下的面积.
估算方法:
(Xi,Yi)为ROC曲线按序连接的点。
AUC与排序误差有密切联系。排序误差为:
排序损失是ROC曲线之上的面积,则有:
- ROC曲线(Receiver Operating Characteristic)
受试者工作特征曲线:
纵轴是真正例率(True Positive Rate,TPR)【正例中有多少被预测为正例】
横轴是假正例率(False Positive Rate,FPR)【反例中有多少被预测为正例】
ROC图如下,对角线对应于随机猜测:
- 代价敏感错误率和代价曲线
不同类型的错误造成不同的损失,即非均等代价。
代价敏感错误率为:
代价曲线,横轴为正例概率代价,纵轴是归一化代价:
(横)(纵)
(ROC曲线上的每一点对应代价曲线上的一条线段)
5、逻辑回归的优缺点
- 优点:
1)适合需要得到一个分类概率的场景。
2)计算代价不高,容易理解实现。LR在时间和内存需求上相当高效。它可以应用于分布式数据,并且还有在线算法实现,用较少的资源处理大型数据。
3)LR对于数据中小噪声的鲁棒性很好,并且不会受到轻微的多重共线性的特别影响。(严重的多重共线性则可以使用逻辑回归结合L2正则化来解决,但是若要得到一个简约模型,L2正则化并不是最好的选择,因为它建立的模型涵盖了全部的特征。)
4)资源占用小,尤其是内存。因为只需要存储各个维度的特征值,。
5)方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。
- 缺点:
1)容易欠拟合,分类精度不高。
2)数据特征有缺失或者特征空间很大时表现效果并不好。
3)逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。
6、样本不均衡问题解决办法
对于实际中正负样本分布不平衡的情况,一个基本策略是:再缩放(再平衡)。令:【一个假设是训练集是真实样本的无偏采样】
目前有三种做法:
1)对训练集中的反例进行‘欠采样’。即去掉一些反例,让两类样本数量相近
不能随机丢弃反例,否则会丢失重要信息。代表算法EasyEnsemble(利用集成学习机制,将反例划分为若干个集合,供不同的学习器使用,这样每个学习器都是欠采样,全局不丢失重要信息)
2)对训练集中的正例进行过采样。即增加一些正例,让两类样本数量接近
不能简单重复采用,会过拟合。代表算法SMOTE(通过插值来产生额外的正例。)
3)基于原始训练集,在用训练好的分类器进行预测时,将‘再缩放’嵌入到决策过程中,称为‘阈值移动’
7.LR介绍提纲
- 一句话概括逻辑回归:
逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
- 逻辑回归的基本假设
1).假设数据服从伯努利分布
2)假设样本为正的概率是:
- 逻辑回归的损失函数
损失函数可以通过最小化负的似然函数得到
- 逻辑回归的求解方法
1).梯度下降(随机梯度下降,批梯度下降,small batch 梯度下降)
2).如Adam,动量法等优化方法.因为上述方法存在两个问题。
(1)第一个是如何对模型选择合适的学习率。自始至终保持同样的学习率其实不太合适。因为一开始参数刚刚开始学习的时候,此时的参数和最优解隔的比较远,需要保持一个较大的学习率尽快逼近最优解。但是学习到后面的时候,参数和最优解已经隔的比较近了,你还保持最初的学习率,容易越过最优点,在最优点附近来回振荡.
(2)第二个是如何对参数选择合适的学习率。在实践中,对每个参数都保持的同样的学习率也是很不合理的。有些参数更新频繁,那么学习率可以适当小一点。有些参数更新缓慢,那么学习率就应该大一点。
- 逻辑回归的目的
将数据二分类,提高准确率。
- 逻辑回归如何分类
y值确实是一个连续的变量。逻辑回归的做法是划定一个阈值,y值大于这个阈值的是一类,y值小于这个阈值的是另外一类。阈值具体如何调整根据实际情况选择。一般会选择0.5做为阈值来划分。
-
为什么逻辑回归采用似然函数,而不是平方损失函数?
1)可以克服方差代价函数更新权重过慢的问题。原因是其梯度里面不在包含对sigmoid函数的导数。
2)最小二乘作为逻辑回归模型的损失函数(非凸)。最大似然作为逻辑回归模型的损失函数是凸函数。
- 逻辑回归为什么使用sigmoid函数
1)Sigmoid 函数自身的性质
因为这是一个最简单的,可导的,0-1阶跃函数;sigmoid 函数连续,单调递增;sigmiod 函数关于(0,0.5) 中心对称;对sigmoid函数求导简单
2)逻辑回归函数的定义
参考:
https://www.cnblogs.com/ModifyRong/p/7739955.html
https://blog.csdn.net/ddydavie/article/details/82668141
8、sklearn参数
Sklearn.linear_model.LogisticRegression
- penalty: ’l1’ or ‘l2’ ,默认’l2’
惩罚
- dual:bool 默认False
‘双配方仅用于利用liblinear解算器的l2惩罚。’
- tol: float, 默认: 1e-4
‘公差停止标准’
- C:float 默认:1.0
正则化强度, 与支持向量机一样,较小的值指定更强的正则化。
- fit_intercept: bool 默认:True
指定是否应将常量(bias或intercept)添加到决策函数中。
- intercept_scaling:float ,默认:1
仅在使用求解器“liblinear”且self.fit_intercept设置为True时有用。 在这种情况下,x变为[x,self.intercept_scaling],即具有等于intercept_scaling的常数值的“合成”特征被附加到实例矢量。 截距变为intercept_scaling * synthetic_feature_weight
- class_weight: dict or ‘balanced’ 默认:None
与{class_label:weight}形式的类相关联的权重。 如果没有给出,所有类都应该有一个权重。“平衡”模式使用y的值自动调整与输入数据中的类频率成反比的权重,如n_samples /(n_classes * np.bincount(y))。请注意,如果指定了sample_weight,这些权重将与sample_weight(通过fit方法传递)相乘。
- random_state:int,RandomState实例或None,可选,默认值:None
在随机数据混洗时使用的伪随机数生成器的种子。 如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是np.random使用的RandomState实例。 在求解器=='sag'或'liblinear'时使用。
- solver:{‘newton-cg’,’lbfgs’,’liblinear’,’sag’,’saga’}默认: ‘liblinear’
在优化问题中使用的算法。对于小型数据集,'liblinear'是一个不错的选择,而'sag'和'saga'对于大型的更快。
对于多类问题,只有'newton-cg','sag','saga'和'lbfgs'处理多项损失; 'liblinear'仅限于’ovr’方案。'newton-cg','lbfgs'和'sag'只处理L2惩罚,而'liblinear'和'saga'处理L1惩罚。请注意,“sag”和“saga”快速收敛仅在具有大致相同比例的要素上得到保证。 您可以使用sklearn.preprocessing中的缩放器预处理数据。
- max_iter: int 默认:100
仅适用于newton-cg,sag和lbfgs求解器。 求解器收敛的最大迭代次数。
- muti_class:str,{‘ovr’:’multinomial’},默认:’ovr’
多类选项可以是'ovr'或'multinomial'。 如果选择的选项是'ovr',那么二元问题适合每个标签。 另外,最小化损失是整个概率分布中的多项式损失拟合。 不适用于liblinear解算器。
- verbose: int,默认:0
对于liblinear和lbfgs求解器,将verbose设置为任何正数以表示详细程度。
- warm_start:bool 默认:False
设置为True时,重用上一次调用的解决方案以适合初始化,否则,只需擦除以前的解决方案。 对于liblinear解算器没用。
版本0.17中的新功能:warm_start支持lbfgs,newton-cg,sag,saga求解器。
- n_jobs: int,默认:1
如果multi_class ='ovr'“,则在对类进行并行化时使用的CPU核心数。 无论是否指定'multi_class',当``solver``设置为'liblinear'时,都会忽略此参数。 如果给定值-1,则使用所有核心。
参考:https://blog.csdn.net/ustbclearwang/article/details/81235892