分类预测建模涉及为样本预测类别标签,尽管某些问题需要预测类成员身份的概率。
对于这些问题,不需要清晰的类别标签,而是需要每个样本属于每个类别的可能性,之后再进行解释。因此,小的相对概率可能包含很多含义,并且需要专门的指标来量化预测的概率。
在本教程中,您将了解用于评估类别不平衡分类的概率预测的指标。
完成本教程后,您将了解:
- 概率预测对于某些分类预测建模问题是必需的。
- 对数损失量化了预测概率分布和预期概率分布之间的平均差异。
- 布里尔分数量化了预测概率和预期概率之间的平均差异。
开始您的项目,阅读我的新书《Python 类别不平衡分类》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

不平衡分类概率指标简介
照片由 a4gpa 提供,保留部分权利。
教程概述
本教程分为三个部分;它们是:
- 概率指标
- 类别不平衡分类的对数损失
- 类别不平衡分类的布里尔分数
概率指标
分类预测建模涉及为样本预测类别标签。
在某些问题中,不需要清晰的类别标签,而是首选类成员身份的概率。概率总结了样本属于每个类别的可能性(或不确定性)。概率更细致,可以由人工操作员或系统在决策制定中进行解释。
概率指标是专门设计用于量化分类模型使用预测概率而不是清晰类别标签的技能的指标。它们通常是分数,可以用来根据预测概率与预期类别概率的匹配程度来比较不同的模型。
实际上,数据集将不包含目标概率。相反,它将包含类别标签。
例如,一个二元分类问题将具有负类别的类别标签 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 的近似值,那么 P 的 Q 的交叉熵是使用 Q 而不是 P 表示事件所需的额外位数。
我们暂时坚持使用对数损失,因为它是在使用此计算作为分类模型评估指标时最常用的术语。
当计算一组预测与测试数据集中的一组预期概率之间的对数损失时,将计算并报告所有样本的对数损失平均值;例如
- AverageLogLoss = 1/N * sum i in N -((1 – y) * log(1 – yhat) + y * log(yhat))
训练数据集上预测的平均对数损失通常简称为对数损失。
我们可以通过一个实例演示计算对数损失。
首先,让我们定义一个合成二元分类数据集。我们将使用make_classification() 函数创建 1,000 个样本,两个类别的比例为 99%/1%。创建和总结数据集的完整示例列在下面。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 创建一个类别不平衡的数据集 from numpy import unique from sklearn.datasets import make_classification # 生成 2 类数据集 X, y = make_classification(n_samples=1000, n_classes=2, weights=[0.99], flip_y=0, random_state=1) # 总结数据集 classes = unique(y) total = len(y) for c in classes: n_examples = len(y[y==c]) percent = n_examples / total * 100 print('> Class=%d : %d/%d (%.1f%%)' % (c, n_examples, total, percent)) |
运行示例创建数据集并报告每个类别的样本分布。
1 2 |
> Class=0 : 990/1000 (99.0%) > Class=1 : 10/1000 (1.0%) |
接下来,我们将为朴素预测开发直观理解。
一种朴素的预测策略是预测多数类别为确定性,即 P(类别=0) = 1。另一种策略是预测少数类别,即 P(类别=1) = 1。
对数损失可以使用 log_loss() scikit-learn 函数进行计算。它接受每个类别的概率作为输入并返回平均对数损失。具体来说,每个样本必须有一个每个类别的预测概率,这意味着对于二元分类问题,一个样本的预测必须有一个类别 0 和类别 1 的概率。
因此,为所有样本预测类别 0 的确定性概率将如下实现:
1 2 3 4 5 |
... # 无技巧预测 0 probabilities = [[1, 0] for _ in range(len(testy))] avg_logloss = log_loss(testy, probabilities) print('P(class0=1): Log Loss=%.3f' % (avg_logloss)) |
我们可以对 P(class1)=1 做同样的事情。
预计这两种策略的表现都会很差。
一种更好的朴素策略是预测每个样本的类别分布。例如,由于我们的数据集对于多数和少数类别的类别分布为 99%/1%,因此可以将此分布“预测”给每个样本,以提供概率预测的基线。
1 2 3 4 5 |
... # 基线概率 probabilities = [[0.99, 0.01] for _ in range(len(testy))] avg_logloss = log_loss(testy, probabilities) print('Baseline: Log Loss=%.3f' % (avg_logloss)) |
最后,我们还可以通过将测试集的目标值作为预测来计算完美预测概率的对数损失。
1 2 3 4 |
... # 完美概率 avg_logloss = log_loss(testy, testy) print('Perfect: Log Loss=%.3f' % (avg_logloss)) |
将所有这些结合起来,完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 朴素概率预测的对数损失。 from numpy import mean from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import log_loss # 生成 2 类数据集 X, y = make_classification(n_samples=1000, n_classes=2, weights=[0.99], flip_y=0, random_state=1) # 以相同类别比例分割为训练/测试集 trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2, stratify=y) # 无技巧预测 0 probabilities = [[1, 0] for _ in range(len(testy))] avg_logloss = log_loss(testy, probabilities) print('P(class0=1): Log Loss=%.3f' % (avg_logloss)) # 无技巧预测 1 probabilities = [[0, 1] for _ in range(len(testy))] avg_logloss = log_loss(testy, probabilities) print('P(class1=1): Log Loss=%.3f' % (avg_logloss)) # 基线概率 probabilities = [[0.99, 0.01] for _ in range(len(testy))] avg_logloss = log_loss(testy, probabilities) print('Baseline: Log Loss=%.3f' % (avg_logloss)) # 完美概率 avg_logloss = log_loss(testy, testy) print('Perfect: Log Loss=%.3f' % (avg_logloss)) |
运行示例报告了每种朴素策略的对数损失。
正如预期的那样,预测每个类别标签的确定性会受到高对数损失分数的惩罚,而对所有少数类别都预测确定性的情况会得到更高的分数。
我们可以看到,预测数据集中样本分布的基线比其他任何朴素度量都具有更好的分数。此基线代表无技巧分类器,低于此策略的对数损失分数表示具有一定技巧的模型。
最后,我们还可以看到完美预测概率的对数损失为 0.0,这表示实际和预测的概率分布之间没有差异。
1 2 3 4 |
P(class0=1): Log Loss=0.345 P(class1=1): Log Loss=34.193 Baseline: Log Loss=0.056 Perfect: Log Loss=0.000 |
现在我们熟悉了对数损失,让我们看一下布里尔分数。
类别不平衡分类的布里尔分数
布里尔分数(以 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 2 3 4 5 6 7 8 9 |
... # 无技巧预测 0 probabilities = [0.0 for _ in range(len(testy))] avg_brier = brier_score_loss(testy, probabilities) print('P(class1=0): Brier Score=%.4f' % (avg_brier)) # 无技巧预测 1 probabilities = [1.0 for _ in range(len(testy))] avg_brier = brier_score_loss(testy, probabilities) print('P(class1=1): Brier Score=%.4f' % (avg_brier)) |
我们也可以测试预测数据集中正例比例(在本例中为 1% 或 0.01)的无技巧分类器。
1 2 3 4 5 |
... # 基线概率 probabilities = [0.01 for _ in range(len(testy))] avg_brier = brier_score_loss(testy, probabilities) print('Baseline: Brier Score=%.4f' % (avg_brier)) |
最后,我们还可以确认完美预测概率的布里尔分数。
1 2 3 4 |
... # 完美概率 avg_brier = brier_score_loss(testy, testy) print('Perfect: Brier Score=%.4f' % (avg_brier)) |
将这些结合起来,完整的示例列在下面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 朴素概率预测的布里尔分数。 from numpy import mean from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import brier_score_loss # 生成 2 类数据集 X, y = make_classification(n_samples=1000, n_classes=2, weights=[0.99], flip_y=0, random_state=1) # 以相同类别比例分割为训练/测试集 trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2, stratify=y) # 无技巧预测 0 probabilities = [0.0 for _ in range(len(testy))] avg_brier = brier_score_loss(testy, probabilities) print('P(class1=0): Brier Score=%.4f' % (avg_brier)) # 无技巧预测 1 probabilities = [1.0 for _ in range(len(testy))] avg_brier = brier_score_loss(testy, probabilities) print('P(class1=1): Brier Score=%.4f' % (avg_brier)) # 基线概率 probabilities = [0.01 for _ in range(len(testy))] avg_brier = brier_score_loss(testy, probabilities) print('Baseline: Brier Score=%.4f' % (avg_brier)) # 完美概率 avg_brier = brier_score_loss(testy, testy) print('Perfect: Brier Score=%.4f' % (avg_brier)) |
运行示例,我们可以看到朴素模型和基线无技巧分类器的分数。
正如我们可能预期的那样,我们可以看到预测所有样本的 0.0 会导致低分数,因为所有 0.0 预测与测试集中的大部分 0 类别之间的均方误差会产生一个较小的值。相反,1.0 预测与大部分 0 类别值之间的误差会导致更大的误差分数。
重要的是,我们可以看到默认的无技巧分类器比预测所有 0.0 值产生更低的分数。同样,这代表了基线分数,低于此分数,模型将表现出技巧。
1 2 3 4 |
P(class1=0): Brier Score=0.0100 P(class1=1): Brier Score=0.9900 Baseline: Brier Score=0.0099 Perfect: Brier Score=0.0000 |
布里尔分数可能变得非常小,并且关注点将是小数点以下的位数。例如,上述示例中基线分数和完美分数之间的差异在小数点后四位很小。
一种常见的做法是使用参考分数(例如无技巧分类器)来转换分数。这被称为布里尔技巧分数,或简称 BSS,计算如下
- BrierSkillScore = 1 – (BrierScore / BrierScore_ref)
我们可以看到,如果评估了参考分数,它将导致 BSS 为 0.0。这表示无技巧预测。低于此值的值将为负数,表示比无技巧更差。高于 0.0 的值表示有技巧的预测,完美预测值为 1.0。
我们可以通过开发一个函数来计算如下所示的布里尔技巧分数来演示这一点。
1 2 3 4 5 6 |
# 计算布里尔技巧分数 def brier_skill_score(y, yhat, brier_ref): # 计算布里尔分数 bs = brier_score_loss(y, yhat) # 计算技巧分数 return 1.0 - (bs / brier_ref) |
然后,我们可以计算每种朴素预测以及完美预测的 BSS。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# 朴素概率预测的布里尔技巧分数。 from numpy import mean from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import brier_score_loss # 计算布里尔技巧分数 def brier_skill_score(y, yhat, brier_ref): # 计算布里尔分数 bs = brier_score_loss(y, yhat) # 计算技巧分数 return 1.0 - (bs / brier_ref) # 生成 2 类数据集 X, y = make_classification(n_samples=1000, n_classes=2, weights=[0.99], flip_y=0, random_state=1) # 以相同类别比例分割为训练/测试集 trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2, stratify=y) # 计算参考 probabilities = [0.01 for _ in range(len(testy))] brier_ref = brier_score_loss(testy, probabilities) print('Reference: Brier Score=%.4f' % (brier_ref)) # 无技巧预测 0 probabilities = [0.0 for _ in range(len(testy))] bss = brier_skill_score(testy, probabilities, brier_ref) print('P(class1=0): BSS=%.4f' % (bss)) # 无技巧预测 1 probabilities = [1.0 for _ in range(len(testy))] bss = brier_skill_score(testy, probabilities, brier_ref) print('P(class1=1): BSS=%.4f' % (bss)) # 基线概率 probabilities = [0.01 for _ in range(len(testy))] bss = brier_skill_score(testy, probabilities, brier_ref) print('Baseline: BSS=%.4f' % (bss)) # 完美概率 bss = brier_skill_score(testy, testy, brier_ref) print('Perfect: BSS=%.4f' % (bss)) |
运行示例首先计算 BSS 计算中使用的参考布里尔分数。
然后我们可以看到,预测每个类别的确定性分数会导致负的 BSS 分数,这表明它们比无技巧差。最后,我们可以看到评估参考预测本身会导致 0.0,表示无技巧,而评估真实值作为预测会导致完美的 1.0 分数。
因此,布里尔技巧分数是评估概率预测的最佳实践,并且在常规评估概率分类预测的领域被广泛使用,例如天气预报(例如,是否下雨)。
1 2 3 4 5 |
Reference: Brier Score=0.0099 P(class1=0): BSS=-0.0101 P(class1=1): BSS=-99.0000 Baseline: BSS=0.0000 Perfect: BSS=1.0000 |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
教程
书籍
- 第 8 章 类别不平衡学习的评估指标,《类别不平衡学习:基础、算法和应用》,2013。
- 第 3 章 性能度量,《从类别不平衡数据集中学习》,2018。
API
- sklearn.datasets.make_classification API.
- sklearn.metrics.log_loss API.
- sklearn.metrics.brier_score_loss API.
文章
总结
在本教程中,您了解了用于评估类别不平衡分类概率预测的指标。
具体来说,你学到了:
- 概率预测对于某些分类预测建模问题是必需的。
- 对数损失量化了预测概率分布和预期概率分布之间的平均差异。
- 布里尔分数量化了预测概率和预期概率之间的平均差异。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
你好 Jason,
我有一个问题。我有 100 个训练样本。特征与工人有关。 y 值是城市名称。将来,我需要预测工人要搬往的城市名称,给定新的输入。这似乎是一个分类问题。对吧?第一个问题是如何对城市名称进行编码?然后是使用 Keras 还是 Sklearn 更好?如果是 Sklearn,使用哪种算法?最后如何解码 y 值?谢谢
Marco
是的。分类。
或许可以使用标签编码器来处理城市名称。
测试一系列算法
https://machinelearning.org.cn/faq/single-faq/what-algorithm-config-should-i-use
你好 Jason,
是否也可以使用独热编码来对城市进行编码?独热编码和标签编码有什么区别?何时使用它们?
谢谢,
Marco
是的,好问题。看这里
https://machinelearning.org.cn/how-to-prepare-categorical-data-for-deep-learning-in-python/
你好 Jason,
我正在使用IRIS数据集尝试XGBClassifier。
1) 它是机器学习算法还是深度学习算法?
2) 当我使用labelEncoder()编码IRIS的y时,为什么我不需要对其进行归一化?(更普遍地说,我是否需要归一化y?)
3) IRIS X_train的值大于1,我需要对其进行归一化吗?
谢谢,
Marco
XGBoost是机器学习,不是深度学习。
编码后的标签是整数。不需要归一化类别标签。
一般来说,对于像xgboost这样的树模型,您不需要归一化输入。
嗨,Jason,
那么,如果我们使用树模型,比如xgboost,我们是否不需要进行任何数据转换,例如归一化或标准化?
是的,通常是这样。
你好 Jason,
看来XGBClassifier是一个很棒的算法。我用它测试了客户流失数据集。
我还构建了一个Keras MLP(100个epoch)。
XGBClassifier比Keras模型快得多,而且准确性更高。
1. 那么,机器学习算法是否可能比深度学习算法更好?
2. 您说“一般来说,对于像xgboost这样的树模型,您不需要归一化输入”
这是个好消息,那另外两个是什么?
3. XGBClassifier是否也适用于线性回归。您有示例吗?
谢谢,
Marco
是的,每个数据集都不同,您必须进行受控实验来发现最适合每个数据集的方法。
没有一种“最佳”算法适用于所有问题。
XGBoost可用于回归。我可能在博客上有示例,可以搜索一下。
第2个问题 - “像xgboost这样的树模型……,那另外两个是什么?”..
真让我开心 🙂
能否请您用简单的语言解释一下为什么应该更偏爱Brier Skill Score而不是Log Loss?与Log Loss相比,使用它的好处是什么?
谢谢
Log loss非常适合比较分布。
Brier score,特别是Brier Skill Score,非常适合呈现相对于基线的得分。
你好 Jason,
关于XGBoost还有一个问题。
我还看到scikit-learn有两个版本的梯度提升(ensemble.GradientBoostingClassifier / ensemble.ensemble.HistGradientBoostingClassifier 和 ensemble.GradientBoostingRegressor / ensemble.HistGradientBoostingRegressor)。
与XGBoost函数有什么区别?我应该使用哪个?它们更快吗?
我能否在不进行重大更改的情况下,用它们替换XGBoost函数(XGBClassifier 和 XGBRegressor)?
谢谢
很好的问题!
sklearn中的GBM是标准算法。
sklearn中的基于直方图的GBM是实验性的,它是基于微软的lightgbm算法的快速版本。
xgboost是GBM的有效实现,并且比sklearn的实现快得多。
通常,xgboost、lightgbm和catboost的性能改进也常常带来模型技能的提升。
你好 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
超参数是在定义算法类时作为参数传递的。
是的,您可以使用scikit-learn对xgboost进行网格搜索。
是的,这里有一个示例
https://machinelearning.org.cn/xgboost-python-mini-course/
解释得很棒,谢谢!🙂
谢谢!
你好 Jason,
我注意到在集成方法中,有AdaBoostClassifier和AdaBoostRegressor。
AdaBoostClassifier与GradientBoostingClassifier以及AdaBoostRegressor与GradientBoostingRegressor之间有什么区别?
什么时候更适合使用Ada函数?
谢谢,
Marco
它们是完全不同的算法,例如,adaboost 与梯度提升机。
Adaboost 是第一个提升算法。
https://machinelearning.org.cn/boosting-and-adaboost-for-machine-learning/
梯度提升是这个想法的一个巧妙的扩展。
https://machinelearning.org.cn/gentle-introduction-gradient-boosting-algorithm-machine-learning/
你好 Jason,
还有一个问题是如何浏览scikit-learn地图(https://scikit-learn.cn/stable/tutorial/machine_learning_map/index.html)。
我清楚流程直到集成分类器(例如,在分类的情况下,是-> SVC -> 不起作用 -> 文本数据 -> 否 -> KNeighbors Classifier -> 不起作用 -> 然后是集成分类器)。那么,如何选择集成分类器中的正确流程?
是否有任何整体的图或地图来帮助选择正确的集成分类器(或集成回归器,如果是回归的话)?
谢谢,
Marco
我推荐这个过程
https://machinelearning.org.cn/start-here/#process
你好Jason,实际上我有一个包含7种缺陷的数据集。目前我已经完成了所有类型的缺陷分类,这里只有一个输出。但是,您是否知道如何知道缺陷的百分比?这意味着我需要将其设置为多个输入,首先
1. 缺陷类型
2. 缺陷几率的百分比。
谢谢,
Nini
更正
这意味着我需要进行多输出,即首先
1. 缺陷类型
2. 缺陷几率的百分比。
谢谢,
Nini
不,模型可以直接预测每个类别的概率。例如,LDA、逻辑回归、朴素贝叶斯,以及更多。
是的,您可以使用预测类别成员概率的模型。或者使用预测概率分数并将模型进行校准的模型。
这是否意味着不平衡分类的多类别不能用来查找缺陷类型的百分比?:(
不,这并不意味着。
你好,
您说像xgboost这样的分类器模型可以直接预测概率。您有这方面的例子吗?
另一个问题是,我尝试使用rusboost作为我的数据集的算法选择(在matlab中测试过)。我发现python也有它(https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.ensemble.RUSBoostClassifier.html)
这个rusboost是scikit-learn的一部分吗?
XGBoost可以预测概率,但它不是原生的。您必须对树模型预测的概率进行校准。
您可以通过调用model.predict_proba()来预测分类概率,这里有示例
https://machinelearning.org.cn/make-predictions-scikit-learn/
我不知道ruboost,但我相信imbalanced learn模型与sklearn框架兼容。
谢谢 Jason!
你太棒了。
顺便问一下,我怎么知道这里的所有答案都不是由ML驱动的聊天机器人回复的?
祝好
非常欢迎。
我不知道有什么机器人能做到这一点 🙂
嗨,Jason,
您能指出关于概率校准的教程吗?
另外,您有关于autoML的教程吗?另外,您是否也计划提供H2O的教程?
概率校准
https://machinelearning.org.cn/probability-calibration-for-imbalanced-classification/
是的,我有很多关于automl的教程,已经写好并计划发布——都是开源库。它们将在未来几个月内出现在博客上。
嗨,杰森,
我正在为我的网格搜索使用brier score,它以‘neg_brier_score’的形式传递,但是,由于我的问题是不平衡的,我该如何传递一个‘brier skill’指标?
您可能需要手动定义函数,然后将其指定给网格搜索。
你好,先生,
如何使用随机森林找到二元分类的类别概率。
调用model.predict_proba()来获取概率。
您可能需要考虑在使用概率之前对其进行校准。
https://machinelearning.org.cn/calibrated-classification-model-in-scikit-learn/
亲爱的 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)
抱歉,我没跟上。
“然而,sklearn的实现考虑了所有类别,阳性和阴性”是什么意思?
类别用正整数表示,从零开始。
嗨,Jason,
文章描述了将预测概率与真实/预期概率进行比较。在示例中,真实/预期概率是明确已知并定义为99/1。
在实践中,真实概率是未知的(如果已知,那么构建模型的目的是什么?)。
在这种情况下,您如何评估旨在预测概率的模型?
你好Rahul……总是建议对预测模型进行验证。
你好!我刚开始接触机器学习,我正在启动一个新项目。我有一份广告列表,我想根据转化概率对它们进行排序,以便第一个广告被点击的可能性更高。数据集包含诸如星期几、小时、地区、设备类型等特征。
我的数据集是不平衡的,转化样本很少。当我运行f1分数时,我得到0。我明白模型无法预测转化。
但是,我仍然可以使用sklearn predict_proba 的值来比较不同的广告并使用该值进行排序吗?这有什么意义吗?
你好Fernando……也许你可以尝试你建议的值来确定效果?
你好,
我有点困惑于预期概率:在博客文章中描述的方法中,我们从机器学习方法中得到每个示例的预测概率,并计算每个示例的log loss或Brier Score。为此,我们需要每个示例的预期概率。由于我们有标签,我们知道真实情况,我们可以使用频率方法为示例组计算预期概率,但如何为单个示例确定预期概率(除了估计100%和0%如果标签或这个单个事件是正确的或不正确的,这并没有真正意义)?
你好Simon……是的!您的理解是正确的!
嗨 James,
感谢您的回复。我想我已经自己解决了。我指的是以下公式
BrierScore = 1/N * Sum i to N (yhat_i – y_i)^2
y_i 对于单个事件只能是0或1,这在某种程度上使我感到困惑。我期望使用某种频率概率来处理一组可比较的事件,实际上这在Brier Score的3个分量分解的“可靠性”项中使用。看到得分的3个分量分解解决了我的思路障碍。
你好Simon……是的!您的理解是正确的!