如何使用SMOTE解决过采样中的<K邻居错误?

时间:2019-04-09 14:55:15

标签: python machine-learning classification oversampling imblearn

我正在为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?

当我为100k行(只有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行时,收到了相同的错误。

尽管尝试,但我不太了解。我是新手。您能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我今天有一个类似的问题。当我增加数据集的行数时,此问题已解决。 当我更改为n_rows = 5000时,我首先尝试使用n_rows = 1000的子样本,但不再收到错误。

由于数据集的输入大小非常大,因此在应用imblearn之前减小数据集的大小可能会很有用。实际上,您将在网络上找到一些实验,这些实验表明存在一个数据集长度阈值,而分类器并不能显着改善其性能。 Here这些实验之一。

答案 1 :(得分:0)

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

因此,在这种情况下,没有用于SMOTE算法的样本可用于合成副本。仔细检查您的数据集,并确保它是干净且可用的。

使用df.where("Label != '���'")

删除了不必要的实例