不平衡分类概率指标简介

分类预测建模涉及为样本预测类别标签,尽管某些问题需要预测类成员身份的概率。

对于这些问题,不需要清晰的类别标签,而是需要每个样本属于每个类别的可能性,之后再进行解释。因此,小的相对概率可能包含很多含义,并且需要专门的指标来量化预测的概率。

在本教程中,您将了解用于评估类别不平衡分类的概率预测的指标。

完成本教程后,您将了解:

  • 概率预测对于某些分类预测建模问题是必需的。
  • 对数损失量化了预测概率分布和预期概率分布之间的平均差异。
  • 布里尔分数量化了预测概率和预期概率之间的平均差异。

开始您的项目,阅读我的新书《Python 类别不平衡分类》,其中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

A Gentle Introduction to Probability Metrics for Imbalanced Classification

不平衡分类概率指标简介
照片由 a4gpa 提供,保留部分权利。

教程概述

本教程分为三个部分;它们是:

  1. 概率指标
  2. 类别不平衡分类的对数损失
  3. 类别不平衡分类的布里尔分数

概率指标

分类预测建模涉及为样本预测类别标签。

在某些问题中,不需要清晰的类别标签,而是首选类成员身份的概率。概率总结了样本属于每个类别的可能性(或不确定性)。概率更细致,可以由人工操作员或系统在决策制定中进行解释。

概率指标是专门设计用于量化分类模型使用预测概率而不是清晰类别标签的技能的指标。它们通常是分数,可以用来根据预测概率与预期类别概率的匹配程度来比较不同的模型。

实际上,数据集将不包含目标概率。相反,它将包含类别标签。

例如,一个二元分类问题将具有负类别的类别标签 0 和正类别的类别标签 1。当一个样本的类别标签为 0 时,类别标签 0 和 1 的概率分别为 1 和 0。当一个样本的类别标签为 1 时,类别标签 0 和 1 的概率分别为 0 和 1。

  • 类别=0 的示例:P(类别=0) = 1,P(类别=1) = 0
  • 类别=1 的示例:P(类别=0) = 0,P(类别=1) = 1

我们可以看到这如何扩展到三个或更多类别;例如

  • 类别=0 的示例:P(类别=0) = 1,P(类别=1) = 0,P(类别=2) = 0
  • 类别=1 的示例:P(类别=0) = 0,P(类别=1) = 1,P(类别=2) = 0
  • 类别=2 的示例:P(类别=0) = 0,P(类别=1) = 0,P(类别=2) = 1

在二元分类问题中,此表示可以简化为仅关注正类别。

也就是说,我们只需要一个样本属于类别 1 的概率来表示二元分类的概率(所谓的伯努利分布);例如

  • 类别=0 的示例:P(类别=1) = 0
  • 类别=1 的示例:P(类别=1) = 1

概率指标将总结预测的类成员身份分布与已知类别概率分布匹配的程度。

这种对预测概率的关注可能意味着模型预测的清晰类别标签将被忽略。这种关注可能意味着,当根据清晰类别标签(例如使用准确率或类似分数)进行评估时,预测概率的模型可能表现出糟糕的性能。这是因为尽管预测的概率可能显示出技巧,但在转换为清晰类别标签之前,必须使用适当的阈值对其进行解释。

此外,对预测概率的关注也可能要求对某些非线性模型的预测概率在用于或评估之前进行校准。一些模型将在训练过程中作为训练过程的一部分学习校准的概率(例如,逻辑回归),但许多模型不会,并且需要校准(例如,支持向量机、决策树和神经网络)。

给定概率指标通常是针对每个样本计算的,然后跨训练数据集中的所有样本进行平均。

有两种流行的评估预测概率的指标;它们是

  • 对数损失
  • 布里尔分数

让我们依次仔细看看每一个。

想要开始学习不平衡分类吗?

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

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

类别不平衡分类的对数损失

对数损失,简称为 log loss,是一个损失函数,以训练逻辑回归分类算法而闻名。

对数损失函数计算二元分类模型所做的概率预测的负对数似然。最值得注意的是,这是逻辑回归,但该函数可用于其他模型,例如神经网络,并且以其他名称而闻名,例如交叉熵

通常,对数损失可以使用每个类别的预期概率和每个类别的预测概率的自然对数来计算;例如

  • LogLoss = -(P(类别=0) * log(P(类别=0)) + (P(类别=1)) * log(P(类别=1)))

最佳对数损失为 0.0,分数从正数到无穷大,分数越差。

如果您只是预测正类别的概率,那么对于一个二元分类预测 (yhat) 与预期概率 (y) 之间的对数损失函数可以计算如下

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

例如,如果预期概率为 1.0,模型预测为 0.8,则对数损失将为

  • LogLoss = -((1 – y) * log(1 – yhat) + y * log(yhat))
  • LogLoss = -((1 – 1.0) * log(1 – 0.8) + 1.0 * log(0.8))
  • LogLoss = -(-0.0 + -0.223)
  • LogLoss = 0.223

此计算可以通过添加额外的项来扩展到多个类别;例如

  • LogLoss = -( sum c in C y_c * log(yhat_c))

这种泛化也称为交叉熵,它计算两个概率分布的差异位数(如果使用以 2 为底的对数)或自然数(如果使用以 e 为底的对数)。

具体来说,它建立在信息论中的概念的基础上,并计算与另一个分布相比,表示或传输一个分布的事件所需的平均位数。

… 交叉熵是我们使用模型 q 来编码来自具有分布 p 的源的数据所需的平均位数 …

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

该定义的直观之处在于,如果我们考虑一个目标或基础概率分布 P 和目标分布 Q 的近似值,那么 PQ 的交叉熵是使用 Q 而不是 P 表示事件所需的额外位数。

我们暂时坚持使用对数损失,因为它是在使用此计算作为分类模型评估指标时最常用的术语。

当计算一组预测与测试数据集中的一组预期概率之间的对数损失时,将计算并报告所有样本的对数损失平均值;例如

  • AverageLogLoss = 1/N * sum i in N -((1 – y) * log(1 – yhat) + y * log(yhat))

训练数据集上预测的平均对数损失通常简称为对数损失。

我们可以通过一个实例演示计算对数损失。

首先,让我们定义一个合成二元分类数据集。我们将使用make_classification() 函数创建 1,000 个样本,两个类别的比例为 99%/1%。创建和总结数据集的完整示例列在下面。

运行示例创建数据集并报告每个类别的样本分布。

接下来,我们将为朴素预测开发直观理解。

一种朴素的预测策略是预测多数类别为确定性,即 P(类别=0) = 1。另一种策略是预测少数类别,即 P(类别=1) = 1。

对数损失可以使用 log_loss() scikit-learn 函数进行计算。它接受每个类别的概率作为输入并返回平均对数损失。具体来说,每个样本必须有一个每个类别的预测概率,这意味着对于二元分类问题,一个样本的预测必须有一个类别 0 和类别 1 的概率。

因此,为所有样本预测类别 0 的确定性概率将如下实现:

我们可以对 P(class1)=1 做同样的事情。

预计这两种策略的表现都会很差。

一种更好的朴素策略是预测每个样本的类别分布。例如,由于我们的数据集对于多数和少数类别的类别分布为 99%/1%,因此可以将此分布“预测”给每个样本,以提供概率预测的基线。

最后,我们还可以通过将测试集的目标值作为预测来计算完美预测概率的对数损失。

将所有这些结合起来,完整的示例如下所示。

运行示例报告了每种朴素策略的对数损失。

正如预期的那样,预测每个类别标签的确定性会受到高对数损失分数的惩罚,而对所有少数类别都预测确定性的情况会得到更高的分数。

我们可以看到,预测数据集中样本分布的基线比其他任何朴素度量都具有更好的分数。此基线代表无技巧分类器,低于此策略的对数损失分数表示具有一定技巧的模型。

最后,我们还可以看到完美预测概率的对数损失为 0.0,这表示实际和预测的概率分布之间没有差异。

现在我们熟悉了对数损失,让我们看一下布里尔分数。

类别不平衡分类的布里尔分数

布里尔分数(以 Glenn Brier 命名)计算预测概率与预期值之间的均方误差。

该分数总结了概率预测中错误的幅度,是为二元分类问题设计的。它侧重于评估正类别的概率。尽管如此,它也可以适应多类别问题。

因此,它是类别不平衡问题的合适概率指标。

概率分数的评估通常通过布里尔分数进行。基本思想是计算预测概率分数与真实类别指示符之间的均方误差 (MSE),其中正类别编码为 1,负类别编码为 0。

— 第 57 页,《学习不平衡数据集》,2018 年。

误差分数总是在 0.0 和 1.0 之间,其中技能完美的模型的得分为 0.0。

布里尔分数可以按照以下方式为正类别预测概率 (yhat) 与预期概率 (y) 计算

  • BrierScore = 1/N * Sum i to N (yhat_i – y_i)^2

例如,如果预测的正类别概率为 0.8,预期概率为 1.0,则布里尔分数计算如下

  • BrierScore = (yhat_i – y_i)^2
  • BrierScore = (0.8 – 1.0)^2
  • BrierScore = 0.04

我们可以通过使用与上一节相同的用于朴素预测模型的那个数据集来演示计算布里尔分数。

布里尔分数可以使用 brier_score_loss() scikit-learn 函数进行计算。它只接受正类别的概率,并返回平均分数。

与上一节一样,我们可以评估预测每个类别标签的确定性的朴素策略。在这种情况下,由于分数仅考虑正类别的概率,因此这将涉及预测 P(类别=1)=0 的 0.0 和 P(类别=1)=1 的 1.0。例如

我们也可以测试预测数据集中正例比例(在本例中为 1% 或 0.01)的无技巧分类器。

最后,我们还可以确认完美预测概率的布里尔分数。

将这些结合起来,完整的示例列在下面。

运行示例,我们可以看到朴素模型和基线无技巧分类器的分数。

正如我们可能预期的那样,我们可以看到预测所有样本的 0.0 会导致低分数,因为所有 0.0 预测与测试集中的大部分 0 类别之间的均方误差会产生一个较小的值。相反,1.0 预测与大部分 0 类别值之间的误差会导致更大的误差分数。

重要的是,我们可以看到默认的无技巧分类器比预测所有 0.0 值产生更低的分数。同样,这代表了基线分数,低于此分数,模型将表现出技巧。

布里尔分数可能变得非常小,并且关注点将是小数点以下的位数。例如,上述示例中基线分数和完美分数之间的差异在小数点后四位很小。

一种常见的做法是使用参考分数(例如无技巧分类器)来转换分数。这被称为布里尔技巧分数,或简称 BSS,计算如下

  • BrierSkillScore = 1 – (BrierScore / BrierScore_ref)

我们可以看到,如果评估了参考分数,它将导致 BSS 为 0.0。这表示无技巧预测。低于此值的值将为负数,表示比无技巧更差。高于 0.0 的值表示有技巧的预测,完美预测值为 1.0。

我们可以通过开发一个函数来计算如下所示的布里尔技巧分数来演示这一点。

然后,我们可以计算每种朴素预测以及完美预测的 BSS。

完整的示例如下所示。

运行示例首先计算 BSS 计算中使用的参考布里尔分数。

然后我们可以看到,预测每个类别的确定性分数会导致负的 BSS 分数,这表明它们比无技巧差。最后,我们可以看到评估参考预测本身会导致 0.0,表示无技巧,而评估真实值作为预测会导致完美的 1.0 分数。

因此,布里尔技巧分数是评估概率预测的最佳实践,并且在常规评估概率分类预测的领域被广泛使用,例如天气预报(例如,是否下雨)。

进一步阅读

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

教程

书籍

API

文章

总结

在本教程中,您了解了用于评估类别不平衡分类概率预测的指标。

具体来说,你学到了:

  • 概率预测对于某些分类预测建模问题是必需的。
  • 对数损失量化了预测概率分布和预期概率分布之间的平均差异。
  • 布里尔分数量化了预测概率和预期概率之间的平均差异。

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

掌控不平衡分类!

Imbalanced Classification with Python

在几分钟内开发不平衡学习模型

...只需几行python代码

在我的新电子书中探索如何实现
使用 Python 处理不平衡分类问题

它提供了关于以下内容的自学教程端到端项目
性能指标欠采样方法SMOTE阈值移动概率校准成本敏感算法
以及更多...

将不平衡分类方法引入您的机器学习项目

查看内容

49 条对“概率指标在类别不平衡分类中的入门指南”的回复

  1. marco 2020年1月11日 上午3:41 #

    你好 Jason,
    我有一个问题。我有 100 个训练样本。特征与工人有关。 y 值是城市名称。将来,我需要预测工人要搬往的城市名称,给定新的输入。这似乎是一个分类问题。对吧?第一个问题是如何对城市名称进行编码?然后是使用 Keras 还是 Sklearn 更好?如果是 Sklearn,使用哪种算法?最后如何解码 y 值?谢谢
    Marco

  2. marco 2020年1月13日 上午6:29 #

    你好 Jason,
    是否也可以使用独热编码来对城市进行编码?独热编码和标签编码有什么区别?何时使用它们?
    谢谢,
    Marco

  3. marco 2020年1月13日 下午8:08 #

    你好 Jason,
    我正在使用IRIS数据集尝试XGBClassifier。
    1) 它是机器学习算法还是深度学习算法?
    2) 当我使用labelEncoder()编码IRIS的y时,为什么我不需要对其进行归一化?(更普遍地说,我是否需要归一化y?)
    3) IRIS X_train的值大于1,我需要对其进行归一化吗?
    谢谢,
    Marco

    • Jason Brownlee 2020年1月14日 上午7:21 #

      XGBoost是机器学习,不是深度学习。

      编码后的标签是整数。不需要归一化类别标签。

      一般来说,对于像xgboost这样的树模型,您不需要归一化输入。

      • James Hutton 2020年7月25日 下午6:43 #

        嗨,Jason,

        那么,如果我们使用树模型,比如xgboost,我们是否不需要进行任何数据转换,例如归一化或标准化?

  4. marco 2020年1月14日 下午8:14 #

    你好 Jason,
    看来XGBClassifier是一个很棒的算法。我用它测试了客户流失数据集。
    我还构建了一个Keras MLP(100个epoch)。
    XGBClassifier比Keras模型快得多,而且准确性更高。
    1. 那么,机器学习算法是否可能比深度学习算法更好?
    2. 您说“一般来说,对于像xgboost这样的树模型,您不需要归一化输入”
    这是个好消息,那另外两个是什么?
    3. XGBClassifier是否也适用于线性回归。您有示例吗?
    谢谢,
    Marco

    • Jason Brownlee 2020年1月15日 上午8:24 #

      是的,每个数据集都不同,您必须进行受控实验来发现最适合每个数据集的方法。

      没有一种“最佳”算法适用于所有问题。

      XGBoost可用于回归。我可能在博客上有示例,可以搜索一下。

    • James Hutton 2020年7月16日 上午7:53 #

      第2个问题 - “像xgboost这样的树模型……,那另外两个是什么?”..

      真让我开心 🙂

  5. Markus 2020年1月15日 上午8:18 #

    能否请您用简单的语言解释一下为什么应该更偏爱Brier Skill Score而不是Log Loss?与Log Loss相比,使用它的好处是什么?

    谢谢

    • Jason Brownlee 2020年1月15日 上午8:34 #

      Log loss非常适合比较分布。

      Brier score,特别是Brier Skill Score,非常适合呈现相对于基线的得分。

  6. marco 2020年1月17日 下午7:00 #

    你好 Jason,
    关于XGBoost还有一个问题。
    我还看到scikit-learn有两个版本的梯度提升(ensemble.GradientBoostingClassifier / ensemble.ensemble.HistGradientBoostingClassifier 和 ensemble.GradientBoostingRegressor / ensemble.HistGradientBoostingRegressor)。
    与XGBoost函数有什么区别?我应该使用哪个?它们更快吗?
    我能否在不进行重大更改的情况下,用它们替换XGBoost函数(XGBClassifier 和 XGBRegressor)?
    谢谢

    • Jason Brownlee 2020年1月18日 上午8:41 #

      很好的问题!

      sklearn中的GBM是标准算法。

      sklearn中的基于直方图的GBM是实验性的,它是基于微软的lightgbm算法的快速版本。

      xgboost是GBM的有效实现,并且比sklearn的实现快得多。

      通常,xgboost、lightgbm和catboost的性能改进也常常带来模型技能的提升。

  7. marco 2020年1月19日 下午9:16 #

    你好 Jason,
    我有几个问题。函数中的参数被称为超参数吗?或者scikit-learn函数中的超参数是什么?

    GradientBoostingClassifier(loss=’deviance’, learning_rate=0.1, n_estimators=100, subsample=1.0, criterion=’friedman_mse’, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0, min_impurity_split=None, init=None, random_state=None, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=False, presort=’deprecated’, validation_fraction=0.1, n_iter_no_change=None, tol=0.0001, ccp_alpha=0.0)[source]¶

    第二个问题是关于sklearn.model_selection.GridSearchCV(我想将其与XGBClassifier和XGBRegressor一起使用)。
    它是否可用于交叉验证?您有示例吗?
    谢谢,
    Marco

  8. Venkatesh Gandi 2020年1月20日 上午6:29 #

    解释得很棒,谢谢!🙂

  9. marco 2020年1月21日 上午12:35 #

    你好 Jason,
    我注意到在集成方法中,有AdaBoostClassifier和AdaBoostRegressor。
    AdaBoostClassifier与GradientBoostingClassifier以及AdaBoostRegressor与GradientBoostingRegressor之间有什么区别?
    什么时候更适合使用Ada函数?
    谢谢,
    Marco

  10. marco 2020年1月21日 上午3:04 #

    你好 Jason,
    还有一个问题是如何浏览scikit-learn地图(https://scikit-learn.cn/stable/tutorial/machine_learning_map/index.html)。
    我清楚流程直到集成分类器(例如,在分类的情况下,是-> SVC -> 不起作用 -> 文本数据 -> 否 -> KNeighbors Classifier -> 不起作用 -> 然后是集成分类器)。那么,如何选择集成分类器中的正确流程?
    是否有任何整体的图或地图来帮助选择正确的集成分类器(或集成回归器,如果是回归的话)?
    谢谢,
    Marco

  11. nini 2020年6月4日 下午7:07 #

    你好Jason,实际上我有一个包含7种缺陷的数据集。目前我已经完成了所有类型的缺陷分类,这里只有一个输出。但是,您是否知道如何知道缺陷的百分比?这意味着我需要将其设置为多个输入,首先
    1. 缺陷类型
    2. 缺陷几率的百分比。

    谢谢,

    Nini

    • nini 2020年6月4日 下午7:08 #

      更正
      这意味着我需要进行多输出,即首先
      1. 缺陷类型
      2. 缺陷几率的百分比。

      谢谢,

      Nini

      • Jason Brownlee 2020年6月5日 上午8:08 #

        不,模型可以直接预测每个类别的概率。例如,LDA、逻辑回归、朴素贝叶斯,以及更多。

    • Jason Brownlee 2020年6月5日 上午8:08 #

      是的,您可以使用预测类别成员概率的模型。或者使用预测概率分数并将模型进行校准的模型。

      • nini 2020年6月5日 上午10:39 #

        这是否意味着不平衡分类的多类别不能用来查找缺陷类型的百分比?:(

  12. James Hutton 2020年7月16日 上午8:02 #

    你好,

    您说像xgboost这样的分类器模型可以直接预测概率。您有这方面的例子吗?

    另一个问题是,我尝试使用rusboost作为我的数据集的算法选择(在matlab中测试过)。我发现python也有它(https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.ensemble.RUSBoostClassifier.html

    这个rusboost是scikit-learn的一部分吗?

    • Jason Brownlee 2020年7月16日 下午1:48 #

      XGBoost可以预测概率,但它不是原生的。您必须对树模型预测的概率进行校准。

      您可以通过调用model.predict_proba()来预测分类概率,这里有示例
      https://machinelearning.org.cn/make-predictions-scikit-learn/

      我不知道ruboost,但我相信imbalanced learn模型与sklearn框架兼容。

      • James Hutton 2020年7月16日 下午5:59 #

        谢谢 Jason!

        你太棒了。

        顺便问一下,我怎么知道这里的所有答案都不是由ML驱动的聊天机器人回复的?

        祝好

        • Jason Brownlee 2020年7月17日 上午6:08 #

          非常欢迎。

          我不知道有什么机器人能做到这一点 🙂

  13. xgboost_user 2020年8月6日 上午12:55 #

    嗨,杰森,

    我正在为我的网格搜索使用brier score,它以‘neg_brier_score’的形式传递,但是,由于我的问题是不平衡的,我该如何传递一个‘brier skill’指标?

    • Jason Brownlee 2020年8月6日 上午6:15 #

      您可能需要手动定义函数,然后将其指定给网格搜索。

  14. ANANTHAKRISHNAN CG 2021年2月5日 下午5:09 #

    你好,先生,

    如何使用随机森林找到二元分类的类别概率。

  15. Moreno 2021年2月9日 上午2:49 #

    亲爱的 Jason,
    您提到Brier Score“侧重于评估阳性类别的概率”,并且“这使得Brier Score比Log Loss更可取,后者侧重于整个概率分布”
    然而,sklearn的实现考虑了所有类别,阳性和阴性。
    因此,它会像logloss一样受到不平衡数据集的影响。

    您对此有什么评论?

    请查看此代码段

    import numpy as np
    from sklearn.metrics import brier_score_loss
    y_true = np.array([0, 1, 1, 0])
    y_true_categorical = np.array(["spam", "ham", "ham", "spam"])
    y_prob = np.array([0.1, 0.9, 0.8, 0.3])
    assert brier_score_loss(y_true, y_prob) == sum((y_true - y_prob)**2) / len(y_prob)

    • Jason Brownlee 2021年2月9日 上午6:35 #

      抱歉,我没跟上。

      “然而,sklearn的实现考虑了所有类别,阳性和阴性”是什么意思?

      类别用正整数表示,从零开始。

  16. Rahul 2022年1月22日 下午7:10 #

    嗨,Jason,

    文章描述了将预测概率与真实/预期概率进行比较。在示例中,真实/预期概率是明确已知并定义为99/1。

    在实践中,真实概率是未知的(如果已知,那么构建模型的目的是什么?)。

    在这种情况下,您如何评估旨在预测概率的模型?

    • James Carmichael 2022年2月4日 上午10:40 #

      你好Rahul……总是建议对预测模型进行验证。

  17. Fernando 2022年1月25日 上午4:37 #

    你好!我刚开始接触机器学习,我正在启动一个新项目。我有一份广告列表,我想根据转化概率对它们进行排序,以便第一个广告被点击的可能性更高。数据集包含诸如星期几、小时、地区、设备类型等特征。
    我的数据集是不平衡的,转化样本很少。当我运行f1分数时,我得到0。我明白模型无法预测转化。
    但是,我仍然可以使用sklearn predict_proba 的值来比较不同的广告并使用该值进行排序吗?这有什么意义吗?

    • James Carmichael 2022年1月25日 上午10:37 #

      你好Fernando……也许你可以尝试你建议的值来确定效果?

  18. Simon 2022年4月1日 下午10:44 #

    你好,

    我有点困惑于预期概率:在博客文章中描述的方法中,我们从机器学习方法中得到每个示例的预测概率,并计算每个示例的log loss或Brier Score。为此,我们需要每个示例的预期概率。由于我们有标签,我们知道真实情况,我们可以使用频率方法为示例组计算预期概率,但如何为单个示例确定预期概率(除了估计100%和0%如果标签或这个单个事件是正确的或不正确的,这并没有真正意义)?

    • James Carmichael 2022年4月2日 下午12:22 #

      你好Simon……是的!您的理解是正确的!

  19. Simon Knutzen 2022年4月4日 下午11:07 #

    嗨 James,

    感谢您的回复。我想我已经自己解决了。我指的是以下公式

    BrierScore = 1/N * Sum i to N (yhat_i – y_i)^2

    y_i 对于单个事件只能是0或1,这在某种程度上使我感到困惑。我期望使用某种频率概率来处理一组可比较的事件,实际上这在Brier Score的3个分量分解的“可靠性”项中使用。看到得分的3个分量分解解决了我的思路障碍。

    • James Carmichael 2022年4月5日 上午7:01 #

      你好Simon……是的!您的理解是正确的!

留下回复

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