Как исправить сэмплы <ошибка K-соседей при передискретизации с использованием SMOTE? - PullRequest
0 голосов
/ 09 апреля 2019

Я разрабатываю мультиклассовый классификатор для 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?

Когда я попробовал тот же код для гораздо меньшего набора данных из 100 тыс. Строк (и только 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 работает путем синтеза выборок меньшинства, используя евклидово расстояние между ближайшими соседями точки данных меньшинства. Поэтому я распечатал переменную n_samples в файле ../python3.6/site-packages/sklearn/neighbors/base.py. Он показал стабильно убывающие выборки с 5236 -> 103 -> 3, и тогда я получил ошибку. Я не мог понять, что происходит.

  1. Использование SVMSMOTE: - Слишком много времени для вычислений (более 2 дней) и сбой ПК.
  2. Использование RandomOverSampler: - Модель дает низкую точность, 45%
  3. Использование разных sampling_strategy: - работает только для minority.
  4. Также из предоставленных предложений здесь и здесь ., Безуспешно. Честно говоря, я не мог их понять.
  5. Та же ошибка была получена, когда я уменьшил набор данных до 100К, 1К и 5К строк.

Несмотря на попытки, я мало что понимаю в этом. Я новичок в отборе проб. Можете ли вы помочь мне решить эту проблему, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Эта ошибка возникает из-за того, что некоторые экземпляры в наборе данных слишком малы. Например, в сильном наборе данных 2M был только один экземпляр с определенной меткой « ».

Следовательно, для этого экземпляра не существует примеров для алгоритма SMOTE, из которого можно сделать искусственные копии. Внимательно проверьте свой набор данных и убедитесь, что он чистый и пригодный для использования.

Ненужный экземпляр был удален с помощью df.where("Label != '���'")

0 голосов
/ 10 апреля 2019

У меня была похожая проблема сегодня. Проблема была исправлена, когда я увеличил количество строк в моем наборе данных. Я впервые попробовал с подвыборкой n_rows = 1000, когда я изменил на n_rows = 5000, больше не получал ошибку.

Поскольку входной размер вашего набора данных очень велик, может оказаться полезным уменьшить размер набора данных до применения imblearn. Фактически, вы найдете пару экспериментов в сети, которые демонстрируют, что существует порог длины набора данных, при котором классификатор не значительно улучшает свою производительность. Здесь один из этих экспериментов.

...