Как удалить классы меньшинств с меньшим количеством примеров перед выполнением SMOTE, python

У меня есть набор данных, который содержит 100 столбцов в качестве векторов признаков (100D векторов признаков), сгенерированных из word2vec, и моя цель - категориальная переменная для каждой строки вектора в моем наборе данных. Сейчас в моем наборе данных около 1000 различных категориальных переменных, а количество строк составляет около 75000. Проблема с набором данных заключается в том, что он сильно несбалансирован и, за исключением первых 200 категориальных переменных, все остальные классы имеют очень мало выборок и some classes have less than 6 samples .

Теперь я хочу выполнить передискретизацию этих данных с помощью SMOTE, чтобы создать больше примеров для классов меньшинств. I want to ignore the classes that have less than 6 sample examples, потому что это точка, в которой SMOTE выдает ошибку значения. Есть ли способ обработать это в коде, чтобы я мог игнорировать эти классы с менее чем 6 образцами при выполнении SMOTE? И поможет ли это решить проблему, с которой я столкнулся в настоящее время?

Код и сообщение об ошибке для справки:

dataset = pd.read_csv(r'C:\vectors.csv')
X = dataset.iloc[:, 3:103]
y = dataset.iloc[:, 0]
from imblearn.over_sampling import SMOTE
smote = SMOTE(k_neighbors = 1)       
smote_Xtrain, smote_y_train = smote.fit_sample(X, y) 

Я получаю эту ошибку в настоящее время ValueError: Expected n_neighbors <= n_samples, but n_samples = 1, n_neighbors = 2, хотя я установил k_neighbors = 1

Любая помощь в этом будет высоко оценена


person Erich    schedule 17.08.2020    source источник


Ответы (1)


Вы можете увидеть уникальные записи для каждого класса и подсчитать их с помощью следующей команды: df['VARIABLE'].value_counts(dropna=False) (поверните dropna=True, если вы не хотите, чтобы NaN отображалось).

Затем с этим вы можете сами создать алгоритм, установить порог и автоматически удалять классы, которые кажутся меньше вашего порога, или помещать их, например, в новый большой класс Other

person BeamsAdept    schedule 17.08.2020
comment
Спасибо за предложение. Пробовал, но теперь получаю ошибку памяти при попытке подогнать тренировочные данные к Smote. Есть идеи, как это решить? - person Erich; 17.08.2020