Съдържание

В тази публикация ще преминем през:

  1. Необходимостта от откриване на аномалии
  2. Базов алгоритъм за откриване на аномалия с основна математика
  3. Оценяване на алгоритъм за откриване на аномалия
  4. Разширяване на базовия алгоритъм за многомерно гаусово разпределение и използване на разстоянието на Махаланобис
  5. Откриване на измамни транзакции в набор от данни за кредитна карта, наличен в Kaggle

В предишната публикация разгледахме задълбочено Анализа на основните компоненти (PCA) и проблема, който се опитва да реши. За да консолидираме нашите концепции, ние също визуализирахме резултатите от PCA върху цифровия набор от данни на MNIST на Kaggle. Във всяка публикация досега обсъждахме или алгоритъм за контролирано обучение, или алгоритъм за неконтролирано обучение, но в тази публикация ще обсъждаме алгоритми за откриване на аномалии, които могат да бъдат решени с помощта както на контролирани, така и на неконтролирани методи на обучение. Тук обаче ще обсъдим как неконтролираното обучение се използва за решаване на този проблем и също така ще разберем защо откриването на аномалии чрез неконтролирано обучение е от полза в повечето случаи.

Откриване на аномалия

Аномалия е синоним на думата „отклонение“. Откриване на аномалия (или откриване на извънредни стойности) е идентифицирането на редки елементи, събития или наблюдения, които пораждат подозрения, като се различават значително от по-голямата част от данните. Аномалните дейности могат да бъдат свързани с някакъв вид проблеми или редки събития като банкова измама, медицински проблеми, структурни дефекти, неизправно оборудване и др.

Необходимостта от откриване на аномалии

Според изследване на Domo, публикувано през юни 2018 г., над 2,5 квинтилиона байта данни се създават всеки ден и се изчислява, че до 2020 г. близо 1,7 MB данни ще се създават всяка секунда за всеки човек на земята. И във времена на CoViD-19, когато световната икономика беше стабилизирана от онлайн бизнеси и онлайн образователни системи, броят на потребителите, използващи интернет, се увеличи с повишена онлайн активност и следователно е безопасно да се предположи, че данните, генерирани на човек, са се увеличили колектор. С прости думи, цифровият отпечатък за човек, както и за организация, се е увеличил рязко. Сървърите са наводнени с потребителска активност и това представлява огромно предизвикателство за всички фирми. Измамните дейности в банковите системи, фалшивите идентификатори и спамерите в социалните медии и DDoS атаките срещу малкия бизнес имат потенциала да сринат съответните организации и това може да бъде предотвратено само ако има начини за откриване на такава злонамерена (аномална) дейност. Тъй като има тонове начини за предизвикване на конкретна кибератака, е много трудно да имате информация за всички тези атаки предварително в набор от данни. Но тъй като по-голямата част от потребителската активност онлайн е нормална, можем да уловим почти всички начини, които показват нормално поведение. И от принципа на включване-изключване, ако дадена дейност под наблюдение не дава индикации за нормална дейност, можем да прогнозираме с голяма увереност, че дадената дейност е аномална.

Нека разберем горното с аналогия. В света на човешките болести нормалната активност може да се сравни с болести като малария, денга, свински грип и др., за които имаме лек. SarS-CoV-2 (CoViD-19), от друга страна, е аномалия, пропълзяла в нашия свят на болести, която има характеристики на нормално заболяване с изключение на забавени симптоми. Ако аномалията на SarS-CoV-2 беше открита в много ранен стадий, разпространението й можеше да бъде ограничено значително и днес нямаше да сме изправени пред пандемия. Тъй като SarS-CoV-2 е изцяло нова аномалия, която никога не е била наблюдавана досега, дори контролирана процедура за обучение, която да открие това като аномалия, би се провалила, тъй като моделът за контролирано обучение просто научава модели от характеристиките и етикетите в дадения набор от данни, докато чрез предоставяне на нормални данни за съществуващи заболявания на неконтролиран алгоритъм за обучение, бихме могли да открием този вирус като аномалия с голяма вероятност, тъй като той не би попаднал в категорията (клъстер) на нормалните заболявания. Надявам се, че това дава достатъчно интуиция, за да осъзнаем важността на откриването на аномалии и защо неконтролираните методи на обучение са предпочитани пред контролираните методи на обучение в повечето случаи за такива задачи.

Алгоритъм за откриване на аномалии

Има различни типове алгоритми за откриване на аномалии, но този, който ще обсъдим днес, ще започне от разпределението на вероятностите за всяка функция и как ни води до използването на Разстоянието на Махаланобисза алгоритъма за откриване на аномалия.

Едно от най-важните допускания за алгоритъм за неконтролирано откриване на аномалия е, че наборът от данни, използван за целите на обучението, се предполага, че съдържа всички неаномални примери за обучение (или много много малка част от аномални примери). Това може да изглежда много смело предположение, но току-що обсъдихме в предишния раздел колко по-малко вероятна (но много опасна) е аномална дейност. Освен това целта на алгоритъма за откриване на аномалии чрез данните, подавани към него, е да научи моделите на нормална дейност, така че когато възникне аномалия, да можем да я маркираме чрез принципа на включване-изключване. Имайки това предвид, нека обсъдим подробно алгоритъма за откриване на аномалия.

Точките от данни в набор от данни обикновено имат определен тип разпределение като Гаусово (нормално) разпределение. Не всички набори от данни следват нормално разпределение, но винаги можем да приложим определена трансформация към функции (които ще обсъдим в по-късен раздел), които преобразуват разпределението на данните в нормално разпределение, без каквато и да е загуба на вариация на характеристиките. Набор от точки с данни с Гаусово разпределение изглежда както следва:

От хистограмата по-горе виждаме, че точките от данни следват Гаусово разпределение на вероятностите и повечето от точките от данни са разпръснати около централно (средно) местоположение. Когато честотните стойности на оста y се споменават като вероятности, площта под камбановата крива винаги е равна на 1. Преди да продължим нашата дискусия, погледнете следните нормални разпределения.

Какво наблюдаваме? Всички линейни графики по-горе представляват нормални вероятностни разпределения и въпреки това са различни. Това е така, защото всяко разпределение по-горе има 2 параметъра, които правят всеки график уникален: средната стойност (μ) и вариацията (σ²) на данните. Червеното, синьото и жълтото разпределения са центрирани при средна стойност 0, но всички те са различни, защото имат различни спредове за техните средни стойности. От друга страна, зеленото разпределение няма 0 средна стойност, но все още представлява нормално разпределение. От това става ясно, че за да се опише нормално разпределение, двата параметъра, μи σ² контролират как ще изглежда разпределението. В интерес на истината, 68% от данните се намират около първото стандартно отклонение (σ) от средната стойност (34% от всяка страна), 26,2% данни се намират между първото и второто стандартно отклонение (σ) (13,1% от всяка страна) и т.н. Това означава, че приблизително 95% от данните в разпределението на Гаус се намират в рамките на 2 стандартни отклонения от средната стойност. Можем да използваме това, за да проверим дали наборите от данни от реалния свят имат (почти перфектно) Гаусово разпределение или не.

Данните от реалния свят имат много функции. Ако всяка функция има своите данни, разпределени по нормален начин, тогава можем да продължим по-нататък, в противен случай се препоръчва да конвертирате даденото разпределение в нормално. Следващата фигура показва какви трансформации можем да приложим към дадено вероятностно разпределение, за да го преобразуваме в нормално разпределение. Получената трансформация може да не доведе до перфектно разпределение на вероятностите, но води до достатъчно добро приближение, което кара алгоритъма да работи добре.

Спомнете си предположението, което направихме, че всички данни, използвани за обучение, се приемат за неаномални (или трябва да имат много много малка част от аномалии). Ще го използваме тук. По-рано видяхме, че почти 95% от данните в нормално разпределение се намират в рамките на две стандартни отклонения от средната стойност. Тъй като вероятността от аномалии като цяло е много ниска, можем да кажем с голяма увереност, че точките от данни, разпръснати близо до средната стойност, не са аномални. И тъй като стойностите на вероятностното разпределение между средното и две стандартни отклонения са достатъчно големи, можем да зададем стойност в този диапазон като праг (параметър, който може да се настройва), където стойности на характеристиките с вероятност, по-голяма от този праг, показват, че даденият стойностите на функцията не са аномални, в противен случай е аномални. Имайте предвид, че има общоnхарактеристики в данните. За функция x(i) с прагова стойност ε(i), всички вероятности за точки от данни, които са над този праг, са неаномални точки от данни, т.е. аномални точки с данни w.r.t. конкретна характеристика е представена като:

Където P(X(i): μ(i), σ(i))представлява вероятността за даден пример за обучение за функция X(i), което се характеризира със средната стойност на μ(i)и дисперсия на σ(i).

Горният случай маркира точка от данни като аномална/неаномална въз основа на конкретна характеристика. В действителност не можем да маркираме точка от данни като аномалия въз основа на една функция. Само когато се изчисли комбинация от всички вероятностни стойности за всички характеристики за дадена точка от данни, можем да кажем с голяма увереност дали дадена точка от данни е аномалия или не. Този сценарий може да бъде разширен от предишния сценарий и може да бъде представен със следното уравнение.

Дадена точка от данни се счита за неаномална, когато

След като вече знаем как да маркираме аномалия, използвайки всички n-характеристики на данните, нека бързо да видим как можем да изчислим P(X(i))за дадено нормално вероятностно разпределение. За целта също трябва да изчислим μ(i)и σ2(i), което се прави по следния начин.

където m е броят на примерите за обучение и nе броят на функциите.

Вече разполагаме с всичко, което трябва да знаем, за да изчислим вероятностите за точки от данни в нормално разпределение. Нека да разгледаме пример и да видим как работи този процес. Разгледайте данните, състоящи се от 2 характеристики x1 и x2 с нормално разпределение на вероятностите, както следва:

Ако вземем предвид точка от данни в набора за обучение, тогава ще трябва да изчислим нейните вероятностни стойности спрямо x1 и x2 поотделно и след това да ги умножим, за да получим крайния резултат, който след това ще сравним с праговата стойност, за да решим независимо дали е аномалия или не. За да визуализираме по-добре нещата, нека начертаем x1 и x2 в 2-D графика, както следва:

Комбинираното разпределение на вероятностите за двете характеристики ще бъде представено в 3-D, както следва:

Полученото вероятностно разпределение е разпределение на Гаус. Сега, ако разгледаме пример за обучение около централната стойност, можем да видим, че тя ще има по-висока вероятностна стойност, а не далечни точки от данни, тъй като се намира доста високо на кривата на вероятностното разпределение. Видяхме по-рано, че приблизително 95% от данните за обучение се намират в рамките на 2 стандартни отклонения от средната стойност, което ни накара да изберем стойността на εоколо стойността на граничната вероятност на второто стандартно отклонение, което обаче може да бъде настройва се в зависимост от задача на задача. Това показва, че точките от данни, лежащи извън 2-ро стандартно отклонение от средната стойност, имат по-голяма вероятност да бъдат аномални, което е видно от лилаво оцветената част на вероятностното разпределение на горната фигура.

Оценяване на алгоритъм за откриване на аномалия

Всеки алгоритъм за откриване на аномалия, независимо дали е контролиран или не, трябва да бъде оценен, за да се види колко ефективен е алгоритъмът. Тъй като броят на поява на аномалии е относително много малък в сравнение с нормалните точки от данни, не можем да използваме точността като показател за оценка, защото за модел, който прогнозира всичко като неаномално, точността ще бъде по-голяма от 99,9% и ние нямаше да улови никаква аномалия. Това е напълно нежелателно. Нашето изискване е да оценим колко аномалии сме открили и колко сме пропуснали. Предвиждането на неаномален пример като аномален почти няма да навреди на никоя система, но предсказването на аномален пример като неаномален може да причини значителни щети. Един показател, който ни помага при такива критерии за оценка, е чрез изчисляване на матрицата на объркването на прогнозираните стойности. Матрицата на объркване е обобщение на резултатите от прогнозирането на проблем с класификацията. Броят на правилните и неправилните прогнози се обобщава с преброени стойности и се разбиват по всеки клас. Това е ключът към матрицата на объркването. Матрицата на объркването показва начините, по които вашият класификационен модел е объркан, когато прави прогнози. Той ни дава представа не само за грешките, допускани от класификатора, но по-важното за видовете грешки, които се правят.

Истински положителен е резултат, при който моделът прогнозира правилно положителния клас (неаномални данни като неаномални). По същия начин, истинско отрицателно е резултат, при който моделът правилно прогнозира отрицателния клас (аномални данни като аномални). Грешно положителен е резултат, при който моделът неправилно прогнозира положителния клас (неаномалните данни като аномални), а фалшиво отрицателен е резултат, при който моделът неправилно прогнозира отрицателния клас (аномални данни като неаномални). В случая с нашия алгоритъм за откриване на аномалия, нашата цел е да намалим възможно най-много фалшиви отрицания. По-малък е броят на фалшивите отрицателни резултати, по-добра е производителността на алгоритъма за откриване на аномалии.

Тук сме пропуснали много важен детайл. Алгоритъмът за откриване на аномалии, който обсъдихме по-горе, е алгоритъм за неконтролирано обучение, тогава как да оценим неговата ефективност? Докато събираме данни, ние определено знаем кои данни са аномални и кои не. Причината да не се използва контролирано обучение е, че то не може да улови всички аномалии от толкова ограничен брой аномалии. Ето защо използваме неконтролирано обучение на принципа на включване-изключване. Да предположим, че имаме 10 040 примера за обучение, 10 000 от които не са аномални и 40 са аномални. Тези данни ще бъдат разделени на обучение, кръстосано валидиране и набор от тестове, както следва:

Набор за обучение: 8000 неаномални примера

Набор за кръстосано валидиране: 1000 неаномални и 20 аномални примера

Набор от тестове: 1000 неаномални и 20 аномални примера

Това разпределение ще ни позволи да уловим възможно най-много модели, които се срещат в неаномални точки от данни, и след това можем да ги сравним и контрастираме с 20 аномалии, всяка в кръстосано валидиране и набор от тестове. Смисълът на създаването на набор за кръстосано валидиране тук е да се настрои стойността на праговата точка ε.

Недостатък на този алгоритъм за откриване на аномалия

Трябва да знаем как алгоритъмът за откриване на аномалии анализира моделите за неаномални точки от данни, за да разберем дали има допълнителен обхват на подобрение. Нека разгледаме разпределение на данни, в което начертаните точки не приемат кръгла форма, както следва.

Всички червени точки в изображението по-горе са неаномални примери. Ако вземем предвид точката, маркирана в зелено, използвайки нашата интелигентност, ще маркираме тази точка като аномалия. Но по начина, по който работи алгоритъмът за откриване на аномалия, който обсъдихме, тази точка ще лежи в региона, където може да бъде открита като нормална точка от данни.

Обсъденият досега алгоритъм за откриване на аномалии работи в кръгове. Вътрешният кръг е представителен за вероятностните стойности на нормалното разпределение, близки до средната стойност. Вторият кръг, където се намира зелената точка, е представителен за вероятностните стойности, които са близки до първото стандартно отклонение от средната стойност и т.н. Това е нежелателно, защото всеки път няма да имаме данни, чиято диаграма на разсейване води до кръгово разпределение в 2 измерения, сферично разпределение в 3 измерения и т.н. Имаме нужда от алгоритъм за откриване на аномалии, който се адаптира според разпределението на точките от данни и дава добри резултати. Оказва се, че за този проблем можем да използваме свойството Разстояние на Махаланобис (MD) на многовариантно разпределение на Гаус (досега се занимавахме с многовариантни разпределения на Гаус).

Разстояние Махаланобис за откриване на аномалия на многомерно разпределение на Гаус

Разстоянието Махаланобис (MD) е разстоянието между две точки в многомерното пространство. В редовно евклидово пространство променливите (напр. x, y, z) са представени от оси, начертани под прав ъгъл една спрямо друга. Разстоянието между произволни две точки може да се измери с линийка. За некорелирани променливи евклидовото разстояние е равно на MD. Ако обаче две или повече променливи са корелирани, осите вече не са под прав ъгъл и измерванията стават невъзможни с линийка. Освен това, ако имате повече от три променливи, изобщо не можете да ги начертаете в редовно 3D пространство. MD решава този проблем с измерването, тъй като измерва разстояния между точки, дори корелирани точки за множество променливи.

Разстоянието Mahalanobis измерва разстоянието спрямо центроида — основа или централна точка, която може да се разглежда като обща средна стойност за многовариантни данни. Центроидът е точка в многовариантното пространство, където се пресичат всички средни от всички променливи. Колкото по-голям е MD, толкова по-далеч от центроида е точката с данни.

За да използваме разстоянието на Mahalanobis за откриване на аномалия, не е необходимо да изчисляваме индивидуалните вероятностни стойности за всяка характеристика. Вместо това можем директно да изчислим крайната вероятност за всяка точка от данни, която отчита всички характеристики на данните и най-вече поради ненулевите извъндиагонални стойности на ковариационната матрица Σдокато изчисляваме разстоянието на Махаланобис , получената крива на откриване на аномалия не е повече кръгла, а по-скоро отговаря на формата на разпределението на данните.

Разстоянието Махаланобис се изчислява с помощта на формулата, дадена по-долу.

След като се изчисли разстоянието Махаланобис, можем да изчислим P(X), вероятността за възникване на пример за обучение, предвид всички n характеристики, както следва:

Където |Σ| представлява детерминантата на ковариационната матрица Σ.

Стойностите μи Σ се изчисляват, както следва:

И накрая, можем да зададем прагова стойност ε, където всички стойности на P(X) ‹ ε означават аномалия в данните. Тази стойност обаче е параметър и може да бъде настроена с помощта на набора за кръстосано валидиране със същото разпределение на данни, което обсъдихме за предишния алгоритъм за откриване на аномалия.

Преди да завършим теоретичната част на тази публикация, трябва да се отбележи, че въпреки че използването на разстоянието на Mahalanobis за откриване на аномалия е по-обобщен подход за откриване на аномалия, точно тази причина го прави изчислително по-скъп от базовия алгоритъм. Освен това трябва да имаме броя примери за обучение m, по-голям от броя на функциите n(mn) , в противен случай ковариационната матрица Σще бъде необратима (т.е. Σ^-1ще стане недефинирана).

Най-накрая стигнахме до заключителната част на теоретичната част на поста. Разбрахме необходимостта от алгоритъм за откриване на аномалии, преди да се потопим дълбоко в математиката, включена зад алгоритъма за откриване на аномалии. Препоръчвам да прочетете теоретичната част повече от веднъж, ако нещата са малко объркани в главата ви в този момент, което обаче е напълно нормално. Сега нека да погледнем назад към набора от данни за транзакции с измамни кредитни карти от Kaggle, който разрешихме с помощта на Support Vector Machines в тази публикация и да го разрешим с помощта на алгоритъма за откриване на аномалия.

Постановка на проблема

В този раздел ще използваме алгоритъма за откриване на аномалии, за да определим измамни транзакции с кредитни карти. Набор от данни за този проблем може да бъде намерен тук. Едно нещо, което трябва да се отбележи тук е, че характеристиките на този набор от данни вече са изчислени в резултат на PCA. Това ни помага по 2 начина:

(i) Поверителността на потребителските данни се запазва.

(ii) Характеристиките в набора от данни са независими една от друга поради PCA трансформация.

Нека започнем със зареждане на данните в паметта в рамка с данни на pandas.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.neighbors import LocalOutlierFactor
from sklearn.metrics import confusion_matrix, classification_report,accuracy_score
import os
for dirname, _, filenames in os.walk(‘/kaggle/input’):
  for filename in filenames
    print(os.path.join(dirname, filename))

df = pd.read_csv("/kaggle/input/creditcardfraud/creditcard.csv")
df.head()

Продължаваме със стъпката за предварителна обработка на данните. Нека да разгледаме как стойностите се разпределят в различните характеристики на набора от данни.

df.describe()

Оригиналният набор от данни има над 284k+ точки от данни, от които само 492 са аномалии. Обучението на модела върху целия набор от данни доведе до изчакване на Kaggle, така че използвах 20% от данните ( › 56k точки от данни).

print(df.shape)
data= df.sample(frac = 0.2,random_state=1)
print(data.shape)

Данните нямат нулеви стойности, което може да се провери от следната част от кода.

df.isnull().values.any()

Нека начертаем нормални транзакции срещу аномални транзакции на лентова графика, за да осъзнаем частта от измамни транзакции в набора от данни. Освен това ни позволете да разделим нормалните и измамните транзакции в техните собствени набори от данни.

num_classes = pd.value_counts(df['Class'], sort = True)
num_classes.plot(kind = 'bar')
plt.title("Transaction Class Distribution")
plt.xticks(range(2), ["Normal", "Fraud"])
plt.xlabel("Class")
plt.ylabel("Frequency")
fraud = df[df['Class'] == 1]
normal = df[df['Class'] == 0]
print(fraud.shape, normal.shape)

В набора от данни можем да интерпретираме само стойностите „Време“ и „Сума“ спрямо изходния „Клас“. Нека да видим дали можем да намерим нещо наблюдение, което ни позволява видимо да разграничим нормалните от измамните транзакции.

f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
f.suptitle('Time of transaction v/s Amount by Class type')
ax1.scatter(fraud.Time, fraud.Amount)
ax1.set_title('Fraud')
ax2.scatter(normal.Time, normal.Amount)
ax2.set_title('Normal')
plt.xlabel('Time (in secs)')
plt.ylabel('Amount')
plt.xlim((0, 20000))
plt.show()

f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
f.suptitle('Amount per transaction by class')
bins = 10
ax1.hist(fraud.Amount, bins = bins)
ax1.set_title('Fraud')
ax2.hist(normal.Amount, bins = bins)
ax2.set_title('Normal')
plt.xlabel('Amount ($)')
plt.ylabel('Number of Transactions')
plt.xlim((0, 20000))
plt.yscale('log')

От първия сюжет можем да забележим, че измамните транзакции се случват по същото време като нормалната транзакция, което прави времето без значение фактор. От втория график можем да видим, че повечето от измамните транзакции са транзакции с малки суми. Това обаче не е огромна отличителна черта, тъй като по-голямата част от нормалните транзакции също са транзакции с малки суми.

Преди да продължим, нека да разгледаме колко измамни и неизмамни транзакции имаме в намаления набор от данни (20% от функциите), който ще използваме за обучение на модела за машинно обучение за идентифициране на аномалии.

fraud = data[data['Class']==1]
normal = data[data['Class']==0]
anomaly_fraction = len(fraud)/float(len(normal))
print(anomaly_fraction)
print("Fraud Cases: " + str(len(fraud)))
print("Normal Cases: " + str(len(normal)))

Имаме само 0,1% измамни транзакции в набора от данни. Това означава, че произволно предположение от модела трябва да доведе до 0,1% точност за измамни транзакции. Ние обаче ще конструираме модел, който ще има много по-добра точност от този. Може би си мислите защо споменах това тук. Ще се позова на тези редове, докато оценявам представянето на крайния модел.

Спомнете си, че научихме, че всяка функция трябва да бъде нормално разпределена, за да се приложи алгоритъмът за неконтролирано откриване на аномалии. Нека начертаем хистограми за всяка характеристика и да видим кои характеристики изобщо не представляват Гаусово разпределение.

data.hist(figsize=(15,15), bins = 64)
plt.show()

От горните хистограми можем да видим, че „Време“, „V1“ и „V24“ са тези, които дори не се доближават до Гаусово разпределение. Нека премахнем тези функции от процеса на обучение на модела. Така или иначе щяхме да пропуснем функцията „Време“.

columns = data.columns.tolist()
target=columns[-1]
columns = columns[:-1]
X_train = data.iloc[:45000, :-1]
y_train = data.iloc[:45000, -1]
X_test = data.iloc[45000:, :-1]
y_test = data.iloc[45000:, -1]
print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)

Нека използваме функцията LocalOutlierFactor от библиотеката scikit-learn, за да използваме метода на обучение без надзор, обсъден по-горе, за да обучим модела.

model = LocalOutlierFactor(contamination=anomaly_fraction)
y_train_pred = model.fit_predict(X_train)
y_train_pred[y_train_pred == 1] = 0
y_train_pred[y_train_pred == -1] = 1
y_test_pred = model.fit_predict(X_test)
y_test_pred[y_test_pred == 1] = 0
y_test_pred[y_test_pred == -1] = 1

Сега, след като обучихме модела, нека да оценим производителността на модела, като разгледаме матрицата на объркването за същото, както обсъдихме по-рано, че точността не е добър показател за оценка на всеки алгоритъм за откриване на аномалия, особено този, който има такъв изкривени входни данни като този.

import itertools
classes = np.array(['0','1'])
def plot_confusion_matrix(cm, classes,title='Confusion matrix', cmap=plt.cm.Blues):
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=45)
plt.yticks(tick_marks, classes)
fmt = 'd'
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, format(cm[i, j], fmt),
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')

Горната функция е помощна функция, която ни позволява да конструираме матрица за объркване. Ще начертаем матрици на объркване, за да оценим представянето както на обучението, така и на тестовия комплект.

cm_train = confusion_matrix(y_train, y_train_pred)
plot_confusion_matrix(cm_train,["Normal", "Fraud"])

cm_test = confusion_matrix(y_test_pred, y_test)
plot_confusion_matrix(cm_test,["Normal", "Fraud"])

Виждаме, че в набора за обучение моделът открива правилно 44 870 нормални транзакции и само 55 нормални транзакции са обозначени като измама. Това е доста добре, но това не е нещо, което ни притеснява. Можем да видим, че от 75-те измамни транзакции в набора за обучение, само 14 са уловени правилно, докато 61 са неправилно класифицирани, което е проблем. Когато сравним това представяне с вероятността за произволно предположение от 0,1%, това е значително подобрение, но не достатъчно убедително. Дори в тестовия набор виждаме, че 11 936/11 942 нормални транзакции са правилно предвидени, но само 6/19 измамни транзакции са правилно уловени.

Анализиране на производителността

Когато решавах този набор от данни, дори аз бях изненадан за момент, но след това анализирах критично набора от данни и стигнах до заключението, че за този проблем това е най-добрият начин за обучение без надзор. Една от причините, поради които обучението без надзор не се представя достатъчно добре, е, че повечето от измамните транзакции нямат много необичайни характеристики по отношение на тях, които могат да бъдат добре отделени от нормалните транзакции. Това се подкрепя от графиките „Време“ и „Сума“, които начертахме спрямо функцията „Клас“. И смятам, че това е основната причина да се предоставят етикети с набора от данни, които обозначават транзакциите като измамни и не-измамни, тъй като няма никакви видими отличителни характеристики за измамни транзакции. Точността на откриване на аномалии в набора от тестове е 25%, което е много по-добро от случайно предположение (частта от аномалии в набора от данни е ‹ 0,1%), въпреки че има точност от 99,84% точност в набора от тестове.

print('Total fraudulent transactions detected in training set: ' + str(cm_train[1][1]) + ' / ' + str(cm_train[1][1]+cm_train[1][0]))
print('Total non-fraudulent transactions detected in training set: ' + str(cm_train[0][0]) + ' / ' + str(cm_train[0][1]+cm_train[0][0]))
print('Probability to detect a fraudulent transaction in the training set: ' + str(cm_train[1][1]/(cm_train[1][1]+cm_train[1][0])))
print('Probability to detect a non-fraudulent transaction in the training set: ' + str(cm_train[0][0]/(cm_train[0][1]+cm_train[0][0])))
print("Accuracy of unsupervised anomaly detection model on the training set: "+str(100*(cm_train[0][0]+cm_train[1][1]) / (sum(cm_train[0]) + sum(cm_train[1]))) + "%")

print('Total fraudulent transactions detected in test set: ' + str(cm_test[1][1]) + ' / ' + str(cm_test[1][1]+cm_test[1][0]))
print('Total non-fraudulent transactions detected in test set: ' + str(cm_test[0][0]) + ' / ' + str(cm_test[0][1]+cm_test[0][0]))
print('Probability to detect a fraudulent transaction in the test set: ' + str(cm_test[1][1]/(cm_test[1][1]+cm_test[1][0])))
print('Probability to detect a non-fraudulent transaction in the test set: ' + str(cm_test[0][0]/(cm_test[0][1]+cm_test[0][0])))
print("Accuracy of unsupervised anomaly detection model on the test set: "+str(100*(cm_test[0][0]+cm_test[1][1]) / (sum(cm_test[0]) + sum(cm_test[1]))) + "%")

Целият код за тази публикация може да бъде намерен тук.

Това е всичко за тази публикация. Тази публикация също бележи края на поредица от публикации за машинно обучение. За мен беше удоволствие да пиша тези публикации и научих много в този процес. Вярвам, че разбираме нещата само толкова добре, колкото ги учим и в тези публикации се опитах да опростя нещата колкото мога повече. Математиката стана малко сложна в последните няколко публикации, но тези теми бяха такива. Благодаря, че прочетохте тези публикации.