我正在尝试解决分类不平衡的问题,所有输入要素都是分类的。这是每个功能的价值计数:
for i in X_train.columns:
print(i+':',X_train[i].value_counts().shape[0])
Pclass: 3
Sex: 2
IsAlone: 2
Title: 5
IsCabin: 2
AgeBin: 4
FareBin: 4
train_test_split之后,将SMOTE应用于训练数据。创建了新值,这些新值在X_train数据集中不存在。
from imblearn.over_sampling import SMOTE
from collections import Counter
#removing the random_state dosent help
sm = SMOTE(random_state=0)
X_res, y_res = sm.fit_resample(X_train, y_train)
print('Resampled dataset shape %s' % Counter(y_res))
Resampled dataset shape Counter({1: 381, 0: 381})
重新采样的数据集的值计数:
Pclass: 16
Sex: 7
IsAlone: 2
Title: 12
IsCabin: 2
AgeBin: 4
FareBin: 4
使用SMOTE正在创建新值,创建欠采样的新值也是如此。这些新值在测试数据集中不存在。
示例:
X_train-Pclass 1-20,2-15,3-40
X_res-Pclass 1-20,0.999999-3,2-11,1.9999999-4,3-34,2.9999999-6
我的问题:
为什么创建这些值,并且它们具有某些重要性?
如何处理?我应该将它们四舍五入还是将其删除
是否有一种方法可以在不创建这些新值的情况下进行过采样和欠采样?
如果数据集的类分布不均匀,则这可能会在以后的训练和分类阶段引起麻烦,因为分类器将仅具有很少的数据来学习特定类的特征。
与正常的上采样不同,此技术利用最近邻居算法来生成可用于训练模型的新数据和合成数据。
如this original paper of SMOTE中所述,“ 通过获取每个少数族裔样本并沿着连接任意/全部k个少数族裔最近邻的线段引入综合示例,对少数族裔进行过采样。]“
所以是
,这些新生成的合成数据点很重要,您不必太担心它们。 SMOTE是执行此任务的最佳技术之一,因此,我建议使用此技术。的class 0数据点较多,而class 1的数据点很少。如您所见,在应用SMOTE(图b
之后,它将为以下类别的minority类(在本例中为class 1)生成新的数据点为了平衡数据集。尝试阅读: