Автор | Рашида Насрин Sucky Компилировать|ВКонтакте Источник | К науке о данных
Обнаружение аномалий можно рассматривать как статистическую задачу анализа выбросов. Но если мы разработаем модель машинного обучения, ее можно автоматизировать как обычно, что может сэкономить много времени.
Существует множество вариантов использования для обнаружения аномалий. Обнаружение мошенничества с кредитными картами, обнаружение неисправных машин или аппаратных систем на основе аномальных особенностей, обнаружение заболеваний на основе медицинских записей — все это хорошие примеры. Вариантов использования намного больше. Применение обнаружения аномалий будет только расти.
В этой статье я объясню процесс разработки алгоритма обнаружения аномалий с нуля на Python.
формулы и процедуры
По сравнению с другими алгоритмами машинного обучения, которые я объяснял ранее, это намного проще. Алгоритм будет использовать среднее значение и дисперсию для расчета вероятности каждого обучающего данных.
Это нормально, если вероятность обучающего экземпляра высока. Если вероятность обучающего экземпляра низкая, это аномалия. Определения высокой вероятности и низкой вероятности различны для разных обучающих наборов. Мы обсудим это позже.
Если бы мне пришлось объяснять, как работает обнаружение аномалий, это было бы довольно просто.
- Рассчитайте среднее значение по следующей формуле:
Здесь m — длина набора данных или количество обучающих данных, аявляется единственным обучающим примером. Если у вас есть несколько тренировочных функций, в большинстве случаев вам нужно рассчитать среднее значение энергии каждой функции.
- Рассчитайте дисперсию по следующей формуле:
Здесь mu — среднее значение, рассчитанное на предыдущем шаге.
- Теперь используйте эту формулу вероятности для расчета вероятности каждого обучающего примера.
Пусть вас не смущают символы суммирования в этой формуле! На самом деле это Sigma означает дисперсию.
Вы увидите, как это выглядит позже, когда мы реализуем алгоритм.
- Теперь нам нужно найти критическое значение вероятности. Как я упоминал ранее, если обучающий пример имеет низкую вероятность, это аномальный пример.
Насколько мала вероятность?
Универсальных ограничений нет. Нам нужно выяснить это для нашего обучающего набора данных.
Мы получаем ряд значений вероятности из вывода, полученного на шаге 3. Для каждой вероятности узнайте, являются ли данные аномальными, задав пороговое значение.
Затем для ряда вероятностей рассчитываются показатели точности, отзыва и f1.
Точность можно рассчитать по следующей формуле
Формула расчета отзыва выглядит следующим образом:
это здесь,True positives(Истинные экземпляры) относится к количеству случаев, когда алгоритм обнаруживает аномалию, которая на самом деле является аномалией.
False Positives(Ложное срабатывание) Ложное срабатывание возникает, когда алгоритм обнаруживает аномальный пример, но на самом деле он не является аномальным.
False Negative(Ложный контрпример) означает, что пример, обнаруженный алгоритмом, не является аномальным, но на самом деле является аномальным примером.
Как видно из приведенной выше формулы, более высокая точность и более высокий отзыв всегда хороши, потому что это означает, что у нас больше истинных положительных результатов. Но в то же время ложные срабатывания и ложные отрицания играют решающую роль, как вы можете видеть в формуле. Это требует баланса. В зависимости от вашей отрасли, вам нужно решить, какой из них терпим для вас.
Хороший способ - взять среднее значение. Существует уникальная формула расчета среднего. Это оценка f1. Формула счета f1:
Здесь P и R обозначают точность и полноту соответственно.
Я не хочу вдаваться в подробности о том, почему эта формула настолько уникальна. Потому что этот пост посвящен обнаружению аномалий. Если вам больше интересна эта статья, вы можете проверить ее:к data science.com/ah-complete-…
Основываясь на счете f1, вам нужно выбрать пороговую вероятность.
Алгоритмы обнаружения аномалий
Я буду использовать набор данных из курса машинного обучения Эндрю Нг, в котором есть две обучающие функции. Я не использовал настоящий набор данных в этой статье, потому что этот набор данных очень подходит для обучения. У него всего две характеристики. В любом реальном наборе данных невозможно иметь только два признака.
Преимущество наличия двух функций заключается в том, что данные можно визуализировать, что очень полезно для учащихся. Не стесняйтесь загружать набор данных по этой ссылке и продолжать:
Сначала импортируйте необходимые пакеты
import pandas as pd
import numpy as np
Импортируйте набор данных. Это набор данных Excel. Здесь данные обучения и данные перекрестной проверки хранятся в отдельных таблицах. Итак, давайте введем обучающие данные.
df = pd.read_excel('ex8data1.xlsx', sheet_name='X', header=None)
df.head()
Сравним столбец 0 со столбцом 1.
plt.figure()
plt.scatter(df[0], df[1])
plt.show()
Вы можете узнать, какие данные являются аномальными, посмотрев на этот график.
Проверьте, сколько обучающих примеров есть в этом наборе данных:
m = len(df)
Вычислите среднее значение для каждого признака. Здесь у нас всего два признака: 0 и 1.
s = np.sum(df, axis=0)
mu = s/m
mu
вывод:
0 14.112226
1 14.997711
dtype: float64
Используя формулу, описанную в разделе «Формулы и процедуры» выше, рассчитаем дисперсию:
vr = np.sum((df - mu)**2, axis=0)
variance = vr/m
variance
вывод:
0 1.832631
1 1.709745
dtype: float64
Теперь сделайте его диагональной формы. Как я объяснил в разделе «Формулы и процедуры» после формулы вероятности, знак суммирования на самом деле является дисперсией
var_dia = np.diag(variance)
var_dia
вывод:
array([[1.83263141, 0. ],
[0. , 1.70974533]])
Вычислите вероятность:
k = len(mu)
X = df - mu
p = 1/((2*np.pi)**(k/2)*(np.linalg.det(var_dia)**0.5))* np.exp(-0.5* np.sum(X @ np.linalg.pinv(var_dia) * X,axis=1))
p
Учебная часть выполнена.
Следующим шагом является определение пороговой вероятности. Если вероятность ниже пороговой вероятности, данные выборки являются аномальными. Но нам нужно выяснить этот порог для нашего особого случая.
На этом этапе мы используем данные перекрестной проверки и метки.
В вашем случае вам нужно только сохранить часть исходных данных для перекрестной проверки.
Теперь импортируйте данные перекрестной проверки и метки:
cvx = pd.read_excel('ex8data1.xlsx', sheet_name='Xval', header=None)
cvx.head()
Теги следующие:
cvy = pd.read_excel('ex8data1.xlsx', sheet_name='y', header=None)
cvy.head()
Я собираюсь преобразовать 'cvy' в массив NumPy, потому что мне нравится работать с массивами. Впрочем, датафреймы тоже неплохие.
y = np.array(cvy)
вывод:
# 数组的一部分
array([[0],
[0],
[0],
[0],
[0],
[0],
[0],
[0],
[0],
Здесь значение y, равное 0, указывает, что это нормальный пример, а значение y, равное 1, указывает, что это ненормальный пример.
Теперь, как выбрать порог?
Я не хочу просто проверять все вероятности в таблице вероятностей. Это может не понадобиться. Давайте снова рассмотрим значения вероятности.
p.describe()
вывод:
count 3.070000e+02
mean 5.905331e-02
std 2.324461e-02
min 1.181209e-23
25% 4.361075e-02
50% 6.510144e-02
75% 7.849532e-02
max 8.986095e-02
dtype: float64
Как показано, у нас не так много данных о выбросах. Итак, если мы начнем со значения 75%, все должно быть в порядке. Но на всякий случай начну со среднего.
Поэтому мы начнем со среднего и нижнего диапазона вероятностей. Мы проверим f1-оценку для каждой вероятности в этом диапазоне.
Во-первых, определите функцию для вычисления истинных примеров, ложных срабатываний и ложных отрицаний:
def tpfpfn(ep):
tp, fp, fn = 0, 0, 0
for i in range(len(y)):
if p[i] <= ep and y[i][0] == 1:
tp += 1
elif p[i] <= ep and y[i][0] == 0:
fp += 1
elif p[i] > ep and y[i][0] == 1:
fn += 1
return tp, fp, fn
Перечислите вероятности, которые ниже или равны средней вероятности.
eps = [i for i in p if i <= p.mean()]
Проверьте длину списка
len(eps)
вывод:
133
Определите функцию, которая вычисляет счет f1 в соответствии с формулой, рассмотренной ранее:
def f1(ep):
tp, fp, fn = tpfpfn(ep)
prec = tp/(tp + fp)
rec = tp/(tp + fn)
f1 = 2*prec*rec/(prec + rec)
return f1
Все функции готовы!
Теперь вычислите f1-оценку для всех эпсилон или диапазона значений вероятности, которые мы выбрали ранее.
f = []
for i in eps:
f.append(f1(i))
f
вывод:
[0.14285714285714285,
0.14035087719298248,
0.1927710843373494,
0.1568627450980392,
0.208955223880597,
0.41379310344827586,
0.15517241379310345,
0.28571428571428575,
0.19444444444444445,
0.5217391304347826,
0.19718309859154928,
0.19753086419753085,
0.29268292682926833,
0.14545454545454545,
Это часть таблицы f-оценки. Длина должна быть 133.
Показатель f обычно находится в диапазоне от 0 до 1, где чем выше показатель f1, тем лучше. Итак, нам нужно взять наивысшую оценку f из списка оценок f, которые мы только что вычислили.
Теперь используйте функцию «argmax», чтобы определить индекс максимального значения f-оценки.
np.array(f).argmax()
вывод:
131
Теперь используйте этот индекс, чтобы получить пороговую вероятность.
e = eps[131]
e
вывод:
6.107184445968581e-05
Найти экземпляры исключений
У нас есть критическая вероятность. Из этого мы можем узнать метки наших обучающих данных.
Если значение вероятности меньше или равно этому порогу, данные являются аномальными, в противном случае — нормальными. Мы обозначаем нормальные данные и аномальные данные как 0 и 1 соответственно,
label = []
for i in range(len(df)):
if p[i] <= e:
label.append(1)
else:
label.append(0)
label
вывод:
[0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
Это часть списка тегов.
Я добавлю эту вычисляемую метку в обучающий набор данных выше:
df['label'] = np.array(label)
df.head()
Я рисую данные красным цветом, где метка равна 1, и черным цветом, где метка равна 0. Ниже приведены результаты.
Имеет ли это смысл?
Да, верно? Данные, выделенные красным цветом, явно ненормальны.
в заключении
Я попытался шаг за шагом объяснить процесс разработки алгоритма обнаружения аномалий, надеюсь, понятно. Если вы не можете понять, просто прочитав, я предлагаю вам запустить каждый фрагмент кода. Это довольно ясно.
Оригинальная ссылка:к data science.com/ah-complete-…
Добро пожаловать на сайт блога Panchuang AI:panchuang.net/
sklearn машинное обучение китайские официальные документы:sklearn123.com/
Добро пожаловать на станцию сводки ресурсов блога Panchuang:docs.panchuang.net/