Резюме
SMOTE — это алгоритм синтетических данных, основанный на синтетической выборке, который используется для решения проблемы несбалансированного класса. Эта статья будетНитеш В. Чавла (2002)Основываясь на документе SMOTE, он излагает основную идею SMOTE и реализует его наивный алгоритм, сравнивает производительность алгоритма с традиционными классификаторами (байесовским и деревом решений) и обсуждает способы улучшения его алгоритма.
1. Введение
Дисбаланс классов — одна из распространенных проблем при обучении моделей классификаторов, например, научиться судить о том, болен ли человек раком, по большому количеству рентгенограмм грудной клетки или научиться обнаруживать шаблоны данных, которые могут быть агрессивным поведением в сетевом потоке. logs, в задачах такого типа нормальных классов больше, чем аномальных (диагностированный рак, агрессивное поведение) классов, и классификатор, обученный на несбалансированных данных классов, должен быть очень осторожным, даже если классификатор имеет высокую точность, потому что, скорее всего, чтобы узнать, что большая часть этого является нормальным, и что нам может понадобиться, так это то, что он может идентифицировать аномальное поведение в наибольшей степени, даже если точность ниже, чем первая.
Чтобы решить эту проблему, в отрасли есть следующие 5 признанных методов расширения набора данных [1], чтобы категории были единообразными:
- Произвольно увеличьте количество выборок в классе меньшинства.
- Произвольно увеличить количество образцов определенного класса меньшинства.
- Случайным образом уменьшите количество выборок мажоритарного класса.
- Случайным образом уменьшите количество выборок определенного класса большинства.
- Измените функцию стоимости так, чтобы классу меньшинства было дороже совершать ошибки.
Алгоритм SMOTE, который будет представлен в этой статье, представляет собой улучшенный метод объединения методов 1 и 3. Он основан на k ближайших соседних точек выборки каждой точки выборки и случайным образом выбирает N соседних точек, чтобы умножить разницу на [0 , 1] Порог диапазона, чтобы достичь цели синтеза данных. Суть этого алгоритма в том, что признаки смежных точек в пространстве признаков подобны. Он производит выборку не в пространстве данных, а в пространстве признаков, поэтому его точность будет выше, чем у традиционного метода выборки. Вот почему SMOTE и производные от него алгоритмы до сих пор остаются основными методами выборки.
Как показано на рисунке выше, если предположить, что точка данных A имеет 4 смежные точки в пространстве признаков, если N равно 2, SMOTE случайным образом выберет среди них 2 соседние точки B и C и рассчитает значения A->B. и A->C соответственно.Расстояния, показанные зеленой и красной линиями на рисунке, приемлемы для всех точек отбора проб на зеленых или красных линиях, таких как точка A1. Чтобы точки данных были как можно более разнообразными (не перекрывающимися), умножьте их на случайный коэффициент между [0, 1].
В этой статье будет реализован алгоритм, основанный на ядре SMOTE и его псевдокоде из главы 2, и применен его к тестовому набору данных; в главе 3 будет использоваться стороннийimbalanced-learn
Алгоритм SMOTE, реализованный в библиотеке, отбирается для проверки точности реализованного нами алгоритма.Конечно, алгоритм в этой библиотеке лучше, чем наивный алгоритм SMOTE.После этого мы будем использовать деревья решений и гауссовские байесовские классификаторы в качестве инструментов. Протестируйте исходные данные, данные, сгенерированные с помощью нашей реализованной выборки SMOTE, и данные, сгенерированные с использованием сторонней библиотеки SMOTE, чтобы сравнить производительность; в главе 4 обсуждается наивный алгоритм SMOTE, который является более надежным и обеспечивает лучший подход к оптимизации; глава 5 является кратким изложением этой статьи.
2. Алгоритм анализа и реализации
На рисунке ниже представлен псевдокод, предложенный в документе SMOTE и состоящий из двух функций.SMOTE(T, N, K)
иPopulate(N, i, nnarray)
сочинение.
SMOTE
Отвечает за принятие набора данных класса X для выборки и возврат выборочного набора данных SMOTE с размером(N/100)*T
, функция имеет три параметра, которыеT: 需要处理的数据集X的样本数量; N: 采样比例,一般为100, 200, 300等整百数,对应即1倍,2倍,3倍;K: 为采样的最近邻数量,论文中默认为5
.SMOTE
Идея кода очень проста: сканировать каждую точку выборки, вычислять K ближайших соседей каждой точки выборки и записывать индекс каждой ближайшей соседней точки выборки вnnarray
, затем пройти вPopulate(N, i, nnarray)
Выборка одной точки выборки завершена.
Populate
Ответственный заnnarray
Индексы переходят к случайной генерацииN
и наблюдаемые образцыi
подобные образцы. Эта функция вычисляет случайных соседейnn
с наблюдаемыми образцамиi
разрыв между каждой особенностью точкиdif
, умножьте разницу на случайный коэффициент [0, 1]gap
, а потомdif*gap
Значение плюс точка наблюденияi
То есть синтез признака завершен.
Это реализовано в Python следующим образом:
Примечание. Чтобы обеспечить воспроизводимость всех кодов в этой статье, установитеrandom_state
оба666
def NaiveSMOTE(X, N=100, K=5):
"""
{X}: minority class samples;
{N}: Amount of SMOTE; default 100;
{K} Number of nearest; default 5;
"""
# {T}: Number of minority class samples;
T = X.shape[0]
if N < 100:
T = (N/100) * T
N = 100
N = (int)(N/100)
numattrs = X.shape[1]
samples = X[:T]
neigh = NearestNeighbors(n_neighbors=K)
neigh.fit(samples)
Synthetic = np.zeros((T*N, numattrs))
newindex = 0
def Populate(N, i, nns, newindex):
"""
Function to generate the synthetic samples.
"""
for n in range(N):
nn = np.random.randint(0, K)
for attr in range(numattrs):
dif = samples[nns[nn], attr] - samples[i, attr]
gap = np.random.random()
Synthetic[newindex, attr] = samples[i, attr] + gap*dif
newindex += 1
return newindex
for i in range(T):
nns = neigh.kneighbors([samples[i]], K, return_distance=False)
newindex = Populate(N, i, nns[0], newindex)
return Synthetic
Здесь нет матричной операции, но она полностью воспроизводится так, как в статье (т.н. NaiveSMOTE), где мы используем вычисление ближайшего соседаscikit-learn
который предоставилNearestNeighbors
Класс завершен.
Далее мы используемscikit-learn
серединаmake_classification
Чтобы создать набор данных тестовой классификации, смоделируйте несбалансированные данные класса, конечно, заинтересованные читатели также могут найти набор данных, используемый в статье.
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=500,
n_features=9,
n_redundant=3,
weights=(0.1, 0.9),
n_clusters_per_class=2,
random_state=666) # 为了可复现性
print(X.shape, y.shape) # ((500, 9), (500,))
# 查看y的各类样本数
print(view_y(y)) # class 0: 50 class 1: 450
Распределение исходного набора данных показано на рисунке ниже, на котором красный кружок — это положительный класс, то есть класс меньшинства, а синий × — это отрицательный класс, то есть класс большинства.
заставить нас осознатьNaiveSMOTE
Применяется к этим тестовым данным:
X_over_sampling = NaiveSMOTE(X[y==0], N=800)
print(X_over_sampling.shape) # (400, 9) 新增了400个样本
# 将合成数据与原数据集合并
new_X = np.r_[X, X_over_sampling]
new_y = np.r_[y, np.zeros((X_over_sampling.shape[0]))]
print(new_X.shape, new_y.shape) # ((900, 9), (900,))
print(view_y(new_y)) # class 0: 450 class 1: 450
Затем мы объединяем исходный набор данных сNaiveSMOTE
Синтезированные наборы данных сравниваются:
Хорошо видно, что исходные классы выросли до удовлетворительного уровня, а расстояния между сгенерированными классами не слишком велики.
3. Сравнение производительности алгоритма
В этой главе мы представим сторонние библиотекиimbalanced-learnпредоставлено вSMOTE
Классы и реализации на основе статейNaiveSMOTE
Сравнивать. Оба реализованы на основе идеи одной и той же статьи, но реализованы только в сторонней библиотеке.SMOTE
Он более надежен и может всесторонне рассматривать все классы, что является полным смыслом.Combination of Over-sampling minority class and Under-sampling majority class
Технологии. Поэтому мы вводим его только для проверки точности нашего воспроизведенного метода.
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=666)
X_res, y_res = sm.fit_resample(X, y) # 即完成了合成
print(X_res.shape, y_res.shape) # ((900, 9), (900,))
Сравнение нижеimblearn
изSMOTE
снова появляйся с намиNaiveSMOTE
Сгенерированный набор данных:
может видетьNaiveeSMOTE
Синтетические данные больше склоняются к середине, в то время как сторонниеSMOTE
Данные, генерируемые регионом при всестороннем рассмотрении глобальной ситуации, лучше, чемNaiveSMOTE
многие.
Далее мы используемDecisionTree
иGaussianNaive
Чтобы проверить кривые ROC для 3 наборов данных (исходный набор данных, набор данных, синтезированный NaiveSMOTE, и набор данных, синтезированный сторонним SMOTE), см. специальный код в приложении.Notebook
документ
原数据的ROC曲线
NaiveSMOTE生成的数据的ROC曲线
第三方SMOTE生成的数据的ROC曲线
Как можно видетьNaiveSMOTE
иimblearn
изSMOTE
сгенерированные данныеAUC
Площадь больше, чем у исходных данных.imblearn
изSMOTE
Сгенерированные данные находятся вGaussianNaiveBayes
Производительность классификатора лучше, чемNaiveSMOTE
Классификатор, обученный на сгенерированных данных.
4. Улучшение алгоритма
В этой части мы начинаем сNaiveSMOTE
Обсуждаются три аспекта оптимизации:
-
скорость обработки.
NaiveSMOTE
Есть много мест, которые можно изменить, чтобы использовать матричные операции, что увеличит скорость обработки данных. иPopulate
Функция также очень избыточна и может быть переписана с помощью матричных операций. -
глобальная рациональность. Глобальная рациональность включает в себя два аспекта: рациональность соотношения синтетических данных и глобальная рациональность синтетических данных.
Рационализация коэффициентов синтетических данных: в
NaiveSMOTE
Известно, что число выборокN
Коэффициент синтеза контролируется, и можно синтезировать только целые числа, кратные ему.Набор данных, используемый в этой статье, точно1:9
, поскольку синтетические исходные данные в 8 раз больше, два типа могут достигать одного и того же уровня относительного количества, но большинство наборов реальных данных не имеют отношения умножения количества, поэтому его можно рассматривать как замену лучшего коэффициента генерации. , так что каждый класс Каждый может быть на уровне аппроксимации относительных чисел, избегая ситуации, когда исходный класс меньшинства становится классом большинства после синтеза.Глобальное обоснование синтетических данных: вспомнить из
NaiveSMOTE
иimblearn SMOTE
При сравнении соответствующих синтезированных данных можно обнаружить, чтоNaiveSMOTE
Легче сгруппировать синтезированные данные вокруг определенной точки выборки, в то время какimblearn SMOTE
Синтезированные данные являются более разреженными и равномерно распределенными и ближе к распределению вероятностей исходных данных. Причина в том, чтоNaiveSMOTE
При синтезе учитываются только исходные выборки данных, и то, как синтезированные выборки данных повлияют на глобальные данные, не рассматривается. Рассмотрите возможность добавления его в набор данных после каждого синтеза, а также учитывайте синтетические данные во время обработки. -
прочность. Легко найти
NaiveSMOTE
Может обрабатывать только числовые данные, и его формула расчета расстояния, вероятно, будет неправильно понята. На самом деле существует много нечисловых данных, таких как性别
,职业
и Т. Д. Конечно, все это можно перекодировать в данные, которые можно обрабатывать численно, например, пол.OneHot
Код, но в настоящее время формула расчета расстояния будет неправильно понята, вы можете рассмотреть возможность замены ее на евклидово расстояние, расстояние Манхэттена или расстояние Махаланобиса.
Примечание: в родеOneHot
При кодировании ситуация следующая:
男性: 0 1
女性: 1 0
Если согласноNaiveSMOTE
Первоначальная формула расчета расстояния, вероятно, интерпретирует его как разрыв в 1 между мужчинами и женщинами, поэтому возникает недоразумение.
5. Заключение
В этой статье сравниваются три вида данных послеNaiveSMOTE
иimblearn SMOTE
Синтезированные данные лучше работают с традиционными классификаторами, чем исходные данные (т.е. без каких-либо изменений), иimblearn SMOTE
Прочность выше, чемNaiveSMOTE
. обсуждатьNaiveSMOTE
недостатки и возможные направления оптимизации. В практических приложениях рекомендуется отдавать приоритет более надежным.imlearn SMOTE
Вместо того, чтобы делать свои собственные колеса,imblearn SMOTE
Реализация больше соответствует общепринятым стандартам. Но это нельзя игнорироватьNaiveSMOTE
В том смысле, что любая оптимизация должна основываться на исходной основе. пониматьNaiveSMOTE
Для того, чтобы лучше использовать и оптимизировать его.