SMOTE平衡R中的200多个课程

时间:2018-11-28 10:42:05

标签: r resampling oversampling

我有一个两列的数据集(功能和类),其中有200多个类必须将输入功能分类。对于某些类,这些类的出现范围从1到几千。功能列包含文本和数字。我尝试了以下方法:

UBL中的SMOTE

SmoteClassif(lab ~ ., dat, C.perc = "balance",dist="HEOM")

这给出了警告:

Warning messages:
1: SmoteClassif :: Nr of examples is less or equal to k.
 Using k = 1 in the nearest neighbours computation in this bump.
2: SmoteClassif :: Nr of examples is less or equal to k.
 Using k = 1 in the nearest neighbours computation in this bump.
3: SmoteClassif :: Nr of examples is less or equal to k.
 Using k = 2 in the nearest neighbours computation in this bump.
4: SmoteClassif :: Nr of examples is less or equal to k.
 Using k = 2 in the nearest neighbours computation in this bump.

但这仍然很好地平衡了所有类lab。但是,并非所有功能都存在于SMOTED数据集中。这不是数据丢失,即缺少训练模型所需的功能吗?我是该领域的新手。警告是否解释了问题?我已经尝试过k=1,但最终结果还是一样。

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

在UBL软件包中实现的SmoteClassif函数使用SMOTE过程随机过采样来组合过采样

这意味着当您使用选项“ balance”时,该函数将为最稀有的类生成新个案,并从人口最多的类中删除个案。最后,目标是获得一个新的平衡数据集,其大小与原始数据集大致相同。因此,当您使用选项“ balance”时,您将生成新的综合案例,并从最常见的类中删除案例,以便最终获得一个大小与初始样本大小相似的数据集。

如果只想应用过采样过程,则需要在C.perc参数中指定要应用于每个类的过采样量。 例如,您可以设置

C.perc = list(A = 2, B=3)

这将复制A类的元素,并使B类的元素重复三倍,而其余数据集保持不变(所有其他类保持其频率)。在这种情况下,您的数据集将通过新的合成方法进行扩展,并且不会丢弃任何信息!

一个简单的例子:

library(MASS)
data(cats)
table(cats$Sex)

F  M  
47 97 

# class M is duplicated
mysmote.cats <- SmoteClassif(Sex~., cats, list(M = 2))
table(mysmote.cats$Sex)

F   M 
 47 194 

#class M is oversampled by 150% and class F is undersampled by 50%
mysmote.cats <- SmoteClassif(Sex~., cats, list(M = 1.5, F=0.5))
table(mysmote.cats$Sex)

F   M 
 23 145 

关于警告,该功能的默认值是在计算特定类别中示例的最接近邻居时使用k = 5。但是,在某些数据集中,由于没有足够的示例,因此无法计算选定的邻居数。例如,当您从此类中选择一个病例时,如果您只有3个A类示例,那么您最多可以从该类中找到2个最近的邻居!

因此,当所选的k太大而无法确定某个案例的邻居的特定数目时,将显示警告。