logistic回归概述及python应用

发布于 2021-08-30  1724 次阅读


逻辑回归概述

逻辑回归(logistic regression)是一种可以用于分类的回归算法,多用于二分类任务。简单地说,任何需要预测“二选一”事件可能性(比如,好用户还是坏用户,流失还是不流失)都可以用于逻辑回归来预测。

区别于一般的线性回归,逻辑回归计算每个样本介于0~1的概率值。我们可以选择一个概率阈值,比如0.5,当概率大于0.5时,判定样本属于某一类。当概率小于0.5时,样本属于另一类。

Sigmoid函数的引用

对于一个二元目标来说,逻辑回归的目的是要预测自变量相对与因变量是“是”或“否”的概率,是一个在[0,1]的概率值。如果用一般的线性回归方法来计算,得到的值域是整个实数域,远远超过[0,1]这个范围。那么问题来了,如何将一个实数域的输出范围转换到[0,1]的范围呢?

仔细观察这个问题,我们的输出需要满足两个条件:大于等于0且小于等于1.要让输出在任何情况下都大于等于0,可以用指数函数:

p = e^{\beta_0+\beta_1x_1+\beta_2x_2+?+\beta_kx_k}

其中, \beta_0 是常数, \beta_1\beta_k 是自变量各自对应的系数。
再让结果在任何情况下都小于等于1,可以让它作为分子,分母是自身加上1,那么结果肯定是小于1的了。

p = \frac {e^{\beta_0+\beta_1x_1+\beta_2x_2+?+\beta_kx_k}}{e^{\beta_0+\beta_1x_1+\beta_2x_2+?+\beta_kx_k}+1}

我们再对这个公式稍加变形,就得到了专门的概率计算公式,或叫Sigmoid函数:

p(y=1) = \frac {1} {e^{-(\beta_0+\beta_1x_1+\beta_2x_2+?+\beta_kx_k})+1}

绘制sigmoid函数

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10,10,2000)
f = np.vectorize(lambda x:1/(np.exp(-x)+1))
y = f(x)
plt.plot(x,y)
plt.show(

可以看到,Sigmoid函数连续、光滑、严格单调,且中心对称,可以保证我们对目标变量的输出(即概率值)是在[0,1]范围内的。

可能性比率

我们再来介绍逻辑回归中另一个重要概念:可能性比率(Odds)。可能性比率是指一件事件发生的概率与该事件不发生的概率的比值,即:

Odds = \frac {p(y=1)} {1-p(y=1)}

举例来说,如果Odds等于1,则说明这件事发生与不发生的概率均为50%。如果Odds大于1,则该事件发生的概率高于50%,小于1则事件发生的概率小于50%。
综合可能性比率公式和之前的Sigmoid函数,我们可以得到逻辑回归的公式:

Odds = e^{\beta_0+\beta_1x_1+\beta_2x_2+?+\beta_kx_k}

或者:

log(Odds) = log(\frac {p(y=1)}{1-p(y=1)}) = \beta_0+\beta_1x_1+\beta_2x_2+?+\beta_kx_k

算法过程

  1. 收集自变量和因变量的数据,并筛选特征。
  2. 构造逻辑回归方程。
  3. 构造损失函数,利用梯度上升法求得使损失函数最小的回归参数。
  4. 模型性能检验,如准确率、混淆矩阵等。

在进行逻辑回归的模型训练过程中,不是所有的变量都适合进入最终的模型。添加进不恰当的自变量反而可能使得模型的效果变差,因此需要对变量做筛选。常见的筛选方法有3种:向前引入法(forward selection)、向后剔除法(backward deletion)和逐步回归法(stepwise selection)。

向前引入法

将自变量逐个引入回归模型。首先,在所有m个自变量中选择一个与因变量关系最密切的变量,再在所有剩余的(m-1)个自变量中挑选最优的自变量使得模型效果最好,依次不断继续下去,直到当某个自变量进入模型后,模型的效果不再显著提升,即说明新引入的变量不再对因变量具有显著影响。

这种方法的缺点是先引入的自变量在之后不会被剔除出去,但在新变量加入后,可能导致老变量变得不显著,这是继续保留老的变量是不合理的。

向后剔除法

与向前引入法相反,向后剔除法先引入所有的自变量,再逐个剔除掉对模型影响最小的变量,知道剩余的所有变量的显著性水平都高于设置的阈值。

这个方法的缺点和向前引入法类似,先被剔除的变量就再也没有机会重新进入模型了,而随着变量的变化,先被删除的变量可能又重新变得有显著性,但却没有办法重新纳入模型。

逐步回归法

逐步回归法综合了以上两种方法的优点。自变量仍然首先逐个引入回归模型中,不同的是,每次当新变量被引入后,又要对所有已有的变量进行检验,一旦发现有变量变得不显著时就立刻删除该变量,如此循环直到保留下的所有变量均无法删除,且新的变量也无法加入为止。

优点:

  • 产生的模型可解释性强,可以看到各个变量的权重和影响。
  • 无需是先假设数据的分布,避免了假设分布不准确造成的问题。
  • 不仅给出预测的类别,也给出概率值的预测,有利于实现其他更精细的决策。

缺点:

  • 对异常值敏感。
  • 无法处理缺失值,需要进行适当的处理。
  • 预测精度一般,容易欠拟合。
# 使用逻辑回归对乳腺癌数据集进行二分类
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split

# 导入数据集并分为训练集和测试集
breast_cancer = datasets.load_breast_cancer()
x = breast_cancer['data']
y = breast_cancer['target']
X_train, X_test, Y_train, Y_test = train_test_split(x, y, random_state=42)

# 逻辑回归拟合
log_reg = LogisticRegression()
log_reg.fit(X_train, Y_train)

# 测试集效果检验,输出混淆矩阵。
y_predict = log_reg.predict(X_test)# 预测测试集结果
print(confusion_matrix(Y_test,y_predict))

小结

逻辑回归是一种典型的有监督分类算法,多用于解决二分类问题。逻辑回归模型虽然是非线性模型,但他的本质却可以看成是线性回归与Sigmoid函数的结合。传统的线性回归帮助我们拟合函数曲线的最佳参数,而Sigmoid函数帮助我们讲述处置固定在0~1。

扩展之多项逻辑回归模型

之前,我们介绍了用于二分类的逻辑回归模型。也可以将其扩展,支持多个类别的分类问题,成为多项逻辑回归模型。要实现这一点,只需将SIgmoid函数替换为Softmax函数即可:

p(y=k) = \frac {e^{W_k^Tx+b_k}} {\sum_{j=1}^Ke^{W_j^Tx+b_j}},j=1,2,?K

其中,p(y=k)表示将一个样本分为第k类的概率大小。计算过程也很简单,即该样本的指数与所有样本指数的比值。多项逻辑回归针对每一个带预测的类别计算一组参数,然后利用Softmax函数计算每类的概率(所有类别的概率总和为1,与二分类一样),计算概率最大的那个类别即预测的类别。