首页 > 解决方案 > 在 mlr 中将 Multi Class Wrapper 与 Sampling Wrapper 相结合以获得子问题特定的采样

问题描述

我正在使用 mlr 包解决不平衡的多类分类问题:

标签 样品
一个 232
657
C 221
D 154

我想使用不同的机器学习算法来解决它,包括一些不支持开箱即用的多类分类的算法。因此,我检查了 mlr 文档,发现MulticlassWrapper从底层多类问题中创建二进制“一对一”问题。

我希望专门针对每个二进制分类问题执行平衡。因此,我不希望每个问题都使用相同的上采样率或下采样率,而是根据这个二元问题的实际类分布来使用不同的采样率。

我在 mlr 文档中发现用于采样目的的是OversampleWrapperUndersampleWrapperOverbaggingWrapperSMOTEWrapper. 问题是它们都需要一个应用的采样率并且不执行基于分布的采样。因此,当我使用以下代码片段中所示的其中一个包装器时,所有二进制子问题都以相同的速率进行采样。

learner <- makeLearner("classif.rpart") # just an example 

over.lrn = makeOversampleWrapper(learner, osw.rate = 2)

multiclass.over.lrn = makeMulticlassWrapper(over.lrn, mcw.method = "onevsone")

multiclass.over.model <- train(multiclass.over.lrn, task.train)

例如,问题“A”与“B”将被采样到 464 个“A”和 657 个“B”的分布。

我想为“A”和“B”得到 657 个“A”和 657 个“B”。对于“A”与“C”,它将是 232 个“A”和 232 个“B”等等。因此,对于 MulticlassWrapper 创建的所有二进制问题,采样率不应该是固定的,而是动态的,例如,对于过采样少数类被过采样以匹配主要类的样本数量(反之亦然)。

有没有办法用 mlr 包实现这一点?

(如果不是,我会编写自己的采样包装器来实现这一点,尽管它被团队认为已退休,但将其包含在 mlr 包中通常会很有趣吗?抱歉,我没有为开源项目)。

标签: samplingresamplingmulticlass-classificationmlr

解决方案


推荐阅读