Моя проблема связана с ошибкой значения, вызванной классом SMOTE.
Ожидаемые n_neighbors ‹= n_samples, но n_samples = 1, n_neighbors = 6
# imbalanced learn is a package containing impelementation of SMOTE
from imblearn.over_sampling import SMOTE, ADASYN, RandomOverSampler
from imblearn.pipeline import Pipeline
# label column (everythin except the first column)
y = feature_set.iloc[:,0]
# feature matrix: everything except text and label columns
x = feature_set.loc[:, feature_set.columns != 'text_column']
x = x.loc[:, x.columns != 'label_column']
x_resampled, y_resampled = SMOTE().fit_resample(x, y)
Проведя небольшое расследование, я обнаружил, что некоторые из моих классов (всего 158) были отобраны крайне редко.
В соответствии с решением, предложенным в этом сообщении
Создайте конвейер, который использует SMOTE и RandomOversampler способом, который удовлетворяет условию n_neighbors ‹= n_samples для сглаженных классов и использует случайную передискретизацию, когда условие не выполняется.
Тем не менее, я все еще изо всех сил пытаюсь запустить свой эксперимент.
# initilize oversamplers
smote = SMOTE()
randomSampler = RandomOverSampler()
# create a pipeline
pipeline = Pipeline([('smote', smote), ('randomSampler', randomSampler)])
pipeline.fit_resample(x, y)
И когда я его запускаю, у меня все та же ошибка. Я предполагаю, что сгенерированный конвейер применяет оба семплера, тогда как мне нужно применить только один из них одновременно, на основе предопределенного условия (если количество элементов меньше X, то RandomSampler, в противном случае SMOTE). Есть ли способ установить условие для вызова RandomSampler в случае чрезвычайно малого количества элементов?
Заранее спасибо.