问题描述
我正在使用 mlr 包处理一个不平衡的多类分类问题:
标签 | 样品 |
---|---|
A | 232 |
B | 657 |
C | 221 |
D | 154 |
我想使用不同的机器学习算法来解决它,包括一些不支持开箱即用的多类分类的算法。因此,我检查了 mlr 文档,发现 MulticlassWrapper
可以从底层的多类问题中创建二进制“一对一”问题。
我希望专门针对每个二元分类问题执行平衡。所以我不希望每个问题都有相同的上采样率或下采样率,而是根据这个二元问题的实际类分布而不同的率。
我在 mlr 文档中发现的用于采样的内容是 OversampleWrapper
、UndersampleWrapper
、OverbaggingWrapper
和 SMOTEWrapper
。问题是它们都需要应用的采样率并且不执行基于分布的采样。因此,当我使用以下代码段中所示的这些 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 (将#修改为@)