自然语言处理学习笔记

学习笔记-逻辑回归

2020-03-03  本文已影响0人  Pluto_wl

逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。

模型

  1. 逻辑回归的学习了下列的条件概率分布:
    P(y=1|x)=\frac{1}{1+e^{-{wx}}}
    P(y=0|x)=1-P(y=1|x)=1-\frac{1}{1+e^{-{wx}}} =\frac{e^{-{wx}}}{1+e^{-{wx}}}
    把上述两式写成一个式子:P(y|x ) =\frac{1}{1+e^{-{wx}}}^y(1-\frac{1}{1+e^{-{wx}}})^{1-y}
  2. 对数线性模型
    逻辑回归也是对数线性模型,我们将P(y=1|x)与1-P(y=1|x)的比加上log,即
    log\frac{P(y=1|x)}{1-P(y=1|x)}=-wx
    这就是说,在逻辑回归中,输出y=1的对数几率是输入x的线性函数,所以逻辑回归是对数线性模型。

模型参数估计

在训练逻辑回归可以使用极大似然估计模型参数;
第一步:确定似然函数
\prod_{i=1}^{N}p(y_i=1|x_i)^{y_i} (1-p(y_i|x_i)^{1-y_i}
第二步:对数似然函数
对似然函数加上log
J(w)=log( \prod_{i=1}^{N}p(y_i=1|x_i)^{y_i} (1-p(y_i|x_i)^{1-y_i})
J(w)=(\sum_{i=1}^{N} {(y_i}log(p(y_i=1|x_i) + (1-y_i) log(1-p(y_i|x_i))

第三步使用梯度下降法优化参数
接下来的步骤就是求J(w)得最大值,得到w得估计。

  1. 求导
    \frac{\partial J(w)}{\partial w}=\sum_i^N[y_i \frac{1}{\sigma(x_i)} \frac{\partial \sigma(x_i)}{\partial w} -(1-y_i)\frac{1}{\sigma(x_i)} \frac{\partial \sigma(x_i)}{\partial w}]
    这里需要使用\sigma(x)得导数:\sigma(x)(1-\sigma(x)),但本问题是对w求导,所以根据隐函数求导法则,\sigma(x)对w得导数\sigma(x)(1-\sigma(x))x 带入上式中,
    \frac{\partial J(w)}{\partial w} = \sum_i^N \left ( y_{i} - \sigma(x_{i} ) \right )\ast x_{i}

  2. 更新
    利用梯度下降法更新
    \theta=\theta - lr* \sum_i^N \left ( y_{i} - \sigma(x_{i} ) \right )\ast x_{i}

优缺点

优点

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

缺点

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

经典问题

  1. 逻辑回归是线性模型还是非线性模型?
    线性模型
  2. 逻辑回归为什么不用MSE作为损失函数?
    使用mes做损失函数,其梯度更新函数为\theta = \theta−lr* 2∗(\sigma(x_i)∗(1−\sigma(x_i))x_i
    \sigma最大值为0.25. 每次最多更新0.25x_i,太慢了. 加大学习率确实可以帮助缓解这个问题,但是在学习的过程当中,学习率始终保持不变,当模型学到后期,参数和最优解已经隔的比较近了,你还保持最初的学习率,容易越过最优点,这中间需要自适应学习率了。
  3. 逻辑回归在训练的过程当中,如果有很多的特征高度相关或者说有一个特征重复了100遍,会造成怎样的影响?
    (1). 先说结论,如果在损失函数最终收敛的情况下,其实就算有很多特征高度相关也不会影响分类器的效果。
    (2). 但是对特征本身来说的话,假设只有一个特征,在不考虑采样的情况下,你现在将它重复100遍。训练以后完以后,数据还是这么多,但是这个特征本身重复了100遍,实质上将原来的特征分成了100份,每一个特征都是原来特征权重值的百分之一。
    (3)如果在随机采样的情况下,其实训练收敛完以后,还是可以认为这100个特征和原来那一个特征扮演的效果一样,只是可能中间很多特征的值正负相消了。
  4. 为什么我们还是会在训练的过程当中将高度相关的特征去掉?
    (1). 去掉高度相关的特征会让模型的可解释性更好
    (2). 可以大大提高训练的速度。如果模型当中有很多特征高度相关的话,就 算损失函数本身收敛了,但实际上参数是没有收敛的,这样会拉低训练的速度。其次是特征多了,本身就会增大训练的时间。

参考文献

  1. https://tech.meituan.com/2015/05/08/intro-to-logistic-regression.html
  2. https://www.cnblogs.com/modifyrong/p/7739955.html
  3. https://www.cnblogs.com/pinard/p/6029432.html
上一篇下一篇

猜你喜欢

热点阅读