Время прочтения: 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