逻辑回归模型

逻辑回归模型是针对线性可分问题的一种易于实现而且性能优异的分类模型。
它假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降法来求解参数,来达到将数据二分类的目的。

算法推导

  • 引入几率比(odds):指一个事件发生的概率与不发生概率的比值。对其求log,可得:

\[logit(p) = \log{\frac{p}{1-p}} \]

将对数几率记为输入特征值的线性表达式,可得

\[logit(P(Y=1|X)) = w^Tx \]

对于某一样本属于特定类别的概率,为\(logit\)函数的反函数,称为\(logistic\)函数,即\(sigmoid\)函数:

\[\phi(x) = \frac{1}{1+e^{-z}} \]

逻辑斯蒂回归采用sigmoid函数作为激励函数

  • 逻辑斯蒂回归模型定义:

\[P(Y=1|X) = h_\theta(x) \]

\[P(Y=0|X) = 1- h_\theta(x) \]

可知,输出\(Y=1\)的对数几率是输入\(x\)的线性函数。

  • 对于给定的训练数据集\(T\),可以应用极大似然估计法估计模型参数,假设模型概率分布是:

\[P(Y=1|X) =h_\theta(x) \]

\[P(Y=0|X) = 1-h_\theta(x) \]

似然函数为:

\[\prod_{i=1}^N{[h_\theta(x_i)]^{y_i}[1-h_\theta(x_i)]^{1-y_i}} \]

对数似然函数为:

\[l(\theta)=\sum_{i=1}^N{[y_i\log{h_\theta(x_i)}+(1-y_i)\log{(1-h_\theta(x_i))}]} \]

公式推导

我们使用梯度下降的思想来求解此问题,变换的表达式如下:

\[J(\theta)=-\frac{1}{m} l(\theta) \]

因为我们要使用当前的\(\theta\)值通过更新得到新的\(\theta\)值,所以我们需要知道\(\theta\)更新的方向(即当前\(\theta\)是加上一个数还是减去一个数离最终结果近),所以得到\(J(\theta)\)后对其求导便可得到更新方向,求导过程如下:

\[\frac{\partial J(\theta)} {\partial \theta_j} = -\frac{1}{m} \sum_{i=1}^m[(\frac{y_i}{h_\theta(x_i)}-\frac{1-y_i}{1-h_\theta(x_i)})*\frac{\partial h_\theta(x_i)}{\partial \theta_j}] \\ = -\frac{1}{m} \sum_{i=1}^m[(\frac{y_i}{h_\theta(x_i)}-\frac{1-y_i}{1-h_\theta(x_i)})*h_\theta(x_i)*(1-h_\theta(x_i))*x_i^j] \\ =\frac{1}{m} \sum_{i=1}^m (h_\theta(x_i)-y_i)x_i^j \]

得到更新方向后便可使用下面的式子不断迭代更新得到最终结果:

\[ \theta_j:= \theta_j-\alpha \frac{1}{m}\sum_{i=1}^m (h_\theta(x_i)-y_i)x_i^j \]

优缺点

  • 逻辑斯蒂回归模型的优点有:

    • 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
    • 模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。
    • 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化\(sgd\)发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
    • 资源占用小,尤其是内存。因为只需要存储各个维度的特征值,。
    • 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。
  • 逻辑斯蒂回归模型的缺点有:

    • 准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
    • 很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
    • 处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题
    • 逻辑回归本身无法筛选特征。有时候,我们会用GBDT来筛选特征,然后再上逻辑回归。

相关问题

逻辑回归与线性回归区别?

本质上来说,两者都属于广义线性模型,但他们两个要解决的问题不一样,逻辑回归解决的是分类问题,输出的是离散值,线性回归解决的是回归问题,输出的连续值。另外,损失函数方面:线性模型是平方损失函数,而逻辑回归则是似然函数。

LR的损失函数为什么要使用极大似然函数作为损失函数?

将极大似然函数取对数以后等同于对数损失函数。在逻辑回归这个模型下,对数损失函数的训练求解参数的速度是比较快的。
梯度更新速度只和\(x_{ij}\)\(y_{i}\)相关。和\(sigmod\)函数本身的梯度是无关的。这样更新的速度是可以自始至终都比较的稳定。
为什么不选平方损失函数呢?其一是因为如果你使用平方损失函数,你会发现梯度更新的速度和\(sigmod\)函数本身的梯度是很相关的。\(sigmod\)函数在它在定义域内的梯度都不大于0.25。这样训练会非常的慢。另外,在使用\(sigmod\)函数作为正样本的概率时,同时将平方损失作为损失函数,这时所构造出来的损失函数是非凸的,不容易求解,容易得到其局部最优解。

LR的损失函数为什么要使用\(sigmoid\)函数,背后的数学原理是什么?

LR假设数据服从伯努利分布,所以我们只需要知道 \(P(Y|X)\);其次我们需要一个线性模型,所以 \(P(Y|X) = f(wx)\)。接下来我们就只需要知道 \(f\) 是什么就行了。而我们可以通过最大熵原则推出的这个\(f\),就是\(sigmoid\)
\(sigmoid\)是在伯努利分布和广义线性模型的假设推导出来的。

为什么可以用梯度下降法?

因为逻辑回归的损失函数\(L\)是一个连续的凸函数(conveniently convex)。这样的函数的特征是,它只会有一个全局最优的点,不存在局部最优。对于GD跟SGD最大的潜在问题就是它们可能会陷入局部最优。然而这个问题在逻辑回归里面就不存在了,因为它的损失函数的良好特性,导致它并不会有好几个局部最优。当我们的GD跟SGD收敛以后,我们得到的极值点一定就是全局最优的点,因此我们可以放心地用GD跟SGD来求解。

逻辑回归在训练的过程当中,如果有很多的特征高度相关或者说有一个特征重复了很多遍,会造成怎样的影响

如果在损失函数最终收敛的情况下,其实就算有很多特征高度相关也不会影响分类器的效果。 但是对特征本身来说的话,假设只有一个特征,在不考虑采样的情况下,你现在将它重复 N 遍。训练以后完以后,数据还是这么多,但是这个特征本身重复了 N 遍,实质上将原来的特征分成了 N 份,每一个特征都是原来特征权重值的百分之一。

为什么LR的输入特征一般是离散的而不是连续的?

在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:

  1. 离散特征的增加和减少都很容易,易于模型的快速迭代;
  2. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  3. 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
  4. 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
  5. 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  6. 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
  7. 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

代码见:github
sklearn源码:sklearn
参考:
逻辑回归 logistics regression 公式推导
逻辑回归算法面经

原文地址:https://www.cnblogs.com/hellojamest/p/10869834.html