0

我正在尝试解决不平衡的分类问题,所有输入特征都是分类的。以下是每个特征的值计数:

 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 创建了新值,创建了 under_sampling 新值也是如此。这些新值不存在于测试数据集中。

例子:

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

我的问题:

  1. 为什么要创建这些价值观,它们是否具有某种重要性?

  2. 如何对付他们?我应该将它们四舍五入还是删除它们

  3. 有没有办法在不创建这些新值的情况下执行过采样和欠采样?

4

1 回答 1

1

如果数据集的类分布不均匀,这可能会在训练和分类的后期阶段造成麻烦,因为分类器将拥有非常少的数据来学习特定类的特征。

与正常的上采样不同,SMOTE 利用最近邻算法生成可用于训练模型的新合成数据。

正如SMOTE 的这篇原始论文中所说,“通过获取每个少数类样本并沿连接任何/所有 k 个少数类最近邻的线段引入合成示例,对少数类进行过采样。

所以的,这些新生成的合成数据点很重要,您不必太担心它们。SMOTE 是执行此任务的最佳技术之一,因此我建议使用它。

例如,考虑下图: 图 a具有更多的类 0数据点,而类 1非常少。在此处输入图像描述

如您所见,应用 SMOTE(图 b)后,它将为少数类(在本例中为类 1)生成新的数据点,以平衡数据集。


尝试阅读:

  1. http://rikunert.com/SMOTE_explained

  2. https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/

于 2020-03-17T12:20:27.787 回答