【问题标题】:How to fix samples < K-neighbours error in oversampling using SMOTE?如何在使用 SMOTE 进行过采样时修复样本 < K-neighbours 错误?
【发布时间】:2019-08-30 22:02:55
【问题描述】:

我正在为 11 个标签设计一个多类分类器。我正在使用SMOTE 来解决采样问题。但是我面临以下错误:-

SMOTE 出错

from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42)
X_res, Y_res = sm.fit_sample(X_f, Y_f)

错误

~/.local/lib/python3.6/site-packages/sklearn/neighbors/base.py in kneighbors(self, X, n_neighbors, return_distance)
    414                 "Expected n_neighbors <= n_samples, "
    415                 " but n_samples = %d, n_neighbors = %d" %
--> 416                 (train_size, n_neighbors)
    417             )
    418         n_samples, _ = X.shape

ValueError: Expected n_neighbors <= n_samples,  but n_samples = 1, n_neighbors = 6

为什么说我只有 1 个 n_samples?

当我为 10 万行(并且只有 4 个标签)的小得多的数据集尝试相同的代码时,它运行得很好。

有关输入的详细信息

输入参数

X_f

array([[1.43347000e+05, 1.00000000e+00, 2.03869492e+03, ...,
        1.00000000e+00, 1.00000000e+00, 1.35233019e+03],
       [5.09050000e+04, 0.00000000e+00, 0.00000000e+00, ...,
        5.09050000e+04, 0.00000000e+00, 5.09050000e+04],
       [1.43899000e+05, 2.00000000e+00, 2.11447368e+03, ...,
        1.00000000e+00, 2.00000000e+00, 1.39707767e+03],
       ...,
       [8.50000000e+01, 0.00000000e+00, 0.00000000e+00, ...,
        8.50000000e+01, 0.00000000e+00, 8.50000000e+01],
       [2.33000000e+02, 4.00000000e+00, 4.90000000e+01, ...,
        4.00000000e+00, 4.00000000e+00, 7.76666667e+01],
       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,
        0.00000000e+00, 0.00000000e+00, 0.00000000e+00]])

Y_f

array([[1., 0., 0., ..., 0., 0., 0.],
       [1., 0., 0., ..., 0., 0., 0.],
       [1., 0., 0., ..., 0., 0., 0.],
       ...,
       [1., 0., 0., ..., 0., 0., 0.],
       [1., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 1.]])

输入参数的维度

print(X_f.shape, Y_f.shape)
(2087620, 31) (2087620, 11)

我尝试使用imblearn包的其他技术

调试 SMOTE fit_resample() 方法 我知道 SMOTE 通过使用少数数据点的最近邻之间的欧几里德距离合成少数样本来工作。所以我打印出 ../python3.6/site-packages/sklearn/neighbors/base.py 文件中的 n_samples 变量。它显示样本从 5236 -> 103 -> 3 稳步减少,然后我得到了错误。我不明白发生了什么。

  1. 使用SVMSMOTE:- 计算时间太长(超过 2 天),并且 PC 崩溃。
  2. 使用RandomOverSampler:- 模型的准确率很差,为 45%
  3. 使用不同的sampling_strategy:- 仅适用于minority
  4. 还提供了herehere. 的建议,但均未成功。老实说,我无法理解他们。
  5. 当我将数据集减少到 100k、1k 和 5k 行时,收到了同样的错误。

尽管尝试了,但我还是不太了解。我是采样的新手。请帮我解决这个问题好吗?

【问题讨论】:

  • 可能是 imblearn 的错误?

标签: python machine-learning classification oversampling imblearn


【解决方案1】:

发生此错误是因为数据集中的某些实例太少。例如,在一个 2M 强的数据集中,只有一个实例具有特定标签“����”。

因此,对于本例,没有可供 SMOTE 算法合成副本的样本。仔细检查您的数据集,确保其干净且可用。

使用df.where("Label != '���'")删除了不必要的实例

【讨论】:

    【解决方案2】:

    我今天遇到了类似的问题。当我增加数据集的行数时,问题得到了解决。 当我更改为 n_rows = 5000 时,我第一次尝试使用 n_rows = 1000 的子样本不再出现错误。

    由于您的数据集的输入大小非常大,您可能会发现在应用 imblearn 之前减小数据集的大小很有用。事实上,你会在网上找到几个实验,证明存在一个数据集长度阈值,分类器不会显着提高其性能。 Here 这些实验之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-09
      • 2020-03-08
      • 2018-12-24
      • 2019-05-24
      • 2020-07-05
      • 2018-12-02
      • 2015-10-29
      • 1970-01-01
      相关资源
      最近更新 更多