【问题标题】:Ignore columns in SMOTE oversampling忽略 SMOTE 过采样中的列
【发布时间】:2020-06-23 14:05:54
【问题描述】:

我有六个特征列和一个目标列,这是不平衡的。 我可以通过复制与常量完全相同的内容(月、年列)仅为 X1、X2、X3、X4 四个列创建合成记录来制作像 ADASYN 或 SMOTE 这样的过采样方法

当前:

预期一:它可以通过对目标类'1'进行上采样来创建合成记录,但是记录的数量可以增加,但添加的记录应该有月份和年份(如下所示不变)

【问题讨论】:

  • 如果您只想对某些列进行上采样,您可以将要上采样的列拆分为单独的数据框,然后对它们进行上采样,并在对单独的列进行上采样后重新添加到其他列中数据框。
  • 但是未更改的列和上采样的数据帧会有不同的行数,不是吗?我需要为常量列和我需要在合成中创建的记录具有相同数量的记录(在创建合成记录时,他们应该照原样复制我的常量列的条目)。希望这能澄清要求。我们可以在 ADASYN、SMOTE 或任何其他方法中使用任何类似参数列吗?
  • 从上面的第二张图片中,它从记录 2 创建记录 (3,4,5,6) 尝试平衡数据集。在使用任何技术进行此操作时,我不想更改这两列中的值(月:10,年:2000),但可以为 X1、X2、X3 和 X4 列设置任何值。这平衡但在复制时不会更改两列的值

标签: machine-learning imbalanced-data smote


【解决方案1】:

编程的角度来看,2017 年相关Github repo 中提出的一个相同问题得到了否定回答:

[问题]

我有一个想要应用 smote 的数据框,但我希望只使用列的一个子集。其他列包含每个样本的附加数据,我希望每个新样本也包含原始信息

[回答]

除了在新矩阵中提取列并使用 SMOTE 处理它之外,没有其他方法可以做到这一点。 即使您生成一个新样本,您也必须决定将什么作为值放在那里,所以我看不出如何添加这样的功能

建模的角度回答,这不是一个好主意,即使您能找到编程解决方法,您也不应该尝试一下 - 可以说,这就是为什么上面 imbalanced-learn 的开发人员即使考虑在 SMOTE 实现中添加这样的功能也不屑一顾的原因。

这是为什么呢?嗯,合成过采样算法,如 SMOTE,本质上使用 k-nn 方法的一些变体,以便在现有样本“之间”创建人工样本。鉴于这种方法,不言而喻,为了使这些人工样本确实“介于”真实样本之间(在 k-nn 意义上),所有现有的(数字)特征必须是考虑在内。

如果通过使用某种编程炼金术,最终您设法仅基于您的部分特征生成新的 SMOTE 样本,那么将未使用的特征放回原处将破坏任何接近和这些人工样本与真实样本的“中间性”,从而通过在您的训练集中插入一个巨大的偏差来损害整个企业。

简而言之:

  • 如果您认为您的Monthyear 确实是有用的功能,只需将它们包含在SMOTE 中即可;你可能会得到一些无意义的人工样本,但这不应该被认为是一个(大)问题。

  • 如果不是,那么也许您应该考虑将它们从培训中完全删除。

【讨论】:

    猜你喜欢
    • 2019-05-24
    • 2020-07-05
    • 1970-01-01
    • 2018-12-02
    • 2018-12-27
    • 2015-10-29
    • 2020-06-28
    • 2019-10-02
    • 2019-12-25
    相关资源
    最近更新 更多