Программирование Разбираемся с Machine Learning и Fraud-prevention(Антифрод)

pavlichenzo

Местный
Местный
pavlichenzo

pavlichenzo

Местный
Местный
Сообщения
179
Реакции
153
Всем привет!
Сегодня мы очень сжато рассмотрим Машинное обучение на примере антифрода,заодно выясним что такое антифрод для чего он нужен и по какому принципу он работает,чтобы все было максимально наглядно,создадим модель антифрода.

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

Антифрод - это реализованная путем машинного обучения система, созданная для распознавания мошеннический деятельности с финансовыми транзакциями в сети,далее наглядно увидим как это работает.

В самом начале добываются данные,рассказ о том как и от куда они добываются выходит за рамки темы,так что представим что у нас уже есть релевантные данные о деятельности покупателей которые совершали покупки в интернете,и часть из этих покупателей оказались мошенниками.

Данные которые я использую в примере уже "чистые", отфильтрованные,и помещены в csv файл,информацию из которого мы используем для построения модели определяющей мошенник совершает покупку на нашем сайте или нет,стоит сказать что в действительности признаков будет гораздо больше,например день недели,время суток,геолокационные данные,юзер агент браузера,и вообщем признаков может быть и 100 и 300,но чтоб бы не усложнять восприятия остановимся только на тех что у нас есть.

Посмотрим на информацию которую мы имеем:






В наших данных есть 11 признаков в каждом из которых 6362620 наблюдений,то есть у нас есть 6362620 совершенных покупок,и 11 признаков которые описывают каждую:
step
Отображает единицу времени в реальном мире. В этом случае 1 шаг - 1 час времени.
type
CASH-IN, CASH-OUT, DEBIT, PAYMENT и TRANSFER
тип совершенной
операции,снятие наличных,перевод или покупка и т.д.
amount
сумма условных единиц,будем считать что это $
nameOrig

Клиент,
счет с которого была совершена транзакция.
oldbalanceOrg
первоначальный баланс клиента перед транзакцией
newbalanceOrig
баланс клиента после транзакции.
nameDest
идентификатор получателя транзакции.
На чей счет ушли $ как правило это либо мерчант,либо физический счет.
oldbalanceDest
первоначальный баланс получателя,до совершения транзакции.
newbalanceDest
баланс получателя после транзакции.
isFraud
идентифицирует мошенническую транзакцию (1) и не мошенническую (0)
isFlaggedFraud
флаги незаконных попыток передачи более 200 000 в одной транзакции.
Мера наглости мошенника)

Как видим данные бывают как в виде чисел так и виде текста,числовой и строковый тип данных соответственно,для того чтоб применять строковые типы данных в модель обучения,нужно изменить их тип на числовой,по этому в признаке type присваиваем каждому уникальному типу операции свой номер,например вместо CASH-IN - 1,вместо CASH-OUT - 2 и так далее...а признаки nameDest и nameOrig вообще удалим из выборки,во первых для того что б не усложнять,во-вторых в этом скудном наборе данных эти 2 признака много информации не дадут.



Целевой признак это isFraud который делится на классы мошенник/обычный пользователь,в интерпретации 1 = мошенник,0 = обычный пользователь,и еще у нас осталось 8 признаков после удаления двух невзрачных,по ним то наша модель и будет обучаться,то есть имея эти данные нам нужно определить мошенника и найти в 8 признаках закономерность которая будут свойственна именно мошеннику.Разделим теперь данные на информацию которую нужно предсказать и на информацию из которой будет высчитываться предсказания:



Удалим так же признак isFlaggedFraud так как в этом наборе данных он является фильтрующим ,этот признак делит мошенников на тех кто совершил попытку передачи более 200 000 $ в одной транзакции,и на тек кто меньше,вообщем отделяет крупных от мелких,а это не то что мы хотим предсказать.

Существует 2 направления машинного обучения:с учителем, и без учителя,второму свойственно обучаться без целевого признака,то есть без isFraud который в нашем случае по каждой метке в данных делит на классы мошенник,и обычный пользователь,но мы рассмотрим только обучения с учителем,в двух вариация: к ближайших соседей и дерево решений,этого будет вполне достаточно чтобы понять что из себя представляет ML и по какому принципу работает antifroud.

Направления ML с учителем ,и ML без учителя делятся на классы: Метрические,Деревья,Линейные регрессии,метод дерева который рассматривается ниже - относиться к классу деревьев,а метод k-ближайших соседей к метрическим.


Как строится дерево решений

Лучше всего объяснить как строиться дерево решений можно с помощью игры,когда человеку загадывают знаменитость клея бумажку с ее именем ему на лоб,а он пытается отгадать, задавая только те вопросы, на которые можно ответить "Да" или "Нет" кого именно из знаменитостей ему загадали,Логично предположить что он задаст вопрос который сильнее всего уменьшит количество оставшихся вариантов.например: "Это женщина ?" - в не зависимости от ответа,он отсеет как минимум половину неправильных вариантов,а если бы он спросил например: "Это Джеки Чан?" то в случае неправильности у него оставалось бы еще 6-8 миллиардов возможных вариантов,Исходя из этого признак "пол" намного лучше разделяет выборку людей, чем признак "это Джеки Чан", "Любимый цвет синий " , или "национальность-испанец".

С Вышеизложенной игрой можно провести аналогию с понятием "прироста информации", основанного на энтропии,не нужно пугаться этого слова,так как энтропия занимается тем что отфильтровывает малоинформативные признаки по типу : "Любимый цвет " , "национальность-испанец?",от признака "пол" как было в примере с игрой.
В очень хорошо разжевано понятие информационной энтропии + формула,а пока что для поверхностного понимания будет достаточно знать что энтропия 1 - это плохо,а 0 - хорошо,в самом конце когда я построю график все станет понятно.

Энтропия не единственный критерий по которому происходит вычисления на основании которого строиться дерево решений,существует еще и многие другие,но энтропия и коэффициент Джини самые часто используемые .


В языке программирования Python существует большое количество библиотек в которых уже реализованы почти все существующие методы МL,в примеры одна из них - sckiet learn.

По умолчанию дерево не ограниченное глубиной,то есть нет ограничения по скольких признаках будет происходить вычисления,допустим у нас не 7 признаков а 200,среди которых есть большое кол-во тех что слишком индивидуальные,в качестве примера рассмотрим ситуацию с банком,когда клиент приходит брать кредит, а работник банка должен запустить обученную нами систему чтоб та решила выдавать кредит или нет,на основании того или иного признака,так вот у нас 200 признаков,среди которых есть признак одеты ли на клиенте очки,или в зеленых ли он штанах,или проколотое ли у него ухо , обучая систему на всех этих признаках можно получить большую точность,но только на тех данных что есть у нас,наша же цель настроить систему распознавания которая сможет с минимальными ошибками работать на новых данных,то есть имея данные с 200 признаками 30 тысяч человек,мы должны предсказать вернет ли кредит 30001 30002 и так далее..и для лучшего результата нужно играться с глубиной,с начало попробовать протестировать с глубиной 3,затем 5 затем 7 и сравнить результаты (процент предсказывания) однако важно не переборщить с глубиной,так как на новых данных это скажется плохо,в наших 30 тысячных данных по случайным совпадениям слишком много людей в зеленных штанах что не отдали кредит,и слишком много с сьергой в ухе что вернули все в срок,если мы оставим глубину как есть и модель на них обучиться,то миллионам/миллиардам людям не выдадут кредит из-за плохо обученной модели которая придает большое внимания мелочам.

В нашем случае нам это не грозит так как у нас всего 7 признаков,эта информация к сведению о том что нужно учитывать при обучении модели типа дерева.


Разделим данные

Перемешаем данные на случай если они упорядоченные и разделим все наши данные на 70% x, и на y правильных ответов для x признаков на которых модель будет тренироваться - y = isFraud x = 7 признаков.
и на 30% y правильных ответов для x признаков на которых обученная модель будет тестироваться,то есть 30% x,y - это пользователи совершившие транзакцию, и задача нашего обученного дерева на 70% x,y данных, классифицировать лиц совершивших транзакцию на мошенников и не мошенников.





Сделав первичный прогноз становиться ясно что если наше дерево будет владеть данными которыми владели мы,наше дерево с вероятностью 99% отличит мошенников от обычных пользователей, но такого высокого процента на практике добиться очень трудно,и нужно играться с гиперпараметрами такими как глубина дерева,количество лучше всего коррелирующих признаков и т.д. что бы не делать все это вручную в библиотеки sicket learn уже реализованы под эти задачи методы,представим что наша модель предсказывает с точностью не 99% а 83%,и мы хотим улучшить этот показатель,значит нам нужно поиграться с признаками и глубиной дерева,пройтись по так называемой решетки Декарта,опять же не пугайтесь этого слова,вполне возможно что вы пользуетесь такой решеткой перед принятием решения чистить зубы или нет,сварить пельмени или приготовить времязатратную лазанью, посмотрев видео,с большой вероятностью все станет понятно.

В sklearn такая решетка есть:



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



И в этом случае если у нас как мы представили модель предсказывала с точностью в 83%,после подборки лучших параметров и глубины ,мы ее улучшили с 83% до 91% что есть очень хорошо.
Даже имея такую высокую точность в 99%, применив решетку Декарта мы смогли ее улучшить с 0.99825% на 0.99835%



Теперь когда есть готовая обученная модель, ее можно проверить на 30% отложенных данных что б удостовериться в ее точности:



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




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

K-ближайших соседей

Если дерево решений строиться основываясь на вычислениях энтропии,или коэффициента Джини,то к-ближайших соседей,вычитается корнем суммы квадратов всех точек,суть идеи такова:посмотри на своих соседей,какие преобладают, таков и ты,например заходит ответственный пользователь на форум с каким то вопросом,пробегается по всем разделам чтобы посмотреть в каком из них чаще всего создаются темы связные с вопросом который его интересует,и если ответа на него он не находит,то раздел где тем хоть как то косвенно связанны с его вопросом больше всего,он и создает тему надеясь отыскать ответ.
Пользователь -это метод поиска к-соседей,а раздел в котором он создает тему - это ближайшие соседи,так например в разделе А он нашел всего 2 темы связанных с его вопросом,а в разделе B - 8,туда он и направился создавать свою тему.
Еще пример:
Выделена красным цветом точка посчитает расстояния к каждой точке что есть на 2-х мерном пространстве, и будет классифицироваться тем цветом большинство которого ее окружает:


По графику видно что ближайшие цвета это синий зеленый и красный,преобладающие количество синего цвета,значит что обведенная точка синего цвета.

Делаем все тоже самое что из деревом,Разделяем данные в соотношении 70% и 30%,обучаем модель которая посчитает расстояния на двухмерном пространстве каждой точки по отношению к объекту которого нужно классифицировать как мошенника или не мошенника,и ближайшие n соседий определят его судьбу




И с вероятностью в 0.9977% модель обученная на k ближайших соседей сможет отличить мошенническую транзакцию от обычной.

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

Площадок с которыми можно совершать денежные операции множество,вариаций антифрода множество,все имеют свои сильные и слабые стороны, и свой процент распознавания.

На этом все спасибо за внимание!
 

Arman

Модератор
Модератор
Arman

Arman

Модератор
Модератор
Сообщения
851
Реакции
1,010
Обнови картинки.
 

Сверху Снизу