Как использовать комбинацию передискретизации и недостаточной выборки? с несбалансированным обучением

Я хочу передискретизировать некоторые большие данные (размеры классов: 8 миллионов против 2700). Я хотел бы иметь по 50 000 выборок каждого класса с передискретизацией класса 2 и недостаточной выборки класса 1. imblearn, кажется, предлагает комбинацию избыточной и недостаточной выборки, но я не понимаю, как это сделать. работает.

from collections import Counter
from imblearn.over_sampling import SMOTENC
from imblearn.under_sampling import TomekLinks
from imblearn.combine import SMOTETomek

smt = SMOTETomek(random_state=1)
X_resamp, y_resamp = smt.fit_resample(data_all[29000:30000], labels_all[29000:30000])

Раньше данные выглядели как

>>Counter(labels_all[29000:30000])
>>Counter({0: 968, 9: 32})

а потом

>>Counter(y_resamp)
>>Counter({0: 968, 9: 968})

как я ожидал или желал чего-то вроде

>>Counter(y_resamp)
>>Counter({0: 100, 9: 100})

person Quastiat    schedule 12.10.2019    source источник


Ответы (1)


Кажется, у вас есть только 32 записи с классом 9, поэтому он выполняет выборку этого класса и выравнивает его записи данных с записями класса 0, следовательно, 9: 968

вы говорите о сокращении набора данных до 100 записей, вы можете сделать это путем случайной выборки 100 записей для каждого класса из X и Y (те же 100 записей) или взять первые 100, например y_resamp[:100]

person shahaf    schedule 14.10.2019
comment
да, вы правы, я просто ожидал комбинации передискретизации и недостаточной выборки, как будто SMOTETomek может сделать это за один шаг. Теперь я сначала субдискретизирую класс 0 на data_all[labels_all==0].sample(100), а затем передискретизирую сокращенный набор данных с помощью SMOTE. Я просто надеялся, что есть более сложное решение - случайная даунсэмплинг. Я понижаю выборку наблюдений с 8,5 м до 10.000, поэтому мне хотелось бы получить 10.000 самых разнообразных наблюдений. - person Quastiat; 14.10.2019