我有一个两列数据集(要素和类),其中包含 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
但最终结果仍然相同。
任何建议都会有所帮助。
最佳答案
UBL 包中实现的 SmoteClassif 函数使用 SMOTE 过程将过采样与随机欠采样相结合。
这意味着当您使用“平衡”选项时,该函数将为最稀有的类生成新的案例,并从最常见的类中删除案例。最终的目标是获得一个与原始数据集大小大致相同的新的平衡数据集。因此,当您使用选项“平衡”时,您将生成新的合成案例,并从最常见的类中删除案例,以便您最终得到一个大小与初始数据集相似的数据集。
如果您只想应用过采样过程,则需要在 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 太大而无法确定案例的邻居的具体数量时,会显示警告。
关于r - SMOTE 将平衡 R 中的 200 多个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53517536/