不平衡分类项目的分步框架

分类预测建模问题涉及预测给定输入集的类别标签。

这通常是一个具有挑战性的问题,特别是如果对数据集知之甚少,因为有数十甚至数百种机器学习算法可供选择。如果类别中样本的分布不平衡,问题会变得更加困难。这需要使用专门的方法来改变数据集或改变学习算法以处理倾斜的类别分布。

在新分类项目上处理压倒性问题的一种常见方法是使用喜爱的机器学习算法,如随机森林或SMOTE。另一种常见方法是搜寻研究文献,寻找对模糊相似问题的描述,并尝试重新实现所描述的算法和配置。

这些方法可能有效,但它们分别是碰运气和耗时的。相反,在新分类任务上获得良好结果的最短路径是系统地评估一套机器学习算法,以发现哪些效果良好,然后加倍努力。这种方法也可以用于不平衡分类问题,针对数据采样、成本敏感和单类别分类算法的范围进行定制,以供选择。

在本教程中,您将发现一个系统框架,用于处理不平衡分类数据集。

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

  • 为不平衡分类选择算法的挑战。
  • 一个系统地处理不平衡分类项目的高级框架。
  • 在不平衡分类项目的每个步骤中尝试的具体算法建议。

使用我的新书《使用 Python 进行不平衡分类》启动您的项目,包括逐步教程和所有示例的 Python 源代码文件。

让我们开始吧。

Step-By-Step Framework for Imbalanced Classification Projects

不平衡分类项目的分步框架
图片来源:~jar{},保留部分权利。

教程概述

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

  1. 使用哪种算法?
  2. 使用系统框架
  3. 不平衡分类的详细框架
    1. 选择一个度量
    2. 快速检查算法
    3. 快速检查不平衡算法
    4. 超参数调优

1. 使用哪种算法?

您获得或获得了一个不平衡的分类数据集。接下来怎么办?

有如此多的机器学习算法可供选择,更不用说专门为不平衡分类设计的技术了。

您使用哪些算法? 您如何选择?

这是每个新不平衡分类项目开始时面临的挑战。正是这个挑战使得应用机器学习既令人兴奋又令人恐惧。

解决这个问题可能有两种常见方法

  • 使用喜爱的算法。
  • 使用以前有效的方法。

一种方法是选择一个喜爱的算法并开始调整超参数。这是一种快速的解决方案方法,但只有当您喜爱的算法恰好是您特定数据集的最佳解决方案时才有效。

另一种方法是查阅文献,看看在类似您的数据集上使用了哪些技术。如果许多人研究并报告了类似数据集的结果,这可能会有效。

在实践中,情况很少如此,研究出版物倾向于展示对宠物算法的希望,而不是对方法进行诚实的比较。充其量,文献可以用于尝试技术的想法。

相反,如果对问题知之甚少,那么获得“良好”结果的最短路径是系统地测试一系列不同的算法在您的数据集上。

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

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

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

2. 使用系统框架

考虑一个平衡的分类任务。

您面临着选择使用哪些算法来处理数据集的相同挑战。

解决这个问题有很多方法,但最可靠的方法是系统地测试一系列算法并使用经验结果进行选择。

我最喜欢的算法”或“过去有效的方法”等偏见可以为研究提供想法,但如果依赖它们可能会误导您。相反,您需要让系统经验实验的结果告诉您哪种算法对您的不平衡分类数据集是好的或最好的。

一旦有了数据集,过程包括三个步骤:(1) 选择一个评估候选模型的度量,(2) 测试一套算法,以及 (3) 调整表现最佳的模型。这可能不是唯一的方法;它只是最简单的可靠过程,可以非常快速地将您从“我有一个新数据集”变为“我得到了很好的结果”。

此过程可概括如下

  1. 选择一个度量
  2. 快速检查算法
  3. 超参数调优

快速检查算法涉及更多,因为许多算法需要专门的数据准备,例如缩放、去除异常值等。此外,评估候选算法需要仔细设计测试工具,通常涉及使用 k 折交叉验证来估计给定模型在未见数据上的性能。

我们可以将此简单过程用于不平衡分类。

在不平衡分类上快速检查标准机器学习算法仍然很重要。当类别分布不平衡时,标准算法通常表现不佳。尽管如此,首先测试它们可以提供一个性能基线,更专业的模型可以与该基线进行比较并必须超越它。

调整表现良好的算法的超参数仍然很重要。这包括专门为不平衡分类设计的模型的超参数。

因此,我们可以使用相同的三步过程并插入一个额外的步骤来评估不平衡分类算法。

我们可以将此过程概括如下

  1. 选择一个度量
  2. 快速检查算法
  3. 快速检查不平衡算法
  4. 超参数调优

这提供了一个高层次的系统框架来处理不平衡分类问题。

然而,有许多不平衡算法可供选择,更不用说许多不同的标准机器学习算法可供选择。

我们要求每个步骤都有一个类似的低级系统框架。

3. 不平衡分类的详细框架

我们可以开发一个类似的低级框架,系统地处理不平衡分类项目的每个步骤。

从选择度量到超参数调整。

3.1. 选择度量

选择一个度量可能是项目中最重要的步骤。

度量是衡量所有模型并进行比较的尺子。选择错误的度量可能意味着选择错误的算法。也就是说,一个模型解决了与您实际想要解决的问题不同的问题。

度量必须捕获有关模型或其预测对项目或项目利益相关者最重要的那些细节。

这很困难,因为有许多度量可供选择,而且项目利益相关者往往不确定他们想要什么。可能还有多种方式来构建问题,探索几种不同的构建方式并反过来使用不同的度量可能是有益的,以了解对利益相关者来说什么是有意义的。

首先,您必须决定是想预测概率还是精确的类别标签。回想一下,对于二元不平衡分类任务,多数类别是正常类别,称为“负类别”,少数类别是异常类别,称为“正类别”。

概率捕获预测的不确定性,而精确的类别标签可以立即使用。

  • 概率:预测每个样本的类别成员资格概率。
  • 类别标签:预测每个样本的精确类别标签。

3.1.1. 预测概率

如果概率旨在直接使用,那么一个好的度量可能是布里尔分数和布里尔技能分数。

或者,您可能希望预测概率并允许用户通过用户选择的阈值将它们映射到精确的类别标签。在这种情况下,可以选择一个度量来总结模型在所有可能阈值范围内的性能。

如果正类别最重要,则可以使用精确率-召回率曲线和曲线下面积 (PR AUC)。这将优化所有阈值下的精确率和召回率。

或者,如果两个类别同样重要,则可以使用 ROC 曲线和曲线下面积 (ROC AUC)。这将最大化真阳性率并最小化假阳性率。

3.1.2. 预测类别标签

如果需要类别标签并且两个类别同等重要,则一个好的默认度量是分类准确率。这仅在多数类别小于数据约 80% 的情况下才有意义。多数类别如果倾斜超过 80% 或 90%,将淹没准确率度量,并且它将失去比较算法的意义。

如果类别分布严重倾斜,则可以使用 G-均值度量,它将优化敏感度和特异性度量。

如果正类别更重要,则可以使用 F-Measure 的变体来优化精确率和召回率。如果假阳性和假阴性同样重要,则可以使用 F1。如果假阴性代价更高,则可以使用 F2-Measure,否则,如果假阳性代价更高,则可以使用 F0.5-Measure。

3.1.3. 选择度量的框架

这些只是启发式方法,但如果您在为不平衡分类任务选择度量时感到迷失,它们提供了一个有用的起点。

我们可以将这些启发式方法总结为一个框架,如下所示

  • 您是在预测概率吗?
    • 您需要类别标签吗?
      • 正类别更重要吗?
        • 使用精确率-召回率 AUC
      • 两个类别都重要吗?
        • 使用 ROC AUC
    • 您需要概率吗?
      • 使用布里尔分数和布里尔技能分数
  • 您是在预测类别标签吗?
    • 正类别更重要吗?
      • 假阴性和假阳性成本相等吗?
        • 使用 F1-Measure
      • 假阴性成本更高吗?
        • 使用 F2-Measure
      • 假阳性成本更高吗?
        • 使用 F0.5-Measure
    • 两个类别都重要吗?
      • 多数类别样本是否少于 80%-90%? 
        • 使用准确率
      • 多数类别样本是否多于 80%-90%? 
        • 使用 G-均值

我们还可以将这些决策转化为决策树,如下所示。

How to Choose a Metric for Imbalanced Classification

如何为不平衡分类选择度量

一旦选择了度量,您就可以开始评估机器学习算法。

3.2. 快速检查算法

快速检查机器学习算法意味着评估一套不同类型的算法,并进行最少的超参数调整。

具体来说,这意味着给每个算法一个很好地了解问题的机会,包括执行算法所需的任何数据准备,并使用最佳实践配置选项或默认值。

目标是快速测试一系列标准机器学习算法,并提供一个性能基线,所有不平衡分类技术都必须与该基线进行比较并超越它才能被认为是熟练的。这里的想法是,如果花哨的不平衡算法无法超越所谓的非平衡算法,那么使用它们就没什么意义了。

必须定义一个稳健的测试工具。这通常涉及 k 折交叉验证,通常 k=10 是一个合理的默认值。通常需要分层交叉验证以确保每个折叠具有与原始数据集相同的类别分布。并且交叉验证过程通常重复多次,例如 3、10 或 30 次,以便有效地捕获数据集上模型性能的样本,并用分数的均值和标准差进行总结。

可能需要快速检查四级算法;它们是

  1. 朴素算法
  2. 线性算法
  3. 非线性算法
  4. 集成算法

3.2.1. 朴素算法

首先,必须评估朴素分类。

这提供了一个性能的最低基线,任何算法都必须克服它才能在数据集上具有技能。

朴素意味着算法除了 if 语句或预测常量值之外没有其他逻辑。朴素算法的选择基于性能度量的选择。

例如,对于分类准确率,一个合适的朴素算法是所有情况下都预测多数类别。对于评估概率时的布里尔分数,一个合适的朴素算法是预测训练数据集中每个类别的先验概率。

建议的性能度量到朴素算法的映射如下

  • 准确率:预测多数类别(类别 0)。
  • G-均值:预测一个均匀随机类别。
  • F-Measure:预测少数类别(类别 1)。
  • ROC AUC:预测一个分层随机类别。
  • PR ROC:预测一个分层随机类别。
  • 布里尔分数:预测多数类别先验。

如果您不确定哪种“最佳”朴素算法适合您的度量,可以测试几种并发现哪种算法能带来更好的性能,您可以将其用作您的最低基线。

一些选项包括

  • 在所有情况下都预测多数类别。
  • 在所有情况下都预测少数类别。
  • 预测一个均匀随机选择的类别。
  • 根据每个类别的先验概率预测一个随机选择的类别。
  • 预测类别先验概率。

3.2.2. 线性算法

线性算法通常来源于统计学领域,并对问题的函数形式做出强假设。

我们可以称它们为线性,因为输出是输入的线性组合,或加权输入,尽管这个定义被拉伸了。您也可以将这些算法称为概率算法,因为它们通常在概率框架下拟合。

它们通常训练速度快,并且通常表现非常好。您应该考虑尝试的线性算法示例包括

  • 逻辑回归
  • 线性判别分析
  • 朴素贝叶斯

3.2.3. 非线性算法

非线性算法来源于机器学习领域,并且对问题的函数形式做出很少的假设。

我们可以称它们为非线性,因为输出通常是输入到输出的非线性映射。

它们通常比线性算法需要更多的数据,并且训练速度较慢。您应该考虑尝试的非线性算法示例包括

  • 决策树
  • k-近邻
  • 人工神经网络
  • 支持向量机

3.2.4. 集成算法

集成算法也来源于机器学习领域,它们结合了两个或更多模型的预测。

有许多集成算法可供选择,但在快速检查算法时,最好关注决策树算法的集成,因为它们在实践中已知在各种问题上表现良好。

您应该考虑尝试的决策树算法集成示例包括

  • 装袋决策树
  • 随机森林
  • 额外树
  • 随机梯度提升

3.2.5. 快速检查机器学习算法的框架

我们可以将这些建议总结为一个在数据集上测试机器学习算法的框架。

  • 朴素算法
    • 多数类别
    • 少数类别
    • 类别先验
  • 线性算法
    • 逻辑回归
    • 线性判别分析
    • 朴素贝叶斯
  • 非线性算法
    • 决策树
    • k-近邻
    • 人工神经网络
    • 支持向量机
  • 集成算法
    • 装袋决策树
    • 随机森林
    • 额外树
    • 随机梯度提升

这些步骤的顺序可能不灵活。将算法的顺序视为复杂性递增,从而能力递增。

每个步骤中算法的顺序是灵活的,算法列表不完整,鉴于可用的算法数量庞大,可能永远无法完整。将测试的算法限制为最常见或最广泛使用的一个子集是一个好的开始。使用数据准备建议和超参数默认值也是一个好的开始。

下图总结了框架的这一步骤。

How to Spot-Check Machine Learning Algorithms

如何快速检查机器学习算法

3.3. 快速检查不平衡算法

快速检查不平衡算法很像快速检查机器学习算法。

目标是快速测试大量技术,以发现哪些有前景,以便您稍后在超参数调整期间更专注于它们。

上一节中进行的快速检查提供了朴素和适度熟练的模型,所有不平衡技术都可以与之进行比较。这使您可以专注于那些真正有望解决问题的方法,而不是对仅与其他不平衡分类技术相比显得有效的结果感到兴奋(这是一个容易陷入的陷阱)。

可能需要快速检查四种类型的不平衡分类技术

  1. 数据采样算法
  2. 成本敏感算法
  3. 单类别算法
  4. 概率调整算法

3.3.1. 数据采样算法

数据采样算法改变训练数据集的组成,以提高标准机器学习算法在不平衡分类问题上的性能。

数据采样技术可能主要有三种类型;它们是

  • 数据过采样。
  • 数据欠采样。
  • 结合过采样和欠采样。

数据过采样涉及复制少数类别的样本,或者从现有样本中合成少数类别的新样本。最流行的方法可能是 SMOTE 及其变体,例如 Borderline SMOTE。最重要的超参数可能是要执行的过采样量。

数据过采样方法的示例包括

  • 随机过采样
  • SMOTE
  • Borderline SMOTE
  • SVM SMOTE
  • k-Means SMOTE
  • ADASYN

欠采样涉及从多数类别中删除样本,例如随机删除或使用算法仔细选择要删除的样本。流行的编辑算法包括编辑最近邻和 Tomek 链接。

数据欠采样方法的示例包括

  • 随机欠采样
  • Condensed Nearest Neighbor (CNB)
  • Tomek 链接
  • Edited Nearest Neighbors (ENN)
  • Neighborhood Cleaning Rule (NCR)
  • 单侧选择

几乎任何过采样方法都可以与几乎任何欠采样技术结合。因此,测试一系列不同过采样和欠采样技术的组合可能是有益的。

流行的过采样和欠采样组合示例包括

  • SMOTE 和随机欠采样
  • SMOTE 和 Tomek 链接
  • SMOTE 和 Edited Nearest Neighbors (ENN)

数据采样算法可能因机器学习算法的选择而表现不同。

因此,测试一系列标准机器学习算法可能是有益的,例如上一节中快速检查时使用的所有或部分算法。

此外,大多数数据采样算法内部使用 k 最近邻算法。此算法对输入变量的数据类型和尺度非常敏感。因此,在测试方法之前,至少对具有不同尺度的输入变量进行归一化可能很重要,如果某些输入变量是分类而不是数值的,则可能需要使用专门的方法。

3.3.2. 成本敏感算法

成本敏感算法是机器学习算法的修改版本,旨在在训练数据集上拟合模型时考虑错误分类的不同成本。

当用于不平衡分类时,这些算法可能有效,其中错误分类的成本被配置为与训练数据集中样本的分布成反比。

有许多成本敏感算法可供选择,尽管测试一系列线性、非线性算法和集成算法的成本敏感版本可能更实用。

可以配置使用成本敏感训练的机器学习算法的一些示例包括

  • 逻辑回归
  • 决策树
  • 支持向量机
  • 人工神经网络
  • 装袋决策树
  • 随机森林
  • 随机梯度提升

3.3.3. 单类别算法

用于异常检测和异常值检测的算法可用于分类任务。

尽管不寻常,但以这种方式使用时,它们通常被称为单类别分类算法。

在某些情况下,单类别分类算法可能非常有效,例如当存在严重的类别不平衡且正类别样本极少时。

要尝试的单类别分类算法示例包括

  • 单类别支持向量机
  • 孤立森林
  • 最小协方差行列式
  • 局部异常因子

3.3.4. 概率调整算法

预测概率可以通过两种方式改进;它们是

  • 校准概率。
  • 调整分类阈值。
校准概率

一些算法使用概率框架进行拟合,因此具有校准的概率。

这意味着当预测 100 个样本具有 80% 概率的正类别标签时,算法将 80% 的时间预测正确的类别标签。

当概率需要作为输出或用于评估模型时(例如 ROC AUC 或 PR AUC),模型需要校准的概率才能被认为是熟练的二元分类任务。

一些预测校准概率的机器学习算法示例如下

  • 逻辑回归
  • 线性判别分析
  • 朴素贝叶斯
  • 人工神经网络

大多数非线性算法不预测校准概率,因此可以使用算法对预测概率进行后处理以对其进行校准。

因此,当直接需要概率或用于评估模型,并且正在使用非线性算法时,校准预测概率很重要。

要尝试的一些概率校准算法示例包括

  • Platt 缩放
  • 等渗回归
调整分类阈值

一些算法旨在朴素地预测概率,然后必须将其映射到精确的类别标签。

如果问题需要类别标签作为输出,或者模型使用类别标签进行评估,则会出现这种情况。

默认情况下预测概率的概率机器学习算法示例包括

  • 逻辑回归
  • 线性判别分析
  • 朴素贝叶斯
  • 人工神经网络

概率使用阈值概率值映射到类别标签。所有低于阈值的概率都映射到类别 0,所有等于或高于阈值的概率都映射到类别 1。

默认阈值为 0.5,尽管可以使用不同的阈值,这将极大地影响类别标签,进而影响原生预测概率的机器学习模型的性能。

因此,如果使用原生预测概率的概率算法,并且需要类别标签作为输出或用于评估模型,那么尝试调整分类阈值是一个好主意。

3.3.5. 快速检查不平衡算法的框架

我们可以将这些建议总结为一个在数据集上测试不平衡机器学习算法的框架。

  1. 数据采样算法
    • 数据过采样
      • 随机过采样
      • SMOTE
      • Borderline SMOTE
      • SVM SMOTE
      • k-Means SMOTE
      • ADASYN
    • 数据欠采样
      • 随机欠采样
      • Condensed Nearest Neighbor (CNB)
      • Tomek 链接
      • Edited Nearest Neighbors (ENN)
      • Neighborhood Cleaning Rule (NCR)
      • 单侧选择
    • 组合过采样和欠采样
      • SMOTE 和随机欠采样
      • SMOTE 和 Tomek 链接
      • SMOTE 和 Edited Nearest Neighbors (ENN)
  2. 成本敏感算法
    • 逻辑回归
    • 决策树
    • 支持向量机
    • 人工神经网络
    • 装袋决策树
    • 随机森林
    • 随机梯度提升
  3. 单类别算法
    • 单类别支持向量机
    • 孤立森林
    • 最小协方差行列式
    • 局部异常因子
  4. 概率调整算法
    • 校准概率
      • Platt 缩放
      • 等渗回归
    • 调整分类阈值

这些步骤的顺序是灵活的,每个步骤中算法的顺序也是灵活的,而且算法列表并不完整。

该结构旨在让您系统地思考要评估哪种算法。

下图总结了该框架。

How to Spot-Check Imbalanced Machine Learning Algorithms

如何快速检查不平衡机器学习算法

3.4. 超参数调整

在快速检查机器学习算法和不平衡算法之后,您将对哪些在特定数据集上有效,哪些无效有一些了解。

超参数调整最简单的方法是选择表现良好的前五到十种算法或算法组合,并为每种算法调整超参数。

有三种流行的超参数调整算法可供选择

  • 随机搜索
  • 网格搜索
  • 贝叶斯优化

如果知道要尝试的超参数值,网格搜索是一个不错的默认值,否则应使用随机搜索。如果可能,应使用 贝叶斯优化,但设置和运行可能更具挑战性。

调整表现最佳的方法是一个好的开始,但不是唯一的方法。

可能有一些标准机器学习算法表现良好,但与数据采样或概率校准一起使用时表现不佳。这些算法可以与其不平衡分类增强功能协同调整,以查看是否可以实现更好的性能。

此外,可能存在不平衡分类算法,例如数据采样方法,可以显着提高一种或多种算法的性能。这些算法本身可能为进一步调整提供有趣的依据,以查看是否可以实现额外的性能提升。

进一步阅读

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

教程

书籍

总结

在本教程中,您学习了一个系统框架,用于处理不平衡分类数据集。

具体来说,你学到了:

  • 为不平衡分类选择算法的挑战。
  • 一个系统地处理不平衡分类项目的高级框架。
  • 在不平衡分类项目的每个步骤中尝试的具体算法建议。

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

掌控不平衡分类!

Imbalanced Classification with Python

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

...只需几行python代码

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

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

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

查看内容

对《不平衡分类项目的逐步框架》的 67 条回复

  1. Eduardo Rojas 2020年3月9日 上午9:04 #

    天哪。这真的很棒。谢谢 Jason

    • Jason Brownlee 2020年3月9日 上午11:06 #

      谢谢,很高兴它有帮助。

    • Asif Ameer 2020年3月10日 上午5:30 #

      Jason,你做得很出色。非常感谢你的努力

  2. Pawel Rolbiecki 2020年3月9日 晚上10:41 #

    你好,Jason。
    干得好!我终于找到了一篇关于如何为不平衡数据集选择合适方法的好文章。我的问题是关于您今天帖子中的正则化和检测/避免过拟合。

    对不平衡数据集应用正则化的良好实践是什么?我问的是图像分类方面的问题。我只是猜测它更应该是一种数据增强,以生成更多相似的图像。使数据集更“平衡”,而不是专注于调整 L2 或 dropout 比率等正则化参数。这是一种好方法吗?
    Pawel

    • Jason Brownlee 2020年3月10日 上午5:40 #

      我不明白你的问题,抱歉。你是在模型上使用正则化,而不是在数据集上。

      • Layne 2020年3月11日 上午1:40 #

        “这只有在多数类别少于数据的大约 80% 时才有意义”
        哈哈,这正是我想要的。

    • archit garg 2020年3月13日 上午5:25 #

      嗨,Jason,

      我正在处理一个多类别(5 个类别)不平衡数据集,度量标准为平均 F1 分数,并使用随机搜索应用 xgboost 模型,但我没有得到一个好的分数,最好的成绩是 52.5。我甚至尝试了带有 dropout 和 Smote 的深度神经网络,但仍然没有成功。我尝试了其他模型,如随机森林、梯度提升、逻辑回归一对多、Catboost,但仍然无法获得更高的
      分数。您能否建议我还可以尝试什么。

  3. amarillo 2020年3月11日 上午12:50 #

    很棒的工作!非常有帮助。谢谢。

  4. Ganesh Prasad 2020年3月13日 下午4:15 #

    嗨 Jason。我有一个多类别分类问题,其中类别数量约为 75 个。我正在使用神经网络进行分类,但最后一层 softmax 激活函数后我得到的最大概率小于 0.5。预测具有最大概率的类别是否可以,即使其概率低于 0.5?

  5. Malina 2020年3月13日 晚上7:53 #

    亲爱的 Jason,

    非常感谢你的出色工作。如果我能提一点建议,那就是不要在文章中重复自己。文章越短越好。

    • Jason Brownlee 2020年3月14日 上午8:09 #

      谢谢你的建议。

      • YULU 2021年2月17日 下午1:37 #

        我不认为重复是坏事。它对读者很友好,是您的优秀教程的独特之处。

        重复有两种。

        首先,从一系列教程的角度来看,重复数据集设置(即您经常使用的二元分类数据集生成示例)或重复一些必要的背景知识可以为我们提供更好的阅读体验,而无需费心跳到不同的教程。这增加了不同教程之间的独立性。这很棒!

        其次,从单个教程的角度来看,重复代码片段可以为读者提供更好的体验,了解它们各自执行的功能以及如何将它们组合在一起。这也非常符合大多数人的认知过程。棒极了!

        所以我认为你真的可以坚持这种写作风格。干得好!

        • Jason Brownlee 2021年2月18日 上午5:10 #

          同意,谢谢!

          我喜欢每个教程都是完整和独立的,重复是实现这个目标所必需的。

  6. Abdelrahim 2020年3月13日 晚上10:59 #

    谢谢杰森
    如果您能给我们一个关于布里尔分数的教程,那就太好了

  7. zhaowei 2020年3月18日 下午2:25 #

    “也可能有多种方式来构建问题”

    发现一个错别字~

  8. Patrycja 2020年3月28日 上午3:19 #

    嗨!很棒的文章!它有趣且富有洞察力。我们学到了很多。感谢您的工作和传播机器学习知识。只是想让您知道,我们已将此篇文章收录到 Neptune.ai 博客的每周综述中。干杯!

  9. Vinu Pillai 2020年5月1日 上午8:18 #

    这是我见过的最好的资源。非常有洞察力且结构化。您的观点令人振奋。

  10. Arnaud 2020年5月12日 晚上7:34 #

    谢谢 Jason 的框架,它非常有价值。

    我不确定是否清楚理解多数/正概念。

    我有一个案例,需要根据十几个指标预测缺陷产品。
    两个类别:通过/失败。失败的比例是通过的 1/100(非常不平衡)。
    => 多数类别是通过,少数类别是失败。正确吗?
    => 正类别是失败(我想要预测的事件)。正确吗?

    另外,“正类别更重要”是什么意思?

  11. sukhpal 2020年5月28日 晚上10:00 #

    Pip 命令在命令行中不起作用

    Nameerror: pip 未定义
    先生请提供解决方案

  12. Matt 2020年6月4日 下午12:56 #

    你好,
    “两个类别同样重要,但假阳性或假阴性成本更高”是什么意思?此外,为什么您推荐对具有如此大不平衡(80-90%)的数据集使用准确率?请解释。
    Matt

  13. Zina 2020年6月5日 下午5:07 #

    嗨 Jason
    感谢您的出色工作!非常有帮助

    您说“此外,大多数数据采样算法内部使用 k 最近邻算法。此算法对输入变量的数据类型和尺度非常敏感。因此,在测试方法之前,至少对具有不同尺度的输入变量进行归一化可能很重要,如果某些输入变量是分类而不是数值的,则可能需要使用专门的方法。”

    如果输入变量是分类的,“专门的方法”是什么意思?为什么?

    提前感谢

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

      不客气。

      好问题。例如,SMOTE 假定只输入数值。您必须使用支持分类或混合输入的 SMOTE 修改版本。

  14. Awad 2020年6月24日 上午8:04 #

    我正在寻找一些关于 Macro-F1 与 Micro-F1 在不平衡数据集适用性方面的讨论。

  15. Bahman Askari 2020年6月25日 上午7:42 #

    太棒了,Jason

  16. Vandhana 2020年6月30日 晚上9:01 #

    谢谢 Jason。您是否与组织协商以帮助构建机器学习模型?

  17. Shubham Shukla 2020年7月9日 晚上7:47 #

    嗨 Jason,很棒的帖子。

    我有一个问题:在第 3.1 节中,您提到我们首先必须决定是想预测概率还是精确的类别标签。我理解在信用卡欺诈检测等场景中我们希望预测概率。
    1. 您能分享一个我们希望预测精确类别标签的案例(示例或场景)吗?
    2. 什么时候我们希望预测精确的类别标签,尤其是考虑到 sklearn 模型提供了 predict_proba 方法,它允许我们更好地控制分配给测试数据点的标签?我期待您的回复。

    • Jason Brownlee 2020年7月10日 上午5:56 #

      预测概率与精确标签是项目/问题的要求,即我们必须或打算如何使用模型的输出。或者说是品味问题。

  18. Neha Mangal 2020年9月10日 晚上8:53 #

    嘿 Jason,很棒的文章!

    您能否就我们使用重采样方法时,算法会看到并训练非真实数据分布的情况提供一些见解。
    现在,当真实数据出现并包含不平衡时,模型在该数据上的表现会很差吗?

    我们如何解决这个问题?

  19. Bernardo 2020年9月21日 上午1:59 #

    只想说谢谢!很棒的工作。

  20. Kevin 2020年10月10日 上午6:13 #

    我有一个不平衡数据集,其中正例约为 2%,负例约为 98%。当我使用标准逻辑回归 (log = LogisticRegression()) 然后取所有 log.predict_proba() 的平均值时,我将得到大约 2%,这看起来是合理的。不幸的是,f1 分数极低,所以我尝试了一些方法来纠正我的不平衡数据集。

    然而,如果我使用 SMOTE 或平衡的逻辑回归 (log = LogisticRegression(solver='newton-cg', class_weight='balanced')),那么 f1 分数会好得多。然而,log.predict_proba() 的平均值将约为 45%,这太高了(因为我知道正例的平均概率应约为 2%)。

    如何从 log.predict_proba() 中获得对正例概率的真实估计,同时纠正不平衡数据集?

    谢谢。

  21. Rafael Caneiro 2020年12月23日 上午10:39 #

    嘿 Jason,很棒的帖子!!您能否帮助我理解 3.2.1 中针对 PR AUC 指标的“分层随机类别”概念。
    我不知道如何在实践中做到这一点。

    非常感谢!

  22. rayenne 2020年12月31日 下午1:00 #

    嗨,Jason,
    感谢这篇有趣的教程。它非常有帮助!!
    我尝试了不同的模型在我的不平衡数据上,每次都得到大约 0.5 的 AUCROC 分数,我想知道如何才能将分数提高到 0.8。

  23. HCU 2021年1月12日 上午7:34 #

    你好 Jason,

    感谢这篇出色的文章。

    我只是想问一下,“如何选择性能指标”表中,“假阳性成本更高”或“假阴性成本更高”是什么意思?

  24. Ali R 2021年2月9日 下午12:39 #

    布朗利博士,您好,

    我一直在关注您的教程,学到了很多。

    据我理解,我们只对训练数据应用重采样方法,而验证数据保持不变。
    那么,我们如何将重采样方法纳入超参数优化呢?因为网格搜索、随机搜索或贝叶斯搜索都没有重采样方法的参数。

    我尽力用最清晰的方式表达我的问题,如有任何困惑请见谅。

    谢谢你。

    • Jason Brownlee 2021年2月9日 下午1:34 #

      谢谢!

      您可以从训练数据集中获取验证集,无论您使用的是训练/测试拆分还是 k 折交叉验证。

      这个也可能会有帮助
      https://machinelearning.org.cn/difference-test-validation-datasets/

      • Mostafa H. 2021年8月11日 上午7:12 #

        这是一个关于不平衡数据集的有用主题。
        感谢您的回答。我遇到了与 Ali 类似的问题。据我了解,我们将训练集(通过采样技术平衡)分成两部分进行训练和验证。然后,我们使用验证子集进行超参数调整,例如在网格搜索(或随机搜索等)中。接下来,我们使用训练集训练具有调整后超参数的模型。
        这样可以吗?
        提前感谢您的回复。

        • Jason Brownlee 2021年8月11日 上午7:45 #

          如果数据足够多,这可能是一种方法。

  25. makram noureddine 2021年5月3日 晚上8:52 #

    嗨,Jason,

    我有一个不平衡数据集(比例为 1/10)。我尝试了许多采样技术组合,但我仍然得到 77 或 78 的 AUC 分数。最初的 AUC 分数在 50 左右。
    那么您能否建议我可能做错了什么?我的数据是数值变量和分类变量的混合,所以我对数值变量进行了标准缩放,对分类变量进行了独热编码。

    谢谢

  26. Bharat 2021年8月8日 上午4:27 #

    这些信息太宝贵了……

  27. Getahun Mulugeta 2023年1月9日 下午4:23 #

    我发现它对我的当前项目很有用。我是机器学习的初学者。我需要您的专家帮助;如果可能,我想和您谈谈。让我向您简要介绍我的情况;我有一份高度不平衡的数据(对于二元分类问题,感兴趣事件的发生率为7.5%),为此我应用了欠采样、过采样和SMOTE不平衡处理技术。然后使用最佳(性能通过敏感性评估)处理来训练指定的机器学习算法。我使用了逻辑回归、DT、KNN、SVM和RF。最后,我发现SMOTE和逻辑回归分别是最佳的不平衡处理和机器学习算法。我需要有充分的理由来选择这些分类算法。甚至我使用它们也是基于一些关于它们对不平衡数据集的适用性的参考文献。根据您的说明,我想针对成本敏感算法来证明我的偏好。您对我的不平衡处理和分类算法选择有什么建议?

发表评论

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