Я разрабатываю многоклассовый классификатор для 11 этикеток. Я использую 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, после чего я получил ошибку. Я не мог понять, что происходит.
SVMSMOTE
: - Вычисление занимает слишком много времени (более 2 дней), и компьютер выходит из строя.RandomOverSampler
: - Модель дает низкую точность, 45%sampling_strategy
:- работает только для minority
.Несмотря на попытки, я мало что понимаю. Я новичок в выборке. Можете ли вы помочь мне решить эту проблему, пожалуйста?
У меня была аналогичная проблема сегодня. Проблема была исправлена, когда я увеличил количество строк в своем наборе данных. Сначала я пытался использовать подвыборку n_rows = 1000, когда я перешел на n_rows = 5000, ошибка больше не появлялась.
Поскольку входной размер вашего набора данных очень велик, вам может оказаться полезным уменьшить размер набора данных перед применением imblearn. На самом деле, вы найдете пару экспериментов в Интернете, которые демонстрируют, что существует порог длины набора данных, при котором классификатор не повышает значительно свою производительность. Здесь один из этих экспериментов.
Эта ошибка возникает из-за того, что некоторые экземпляры в наборе данных слишком малы. Например, в надежном наборе данных 2M был только один экземпляр с определенной меткой «����».
Следовательно, для этого случая нет образцов для алгоритма SMOTE, чтобы сделать синтетические копии. Внимательно проверьте свой набор данных и убедитесь, что он чист и пригоден для использования.
Ненужный экземпляр был удален с помощью df.where("Label != '���'")
Может быть, это ошибка в imblearn?