为什么 class_weight 通常优于 SMOTE?

数据挖掘 分类 阶级失衡 打击 不平衡数据
2022-03-07 21:39:31

我试图弄清楚class_weightsklearn 究竟做了什么。

在处理不平衡的数据集时,我一直在使用class_weight,因为结果通常比使用 SMOTE 更好。但是,我不确定为什么。

我试图找到答案,但大多数关于这个主题的答案都是模糊的。例如,这里class_weight的第一个答案以类似于 SMOTE 的方式进行解释。也没有提供答案。

我曾经读过 SMOTE 被用作依赖 KNN 并class_weight作用于成本函数的过采样方法。但我没有再找到这个,我不确定这是真的,因为我没有在其他任何地方读过。

2个回答

不同之处在于class_weight不会合成新数据,但 SMOTE 会。

如果您的模型结果总是有利于class_weight,那么我们可以询问您的 SMOTE 是否合成了好的样本。查看 SMOTE 引擎正在做什么的一种方法是 - 您的 SMOTE 会为您的测试数据分配哪些标签?分配标签的百分比 = 真标签?基于 kNN 的 SMOTE 较差的一个原因是 kNN 是一种基于距离的方法,当您的数据具有高维度(特征太多)时,它可能会搞砸。例如,您可以有 2 个样本在 100 个特征中的 99 个具有相同的值,但在最后一个特征中的差异为 1000,并且您可以有另一对样本在 100 个特征中的每个特征中的差异为 10。前一种情况的最终欧几里得距离是 1000,但后一种情况只有 100。如果您认为前一种情况应该“更接近”,

因此,我想说 SMOTE 确实需要您了解功能以选择正确的配置,例如要使用哪些距离指标,以及可能要考虑哪些功能。

一个可能的原因是 scikit-learn 的class_weight参数可能会根据类别成员资格为不同的实例赋予不同的权重值。来自class_weight 文档

如果“平衡”,类别权重将由 n_samples / (n_classes * np.bincount(y)) 给出。如果给定字典,则键是类,值是相应的类权重。如果没有给出,班级权重将是统一的。

SMOTE 代表合成少数过采样技术。合成部分意味着 SMOTE 根据现有数据制造新样品。SMOTE 通过基于现有特征值插入新实例来实现这一点。

在 class_weight 优于 SMOTE 的情况下,增加现有数据的价值比生成新数据更有用。