Передискретизация Python объединяет несколько семплеров в конвейер - PullRequest
1 голос
/ 07 мая 2019

Моя проблема связана с ошибкой значения, вызванной классом SMOTE.

Ожидаемые n_neighbors <= n_samples, но n_samples = 1, n_neighbors = 6 </p>

# 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 для копченого классы и использует случайную передискретизацию, когда условие не удовлетворены. </p>

Тем не менее, я все еще изо всех сил пытаюсь запустить свой эксперимент.

# initilize oversamplers
smote = SMOTE()
randomSampler = RandomOverSampler()
# create a pipeline
pipeline = Pipeline([('smote', smote), ('randomSampler', randomSampler)])
pipeline.fit_resample(x, y)

И когда я запускаю его, у меня все та же ошибка. Я предполагаю, что сгенерированный конвейер применяет оба сэмплера, в то время как мне нужно, чтобы только один из них применялся одновременно, на основе предварительно определенного условия (если число элементов меньше X, тогда RandomSampler, иначе SMOTE). Есть ли способ установить условие для вызова RandomSampler в случае чрезвычайно малого числа элементов?

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

...