使用最大似然估计的逻辑回归简明介绍

逻辑回归是一种用于二元分类预测建模的模型。

逻辑回归模型的参数可以通过一个称为最大似然估计的概率框架来估计。在该框架下,必须假设目标变量(类标签)的概率分布,然后定义一个似然函数,该函数计算给定输入数据和模型时观测结果的概率。然后,可以优化此函数以找到产生训练数据集上最大似然总和的参数集。

拟合逻辑回归模型的最大似然方法既有助于更好地理解逻辑回归模型的形式,也提供了一个可用于更普遍地拟合分类模型的模板。当程序中使用的对数似然函数的负数可以证明等同于交叉熵损失函数时,这一点尤其正确。

在本帖中,您将了解最大似然估计的逻辑回归。

阅读本文后,你将了解:

  • 逻辑回归是二元分类预测建模的线性模型。
  • 模型中的线性部分预测样本属于类别1的对数几率,通过逻辑函数将其转换为概率。
  • 通过最大化似然函数来估计模型的参数,该似然函数预测每个样本的伯努利分布的均值。

立即开始您的项目,阅读我的新书《机器学习中的概率》,其中包含分步教程以及所有示例的Python源代码文件。

让我们开始吧。

A Gentle Introduction to Logistic Regression With Maximum Likelihood Estimation

使用最大似然估计的逻辑回归简明介绍
图片由 Samuel John 提供,部分权利保留。

概述

本教程分为四个部分;它们是

  1. 逻辑回归
  2. 逻辑回归与对数几率
  3. 最大似然估计
  4. 逻辑回归作为最大似然

逻辑回归

逻辑回归是二元分类的经典线性方法。

分类预测建模问题是指那些需要为给定的一组输入变量预测类标签(例如,“红色”、“绿色”、“蓝色”)的问题。二元分类是指具有两个类标签的分类问题,例如真/假或0/1。

逻辑回归与线性回归有很多相似之处,尽管线性回归是一种预测数值的技术,而不是用于分类问题。这两种技术都用一条线(或根据输入维数而定的超平面)来建模目标变量。线性回归将线拟合到数据中,可用于预测新数量,而逻辑回归则拟合一条线以最佳地分隔两个类别。

输入数据表示为 X,包含 n 个样本,输出表示为 y,每个输入对应一个输出。模型对给定输入的预测表示为 yhat

  • yhat = model(X)

模型根据称为系数(beta)的参数定义,每个输入都有一个系数,还有一个提供截距或偏差的额外系数。

例如,一个具有输入 X 和 m 个变量 x1, x2, …, xm 的问题将具有系数 beta1, beta2, …, betambeta0。给定输入通过示例的加权输入和系数的加权和来预测。

  • yhat = beta0 + beta1 * x1 + beta2 * x2 + … + betam * xm

也可以使用线性代数来描述模型,其中包含系数向量(Beta)和输入数据矩阵(X)以及输出向量(y)。

  • y = X * Beta

到目前为止,这与线性回归相同,但不足以用于分类问题,因为输出将是一个实数值而不是类标签。

相反,模型使用非线性函数来压缩此加权和的输出,以确保输出值介于 0 和 1 之间。

使用逻辑函数(也称为 sigmoid 函数),其定义为

  • f(x) = 1 / (1 + exp(-x))

其中 x 是函数的输入值。在逻辑回归的情况下,x 被加权和替换。

例如

  • yhat = 1 / (1 + exp(-(X * Beta)))

输出被解释为二项分布函数中类标签为 1 的概率,如果问题中的两个类标签分别为 0 和 1。

请注意,输出是一个介于 0 和 1 之间的数字,可以解释为属于类标签为 1 的概率。

— 第 726 页,《人工智能:一种现代方法》,第三版,2009 年。

训练数据集中的样本是从更广泛的总体中抽取的,因此,该样本已知是不完整的。此外,观测值中预计存在测量误差或统计噪声。

模型的参数(beta)必须根据从域中抽取的样本进行估计。

有许多方法可以估计参数。最常见的两种框架是:

两者都是涉及搜索不同模型参数的优化过程。

最大似然估计是一种频率统计概率框架,它寻找一组最大化似然函数的模型参数。我们将在接下来的部分中更详细地研究第二种方法。

想学习机器学习概率吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

逻辑回归与对数几率

在深入了解模型参数如何从数据中估计之前,我们需要了解逻辑回归究竟在计算什么。

这可能是逻辑回归中最令人困惑的部分,所以我们将缓慢地进行。

模型中的线性部分(输入的加权和)计算成功事件的对数几率,具体来说,是样本属于类别 1 的对数几率。

  • log-odds = beta0 + beta1 * x1 + beta2 * x2 + … + betam * xm

实际上,模型估计输入变量在每个级别(所有观察到的值)上类别 1 的对数几率。

什么是几率和对数几率?

几率可能在赌博领域很熟悉。几率通常表示为赢局与输局(赢局:输局),例如,赢的几率为一比十或1:10。

给定逻辑回归模型预测的成功概率(p),我们可以将其转换为成功几率,即成功概率除以不成功概率

  • odds of success = p / (1 – p)

计算几率的对数,特别是以 e 为底的对数或自然对数。此数量称为对数几率,可能称为 logit(逻辑单位),是一种度量单位。

  • log-odds = log(p / (1 – p)

回想一下,这正是逻辑回归的线性部分所计算的

  • log-odds = beta0 + beta1 * x1 + beta2 * x2 + … + betam * xm

通过计算对数几率的指数,可以将成功几率转换回成功几率。

  • odds = exp(log-odds)

  • odds = exp(beta0 + beta1 * x1 + beta2 * x2 + … + betam * xm)

成功几率可以按如下方式转换回成功概率

  • p = odds / (odds + 1)

这接近我们的逻辑回归模型的形式,除了我们希望在计算过程中将对数几率转换为几率。

我们可以做到这一点并简化计算,如下所示:

  • p = 1 / (1 + exp(-log-odds))

这表明我们如何通过逻辑回归模型从对数几率转换为几率,再转换为类别 1 的概率,并且最终的函数形式与逻辑函数匹配,确保概率在 0 到 1 之间。

我们可以用一些简单的 Python 示例来具体说明这些在概率、几率和对数几率之间的转换计算。

首先,我们将成功概率定义为 80%,即 0.8,然后将其转换为几率,再转换回概率。

完整的示例如下所示。

运行该示例显示 0.8 被转换为 4 的成功几率,然后又正确地转换回了 0.8 的概率。

让我们扩展这个示例,将几率转换为对数几率,然后将对数几率转换回原始概率。这个最终的转换实际上是逻辑回归模型的形式,或者说是逻辑函数。

完整的示例如下所示。

运行该示例,我们可以看到我们的几率被转换为约 1.4 的对数几率,然后正确地转换回 0.8 的成功概率。

现在我们已经掌握了逻辑回归计算的概率,让我们来看看最大似然估计。

最大似然估计

最大似然估计(简称 MLE)是估计模型参数的一种概率框架。

在最大似然估计中,我们希望最大化在给定特定概率分布及其参数(theta)的情况下观测到数据(X)的条件概率,正式表述为

  • P(X ; theta)

其中 X 实际上是问题域中从 1 到 n 的所有观测值的联合概率分布。

  • P(x1, x2, x3, …, xn ; theta)

这个得到的条件概率被称为给定模型参数时观测到数据的似然,并使用符号 L() 来表示似然函数。例如:

  • L(X ; theta)

联合概率分布可以重述为观测每个示例的条件概率与分布参数的乘积。将许多小概率相乘可能不稳定;因此,将此问题重述为对数条件概率之和是很常见的。

  • sum i to n log(P(xi ; theta))

鉴于对数在似然函数中的频繁使用,它被称为对数似然函数。在优化问题中,通常更倾向于最小化成本函数而不是最大化它。因此,使用对数似然函数的负数,通常称为负对数似然(NLL)函数。

  • 最小化 - sum i=1 to n log(P(xi ; theta))

最大似然估计框架可以作为估计各种机器学习模型(用于回归和分类预测建模)参数的基础。这包括逻辑回归模型。

逻辑回归作为最大似然

我们可以将拟合机器学习模型的问题构建为概率密度估计的问题。

具体来说,模型和模型参数的选择被称为建模假设 h,问题在于找到最能解释数据 Xh。因此,我们可以找到最大化似然函数的建模假设。

  • 最大化 sum i=1 to n log(P(xi ; h))

监督学习可以被构建为一个条件概率问题,即预测输出给定输入的概率

  • P(y | X)

因此,我们可以定义监督机器学习的条件最大似然估计如下:

  • 最大化 sum i=1 to n log(P(yi|xi ; h))

现在我们可以将 h 替换为我们的逻辑回归模型。

为了使用最大似然,我们需要假设一个概率分布。在逻辑回归的情况下,假设数据样本服从二项分布,其中每个样本是伯努利试验的一次观测。伯努利分布有一个参数:成功观测的概率(p)。

  • P(y=1) = p
  • P(y=0) = 1 – p

当有两个类别时最常使用的概率分布是二项分布。5 该分布有一个参数 p,即事件或特定类的概率。

— 第 283 页,《应用预测建模》,2013 年。

伯努利分布的期望值(均值)计算如下:

  • mean = P(y=1) * 1 + P(y=0) * 0

或者,给定 p:

  • mean = p * 1 + (1 – p) * 0

这个计算看起来可能冗余,但它为特定输入的似然函数提供了基础,其中概率由模型(yhat)给出,实际标签由数据集提供。

  • likelihood = yhat * y + (1 – yhat) * (1 – y)

对于 y=0y=1 的情况,当模型接近所需类值时,此函数将始终返回一个较高的概率,而当模型远离时,则返回一个较小的值。

我们可以用一个小的计算示例来演示这两种结果以及为每种结果预测的小概率和大概率。

完整的示例如下所示。

运行该示例打印了每种情况(概率接近和远离)的类别标签(y)和预测概率(yhat)。

我们可以看到似然函数在返回模型实现所需结果的程度的概率方面是一致的。

我们可以使用对数更新似然函数,将其转换为对数似然函数

  • log-likelihood = log(yhat) * y + log(1 – yhat) * (1 – y)

最后,我们可以将似然函数在数据集中的所有示例上求和,以最大化似然

  • maximize sum i to n log(yhat_i) * y_i + log(1 – yhat_i) * (1 – y_i)

作为优化问题,通常的做法是最小化成本函数;因此,我们可以反转函数,以便最小化负对数似然

  • minimize sum i to n -(log(yhat_i) * y_i + log(1 – yhat_i) * (1 – y_i))

计算伯努利分布的负对数似然函数等同于计算伯努利分布的交叉熵函数,其中 p() 表示类别 0 或类别 1 的概率,q() 表示概率分布的估计,在本例中由我们的逻辑回归模型表示。

  • cross entropy = -(log(q(class0)) * p(class0) + log(q(class1)) * p(class1))

与线性回归不同,此优化问题没有解析解。因此,必须使用迭代优化算法。

与线性回归不同,我们无法写出 MLE 的闭式形式。相反,我们需要使用优化算法来计算它。为此,我们需要推导梯度和 Hessian。

— 第 246 页,《机器学习:一种概率视角》,2012 年。

该函数确实提供了一些信息来辅助优化(特别是可以计算 Hessian 矩阵),这意味着可以使用利用这些信息的有效搜索过程,例如BFGS 算法(及其变体)。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

文章

书籍

文章

总结

在本帖中,您了解了最大似然估计的逻辑回归。

具体来说,你学到了:

  • 逻辑回归是二元分类预测建模的线性模型。
  • 模型中的线性部分预测样本属于类别1的对数几率,通过逻辑函数将其转换为概率。
  • 通过最大化似然函数来估计模型的参数,该似然函数预测每个样本的伯努利分布的均值。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

掌握机器学习中的概率!

Probability for Machine Learning

增进你对概率的理解

...只需几行python代码

在我的新电子书中探索如何实现
机器学习概率

它提供了关于以下内容的自学教程端到端项目
贝叶斯定理贝叶斯优化分布最大似然交叉熵校准模型
以及更多...

最终在你的项目中驾驭不确定性

跳过学术理论。只看结果。

查看内容

38 条对《逻辑回归与最大似然估计的入门介绍》的回复

  1. Norman 2019年11月1日 下午4:18 #

    嗨,Jason
    一个建议。您能否考虑使用“yhat ^ y * (1 – yhat) ^(1 – y)”的表示法来定义似然?这个表示法对于伯努利分布的结果与原始表示法相同。但对于计算对数似然而言,这个表示法更容易。以下链接供您参考:

    https://web.stanford.edu/class/cs109/reader/11%20Parameter%20Estimation.pdf
    https://stats.stackexchange.com/questions/275380/maximum-likelihood-estimation-for-bernoulli-distribution

    • Jason Brownlee 2019年11月2日 上午6:39 #

      谢谢 Norman 的建议。

    • Mateusz Serocki 2020年11月2日 上午9:41 #

      我完全同意。

  2. Anthony The Koala 2019年11月2日 上午3:32 #

    尊敬的Jason博士,
    请您能否澄清一下今天的主题?
    * 几率:odds = p/(1-p)。

    如果有一个骰子,掷出“1”朝上的概率 = p = 1/6
    则几率为 odds = p/(1-p) = 0.2
    0.2 的解释是什么?

    * 在逻辑回归与 MLE 部分
    的解释是什么?

    谢谢你,
    悉尼的Anthony

    • Jason Brownlee 2019年11月2日 上午7:09 #

      好问题。

      如果您有一个概率为 1/6 (prob),而作为参考,一个不利概率为 5/6。

      那么掷出“1”的几率是

      prob / (1 – prob) = 0.2

      不掷出“1”的几率(例如,掷出非“1”)是

      (1 – prob) / prob = 5

      即 1:25。

      更多关于几率与概率的对比,请参阅
      https://en.wikipedia.org/wiki/Odds#Mathematical_relations

      您问题的第二部分是关于伯努利试验的似然函数。

      例如,我们报告匹配正面结果的概率。这有点多余,但它为后续的对数似然提供了基础——在该部分中,我想说明它并没有做任何特别的事情。

  3. Adam 2019年12月13日 下午2:50 #

    yhat_i = P(y_i|x_i ; h) 吗?

    • Jason Brownlee 2019年12月14日 上午6:05 #

      是的。

      • Robert 2020年8月17日 下午10:51 #

        嗯… P(y_i|x_i;h) = yhat_i*y_i 吗?
        或者在最后计算(对数)似然的最后一个示例中,我错过了什么?从表达式

        maximize sum i to n log(P(yi|xi ; h)) 到表达式

        maximize sum i to n log(yhat_i) * y_i + log(1 – yhat_i) * (1 – y_i)

  4. Omar 2019年12月21日 下午9:00 #

    您好 Jason,我一直在问有关 LSTM 的帖子,感谢您的回复 🙂

    我有一些概念性问题。主要指的是对数几率与自然对数写为 ln( prob_event / (1 – prob_event) ) = b_0 + b_1 * X_1 + … + b_n * X_n

    1. 在处理真实数据时,我如何知道事件的概率?

    2. 假设我不知道事件的概率。我认为我们可以通过拟合多元线性回归来计算对数几率(如果我错了请纠正我),因为方程右侧是多元线性回归。我该如何计算 beta(b_0, b_1, … b_n)?我明白如何使用 python 获取值,但不知道如何手动计算它们。我也知道我们可以使用最大似然估计来拟合逻辑回归,但我不知道如何手动操作。

    3. 同样,假设我的数据集有 100 行,分为 20 个窗口,每个窗口包含 5 行,用于进行分类,标签对应于窗口。sklearn 的逻辑回归可以对它们进行分类。您是否有任何直观的指导来告诉我 sklearn 的逻辑回归是如何做到的?我理解的是,在我们得到 beta 后,我们可以轻松地将数据代入 X,但我不确定如果我们要代入 X 的值不是单个行(在本例中是 5 行)时会发生什么。

    非常感谢您的帮助。

    • Jason Brownlee 2019年12月22日 上午6:11 #

      很好的问题!

      我们从历史观测(频率)估计事件的概率,或者我们使用领域专业知识来定义我们对事件可能性的信念(贝叶斯)。

      在模型中,我们可以假设事件的似然分布,并猜测新事件的概率。这就是我们在逻辑回归中所做的。

      系数通过最小化训练数据集上的对数损失来优化。无需担心单个观测的系数。

      通过将输入乘以系数来做出预测。

      • Omar 2019年12月22日 下午6:32 #

        啊,我明白了,谢谢!

        请允许我重新表述第三个问题。

        假设我们有一个 Y = b_0 + b_1X_1(一个只有一个预测变量的逻辑回归模型)。比如说,我的数据只有 20 个样本,有 20 个目标变量,每个样本包含 5 行(总行数为 100)。

        我的问题是,拟合/预测包含多行的样本背后的数学是什么?

        例如,如果 b_0 = 2,b_1 = 0.5,X_1 = 4,我可以计算 Y = 2 + 0.5 * 4。但如果 X_1 是一个列表 [2,3,4],我不知道如何进行预测。在 sklearn 中代入多于一行的样本似乎没问题(没有错误或警告)。

        • Jason Brownlee 2019年12月23日 上午6:47 #

          抱歉,我没跟上。

          逻辑回归假设您有一个包含 2 个类的目标变量和一定数量的输入变量。我不知道“20 个样本,20 个目标变量,每个样本包含 5 行”是什么意思。

          • Omar 2019年12月23日 下午10:06 #

            抱歉,我的错。我将提供更详细的解释。背景是关于预测性维护。

            请参考此图像:https://imgur.com/VHikbUn

            给定 6 个观测值,我想制作“观测窗口”,每个窗口包含 3 个观测值。在这种情况下,我有 2 个样本,蓝色和橙色。

            蓝色窗口被分配类别 0(无故障),橙色窗口被分配类别 1(故障)。

            这意味着我有 2 个样本(蓝色和橙色)。

            我的目标是,每当我传入 3 个观测值时,我的模型就会将其视为“一个窗口”并预测它是故障还是非故障。

            使用 sklearn 的 Logistic Regression 的 fit 方法,这意味着 X 有两个样本(蓝色和橙色),y 也有两个样本(0 和 1)。

            我已成功拟合它们。我的问题可能从两个角度得到回答:

            1. 从 Python 或 scikit-learn 的角度来看,为什么它没有抛出任何错误?
            2. 从统计学的角度来看,如何估计 beta 参数以及如何进行与我的情况类似的 X 预测?

            这是我尽力解释的情况。非常感谢您的帮助,Jason。

          • Jason Brownlee 2019年12月24日上午6:42 #

            谢谢你的阐述。

            我们会将这三个数字称为样本,而不是窗口。

            这是一个标准的预测问题,您将 3 个数字的样本输入进来,然后预测类别。您可以手动完成,也可以通过 sklearn 来完成。

            参数将从训练数据中进行估计。

  5. Omar 2019年12月24日 上午12:28 #

    亲爱的 Jason,请忽略我最后的问题,看起来我代码中有一个错误,不知何故使其能够被处理,并且误解了问题的完整上下文。

  6. Omar 2019年12月25日 上午2:22 #

    亲爱的 Jason,我认为我现在对上述情况有了一些见解。请再次参考这张图片:https://imgur.com/VHikbUn

    我能够将数据构建成三维数组(可以输入到 LSTM 模型中),形状为 (2,3,1),表示 (样本数, 时间步长, 特征数)。

    为了确保我能将样本(其中包含像蓝色或橙色这样的三个数字)传递给 sklearn 分类器,我使用以下代码重塑了数据

    nsamples, nx, ny = sample_array.shape
    new_sample_array = sample_array.reshape((nsamples,nx*ny)) # 也可以使用 .reshape((nsamples, -1)) 来完成

    根据我的理解,这将导致我的 new_sample_array 的形状为 (2,3)。似乎我样本中的三个行变成了三个列。我假设列代表第一个样本的第一个时间步,第一个样本的第二个时间步,以此类推。(请参考这张图片以获得重塑的参考:https://imgur.com/E3G4rLb

    因此,我想问两个问题:
    1. 我的重塑方法是否正确?
    2. 如果我将重塑后的数据传递给 Logistic Regression(假设分类器是 clf),然后得到 clf.coef_,我得到一个包含三个值的数组。这是否对应于 b_1、b_2 和 b_3?

    非常感谢您的帮助。

  7. Grzegorz Kępisty 2020年4月21日下午4:06 #

    早上好,Jason!

    感谢您的文章。关于这个话题有两个问题:

    1) 在这篇博文中,您描述了可以通过最大化给定输入数据的似然函数来优化模型。另一方面,在(“如何在 Python 中从头开始实现 Logistic 回归”)您展示了我们可以通过最小化预测误差来优化模型。何时以及如何在这两个目标函数之间进行选择?

    2) 这两种优化方式(最大似然或最小化误差)的模型有何区别?如果第二种情况下的误差是最小的,为什么我们还要使用似然?

    预先感谢您的回复,祝您有愉快的一天!

    • Jason Brownlee 2020年4月22日上午5:50 #

      不客气。

      它们都以相同的一般方式解决问题,只是采用了不同的优化算法。

      如果数据适合放入内存,请使用求解器;如果不适合,请使用 SGD。

  8. Sabine Katzdobler 2020年7月20日晚上10:12 #

    日安,

    目前,我开始重新考虑使用(有序)logit 分布,并想知道最大似然分布是否可能更适合。

    因此,我问:当因变量是序数且涉及 5 个级别时,您是否会推荐最大似然估计(使用伯努利分布)?

    • Jason Brownlee 2020年7月21日上午6:03 #

      对于这个框架,分布无关紧要。

      我认为对于二项分布,您将得到交叉熵损失。

  9. Tristan 2020年10月11日晚上9:58 #

    嗨,Jason,
    首先,非常感谢您这篇富有洞察力的帖子。我有一个问题,我一直在寻找答案,但搜索都没有提供任何见解。您提到“回想一下,这就是逻辑回归的线性部分在计算的

    log-odds = beta0 + beta1 * x1 + beta2 * x2 + … + betam * xm”

    在哪里可以说明 log odds 等于线性方程的步骤?我阅读了 5 篇推导,它们都和我一样。我想了解这个陈述是如何得出的。

    诚挚的问候,
    Tristan

    • Jason Brownlee 2020年10月12日上午6:43 #

      这是加权项的总和,根据定义,这是一个线性方程。

    • Tarun Gupta 2021年1月19日晚上8:50 #

      同样的问题!!这两个怎么会相等。“加权项的总和根据定义是一个线性方程”,这是真的,但它们怎么会相等?

      • Jason Brownlee 2021年1月20日凌晨5:42 #

        我们正在定义一个项,它是定义为加权和的 log odds。

  10. Chew Jing Wei 2020年10月29日下午2:38 #

    您好!感谢您的帖子,您的解释非常清晰。

    但是,我认为这个方程可能有一个错误:likelihood = yhat * y + (1 – yhat) * (1 – y)

    根据这里的讲义:http://web.stanford.edu/class/archive/cs/cs109/cs109.1178/lectureHandouts/220-logistic-regression.pdf,基于单个观测值的似然性应该是 yhat ** y * (1 – yhat) ** (1 – y)

    • Jason Brownlee 2020年10月30日上午6:48 #

      我相信它是正确的,我推荐教程末尾的参考文献。

  11. Harrison Bohl 2020年11月5日下午12:52 #

    请使用 latex 来书写您的数学公式,这真的很难理解发生了什么,而且看起来也很糟糕。谢谢!

  12. Jon 2021年3月14日上午9:36 #

    如何使用上述(Logistic 回归似然函数)来计算 AIC 或 BIC?

  13. Paul 2021年9月30日晚上8:19 #

    这种方法是梯度下降的替代方法吗?我对两者之间的区别感到有些困惑。
    谢谢!

    • Adrian Tam
      Adrian Tam 2021年10月1日下午12:43 #

      如果你指的是逻辑回归和梯度下降,答案是否定的。逻辑回归是接受输入并预测输出,但不是在线性模型中。梯度下降是一种优化算法。在这种情况下,我们通过比较逻辑回归预测和真实输出数据来优化似然分数。

  14. John 2021年12月20日凌晨1:21 #

    如何计算逻辑回归的截距和系数?

Leave a Reply

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。