在 mlr 中将 Multi Class Wrapper 与 Sampling Wrappers 相结合以获得特定于子问题的采样

问题描述

我正在使用 mlr 包处理一个不平衡的多类分类问题:

标签 样品
A 232
B 657
C 221
D 154

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

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

我在 mlr 文档中发现的用于采样的内容是 OversampleWrapperUndersampleWrapperOverbaggingWrapperSMOTEWrapper。问题是它们都需要应用的采样率并且不执行基于分布的采样。因此,当我使用以下代码段中所示的这些 Wrapper 之一时,所有二元子问题都以相同的速率进行采样。

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 包中是否会很有趣?对不起,我没有经验为开源项目做出贡献)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)