Как исправить ошибку сэмплов <K-neighbours при передискретизации с помощью SMOTE?

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

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

Может быть, это ошибка в imblearn?

Has QUIT--Anony-Mousse 10.04.2019 07:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
2 542
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Ответ принят как подходящий

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

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

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

Другие вопросы по теме