.3 基于逻辑回归的分类概率建模

尽管感知器规则提供了一种良好且易于使用的入门级机器学习分类算法,但其最大缺点是,如果类不是完全线性可分的,那么它将永远不收敛。前一节的分类任务就是该场景的一个示例。直观地说,原因是权重在不断更新,因为每次迭代至少会有一个错误分类样本存在。当然,我们也可以改变学习速率,增加迭代次数,但是要小心感知器永远都不会在该数据集上收敛。

为了提高效率,现在让我们来看看逻辑回归,这是一种简单且强大的解决线性二元分类问题的算法。不要望文生义,逻辑回归是一种分类模型,但不是回归模型。

3.3.1 逻辑回归与条件概率

逻辑回归是一种很容易实现的分类模型,但仅在线性可分类上表现不错。它是行业中应用最广泛的分类算法之一。与感知器和Adaline类似,本章所介绍的逻辑回归模型也是一个用于二元分类的线性模型。

用于多元分类的逻辑回归

请注意,逻辑回归可以很容易地推广到多元分类,这被称为多项式逻辑回归或softmax回归。关于多项式逻辑回归的更详细的讨论超出了本书的范围,但是感兴趣的读者可以在我的讲稿中找到更多的信息(https://sebastianraschka.com/pdf/lecture-notes/stat479ss19/L05_gradient-descent_slides.pdf或http://rasbt.github.io/mlxtend/user_guide/classifier/SoftmaxRegression/)。

在多元分类设置中使用逻辑回归的另外一种方法是利用之前讨论过的OvR技术。

要解释作为概率模型的逻辑回归原理,首先要介绍让步比(odds),即某一特定事件发生的概率。让步比可以定义为:$p(y=1)/[1-p(y=0)]$,其中$p$代表正事件的概率。正事件并不一定意味着好,它指的是要预测的事件,例如病人有某种疾病的可能性;可以认为正事件的分类标签$y=1$.可以进一步定义logit函数,这仅仅是让步比的对数形式(log-odds):

注意log是自然对数,与计算机科学中的通用惯例一致。logit函数的输入值取值在0到1之间,并将其转换为整个实数范围的值,可以用它来表示特征值和对数概率(log-odds)之间的线性关系:

逻辑回归是一种常用的机器学习算法,它可以用于分类和回归问题。在逻辑回归中,我们首先定义一个sigmoid函数,然后使用梯度下降法来学习逻辑代价函数的权重。下面是一个简单的逻辑回归示例代码:

```python

import numpy as np

def sigmoid(z):

return 1 / (1 + np.exp(-z))

def cost_function(y, y_pred):

epsilon = 0.001

m = y.shape[0]

h = y_pred * sigmoid(np.arange(-1, m+1)[:, None]) + epsilon

cost = (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()

return cost

def gradient_descent(X, y, learning_rate=0.01):

m = X.shape[0]

theta = np.zeros(X.shape[1])

n = len(X)

for _ in range(1000):

h = np.dot(X, theta)

delta = (h - y) * sigmoid(np.arange(-1, m+1)[:, None]) * (1 - sigmoid(np.arange(-1, m+1)[:, None]))

theta = theta - learning_rate * np.dot(X.T, delta)

return theta

```

学习了如何使用逻辑回归模型来预测概率和分类标签,现在简要讨论一下如何拟合模型的参数(例如前一章的权重w)。上一章代价函数定义为误差平方和:为了在Adaline分类模型中学习权重w,我们简化了函数。要解释清楚如何得到逻辑回归的代价函数,在建立逻辑回归模型时,需要首先定义最大似然函数L,假设数据集中的每个样本都是相互独立的。公式为:在实践中,很容易最大化该方程的自然对数(求其最大值),故定义了对数似然函数:首先,应用对数函数降低数值下溢的可能性,这种情况在似然率非常小的情况下可能发生。其次,假如你还记得微积分的话,可以把因子乘积转换成因子求和,这样就可以通过加法技巧更容易地得到该函数的导数。

现在可以用梯度上升等优化算法最大化这个对数似然函数。另外一个选择是改写对数似然函数作为代价函数J,就像在第2章中那样,用梯度下降方法最小化代价函数J:为了能更好地理解这个代价函数,让我们计算一个训练样本的代价:J(φ(z),y;w)=-ylog(φ(z))-(1-y)log(1-φ(z))从上面的方程可以看到,如果y=0,第一项为零,如果y=1,第二项为零:通过下述简短的代码绘制一张图,以说明对于不同的φ(z)值,分类一个训练样本的代价:图3-4绘制了0到1范围内(sigmoid函数的输入值z的范围为-10到10),x轴的sigmoid激活函数y轴是相关联的逻辑代价。

从图3-4可以看到,如果正确地预测样本属于类1,代价就会接近0(实线)。类似地,可以在y轴上看到,如果正确地预测y=0(虚线),那么代价也接近0。然而,如果预测错误,代价就会趋于无穷大。关键就在于用越来越大的代价惩罚错误的预测。3.3.3 将Adaline实现转换为一个逻辑回归算法如果要自己动手实现逻辑回归,可以直接用新的代价函数取代第2章Adaline实现中的代价函数J:在对训练样本进行分类的过程中,用该公式来计算每次迭代的代价。另外,需要用sigmoid激活函数替换线性激活函数,同时改变阈值函数,返回类标签0和1,而不是返回-1和1。如果能在Adaline编码中完成这三步,即可获得下述逻辑回归的代码实现:

在拟合逻辑回归模型时,必须记住该模型只适用于二元分类。Iris-setosa、Iris-versicolor分别表示两种鸢尾花的种类,0和1分别表示两个类别。运行上述代码可以绘制如图3-5所示的决策区域图。

图 3-5

逻辑回归的梯度下降学习算法

应用微积分可以发现,梯度下降逻辑回归过程中的权重更新相当于第2章讨论Adaline时用过的方程。但是要注意的是,下面的梯度下降学习规则推导是为那些对逻辑回归梯度下降学习规则的原理感兴趣的读者而准备的,并非学习本章其余部分的必要条件。

首先从计算对数似然函数的偏导数开始:

在继续我们的讨论之前,先计算sigmoid函数的偏导数:

现在可以在第一个等式中替换 ,得到下列等式;

记住,目的是要找出可以最大化对数似然的权重,这样我们就可以通过下列方式更新每个权重:

因为要更新所有的权重,所以把通用的更新规则表达如下:

w := w +Δ w

我们把Δ w 定义为:

Δ w =η▽l( w )

由于最大化对数似然相当于最小化前面定义的代价函数J,因此,可以得到下述梯度下降更新规则:

这与第2章中的Adaline梯度下降规则相同。

3.3.4 用scikit-learn训练逻辑回归模型

sklearn.linear_model.LogisticRegression fit multi_class='ovr' multi_class='multinomial' multinomial

现在,让我们看看下面的示例代码:

在训练数据上拟合模型后,上述代码把决策区域、训练样本和测试样本绘制出来,如图3-6所示。

'liblinear' 是一种线性分类器,用于逻辑回归和多类分类任务。它的目标是最小化预测误差,同时保持模型的复杂度较低。

'lbfgs' 是一种求解优化问题的方法,它是 Levenberg-Marquardt 算法的一种变体。它被广泛应用于机器学习和计算机视觉等领域。

solver='lbfgs' 是 liblinear 库中一个可选的参数,用于指定使用的优化算法。默认情况下,liblinear 使用 L2R 方法(Levenberg-Marquardt)。

predict_proba 是 sklearn.linear_model.LogisticRegression 类的一个方法,它返回一个二维数组,其中每一行表示一个样本,每一列表示一个类别,值表示该样本属于该类别的概率。

lr.predict_proba(X_test_std[:3, :]).sum(axis=1) 这段代码计算了测试数据集 X_test_std 前三个样本属于每个类别的概率之和。

Iris-virginica、Iris-setosa 是鸢尾花数据集中的两个类别标签。argmax() 函数返回数组中最大值所在的索引。

reshape() 函数用于改变数组的形状,将一维数组转换为二维数组。

3.3.5 通过正则化解决过拟合问题是机器学习领域中的一个经典问题。过拟合是指模型在训练数据上表现良好,但不能很好地泛化未见过的新数据或测试数据。为了解决过拟合问题,可以采用正则化方法,例如 L1 正则化和 L2 正则化等。这些方法通过对模型参数进行惩罚来限制其复杂度,从而避免过拟合现象的发生。

如果你对术语“偏置”和“方差”的技术规范和推导感兴趣,可以从下面网站获取我的课堂讲义:https://sebastianraschka.com/pdf/lecture-notes/stat479fs18/08_eval-intro_notes.pdf。找到一个好的偏置-方差权衡的方法是通过正则化来调整模型的复杂性。正则化是处理共线性(特征间的高相关性)、滤除数据中的噪声并最终防止过拟合的一种非常有用的方法。

正则化背后的逻辑是引入额外的信息(偏置)来惩罚极端的参数值(权重)。最常见的正则化是所谓的 L2正则化(有时也称为L2收缩或权重衰减),可写作:λw^2,其中λ为所谓的正则化参数。

正则化与特征归一化密切相关。特征缩放(如标准化)之所以重要,其中一个原因就是正则化。为了使得正则化起作用,需要确保所有特征的衡量标准保持统一。通过增加一个简单的正则项,就可以正则化逻辑回归的代价函数,这将在模型训练的过程中缩小权重。通过正则化参数λ,保持权重较小时,我们可以控制模型与训练数据的拟合程度。加大λ值可以增强正则化的强度。

在逻辑回归中,C表示正则化项的系数。当C=1时,逻辑回归退化为多项式回归;当C>1时,逻辑回归具有L2正则化;当C<1时,逻辑回归具有L1正则化。

LogisticRegression 是一种常用的分类算法,它在许多实际问题中表现出色。然而,由于深入讨论各种分类算法超出了本书的范围,我强烈建议读者阅读斯科特·梅纳德博士2009年的书籍 Logistic Regression: From Introductory to Advanced Concepts and Applications,以了解更多关于逻辑回归方面的知识。