【问题标题】:Smote fails making oversamplingSmote 无法进行过采样
【发布时间】:2019-09-27 02:53:53
【问题描述】:

我刚刚使用 Smote 在我的数据集中完成了过采样,包含在 DMwR 包中。

我的数据集由两个类组成。原始分布是 12 对 62。所以,我编写了这个过采样的代码:

newData <- SMOTE(Score ~ ., data, k=3, perc.over = 400,perc.under=150)

现在,分布是 60 对 72。

但是,当我显示“newData”数据集时,我发现 SMOTE 是如何进行过采样的,并且有一些样本重复。

例如,样本编号 24 显示为 24.1、24.2 和 24.3。

这是正确的吗?这直接影响到分类,因为分类器将学习一个模型,其中包含将出现在测试中的数据,因此这在分类中是不合法的。

编辑: 我想我没有正确解释我的问题:

如您所知,SMOTE 是一种过采样技术。它从原始样本创建新样本,并为其修改特征值。但是,当我显示由 SMOTE 生成的新数据时,我得到了这个:

(这些值是特征的值)Sample50:1.8787547 0.19847987 -0.0105946940 4.420207 4.660536 1.0936388 0.5312777 0.07171645 0.008043167

样品 50.1:1.8787547 0.19847987 -0.0105946940 4.420207 4.660536 1.0936388 0.5312777 0.07171645

样本 50 属于原始数据集。样本 50.1 是 SMOTE 生成的“人工”样本。但是(这是我的问题),SMOTE 创建了一个重复样本,而不是创建一个修改“一点”特征值的人工样本。

希望你能理解我。

谢谢!

【问题讨论】:

  • 所以您是说data.frame data 中的分类变量sample 在SMOTE 处理后具有新的无效ID?这个变量的类是什么?您是否将其正确编码为一个因素?
  • 没有。我试图解释的是 SMOTE 重复值。请参阅我的新帖子以了解更多详细信息。

标签: r


【解决方案1】:

Smote 是一种算法,它生成给定类(少数类)的合成示例以处理不平衡分布。然后将这种生成新数据的策略与多数类的随机欠采样相结合。当您在包 DMwR 中使用 SMOTE 时,您需要指定过采样百分比和欠采样百分比。这些值必须谨慎设置,因为获得的数据分布可能仍然不平衡。

在您的情况下,给定参数集,即采样不足和过采样的百分比将引入您的少数类示例的副本。

您的初始类分布是 12 到 62,应用 smote 后,您以 60 到 72 结束。这意味着少数类被 smote 过采样,并且生成了该类的新合成示例。

但是,您的多数类有 62 个示例,现在包含 72 个!对这个类应用了欠采样百分比,但它实际上增加了示例的数量。由于从多数类中选择的示例数是根据少数类的示例确定的,因此从该类中采样的示例数大于现有的示例数。

因此,您有 62 个示例,算法尝试随机选择 72 个!这意味着引入了多数类示例的一些副本。

所以,解释一下您选择的过采样和欠采样:

来自少数类的 12 个示例,具有 400% 的过采样给出:12*400/100=48。因此,48 个新的合成示例添加到少数类(少数类的最终示例数为 12+48=60)。

从多数类中选择的示例数为:48*150/100=72。 但是majority class只有62个,所以必然要引入replicas。

【讨论】:

  • 为了澄清 paboranco 所说的,smote 创建了 perc.under*(#minority classes) 。然后它使用 perc.over* (perc.under*(#minority classes) )。
【解决方案2】:

我不确定 SMOTE 在 DMwR 中的实现,但将新数据四舍五入到最接近的整数值应该是安全的。一种猜测是,如果您想进行回归而不是分类,则留给您去做。否则,如果您想要回归并且 SMOTE 返回整数,那么您会因为反方向(SMOTE -> 整数 -> 实数)而无意中丢失信息。

如果您不熟悉 SMOTE 的功能,它会通过查看最近的邻居来建立邻域,然后从该邻域内采样来创建“新数据”。它通常在给定类的分类问题中没有足够数据时完成。它的运行假设是您的数据附近的数据由于接近而相似。

您也可以使用Weka's implementation of SMOTE,这不会让您做这些额外的工作。

【讨论】:

    【解决方案3】:

    SMOTE 是一种生成合成样本的非常简单的算法。但是,在您开始使用它之前,您必须了解您的功能。例如,如果您的每个功能都相同,等等。

    简单地说,在你做之前,试着理解你的数据......!!!

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 2020-03-08
      • 2019-05-24
      • 2020-07-05
      • 2015-10-29
      • 1970-01-01
      • 2021-09-21
      • 2018-12-24
      • 2018-06-21
      相关资源
      最近更新 更多