Передискретизация Python объединяет несколько семплеров в конвейер

Моя проблема связана с ошибкой значения, вызванной классом 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 в случае чрезвычайно малого количества элементов?

Заранее спасибо.


person Alibek Jakupov    schedule 07.05.2019    source источник
comment
Пожалуйста, отредактируйте, чтобы уточнить; в настоящее время неясно, в чем конкретно ваш вопрос, действительно ли он касается ошибки, которую вы упомянули в начале (где именно она появляется?), или что именно вы имеете в виду, говоря о борьбе   -  person desertnaut    schedule 07.05.2019
comment
Я попытался уточнить вопрос. Это кажется более ясным? Собственно вопрос заключается в настройке пользовательских условий в конвейере.   -  person Alibek Jakupov    schedule 08.05.2019


Ответы (1)


Я также столкнулся с той же проблемой, что и вы (Expected n_neighbors <= n_samples, but n_samples = 1, n_neighbors = 6), прочитал и последовал совету этого парня, как и вы.

Я думаю, вы получаете ту же ошибку, потому что вы устанавливаете случайный передискретизатор ПОСЛЕ операции SMOTE. То есть вам нужно передискретить ваши классы меньшинства ДО применения алгоритма SMOTE.

Это сработало для меня:

pipe = Pipeline([
('tfidf', TfidfVectorizer()), 
('ros', RandomOverSampler()),
('oversampler', SMOTE()),
('clf', LinearSVC()),
])

person BringBackCommodore64    schedule 03.08.2019