不平衡分类的软件与库
1. R 包
在处理不平衡分类问题时,R 语言有一些实用的包。mlr 是 R 中处理数据挖掘(DM)任务时广泛使用的包之一。它包含大量不同的机器学习(ML)技术,并且在网络上有丰富的文档。
1.1 成本敏感学习
对于依赖类别的误分类成本,需要一个支持类权重或观测权重的分类器。而对于依赖示例的误分类成本,需要特征值 x 和一个 n × K 的成本矩阵,该矩阵包含数据集中所有 n 个示例的成本向量。mlr 提供了几个包装器,可将常规分类或回归方法转换为能够处理依赖示例成本的学习器:
-
makeCostSensClassifWrapper(包装分类学习器)
:这是一种简单的方法,通过为每个示例选择成本最小的类标签,将成本强制转换为类标签,然后使用常规分类方法。
-
makeCostSensRegrWrapper(包装回归学习器)
:为每个类的成本拟合一个单独的回归模型。在预测步骤中,首先预测所有类的成本,然后选择预测成本最低的类。
-
makeCostSensWeightedPairsWrapper(包装分类学习器)
:也称为成本敏感一对一(CS - OVO),是目前支持的方法中最复杂的一种。对于每对类,拟合一个二元分类器。对于每个观测值,类标签定义为成本最小的那对元素。在拟合过程中,观测值用成本的绝对差值加权,预测通过简单投票进行。
1.2 示例展示
在图中展示了使用上述第三种方法的示例。创建包装学习器并在上面定义的 CostSensTask 上进行训练。
mlr 虽然没有明确包含预处理技术,但可以与当前的 mlr 函数集成。它允许不同的成本敏感学习替代方案,为处理不平衡分类增加了很好的功能。其最新版本(2.12.1)可在 CRAN 包存储库中找到。
2. Python 库
Python 编程语言已成为科学计算最流行的工具之一。它具有高级交互性,易于学习且功能强大,拥有用于面向对象编程的高效数据结构,简单动态的类型以及解释性,使其成为大多数平台上许多领域脚本编写和快速应用开发的理想语言。此外,它还有广泛而成熟的科学库生态系统,为机器学习和探索性数据分析中的算法开发提供了更高的支持。
2.1 imbalanced - learn 工具包
直到 2017 年,才出现了用于不平衡分类任务的第一个 Python 解决方案——imbalanced - learn 开源 Python 工具包。该工具包仅依赖于 numpy、scipy 和 scikit - learn,并根据 MIT 许可证分发。它旨在与 scikit - learn 环境完全兼容,是“scikit - learn - contrib”支持项目的一部分,提供了文档、单元测试和集成测试,方便使用和贡献。
2.2 预处理方法
imbalanced - learn 工具包提供了广泛的预处理方法来处理不平衡数据集问题。作者将实现的方法分为四类:
| 预处理技术类型 | 具体技术 |
| — | — |
| 欠采样 | 有放回的随机多数类欠采样、提取多数 - 少数类 Tomek 链接、基于聚类质心的欠采样、NearMiss - (1 & 2 & 3)、凝聚最近邻、单边选择、邻域清理规则、编辑最近邻、实例硬度阈值、重复编辑最近邻、AllKNN |
| 过采样 | 有放回的随机多数类过采样、SMOTE(合成少数类过采样技术)、bSMOTE(1 & 2)(1 型和 2 型边界 SMOTE)、SVM SMOTE(支持向量 SMOTE)、ADASYN(不平衡学习的自适应合成采样方法) |
| 混合采样 | SMOTE + TomekLinks、SMOTE + ENN |
| 集成采样 | EasyEnsemble、BalanceCascade |
每个采样器类实现了受 scikit - learn API 启发的三个主要方法:
-
fit
:计算稍后将数据重采样为平衡集所需的几个统计信息。
-
sample
:执行采样并返回具有所需平衡比率的数据。
-
fit_sample
:相当于先调用 fit 方法,然后调用 sample 方法。
此外,还继承了 scikit - learn 工具箱中的 Pipeline 类,以自动组合采样器、转换器和估计器。它还提供了类似于 scikit - learn 的分类报告,包括一些特定于评估不平衡学习问题的最新指标,如召回率、特异性、f - 度量(F1)、几何均值、平衡准确率指数(IBA)和支持度。
作者在 sphinx - gallery 中提供了带有通用和入门示例的教程,在线文档网站上可以找到所有包含算法的工作流程说明。例如,图展示了 SMOTE 及其变体的不同 2D 输出,以及使用 imbalance - learn 软件通过 SMOTE 算法重新平衡训练集的 Python 源代码。
该工具包的源代码、二进制文件和文档可从 https://github.com/scikit - learn - contrib/imbalanced - learn 下载。未来版本旨在包括基于原型/实例选择、生成和减少的额外方法,用户指南也将更加完善。
3. 大数据软件:Spark 包
在大数据环境中,出现了许多用于大规模处理的平台。Apache Spark 是其中最强大的引擎之一,旨在通过使用内存原语在大数据上执行更快的分布式计算。它允许用户程序将数据加载到内存中并重复查询,非常适合在线和迭代处理(尤其是机器学习算法)。
3.1 Spark 基础
Spark 基于称为弹性分布式数据集(RDD)的分布式数据结构。对 RDD 的操作会自动将任务分配到分区中,保持持久化数据的局部性。RDD 是不可变且通用的工具,允许程序员将中间结果持久化到内存或磁盘以实现可重用性,并自定义分区以优化数据放置。RDD 还具有容错性,通过“谱系”跟踪对每个 RDD 执行的延迟操作,以便在数据丢失时可以随时重建每个 RDD。
3.2 MLlib 库
除了 Spark Core,还开发了一些额外的项目来补充核心提供的功能。其中,ML 库(MLlib)由常见的学习算法和统计实用程序组成。其主要功能包括分类、回归、聚类、协同过滤、优化和降维。该库专门设计用于简化大规模环境中的机器学习管道。
3.3 处理不平衡数据分类
为了处理不平衡数据的分类问题,MLlib 中的逻辑回归分类器支持成本敏感学习。具体操作步骤如下:
1. 通过包含一个额外的列来为输入数据设置权重。
2. 在创建分类器的命令行中,需要指定三个不同的列:特征、标签和权重。
更多关于此功能的详细信息可在链接 https://issues.apache.org/jira/browse/SPARK - 9610 中查看。在编写本文时,随机森林算法的类加权功能正在开发中,具有较高的优先级,相关信息可在 https://issues.apache.org/jira/browse/SPARK - 9478 查看。
3.4 补充库
由于 MLlib 中没有直接与不平衡分类相关的预处理解决方案,一些作者开发了补充库,用于处理大数据不平衡问题:
-
进化欠采样
:Triguero 等人提出的进化欠采样方法,通过不同的迭代,能够找到多数类实例的最合适子集,与少数类实例结合,在不平衡领域训练决策树时取得最佳结果。通过 Spark 的内存操作,该模型能够有效利用数据。完整的源代码可从 https://github.com/triguero/EUS - BigData 下载。
-
随机过采样和随机欠采样
:用 Scala 编写的易于使用的随机过采样和随机欠采样方法。它包含在 Spark - packages 存储库中,地址为 https://spark - packages.org/package/saradelrio/Imb - sampling - ROS_and_RUS,完整的源代码和示例可在 https://github.com/saradelrio/Imb - sampling - ROS_and_RUS 找到。在过采样实现中,复制少数类数据点后,对所有示例进行重新分区,以防止在分类阶段单个分区中出现完全相同的示例。
-
SMOTE 和 SMOTE - TL 预处理算法的 Spark 实现
:可从 https://github.com/adritor7/SMOTE - and - Tomek - Links - in - Spark 下载。它包含自己实现的 kNN 过程,用于在构建新的合成实例时获取邻域信息。与随机过采样类似,过滤掉多数类数据点后,对少数类示例进行重新分区,以避免所有少数类数据点存储在同一个数据块中,从而阻碍数据并行性。
4. 总结
综上所述,在处理不平衡分类任务时,不同的编程语言和平台都有相应的工具和库可供选择。R 语言的 mlr 包提供了成本敏感学习的多种方法;Python 的 imbalanced - learn 工具包涵盖了丰富的预处理技术;而在大数据环境下,Spark 及其相关补充库为大规模数据的不平衡分类提供了解决方案。然而,目前在大数据领域,相关的软件工具还相对较少,需要进一步开发包含标准解决方案的完整库,以满足不断增长的需求。
以下是一个简单的 mermaid 流程图,展示处理不平衡分类问题的一般流程:
graph LR
A[获取数据] --> B{数据是否平衡}
B -- 是 --> C[常规分类]
B -- 否 --> D{选择语言和平台}
D -- R --> E[使用 mlr 进行成本敏感学习]
D -- Python --> F[使用 imbalanced - learn 进行预处理]
D -- Spark --> G[使用 MLlib 及补充库]
E --> H[训练模型]
F --> H
G --> H
H --> I[评估模型]
在实际应用中,可以根据具体的数据特点、任务需求和个人偏好选择合适的工具和方法。同时,随着技术的不断发展,这些工具和库也将不断完善和扩展,为不平衡分类问题提供更有效的解决方案。
5. 不同工具的对比与选择
在面对不平衡分类任务时,如何从众多工具中选择合适的解决方案是一个关键问题。下面从多个方面对 R 包、Python 库和 Spark 包进行对比,帮助大家做出决策。
5.1 功能特点对比
| 工具类型 | 功能特点 |
|---|---|
| R 包(mlr) | 提供成本敏感学习功能,有多种包装器可将常规分类或回归方法转换为能处理依赖示例成本的学习器。包含大量机器学习技术,但未明确包含预处理技术,需与现有函数集成。 |
| Python 库(imbalanced - learn) | 专注于不平衡数据集的预处理,提供欠采样、过采样、混合采样和集成采样等多种方法。实现了受 scikit - learn API 启发的方法,方便使用和集成。还提供特定于不平衡学习问题的评估指标。 |
| Spark 包(MLlib 及补充库) | 适合大数据环境,基于 RDD 实现分布式计算,具有容错性和数据局部性。MLlib 提供常见的机器学习算法,逻辑回归支持成本敏感学习。补充库针对不平衡分类提供了进化欠采样、随机过采样和欠采样以及 SMOTE 等实现。 |
5.2 易用性对比
- R 包(mlr) :对于熟悉 R 语言的数据科学家来说,使用 mlr 进行成本敏感学习相对容易上手,因为它遵循 R 语言的编程风格和习惯。但需要编写一定的源代码来实现具体的功能。
- Python 库(imbalanced - learn) :由于其与 scikit - learn 兼容,对于已经熟悉 scikit - learn 的用户来说,学习成本较低。提供了类似于 scikit - learn 的 API 和分类报告,使用起来较为方便。
- Spark 包(MLlib 及补充库) :Spark 的编程模型相对复杂一些,需要对分布式计算和 RDD 有一定的了解。但对于处理大规模数据的场景,其性能优势明显。补充库的使用也需要一定的编程基础。
5.3 性能对比
- R 包(mlr) :适用于中小规模的数据处理,在内存和计算资源允许的情况下,可以实现高效的成本敏感学习。但对于大规模数据,可能会受到内存和计算能力的限制。
- Python 库(imbalanced - learn) :在处理中等规模数据时表现良好,通过优化的算法和数据结构,可以实现快速的预处理操作。但对于超大规模数据,性能可能会受到影响。
- Spark 包(MLlib 及补充库) :在大数据环境下具有明显的性能优势,通过分布式计算和内存操作,可以高效地处理大规模数据。但在集群部署和配置方面需要一定的技术和资源。
5.4 选择建议
- 如果数据规模较小,且更倾向于使用 R 语言进行数据分析,mlr 是一个不错的选择,可以利用其成本敏感学习功能解决不平衡分类问题。
- 如果熟悉 Python 和 scikit - learn,且数据规模适中,imbalanced - learn 可以提供丰富的预处理方法,帮助平衡数据集。
- 如果面对的是大规模数据,需要进行分布式计算,Spark 包及其补充库是首选,能够充分发挥其在大数据处理方面的性能优势。
6. 实际应用案例
为了更好地理解这些工具在实际中的应用,下面给出几个具体的案例。
6.1 金融欺诈检测
在金融领域,欺诈交易通常是少数类,而正常交易是多数类,这是一个典型的不平衡分类问题。可以使用 Python 的 imbalanced - learn 工具包对数据集进行预处理,例如使用 SMOTE 算法进行过采样,增加少数类样本的数量。然后使用 scikit - learn 中的分类器,如逻辑回归或随机森林,进行模型训练和预测。通过对比不同预处理方法和分类器的性能,选择最优的解决方案。
6.2 医疗诊断
在医疗诊断中,某些疾病的患者可能只占少数,而健康人群是多数。可以使用 R 包中的 mlr 进行成本敏感学习,设置不同的误分类成本,以提高对少数类(疾病患者)的识别准确率。同时,可以结合特征选择和模型调优技术,进一步提高模型的性能。
6.3 大数据舆情分析
在大数据环境下,舆情数据通常非常庞大,且正面和负面舆情的分布可能不平衡。可以使用 Spark 及其补充库,如进化欠采样或 SMOTE 的 Spark 实现,对数据进行预处理。然后使用 MLlib 中的分类算法,如支持向量机或朴素贝叶斯,进行舆情分类。通过分布式计算,提高处理效率和模型的准确性。
7. 未来展望
随着数据量的不断增长和不平衡分类问题的日益复杂,未来这些工具和库将朝着以下几个方向发展:
7.1 功能扩展
- R 包可能会增加更多的预处理技术和优化算法,提高处理不平衡数据的能力。
- Python 的 imbalanced - learn 工具包有望引入更多基于深度学习的方法,以处理更复杂的数据结构和模式。
- Spark 相关库将进一步完善大数据环境下的不平衡分类解决方案,提供更多高效的算法和工具。
7.2 易用性提升
- 各个工具将提供更友好的用户界面和文档,降低用户的学习成本。
- 加强与其他常用工具和平台的集成,方便用户在不同环境下使用。
7.3 性能优化
- 针对不同的硬件平台和计算资源,进行性能优化,提高处理速度和效率。
- 利用更先进的分布式计算技术,进一步提升大数据处理能力。
8. 结论
不平衡分类是数据挖掘和机器学习领域中的一个重要问题,不同的编程语言和平台都提供了相应的工具和库来解决这个问题。R 包、Python 库和 Spark 包各有其优势和适用场景,在实际应用中需要根据具体情况进行选择。
通过本文的介绍,我们了解了这些工具的功能特点、操作方法和应用案例,希望能够帮助读者在面对不平衡分类任务时做出明智的决策。同时,我们也期待未来这些工具能够不断发展和完善,为解决更复杂的不平衡分类问题提供更强大的支持。
在处理不平衡分类问题时,还需要注意数据的质量和特征工程,结合合适的评估指标,以确保模型的性能和可靠性。相信随着技术的不断进步,不平衡分类问题将得到更有效的解决,为各个领域的数据分析和决策提供更有力的支持。
以下是一个 mermaid 流程图,展示未来工具发展的方向:
graph LR
A[现有工具] --> B{功能扩展}
A --> C{易用性提升}
A --> D{性能优化}
B --> E[增加预处理技术]
B --> F[引入深度学习方法]
B --> G[完善大数据解决方案]
C --> H[提供友好界面]
C --> I[加强集成]
D --> J[针对硬件优化]
D --> K[利用分布式技术]
总之,选择合适的工具和方法,结合不断发展的技术,将有助于我们更好地应对不平衡分类挑战,挖掘数据中的有价值信息。
超级会员免费看
76

被折叠的 条评论
为什么被折叠?



