关于如何平衡不平衡的数据

Posted

技术标签:

【中文标题】关于如何平衡不平衡的数据【英文标题】:About how to balance imbalanced data 【发布时间】:2016-12-31 06:09:10 【问题描述】:

当我在 Scikit learn 中阅读决策树时,我发现:

在训练之前平衡您的数据集,以防止树被 偏向于占主导地位的阶级。类平衡可以 通过从每个类中抽取相同数量的样本来完成,或 最好通过标准化样本权重的总和 (sample_weight) 为每个类设置相同的值。

在链接中:http://scikit-learn.org/stable/modules/tree.html

我很困惑。

(1)

类平衡可以通过采样相同数量的样本来完成 每个班级

如果我这样做,我应该使用为每个类中的每个样本添加适当的样本权重(或添加类样本......)。

例如,如果我有两个类:A 和 B 的样本数

A:100 B:10000

我可以为每个输入 10000 个样本并设置权重吗:

A的输入样本:10000,B的输入样本:10000

A 的重量:0.01,B 的重量:1.0

(2)

但还是说:

最好通过标准化样本权重的总和 (sample_weight) 为每个类设置相同的值

我完全被它弄糊涂了。这是否意味着我应该输入 100 个 A 样本和 10000 个 B 样本然后设置权重:

A:100 的输入样本,B:10000 的输入样本

A 的权重:1.0,B 的权重:1.0

但我似乎没有采取任何措施来平衡不平衡的数据。

Scikit learn 中哪种方式更好,第二种方式是什么意思?谁能帮我澄清一下?

【问题讨论】:

【参考方案1】:

有很多方法可以平衡数据集:

    从代表性不足的类中过度采样(抽取更多样本而不进行替换) 从过度代表的类中进行欠采样(在有/没有替换的情况下抽取更少的样本) 针对代表性不足的班级基于邻域的虚构数据(搜索 SMOTE) 基于权重的方法:虽然您需要对此进行调整,但大致可以从选择权重开始,使weight*number of observations 对于代表不足和代表过多的组均相等。

【讨论】:

非常感谢。代表不足和过度呈现的组是否意味着样本较少和样本较多? 我对你的前三种方式感到困惑,你为什么不需要增加重量?第四种方法,为什么我们可以调整权重?我一直认为权重*观察次数=不同的组,这是我们需要始终遵循的约束。 尝试了解为什么存在权重以及它如何影响分类中的目标函数。你会更好地了解体重。不平衡数据的问题是过度表示的数据占主导地位。随着过度/不足采样/SMOTE 数据分布变得相同(想想 100:1 -> 10:1 或 5:1)。所以你不再需要权重

以上是关于关于如何平衡不平衡的数据的主要内容,如果未能解决你的问题,请参考以下文章

关于平衡线段树的一点研究

Xgboost 处理不平衡的分类数据

如何处理数据不平衡问题

关于平衡树(Treap)

MongoDB Cluster 数据平衡优化

关于平衡树的一些总结