В datascience все уже знают о важности данных для успеха любого проекта с машинным обучением. Часто бывает, что сами данные представляют собой гораздо большую ценность, чем модель, которая на них обучилась, поскольку процесс получения этих данных может быть гораздо сложнее, опаснее, дороже, чем обучение модели. Поэтому набирает популярность генерация наборов данных, создаются специальные фреймворки. Сегодня речь пойдет об одном из таких фреймворков, SMOTE, или же Synthetic Minority Oversampling Technique. За два последних десятилетия накопилось довольно много материала по этой технике. Ключевое отличие этой статьи в экспериментах, которые проводились в ходе исследования работоспособности такого типа овэрсэмплинга.
Постановка проблемы
Все, кто хоть раз сталкивался с машинным обучением, знакомы с таким понятием как «отсутствие баланса классов». Мало когда встречаются отбалансированные наборы данных, только если мы сами не сделаем себе нужную выборку с балансом. Также, многие наверно слышали, что дисбаланс классов может негативно отражаться на обучении модели, поэтому всегда возникали вопросы о том, как такую проблему решать.
Есть несколько способов как дополнять данные, но сегодня остановимся на исправлении дисбаланса с помощью «синтетики», то есть искусственной генерации дополнительных сэмплов, с учетом характера данных. Есть два способа как можно выровнять классы: oversampling и undersampling. Oversampling – мы дополняем плохо присутствующий класс. Undersampling – срезаем доминирующий класс и тем самым выравниванием дисбаланс классов. Конкретно SMOTE является техникой овэрсэмплинга, то есть он дополняет мало представленный класс, чтобы исправить несбалансированность в данных.
Классический SMOTE
Существует довольно много видов SMOTE. В этой статье будет описано 3 основных, после чего перейдём к проблемам и экспериментам. Начнем с классического. Процесс создания синтетических примеров довольно прост и основан на алгоритме ближайших соседей.
Мы берем сэмпл и одного из его соседей, выбранного случайным образом. Затем мы выполняем интерполяцию между этими двумя точками. В результате новый сэмпл окажется где-то между ними в пространстве признаков, унаследовав свойства обоих точек. Такая интерполяция позволяет нам генерировать новые данные, которые сохраняют основные характеристики малочисленного класса, но при этом добавляют немного разнообразия.
Примерно так это будет выглядеть после того, как сгенерируются новые данные:
Borderline-SMOTE
Borderline-SMOTE направлен на образцы, расположенные на границе между различными классами. Основная мысль заключается в том, что эти образцы часто оказываются самыми сложными для классификации и, следовательно, наиболее важными для обучения модели. Сначала определяются граничные образцы малочисленного класса, то есть те, которые окружены множеством соседей из преобладающего класса. Затем метод Borderline-SMOTE применяется исключительно к этим граничным образцам, увеличивая их количество и таким образом усиливая разделяющую границу вокруг них.
Математическое описание работы Borderline-SMOTE:
Идентификация граничных образцов малочисленного класса:
Классификация образцов малочисленного класса:
Генерация синтетических образцов:
SVM-SMOTE
SVM-SMOTE применяет метод опорных векторов для выбора сэмплов, которые будут усилены. SVM известен своей эффективностью в нахождении оптимальных разделяющих границ между классами. Сначала мы обучаем классификатор SVM. Затем сэмплы, которые находятся наиболее близко к разделяющей границе (опорные векторы), используются для создания новых синтетических данных.
Математическое описание работы SVM-SMOTE:
Инициализация:
Алгоритм:
ADASYN – адаптивный синтетический алгоритм
ADASYN не является на самом деле видом SMOTE, но тем не менее очень схож с ним. Он концентрируется на образцах, которые наиболее трудно классифицировать, и создает больше синтетических данных для этих образцов. Объем синтетических данных для каждого образца определяется на основе количества соседей из противоположного класса — чем больше соседей из другого класса, тем больше синтетических данных будет создано.
Математическое описание работы ADASYN:
Вычисление степени дисбаланса классов:
Проверка, ниже ли дисбаланс порогового значения:
Смотить или не смотить?
В мае 22 года вышла статья To SMOTE or not to SMOTE. В ней авторы решили проверить работоспособность этой техники на разных моделях машинного обучения. Исследование показало, что получали выигрыш от такого оверсэмплинга только так называемые weak learners – то есть простые модели по типу дерева, перцептрона, метода опорных векторов. Наиболее продвинутые модели «по типу» (xgboost, light gbm, cat boost) получали довольно малый, либо нулевой прирост метрик.
Метрики представлены ниже, здесь нас интересуют фиолетовые кружки. По метрикам видно, что прирост показали только слабые модели. В то время как лучшие ML модели почти никак не отреагировали на использование SMOTE. Эти кружки – это средняя метрика по всем датасетам в исследовании, всего было задействовано в оценке 73 датасета.
Пояснение к рисункам:
SVM – Support Vector Machines
DT – Decision Tree
LGBM – Light Gradient-Boosting Machine
XGBoost – Extreme Gradient-Boosting
CatBoost – Categorical Boosting
MLP – Multilayer Perceptron
На примере MLP разобрал, что значат подписи на графике:
Rank – рейтинг всех используемых комбинаций моделей и SMOTE, где чем меньше – тем лучше.
MLP+Default – модель со стартовыми гиперпараметрами без овэрсемплинга
MLP – модель с наилучшими гиперпараметрами без оверсэмплинга. Далее идут модели с оверсэмплингом.
MLP+Random – модель с наилучшими гиперпараметрами и использованием Random Oversampling (случайное дублирование примеров для мало присутствующего класса).
MLP+SMOTE, MLP+SVM-SM, MLP+ADASYN – модели с наилучшими гиперпараметрами с использованием разных видов овэрсэмплинга, которые я описал выше.
MLP+Poly – модель с наилучшими гиперпараметрами и использованием Polynomfit SMOTE (генерация синтетики путём подгонки полинома к пространству признаков малочисленного класса).
Постановка собственных экспериментов
После прочтения этой статьи, было решено самостоятельно убедиться в результатах статьи и прогнать хотя бы на одном датасете несколько классификаторов и вариаций SMOTE и посмотреть на результаты.
Условия эксперимента:
Классический датасет с винами (определение качества вина от 1 до 10)
Убрал одну категориальную колонку (для SMOTE желательно чтобы все признаки были непрерывными, он не умеет корректно работать с категориальными значениями)
Undersampling не проводился
Убрал вина с оценкой 9 (их было всего 5 штук и SMOTE не смог сгенерировать данных для такого малого количества сэмплов)
Было проведено 20 экспериментов (4 модели и 3 типа SMOTE, 4 раза модель прогонялась без SMOTE, еще 4 раза использовался ADASYN)
Тестовая выборка состоит только из настоящих сэмплов, чтобы оценить реальную способность классификаторов
Не проводилось тюнинга гиперпараметров, все модели обучались с дефолтными настройками
Эксперименты – Gradient Boosting
И так, начнем с градиентного бустинга. Считаем его одним из передовых алгоритмов, поэтому ожидаем, что здесь будет ухудшение или такое же качество предсказаний. Если посмотреть бегло на метрики, то видно, что они почти такие же как на дефолтном бустинге. При разных типах SMOTE разные классы вырываются вперед, но общая картина не меняется, все более или менее одинаково.
Эксперименты – Random Forest
Случайный лес тоже довольно сильная модель, поэтому ожидаем результаты как на градиентном бустинге. Так и получилось, если опять бегло посмотрим на метрики, та же картина, все +- как и при дефолтном случайном лесе. Как и на прошлом слайде в разных SMOTE разные классы выбиваются вперед.
Эксперименты – Multilayer Perceptron
Вот здесь уже интереснее. В исследовании 2022 года перцептроны со SMOTE сильно вырвались вперед по метрикам по сравнению с дефолтным перцептроном. Что видно: начали расти метрики на абсолютно нулевых классах. То есть, к примеру 3 и 8, хотя и произошел общий спад метрик на других классах. Лучше всего здесь себя показал SVM-SMOTE. Если посмотрим на f1, это видно, если сравнить с другими типами SMOTE.
Эксперименты – Support Vector Machines
SVM тоже довольно интересен. На дефолте удавалось обнаружить всего 2 класса из 6. Такая же ситуация, как и с перцептроном, SVM начал видеть классы, на которых были нулевые метрики. И опять лучшим себя показал SVM-SMOTE, на пару с основным SVM классификатором. Там стало получаться найти 4 класса.
Когда используем?
применение легких моделей для простой классификации
еще в одной статье видел, что ломается калибровка вероятностей модели, поэтому это тоже надо учитывать
Когда не используем?
при высокой размерности (В таком случае расстояние между точками становятся менее различимы. Концепция ближайшего соседа начинает терять значимость. Появляется риск создания не репрезентативных сэмплов.)
много «шума» в данных (При большом количестве шумовых сэмплов также будет генерироваться довольно большое количество аномальных данных.)
проблемы с распределением (При проблемах с распределением могут создаваться сэмплы, не отображающие реальное распределение класса.)
присутствие категориальных признаков (При присутствии категориальных признаков SMOTE может создавать некорректные сэмплы.)
Автор статьи: Николай Чудиновских, младший исследователь исследовательского центра UDV Group
Полезные ссылки: