{"id":14271,"url":"\/distributions\/14271\/click?bit=1&hash=51917511656265921c5b13ff3eb9d4e048e0aaeb67fc3977400bb43652cdbd32","title":"\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043d\u0430\u0442\u0438\u0432\u043e\u043a \u0438 \u0441\u043f\u0435\u0446\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 vc.ru \u2014 \u043d\u0430\u0439\u0434\u0438\u0441\u044c!","buttonText":"","imageUuid":""}

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

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

При создании модели, с применением методов 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
0
Комментарии
-3 комментариев
Раскрывать всегда