Изучите алгоритм SMOTE

сбор данных

Оригинальная ссылка

Резюме

SMOTE — это алгоритм синтетических данных, основанный на синтетической выборке, который используется для решения проблемы несбалансированного класса. Эта статья будетНитеш В. Чавла (2002)Основываясь на документе SMOTE, он излагает основную идею SMOTE и реализует его наивный алгоритм, сравнивает производительность алгоритма с традиционными классификаторами (байесовским и деревом решений) и обсуждает способы улучшения его алгоритма.

1. Введение

Дисбаланс классов — одна из распространенных проблем при обучении моделей классификаторов, например, научиться судить о том, болен ли человек раком, по большому количеству рентгенограмм грудной клетки или научиться обнаруживать шаблоны данных, которые могут быть агрессивным поведением в сетевом потоке. logs, в задачах такого типа нормальных классов больше, чем аномальных (диагностированный рак, агрессивное поведение) классов, и классификатор, обученный на несбалансированных данных классов, должен быть очень осторожным, даже если классификатор имеет высокую точность, потому что, скорее всего, чтобы узнать, что большая часть этого является нормальным, и что нам может понадобиться, так это то, что он может идентифицировать аномальное поведение в наибольшей степени, даже если точность ниже, чем первая.

Чтобы решить эту проблему, в отрасли есть следующие 5 признанных методов расширения набора данных [1], чтобы категории были единообразными:

  1. Произвольно увеличьте количество выборок в классе меньшинства.
  2. Произвольно увеличить количество образцов определенного класса меньшинства.
  3. Случайным образом уменьшите количество выборок мажоритарного класса.
  4. Случайным образом уменьшите количество выборок определенного класса большинства.
  5. Измените функцию стоимости так, чтобы классу меньшинства было дороже совершать ошибки.

Алгоритм SMOTE, который будет представлен в этой статье, представляет собой улучшенный метод объединения методов 1 и 3. Он основан на k ближайших соседних точек выборки каждой точки выборки и случайным образом выбирает N соседних точек, чтобы умножить разницу на [0 , 1] Порог диапазона, чтобы достичь цели синтеза данных. Суть этого алгоритма в том, что признаки смежных точек в пространстве признаков подобны. Он производит выборку не в пространстве данных, а в пространстве признаков, поэтому его точность будет выше, чем у традиционного метода выборки. Вот почему SMOTE и производные от него алгоритмы до сих пор остаются основными методами выборки.

dif

Как показано на рисунке выше, если предположить, что точка данных 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)сочинение.

algorithm

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

Распределение исходного набора данных показано на рисунке ниже, на котором красный кружок — это положительный класс, то есть класс меньшинства, а синий × — это отрицательный класс, то есть класс большинства.

original_dataset

заставить нас осознать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Синтезированные наборы данных сравниваются:

ori_vs_Naive

Хорошо видно, что исходные классы выросли до удовлетворительного уровня, а расстояния между сгенерированными классами не слишком велики.

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Сгенерированный набор данных:

nav_vs_third

может видетьNaiveeSMOTEСинтетические данные больше склоняются к середине, в то время как сторонниеSMOTEДанные, генерируемые регионом при всестороннем рассмотрении глобальной ситуации, лучше, чемNaiveSMOTEмногие.

Далее мы используемDecisionTreeиGaussianNaiveЧтобы проверить кривые ROC для 3 наборов данных (исходный набор данных, набор данных, синтезированный NaiveSMOTE, и набор данных, синтезированный сторонним SMOTE), см. специальный код в приложении.Notebookдокумент

原数据的ROC曲线

ori_roc

NaiveSMOTE生成的数据的ROC曲线

naive_roc

第三方SMOTE生成的数据的ROC曲线

third_roc

Как можно видетьNaiveSMOTEиimblearnизSMOTEсгенерированные данныеAUCПлощадь больше, чем у исходных данных.imblearnизSMOTEСгенерированные данные находятся вGaussianNaiveBayesПроизводительность классификатора лучше, чемNaiveSMOTEКлассификатор, обученный на сгенерированных данных.

4. Улучшение алгоритма

В этой части мы начинаем сNaiveSMOTEОбсуждаются три аспекта оптимизации:

  1. скорость обработки.NaiveSMOTEЕсть много мест, которые можно изменить, чтобы использовать матричные операции, что увеличит скорость обработки данных. иPopulateФункция также очень избыточна и может быть переписана с помощью матричных операций.

  2. глобальная рациональность. Глобальная рациональность включает в себя два аспекта: рациональность соотношения синтетических данных и глобальная рациональность синтетических данных.

    Рационализация коэффициентов синтетических данных: вNaiveSMOTEИзвестно, что число выборокNКоэффициент синтеза контролируется, и можно синтезировать только целые числа, кратные ему.Набор данных, используемый в этой статье, точно1:9, поскольку синтетические исходные данные в 8 раз больше, два типа могут достигать одного и того же уровня относительного количества, но большинство наборов реальных данных не имеют отношения умножения количества, поэтому его можно рассматривать как замену лучшего коэффициента генерации. , так что каждый класс Каждый может быть на уровне аппроксимации относительных чисел, избегая ситуации, когда исходный класс меньшинства становится классом большинства после синтеза.

    Глобальное обоснование синтетических данных: вспомнить изNaiveSMOTEиimblearn SMOTEПри сравнении соответствующих синтезированных данных можно обнаружить, чтоNaiveSMOTEЛегче сгруппировать синтезированные данные вокруг определенной точки выборки, в то время какimblearn SMOTEСинтезированные данные являются более разреженными и равномерно распределенными и ближе к распределению вероятностей исходных данных. Причина в том, чтоNaiveSMOTEПри синтезе учитываются только исходные выборки данных, и то, как синтезированные выборки данных повлияют на глобальные данные, не рассматривается. Рассмотрите возможность добавления его в набор данных после каждого синтеза, а также учитывайте синтетические данные во время обработки.

  3. прочность. Легко найтиNaiveSMOTEМожет обрабатывать только числовые данные, и его формула расчета расстояния, вероятно, будет неправильно понята. На самом деле существует много нечисловых данных, таких как性别, 职业и Т. Д. Конечно, все это можно перекодировать в данные, которые можно обрабатывать численно, например, пол.OneHotКод, но в настоящее время формула расчета расстояния будет неправильно понята, вы можете рассмотреть возможность замены ее на евклидово расстояние, расстояние Манхэттена или расстояние Махаланобиса.

Примечание: в родеOneHotПри кодировании ситуация следующая:

男性: 0 1
女性: 1 0

Если согласноNaiveSMOTEПервоначальная формула расчета расстояния, вероятно, интерпретирует его как разрыв в 1 между мужчинами и женщинами, поэтому возникает недоразумение.

5. Заключение

В этой статье сравниваются три вида данных послеNaiveSMOTEиimblearn SMOTEСинтезированные данные лучше работают с традиционными классификаторами, чем исходные данные (т.е. без каких-либо изменений), иimblearn SMOTEПрочность выше, чемNaiveSMOTE. обсуждатьNaiveSMOTEнедостатки и возможные направления оптимизации. В практических приложениях рекомендуется отдавать приоритет более надежным.imlearn SMOTEВместо того, чтобы делать свои собственные колеса,imblearn SMOTEРеализация больше соответствует общепринятым стандартам. Но это нельзя игнорироватьNaiveSMOTEВ том смысле, что любая оптимизация должна основываться на исходной основе. пониматьNaiveSMOTEДля того, чтобы лучше использовать и оптимизировать его.

приложение

Экспериментальный блокнот

использованная литература

  1. Japkowicz, Nathalie, and Shaju Stephen. "The class imbalance problem: A systematic study." Intelligent data analysis 6.5 (2002): 429-449.