{"id":14284,"url":"\/distributions\/14284\/click?bit=1&hash=82a231c769d1e10ea56c30ae286f090fbb4a445600cfa9e05037db7a74b1dda9","title":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0430\u043d\u0446\u044b \u0441 \u0441\u043e\u0431\u0430\u043a\u0430\u043c\u0438","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 комментариев
Раскрывать всегда