1. 逻辑回归理论与Python实现

逻辑回归

一、概念

  逻辑回归是一种很容易实现的分类模型,但仅在线性可分类上表现不错。是一种应用广泛的 二分类模型,而且可以利用 OVR 技术扩展到多元分类。

  要解释作为概率模型的逻辑回归原理,首先要介绍 让步比,既有利于某一特定事件的概率。让步比可以定义为 p 1 − p \frac{p}{1-p} 1pp p p p 代表阳性事件的概率。阳性事件是指要预测的事件,例如患新冠肺炎的可能性或彩票中奖的可能性。可以认为阳性事件的分类标签 t a r g e t = 1 target = 1 target=1 。可以进一步定义 logit 函数(让步比的对数形式)。
l o g i t ( p ) = l o g p 1 − p (1) logit(p) = log\frac{p}{1-p} \tag{1} logit(p)=log1pp(1)
   l o g log log 为自然对数, l o g i t logit logit 函数输入值的取值范围在 0 到 1 之间,转换或计算的结果值为整个实数范围,此时我们来回顾一下 回归方程
y = l o g i t ( p ( y = 1 ∣ x ) ) = w 0 + w 1 x 1 + w 2 x 2 + ⋯ + w n x n = ∑ i = 0 n w i x i = W T X (2) y = logit(p(y=1|x)) = w_0 + w_1x_1 + w_2x_2 + \dots + w_n x_n = \sum\limits^n_{i=0}w_ix_i = W^TX \tag{2} y=logit(p(y=1x))=w0+w1x1+w2x2++wnxn=i=0nwixi=WTX(2)
   y y y 的阈值处于 ( − ∞ ,    + ∞ ) (-\infty, \; +\infty) (,+) ,此时不能很好的给出某一类的概率,因为概率的取值应在 [ 0 ,    1 ] [0, \; 1] [0,1] 之间,并且这个函数能够具有很好的可微分性,因此找到了 l o g i t logit logit 函数的逆形式,及 S i g m o i d Sigmoid Sigmoid 函数(也叫 逻 辑 S i g m o i d 逻辑 Sigmoid Sigmoid 函数),有关于 S i g m o i d Sigmoid Sigmoid 函数的知识可参考我的另一篇文章:神经网络,此处不再重复解释。 S i g m o i d Sigmoid Sigmoid 函数的形式为:
ϕ ( z ) = 1 1 + e − z (3) \phi(z) = \frac{1}{1+e^{-z}} \tag{3} ϕ(z)=1+ez1(3)

  此时可以看到,当 z z z 取向 + ∞ +\infty + 时, ϕ ( z ) \phi(z) ϕ(z) 的值接近于1,我们以 0.5 为界限,得到逻辑回归的目标函数:
y ^ = { 1 , if ϕ ( z )   ≥  0.5 0 otherwise (4) \hat y = \begin{cases} 1, & \text{if$\phi(z)$ $\ge$ 0.5} \\ 0 & \text{otherwise} \tag{4} \end{cases} y^={1,0ifϕ(z)  0.5otherwise(4)
  综合可得
p ( y ∣ x ) = y ^ y ( 1 − y ^ ) ( 1 − y ) (5) p(y|x) = \hat y^y(1-\hat y)^{(1-y)} \tag{5} p(yx)=y^y(1y^)(1y)(5)

  在进行逻辑回归相关问题的讨论上,我们均认为 y y y 是因变量,而非 p 1 − p \frac{p}{1-p} 1pp,这便引出逻辑回归和线性回归最大的区别,即逻辑回归中的因变量为离散的,而线性回归中的因变量是连续的。并且在自变量 x x x 与超参数 w w w 确定的情况下,逻辑回归可以看作 广义线性模型 ( G e n e r a l i z e d    L i n e a r    M o d e l ) (Generalized \; Linear \; Model) (GeneralizedLinearModel) 在因变量 y y y 服从二元分布时的一个特殊情况;而使用最小二乘法求解线性回归时,我们认为因变量 y y y 服从正态分布。

二、代价函数

2.1 损失函数

  因为逻辑回归是为了解决二分类问题,即我们的目的应该是求取参数 w w w b b b 使得 p ( y    ∣    x ) p(y\; |\; x) p(yx) 对 0 类和 1 类的分类结果尽可能取最大值。然而我们定义损失函数时往往是为了最大化的达到我们的目的的同时使所付出的代价最小(损失函数最小)。于是很自然地在目的函数前加一个负号就得到了我们逻辑回归的损失函数:
log ⁡ p ( y    ∣    x ) = y log ⁡ y ^ − ( 1 − y ) log ⁡ ( 1 − y ^ ) L ( y ^   , y ) = − y log ⁡ ( y ^ ) − ( 1 − y ) log ⁡ ( 1 − y ^ ) (6) \log p(y\; |\; x) = y\log \hat y−(1−y)\log(1−\hat y) \\ L(\hat y\,, y)=−y \log(\hat y)−(1−y)\log(1−\hat y) \tag{6} logp(yx)=ylogy^(1y)log(1y^)L(y^,y)=ylog(y^)(1y)log(1y^)(6)
  根据损失函数是单个样本的预测值和实际值的误差,而成本函数是全部样本的预测值和实际值之间的误差,于是对所有样本的损失值取平均,得到我们的成本函数:
J ( w ,    b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) ,    y ( i ) ) (7) J(w,\; b) = \frac{1}{m}\sum\limits^m_{i=1}L(\hat y^{(i)},\; y^{(i)}) \tag{7} J(w,b)=m1i=1mL(y^(i),y(i))(7)

2.2 极大似然法

  要解释清除如何得到逻辑回归的代价函数,需要首先定义在建立逻辑回归模型时想要最大化的可能性 L L L,假设数据集中的样本都是相互独立的个体,极大似然估计逻辑回归中的参数 w w w b b b。利用极大似然法的原则,假设所有样本独立同分布, 则联合概率为所有样本概率的乘积,公式如下:
L ( w ) = P ( y    ∣    x ;    w ) = ∏ i = 1 n P ( y ( i )    ∣    x ( i ) ;    w ) = ∏ i = 1 n ( ϕ ( z ( i ) ) ) y ( i ) ( 1 − ϕ ( z ( i ) ) ) 1 − y ( i ) (8) \begin{aligned} L(w) &= P(y\; | \; x;\;w) = \prod^n_{i=1}P(y^{(i)} \; | \; x^{(i)}; \; w) \\ &= \prod^{n}_{i=1}(\phi(z^{(i)}))^{y^{(i)}}(1-\phi(z^{(i)}))^{1-y^{(i)}} \end{aligned} \tag{8} L(w)=P(yx;w)=i=1nP(y(i)x(i);w)=i=1n(ϕ(z(i)))y(i)(1ϕ(z(i)))1y(i)(8)
  在实践中,最大化该方程的自然对数,也被称为对数自然函数。
l ( w ) = log ⁡ ( L ( w ) ) = ∑ i = 1 n [ y ( i ) log ⁡ ( ϕ ( z ( i ) ) ) + ( 1 − y i ) log ⁡ ( 1 − ϕ ( z ( i ) ) ) ] (9) l(w) = \log(L(w)) = \sum\limits^n_{i=1}[y^{(i)}\log(\phi(z^{(i)})) + (1-y^{i}) \log (1-\phi(z^{(i)}))] \tag{9} l(w)=log(L(w))=i=1n[y(i)log(ϕ(z(i)))+(1yi)log(1ϕ(z(i)))](9)
  极大似然估计的本质就是选取 ϕ 0 , ϕ 1 , … , ϕ k \phi_0 , \phi_1 , … , \phi_k ϕ0,ϕ1,,ϕk 使得我们的上式对数似然函数最大。

2.3 优化

  首先,应用对数 log ⁡ \log log 函数降低数值下溢的可能性,这种情况在似然率非常小的情况下可能发生。其次,可以利用微积分的知识,将因子乘积转化成因子求和,这样就可以通过加法技巧更容易的得到该函数的导数。

  现在可以用诸如梯度下降等优化算法来最大化这个对数似然函数。另外一个选择是重写对数 $\log $ 似然函数作为代价函数 J J J,用梯度下降方法来最小化代价函数。
J ( w ) = ∑ i = 1 n [ − y ( i ) log ⁡ ( ϕ ( z ( i ) ) ) − ( 1 − y ( i ) ) log ⁡ ( 1 − ϕ ( z ( i ) ) ) ] (10) J(w) = \sum\limits^n_{i=1}[-y^{(i)} \log (\phi(z^{(i)})) - (1-y^{(i)}) \log (1-\phi(z^{(i)}))] \tag{10} J(w)=i=1n[y(i)log(ϕ(z(i)))(1y(i))log(1ϕ(z(i)))](10)
  为了更高的理解公式 ( 10 ) (10) (10) ,计算一个样本训练实例的代价:
J ( ϕ ( z ) ,    y ;    w ) = − y log ⁡ ( ϕ ( z ) ) − ( 1 − y ) log ⁡ ( 1 − ϕ ( z ) ) (11) J (\phi(z),\;y;\;w) = -y\log(\phi(z)) - (1-y)\log(1-\phi(z)) \tag{11} J(ϕ(z),y;w)=ylog(ϕ(z))(1y)log(1ϕ(z))(11)
  可以看到,如果 y = 0 y=0 y=0,第一项为0,如果 y = 1 y=1 y=1,第二项为0:
J ( ϕ ( z ) ,    y ;    w ) = { − log ⁡ ( ϕ ( z ) ) if     y = 1 − log ⁡ ( 1 − ϕ ( z ) ) if     y = 0 (12) J(\phi(z),\;y;\;w) = \begin{cases} -\log(\phi(z)) & \text{if $\;y=1$} \\ -\log(1-\phi(z)) & \text{if $\;y=0$} \end{cases} \tag{12} J(ϕ(z),y;w)={log(ϕ(z))log(1ϕ(z))if y=1if y=0(12)
  通过可视化来说明 ϕ ( z ) \phi(z) ϕ(z) 不同样本实例分类的代价:

def sigmoid(z):
    return 1.0 / (1.0 + np.exp(-z))

def cost_1(z):
    return -np.log(sigmoid(z))

def cost_0(z):
    return -np.log(1 - sigmoid(z))
z = np.arange(-10, 10, 0.1)
phi_z = sigmoid(z)
c1 = [cost_1(x) for x in z]
c0 = [cost_0(x) for x in z]
plt.plot(phi_z, c1, 'b-', label='$J(w) \; if \; y=1$')
plt.plot(phi_z, c0, 'r--', label='$J(w) \; if \; y=0$')
plt.ylim(0, 5.1)
plt.xlim([0, 1])
plt.xlabel('$\phi(z)$')
plt.ylabel('$J(w)$')
plt.legend(loc='best')

在这里插入图片描述

  如图所示,如果正确的预测样本属于第一类,代价就会接近于0。类似的,如果正确的预测 y = 0 y=0 y=0(虚线),那么代价也会接近于0,而如果预测错误,代价就会趋于无穷大。关键在于用越来越大的代价惩罚错误的预测。

2.4 逻辑回归中的梯度下降

  以下梯度下降学习规则是对逻辑回归的梯度下降学习规则背后的数学概念有兴趣的准备的,首先从计算对数似然函数的偏导数开始:
∂ ∂ w j l ( w ) = ( y 1 ϕ ( z ) − ( 1 − y ) 1 1 − ϕ ( z ) ) ∂ ∂ w j ϕ ( z ) (13) \frac{\partial}{\partial w_j}l(w)=(y\frac{1}{\phi(z)} - (1-y)\frac{1}{1-\phi(z)})\frac{\partial}{\partial w_j} \phi(z) \tag{13} wjl(w)=(yϕ(z)1(1y)1ϕ(z)1)wjϕ(z)(13)
  计算 S i g m o i d Sigmoid Sigmoid 函数的偏导数:
∂ ∂ z ϕ ( z ) = ∂ ∂ z 1 1 + e − z = ϕ ( z ) ( 1 − ϕ ( z ) ) (14) \begin{aligned} \frac{\partial}{\partial z}\phi(z) &= \frac{\partial}{\partial z}\frac{1}{1+e^{-z}} \\ &= \phi(z)(1-\phi(z)) \end{aligned} \tag{14} zϕ(z)=z1+ez1=ϕ(z)(1ϕ(z))(14)
  可以在 公 式 13 公式13 13 中替换 ∂ ∂ z ϕ ( z ) = ϕ ( z ) ( 1 − ϕ ( z ) ) \frac{\partial}{\partial z}\phi(z) = \phi(z)(1-\phi(z)) zϕ(z)=ϕ(z)(1ϕ(z))
∂ ∂ w j l ( w ) = ( y 1 ϕ ( z ) − ( 1 − y ) 1 1 − ϕ ( z ) ) ∂ ∂ w j ϕ ( z ) = ( y 1 ϕ ( z ) − ( 1 − y ) 1 1 − ϕ ( z ) ) ϕ ( z ) ( 1 − ϕ ( z ) ) ∂ ∂ w j z = ( y ( 1 − ϕ ( z ) ) − ( 1 − y ) ϕ ( z ) ) x j = ( y − ϕ ( z ) ) x j (15) \begin{aligned} \frac{\partial}{\partial w_j}l(w) &= (y \frac{1}{\phi(z)} - (1-y)\frac{1}{1-\phi(z)})\frac{\partial}{\partial w_j}\phi(z) \\ &= (y\frac{1}{\phi(z)} - (1-y)\frac{1}{1-\phi(z)})\phi(z)(1-\phi(z))\frac{\partial}{\partial w_j}z \\ &= (y(1-\phi(z)) - (1-y)\phi(z))x_j \\ &= (y-\phi(z))x_j \end{aligned} \tag{15} wjl(w)=(yϕ(z)1(1y)1ϕ(z)1)wjϕ(z)=(yϕ(z)1(1y)1ϕ(z)1)ϕ(z)(1ϕ(z))wjz=(y(1ϕ(z))(1y)ϕ(z))xj=(yϕ(z))xj(15)
  目标是找到可以最大化对数似然率的权重,这样就可以更新每个权重,如下:
w j : = w j + η ∑ i = 1 n ( y ( i ) − ϕ ( z ( i ) ) ) x j ( i ) (16) w_j := w_j + \eta\sum\limits^n_{i=1}(y^{(i)} - \phi(z^{(i)}))x_j^{(i)} \tag{16} wj:=wj+ηi=1n(y(i)ϕ(z(i)))xj(i)(16)
  因为要更新所有的权重,因此把通用的更新规则表示如下:
w : = w + Δ w Δ w = η ∇ J ( w ) (17) w:=w+\Delta w \\ \Delta w = \eta \nabla J(w) \tag{17} w:=w+ΔwΔw=ηJ(w)(17)
  由于最大化对数似然相当于最小化前面定义的代价函数 J J J,因此,可以得到下述梯度下降更新规则:
Δ w j = − η ∂ J ∂ w j = η ∑ i = 1 n ( y ( i ) − ϕ ( z ( i ) ) ) x j ( i ) (18) \Delta w_j = -\eta \frac{\partial J}{\partial w_j} = \eta \sum\limits^n_{i=1}(y^{(i)} - \phi(z^{(i)}))x_j^{(i)} \tag{18} Δwj=ηwjJ=ηi=1n(y(i)ϕ(z(i)))xj(i)(18)

三、二分类逻辑回归实现

  以鸢尾花分类为例,由于该模型只适用于二元分类,所以此次仅识别类0和类1:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X, y = load_iris(return_X_y=True)
X = X[(y==0) | (y==1)]
y = y[(y==0) | (y==1)]

对数据进行标准化处理

X, y = load_iris(return_X_y=True)
X = X[(y==0) | (y==1)]
y = y[(y==0) | (y==1)]

训练模型

lr = LogisticRegression()
lr.fit(X_train, y_train)
lr.score(X_test, y_test)
1.0

四、多分类逻辑回归

4.1 概念

  使用哪一种方法来处理多分类的问题取决于具体问题的定义。首先,如果一个样本只对应一个标签,我们可以假设每个样本属于不同标签的概率服从几何分布,使用 多项式逻辑回归 S o f t m a x    R e g r e s s i o n Softmax \; Regression SoftmaxRegression 来进行分类:
h w ( x ) = [ p ( y = 1    ∣ x ;    w ) p ( y = 2    ∣ x ;    w ) ⋮ p ( y = k    ∣ x ;    w ) ] = 1 ∑ j = 1 k e w j T x [ e w 1 T x e w 2 T x ⋮ e w k T x ] (19) \begin{aligned} h_w(x) = \begin{bmatrix} p(y=1 \; | x;\; w) \\ p(y=2 \; | x;\; w) \\ \vdots \\ p(y=k \; | x;\; w) \end{bmatrix} = \frac{1}{\sum\limits^k_{j=1}e^{w_j^Tx}} \begin{bmatrix} e^{w_1^Tx} \\ e^{w_2^Tx} \\ \vdots \\ e^{w_k^Tx} \end{bmatrix} \end{aligned} \tag{19} hw(x)=p(y=1x;w)p(y=2x;w)p(y=kx;w)=j=1kewjTx1ew1Txew2TxewkTx(19)
  其中 w 1 ,    w 2 ,    … ,    w k w_1,\; w_2,\; \dots ,\; w_k w1,w2,,wk 为模型的参数,而 1 ∑ j = 1 k e w j T x \frac{1}{\sum\limits^k_{j=1}e^{w_j^Tx}} j=1kewjTx1 可以看作是对概率的归一化。为了方便起见,将参数列的 k k k 个列向量按顺序排列形成 n × k n \times k n×k 矩阵,写作 W W W,表示整个参数集。一般来说,多项逻辑回归具有参数冗余的特点,即将参数集同时加减一个向量后预测结果不变,特别的,当类别数为2时:
h w ( x ) = 1 e w 1 T x + e w 2 T x [ e w 1 T x e w 2 T x ] (20) h_w(x) = \frac{1}{e^{w_1^Tx} + e^{w_2^Tx}} \begin{bmatrix} e^{w_1^Tx} \\ e^{w_2^Tx} \end{bmatrix} \tag{20} hw(x)=ew1Tx+ew2Tx1[ew1Txew2Tx](20)
  利用参数冗余的特点,将所有的参数减去 w 1 w_1 w1,式 ( 20 ) (20) (20) 变为:
h w ( x ) = 1 e 0 ⋅ x + e ( w 2 T − w 1 T ) x [ e 0 ⋅ x e ( w 2 T − w 1 T ) x ] = [ 1 1 + e w T x 1 − 1 1 + e w T x ] (21) h_w(x) = \frac{1}{e^{0\cdot x} + e^{(w_2^T-w_1^T)x}} \begin{bmatrix} e^{0 \cdot x} \\ e^{(w_2^T - w_1^T)x} \end{bmatrix} = \begin{bmatrix} \frac{1}{1+e^{w^Tx}} \\ 1- \frac{1}{1+e^{w^Tx}} \end{bmatrix} \tag{21} hw(x)=e0x+e(w2Tw1T)x1[e0xe(w2Tw1T)x]=[1+ewTx111+ewTx1](21)
  其中 w = w 2 − w 1 w = w_2 - w_1 w=w2w1 。整理后的式子与逻辑回归一致。因此,多项逻辑回归实际上是二分类逻辑回归在多标签分类下的一种拓展。

  当存在样本可能属于多个标签的情况时,我们可以训练 k k k 个二分类的逻辑回归分类器,第 i i i 个分类器用以区分每个样本是否可以归为第 i i i 类,训练该分类器时,需要把标签重新整理为 “第 i i i 类标签” 与 “非第 i i i 类标签” 两类。通过这样的方法,我们就解决了每个样本可能拥有多个标签的情况。

4.2 实现

  同样以鸢尾花分类为例,该数据集共有三个类别

X, y = load_iris(return_X_y=True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

ss = StandardScaler()
ss.fit(X)
X_train, X_test = ss.transform(X_train), ss.transform(X_test)

lr = LogisticRegression()
lr.fit(X_train, y_train)
lr.score(X_test, y_test)
1.0

4.3 过拟合问题

  过拟合 是机器学习中的常见问题,虽然模型在训练数据上表现良好,但无法概括未见过的新数据或测试数据。如果某个模型出现过拟合的问题,会说该模型具有较高的 方差,可能是因为相对于给定的数据,参数太多,模型过于复杂。同样,模型也可能会出现偏差高 欠拟合 的情况,这意味着模型不足以捕捉训练数据中的复杂模式,因此对未见过的数据表现不良。

  方差用来度量模型对样本预测结果的一致性,例如训练集的不同子集,模型是否能保持不变。模型对训练数据的随机性很敏感。相反,针对不同的训练集多次建模,用偏差来度量预测值与真实值之间的差异。偏差度量非随机所带来的系统误差。

  找到好的 偏差-方差 平衡的方法之一是通过正则化来调整模型的复杂性。正则化是处理共线性(特征之间的高相关性),滤除数据中的噪声,并最终避免过拟合的非常有效的方法。正则化的逻辑是引入额外的信息(偏置)来惩罚极端的参数值(权重)。最常见的正则化是 L 2 正 则 化 L2 正则化 L2
λ 2 ∣ ∣ w ∣ ∣ 2 = λ 2 ∑ j = 1 m w j 2 (22) \frac{\lambda}{2}||w||^2 = \frac{\lambda}{2}\sum\limits^m_{j=1}w_j^2 \tag{22} 2λw2=2λj=1mwj2(22)
   λ \lambda λ正则化参数

  逻辑回归的代价函数可以通过增加一个简单的正则项来调整,浙江在模型训练的时候缩小权重:
J ( w ) = ∑ i = 1 n [ − y ( i ) log ⁡ ( ϕ ( z ( i ) ) ) − ( 1 − y ( i ) ) log ⁡ ( 1 − ϕ ( z ( i ) ) ) ] + λ 2 ∣ ∣ w ∣ ∣ 2 (23) J(w) = \sum\limits^n_{i=1}[ -y^{(i)} \log (\phi(z^{(i)})) - (1 - y^{(i)}) \log (1 - \phi(z^{(i)}))] + \frac\lambda 2 ||w||^2 \tag{23} J(w)=i=1n[y(i)log(ϕ(z(i)))(1y(i))log(1ϕ(z(i)))]+2λw2(23)
   λ \lambda λ 正则化参数可以控制如何在更好的拟合训练数据的同时保持较小的权重,可以通过加大 λ \lambda λ 值增加正则化强度。

  sklearn 实现 LogisticRegression 类的参数 C 来自于支持向量机的约定, C λ \lambda λ 之间相关联,与正则化参数成反比。因此,降低逆正则化参数C 意味着增加正则化的强度。

五、小结

  逻辑回归是一种最基础的概率分类模型,其具有以下特点:

  • 实现简单,广泛的应用于工业问题上;
  • 分类时计算量非常小,速度很快,存储资源低;
  • 便利的观测样本概率分数;
  • 对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决该问题。

  然而,也有以下弊端:

  • 当特征空间很大时,逻辑回归的性能不是很好,容易欠拟合,一般准确度不太高;
  • 不能很好地处理大量多类特征或变量;
  • 只能处理线性可分;
  • 对于非线性特征,需要进行转换。
    λ \lambda λ 之间相关联,与正则化参数成反比。因此,降低逆正则化参数C 意味着增加正则化的强度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值