Лайфхаки в IT

Алгоритм балансировки классов SMOTE

Время прочтения: 2 мин.

При создании модели, с применением методов ML и использования модели с учителем, можно столкнуться с проблемой несбалансированности классов в обучающей выборке.

В Dataset количество записей одного класса может быть очень мало, а другого класса, наоборот, велико. В результате, при использовании алгоритмов ML, чувствительные к балансу классы алгоритма переобучаются.

Для решения таких задач, как правило, применяется Oversampling или задаются веса определенному классу.

При решении нашей задачи, классы в которой были крайне несбалансированны, удалось достичь улучшения метрик модели путем применения алгоритма.

Представленный алгоритм генерирует определенное количество похожих примеров класса с меньшим количеством данных, но при этом не дублирует данные в этом классе.

Такой алгоритм балансировки классов называется SMOTE (Synthetic Minority Oversampling Technique).

Ниже приведен пример применения балансировки классов:

os.environ ['PATH'] += os.pathsep + 'C:\\Users\\Kate\\Anaconda3\\pkgs'
from imblearn.over_sampling import SMOTE
sm = SMOTE (#sampling_strategy = 0.9,
	    random_state=0,
	    k_neighbors=4)
X_train_res, y_train_res = sm.fit_sample (X_train, y_train) 
print ("Before OverSampling, counts of label '1': { }".format (sum (y_train==1)))
print ("Before OverSampling, counts of label '0': { } \n".format (sum (y_train==0)))
print ('After OverSampling, the shape of train_X: { }'.format (X_train_res.shape))
print ('After OverSampling, the shape of train_y: { } \n'.format (y_train_res.shape))
print ("After OverSampling, counts of label '1': { }".format (sum (y_train_res==1)))
print ("After OverSampling, counts of label '0': { }".format (sum (y_train_res==0)))

Before OverSampling, counts of label '1': 4058
Before OverSampling, counts of label '0': 296

After OverSampling, the shape of train_X: (8116, 49)
After OverSampling, the shape of train_y: (8116, )

After OverSampling, counts of label '1': 4058
After OverSampling, counts of label '0': 4058
Советуем почитать