我有一个两列的数据集(功能和类),其中有200多个类必须将输入功能分类。对于某些类,这些类的出现范围从1到几千。功能列包含文本和数字。我尝试了以下方法:
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
,但最终结果还是一样。
任何建议都会有所帮助。
答案 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太大而无法确定某个案例的邻居的特定数目时,将显示警告。