逻辑回归是一种广义线性模型,它与线性回归模型包含的线性函数十分相似。但逻辑回归通过对数概率函数将线性函数的结果进行映射,目标函数的取值空间从( ∞, +∞)映射到了(0,1)从而可以处理分类问题。逻辑回归虽然有"回归"二字,却是统计学习中经典分类方法。
1. 模型介绍
Logistic Regression虽然被称为回归,但实际上是分类模型,并常用于二分类。Logistic Regression因其简单、可并行化、可解释强深受工业届喜爱。
Logistic回归的本质是:假设数据服从这个分布,然后使用极大似然估计做参数的估计。
1.1 Logistic 分布
Logistic分布是一种连续型的概率分布,其分布函数和密度函数分别为:
其中, 表示位置参数,>0为形状参数。我们可以看下其图像特征:
Logistic分布是由其位置和尺度参数定义的连续分布。Logistic分布的形状与正态分布的形状相似,但是Logistic分布的尾部更长,所以我们可以使用Logistic分布来建模比正态分布具有更长尾部和更高波峰的数据分布。在深度学习中常用到的Sigmoid函数就是Logistic的分布函数在 = 0, = 1 的特殊形式。
逻辑回归的思路是:先拟合决策边界(不局限于线性,还可以是多项式),再建立这个边界与分类的概率联系,从而得到了二分类情况下的概率。
在这我们思考一个问题,我们使用对数几率的意义在哪?通过上述推导我们可以看到Logistic回归实际上是使用线性回归模型的预测值逼近分类任务真实标记的对数几率,其优点有:
(1)直接对分类的概率建模,无需实现假设数据分布,从而避免了假设分布不准确带来的问题(区别于生成式模型);
(2)不仅可预测出类别,还能得到该预测的概率,这对一些利用概率辅助决策的任务很有用;
(3)对数几率函数是任意阶可导的凸函数,有许多数值优化算法都可以求出最优解。
在逻辑回归模型中,我们最大化似然函数和最小化损失函数实际上是等价的。
1.2 求解
求解逻辑回归的方法非常多,我们这里主要聊下梯度下降和牛顿法。优化的主要目标是找到一个方向,参数朝这个方向移动之后使得损失函数的值能够减小,这个方向往往由一阶偏导或者二阶偏导各种组合求得。逻辑回归的损失函数是:
1.3 正则化
正则化是一个通用的算法和思想,所以会产生过拟合现象的算法都可以使用正则化来避免过拟合。在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,可以有效提高泛化预测精度。如果模型过于复杂,变量值稍微有点变动,就会引起预测精度问题。正则化之所以有效,就是因为其降低了特征的权重,使得模型更为简单。
正则化一般会采用L1范式或者L2范式,其形式分别为
(1)L1正则化的本质其实是为模型增加了"模型参数服从零均值拉普拉斯分布"这一先验知识。
(2)L2正则的本质其实是为模型增加了”模型参数服从零均值正态分布“这一先验知识。
(3)L1和L2的区别
从上面的分析中我们可以看到,L1 正则化增加了所有权重 w 参数的绝对值之和逼迫更多 w 为零,也就是变稀疏( L2 因为其导数也趋 0, 奔向零的速度不如 L1 给力了)。我们对稀疏规则趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,大部分特征 x_i 都是和最终的输出 y_i 没有关系或者不提供任何信息的。在最小化目标函数的时候考虑 x_i 这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的特征权重反而会被考虑,从而干扰了对正确 y_i 的预测。L1 正则化的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些无用的特征,也就是把这些特征对应的权重置为 0。
L2 正则化中增加所有权重 w 参数的平方之和,逼迫所有 w 尽可能趋向零但不为零(L2 的导数趋于零)。因为在未加入 L2 正则化发生过拟合时,拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大,在某些很小的区间里,函数值的变化很剧烈,也就是某些 w 值非常大。为此,L2 正则化的加入就惩罚了权重变大的趋势。
正则化之所以能够降低过拟合的原因在于,正则化是结构风险最小化的一种策略实现。
2. 与其他模型相比
逻辑回归是在线性回归的基础上加上了一个Sigmoid函数(非线性)映射,使得逻辑回归成为了一个优秀的分类算法。本质上来说,两者都属于广义线性模型,但他们两个要解决的问题不一样,逻辑回归解决的是分类问题,输出的是离散值,线性回归解决的是回归问题,输出的是连续值。
2.1线性回归
我们需要明确Sigmoid函数到底起了什么作用:
(1)线性回归是在实数域范围内进行预测,而分类范围则需要在[0,1],逻辑回归减少了预测范围;
(2)线性回归在实数域上敏感度一致,而逻辑回归在0附近敏感,在远离0点位置不敏感,这个的好处就是模型更加关注分类边界,可以增加模型的鲁棒性。
2.2 最大熵模型
逻辑回归和最大熵模型本质上没有区别,最大熵在解决二分类问题时就是逻辑回归,在解决多分类问题时就是多项式逻辑回归。
2.3 SVM
相同点:
(1)都是分类算法,本质上都是在找最佳分类超平面;
(2)都是监督学习算法
(3)都是判别式模型,判别模型不关心数据是怎么生成的,它只关心数据之间的差别,然后用差别来简单对给定的一个数据进行分类。
(4)都可以增加不同的正则项。
不同点:
(1)LR是一个统计的方法,SVM是一个几何的方法;
(2)SVM的处理方法是只考了Support Vector,也就是和分类最相关的少数点去学习分类器。
(3)损失函数不同:LR的损失函数是交叉熵,SVM的损失函数是HingeLoss,这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。对HingeLoss来说,其零区域对应的正式非支持向量的普通样本,从而所有的普通样本都不参与最终超平面的决定,这是支持向量机最大的优势所在,对训练样本数目的依赖大减少,而且提高了训练效率。
(4)LR是参数模型,SVM是非参数模型,参数模型的前提是假设数据服从某一分布,该分布由一些参数确定(比如正态分布由均值和方差确定),在此基础上构建的模型称为参数模型;非参数模型对于总体的分布不做任何假设,只是知道总体是一个随机变量,其分布是存在的(分布中也可能存在参数),但是无法知道其分布的形式,更不知道分布的相关参数,只有在给定一些样本的条件下,能够依据非参数统计的方法进行判断。所以LR受数据分布影响,尤其是样本不均衡时影响很大,需要先做平衡,而SVM不直接依赖于分布。
(5)LR可以产生概率,SVM不能
(6)LR不依赖样本之间的距离,SVM是基于距离;
(7)LR相对来说模型更简单好理解,特别是大规模线性分类时并行计算比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
2.4 朴素贝叶斯
朴素贝叶斯和逻辑回归都属于分类模型,当朴素贝叶斯的条件概率服从高斯分布时,它计算出来的形式跟逻辑回归是一样的。
两个模型不同的地方在于:
(1)逻辑回归是判别式模型 p(y|x),朴素贝叶斯是生成式模型 p(x,y):判别式模型估计的是条件概率分布,给定观测变量 x 和目标变量 y 的条件模型,由数据直接学习决策函数 y=f(x) 或者条件概率分布 P(y|x) 作为预测的模型。判别方法关心的是对于给定的输入 x,应该预测什么样的输出 y;而生成式模型估计的是联合概率分布,基本思想是首先建立样本的联合概率概率密度模型 P(x,y),然后再得到后验概率 P(y|x),再利用它进行分类,生成式更关心的是对于给定输入 x 和输出 y 的生成关系;
(2)朴素贝叶斯的前提是条件独立,每个特征权重独立,所以如果数据不符合这个情况,朴素贝叶斯的分类表现就没逻辑会好。
3.模型细节
3.1为什么适合离散特征
我们在使用逻辑回归的时候很少会把数据直接丢给LR来训练,我们一般会对特征进行离散化处理,这样做的优势大致有以下几点:
(1)离散后稀疏向量内积乘法运算速度更快,计算结果也方便存储,容易扩展;
(2)离散后的特征对异常值更具鲁棒性,如age>30为1,否则为0,对于年龄为200的也不会对模型造成很大的干扰;
(3)LR属于广义线性模型,表达能力有限,经过离散化后,每个变量有单独的权重,这相当于引入了非线性,能够提升模型的表达能力,加大拟合;
(4)离散后特征可以进行特征交叉,提升表达能力,由M+N个变量编程M*N个变量,进一步引入非线性,提升了表达能力;
(5)特征离散后模型更稳定,如用户年龄区间,不会因为用户年龄长了一岁就变化;
总的来说,特征离散化以后起到了加快计算,简化模型和增加泛化能力的作用。
4.逻辑回归的欠、过拟合
解决LR回归的欠拟合:增加特征的维度
解决LR的过拟合:
(1)减少特征的数量,可人工特征选择,也可降维等模型算法选择
(2)正则化(加入L1,L2罚项)
(3)逐渐减小梯度下降学习率α
5.逻辑回归的优缺点
优点:
(1)直接对分类的可能性建模,无需事先假设数据分布,避免了假设分布不准确带来的问题
(2)不仅预测出类别,还可得到近似概率预测
(3)对函数是任意阶可导凸函数,有很好的数学性质,很多数值优化算法可直接用于求得最优解。
(4)容易使用和解释,计算代价低。
(5)LR对时间和内存需求上相当高效
(6)可应用于分布式数据,并且还有在线算法实现,用较小资源处理较大数据
(7)对数据中小噪声鲁棒性很好,并且不会受到轻微多重共线性影响。
(8)因为结果是概率,可用作排序模型。
缺点:
(1)容易欠拟合,分类精度不高。
(2)数据特征有缺失或特征空间很大时效果不好。
6.逻辑回归面对线性不可分数据
逻辑回归本质上是一个线性模型,可通过:
(1)利用特殊核函数,对于特征进行变换把低维空间转换到高维空间,使用组合特征映射(如多项式特征)。但组合特征泛化能力较弱。
(2)扩展LR算法,提出FM算法。
7.逻辑回归通常稀疏的原因
(1)分类特征通常采用one-hot转换成数值特征,产生大量稀疏。
(2)一般很少直接将连续值作为逻辑回归模型输入,而是将连续特征离散化
LR一般需要连续特征离散化原因
(1)离散特征的增加和减少都很容易,易于模型快速迭代
(2)稀疏向量内积乘法速度快,快速结果方便存储,容易扩展。
(3)离散化的特征对异常数据有很强的鲁棒性(比如年龄为300异常值可归为年龄>30这一段)
(4)逻辑回归属于广义线性模型,表达能力受限。单变量离散化为N个后,每个变量有单独的权重,相当于对模型引入了非线性,能够提升模型表达能力,加大拟合
(5)离散化进行特征交叉,由M+N个变量为M*N个变量(将单个特征分成M个取值),进一步引入非线性,提升表达能力。
(6)特征离散化后,模型会更稳定(比如对用户年龄离散化,20-30作为一个区间,不会因为用户年龄,增加一岁编程完全不同的人,但区间相邻处样本相反,所以怎样划分区间很重要)
(7)特征离散化后,简化了LR模型,降低过拟合的风险。
8.逻辑回归和线性回归的异同
相同之处:
(1)都使用了极大似然估计来对样本建模。线性回归使用最小二乘法,实际上就是自变量x和参数确定,因变量y服从正态分布的假设下,使用最大似然估计的一个化简。逻辑回归通过对似然函数的学习,得到最佳参数。
(2)二者在求解参数的过程中,都可以使用梯度下降的方法。
不同之处:
(1)逻辑回归处理的是分类问题,线性回归处理的是回归问题。
(2)逻辑回归中因变量取值是一个二元分布,模型学习得出的是E[y|x;],即给定自变量和参数后,得到因变量的期望。而线性回归实际上求解的是,是对假设的真实关系,的一个近似,其中是误差项。
(3)逻辑回归中因变量是离散的,线性回归中的因变量是连续的。并在自变量与参数确定情况下,逻辑回归可以看作广义线性模型在因变量y服从二元分布时一个特殊情况,而使用最小二乘法求解线性回归时,我们认为因变量y服从正态分布。
9.逻辑回归的应用场景
(1)CTR预估,Recommender System的Learning to Rank
(2)病理诊断,可用于寻找某一疾病的危险因素
(3)信用评估领域
(4)垃圾邮件分类
10.逻辑回归 sklearn中的参数
(1)penalty='l2':字符串'l1'或"l2",默认"l2"。用来指定惩罚的基准(正则化参数),只有"l2"支持”newton-cg“,"sag"和"lbfgs"这三种算法。如果选择‘l2’,solver参数可以选择‘liblinear’、‘newton-cg’、‘sag’和‘lbfgs’这四种算法;如果选择‘l1’的话就只能用‘liblinear’算法。
(2)dual=False:对偶或者原始方法。Dual只适用于正则化相为l2的”liblinear“的情况,通常样本数大于特征数的情况下,默认为False。
(3)C=1.0:C为正则化系数的倒数,必须为正数,默认为1。和SVM中的C一样,值越小,代表正则化越强。
(4)fit_intercept=True:是否存在截距,默认存在。
(5)intercept_scaling=1:仅在正则化项为"liblinear",且fit_intercept设置为True时有用。
(6)solver=”liblinear“:solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择。
a)liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
b)lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
c)newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
d)sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
(7)multi_class=’ovr‘:分类方式。
a)ovr即one-vs-rest(OvR),multinomial是many-vs-many(MvM)。如果二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。
b)ovr不论是纪元5回归,都当成二元回归来处理。mvm是从多个类中每次选两个类进行二元回归。如果共有T类,需要T(T-1)/2次分类。
c)OvR相对简单,但分类效果相对略差(大多数样本分布情况)。而MvM分类相对精确,但是分类速度没有OvR快。
d)如果选择了ovr,则四种损失函数的优化方法liblinear,newton-cg,lbfgs和sag都可以选择。但是如果选择了multinomial,则只能选择newton-cg,lbfgs和sag了。
(8)class_weight=None:类型权重参数。用于标示分类模型中各种类型的权重。默认不输入,即所有的分类的权重一样。
a)选择"balanced"自动根据y值计算类型权重。
b)自己设置权重,格式:{class_label:weight}。例如0,1分类的二元模型,设置class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。
(9)random_state=None:随机数种子,默认为无。仅在正则化优化算法为sag或liblinear时有用。
(10)max_iter=100:算法收敛的最大迭代次数。
(11)verbose=0:日志冗长度int 0:不输出训练过程;1:偶尔输出; >1:对每个子模型都输出
(12)warm_start=False:是否热启动,如果是,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。布尔型,默认False。
(13)n_jobs:并行数,-1:跟CPU核数一致;1:默认值。
LogisticRegression类的常用方法
score(X,y,sample_weight=None):返回给定测试集合的平均准确率(mean accuracy), 浮点型数值。对于多个分类返回,则返回每个类别的准确率组成的哈希矩阵。