Machine Learning Fraud Detection (Python): na przykładzie nadużyć kart kredytowych.

Machine Learning Fraud Detection (Python): na przykładzie nadużyć kart kredytowych.

Wczytanie danych i spojrzenie na nie.

Poniżej przedstawiamy kilka technik, które umożliwią automatyczną identyfikacje „lewych” transakcji kartą kredytową. W tym celu zastosujemy jedną z metod machine learningu, którą zaimplementujemy w języku Python 3.

W przykładzie użyty został zbiór o nazwie creditcard.csv pochodzący z www.kaggle.com . Plik zawiera 30 zmiennych, których nazwy zostały ukryte ponieważ pochodzą z prawdziwej instytucji finansowej.

Pierwszym krokiem będzie zainstalowanie niezbędnych bibliotek pandas, numpy i sklearn. Następnie ściągnięcie pliku z danymi (plik można pobrać z www.kaggle.com ).
W kolejnym etapie dokonujemy przeglądu naszych danych.

import pandas as pd
import numpy as np
from sklearn.metrics import confusion_matrix, cohen_kappa_score
from sklearn.metrics import f1_score, recall_score

dt = pd.read_csv(r’creditcard.csv’, delimiter=”,”)

# Show the contents
print(dt.info())
print(dt.head())

# Show the null
print(dt.head().isnull())

# Show the columns
print(dt.columns)

 

W naszym przypadku zmienna zależna nie była numeryczna w związku z tym zamieniamy ją na taką. Do tego może posłużyć np. polecenie factorize z bibl. Pandas. Użycie funkcji zostało przedstawione poniżej. Dodatkowo użyta została funkcja value_count, która zlicza wystąpienia jedynek i zer w zmiennej celu.

# Change to numeric variables
dt[‘Class’] = pd.factorize( dt[‘Class’] )[0]
class_nm = {0:’Not Fraud’, 1:’Fraud’}

print(dt.Class.value_counts())
print(dt.Class.value_counts().rename(index=class_nm))

Następnie tworzymy funkcję , która ułatwi wyświetlanie wyników poszczególnych modeli.

def PrintStats (cmat, y_test, pred):
true_pos = cmat[0][0]
false_neg = cmat[1][1]
true_neg = cmat[0][1]
false_pos = cmat [1][0]

f1score = round(f1_score(y_test, pred), 2)
recallscore = round(recall_score(y_test, pred),2)

print(cmat)
print(‘Accuracy: ‘ + str(np.round(100*float(true_pos+false_neg)/ float(true_pos+false_neg+true_neg+false_pos),2))+’%’)
print(‘Cohen Kappa: ‘ + str(np.round(cohen_kappa_score(y_test, pred),3)))
print(“Sensitivity/Recall for Model: {score}”.format(score=recallscore))
print(“F1 Score for Model: {f1_score}”.format(f1_score=f1score))

Wybór cech

Na tym etapie wybieramy zmienne objaśniające oraz zmienną objaśnianą tzw. klasyfikującą.

feature_names = dt.iloc[:, 1:30].columns
target = dt.iloc[:, 30:].columns

features = dt[feature_names]
target = dt[target]

Modelowanie

Kolejno tworzymy funkcję wyliczającą macierz błędu oraz dopasowanie modelu i predykcję na danych testowych.

def RunModel (model, X_train, y_train, X_test, y_test):
model.fit(X_train, y_train.values.ravel())
pred = model.predict(X_test)
matrix = confusion_matrix(y_test, pred)
return matrix, pred

Ostateczny model

Finalnie przy użyciu biblioteki sklearn importujemy funkcję umożliwiającą podział zbioru na zbiór uczący 70% i testowy 30%. Funkcja random.seed(123) zapewnia nam to, że pracujemy za każdym razem na tych samych danych.

from sklearn.model_selection import train_test_split
np.random.seed(123)

# Split data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(features, target, train_size=0.70, test_size=0.30, random_state=1)

Jako ostatczną postać modelu wybieramy regresję logistyczną i dokonujemy wyliczeń.

# Pick a machine learning technique
from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()
cmat, pred = RunModel(lr, X_train, y_train, X_test, y_test)
PrintStats(cmat, y_test, pred)

Poniżej zrzut wyników:

[[85297 11]
[ 31 104]]
Accuracy: 99.95%
Cohen Kappa: 0.832
Sensitivity/Recall for Model : 0.77
F1 Scorre for Model : 0.83

Drugie podejście – UNDERSAMPLING

W drugim podejściu wykorzystamy dodatkowo tzw. undersampling. Spróbujemy osiągnąć równy podział na oszustwa i ważne transakcje. To sprawi, że zestaw treningowy będzie dość mały, ale algorytm nie potrzebuje wielu danych, aby wymyślić dobry klasyfikator:

fraud_records = len(dt[dt.Class == 1])

# put index
fraud_index = dt[dt.Class==1].index
valid_index = dt[dt.Class==0].index

# choice randomly index
sample_index = np.random.choice(valid_index, fraud_records, False)
undersampled = dt.iloc[np.concatenate([fraud_index, sample_index]),:]
X_undersampled = undersampled.iloc[:,1:30]
y_undersampled = undersampled.Class
X_undersampled_train, X_undersampled_test, y_undersampled_train, y_undersampled_test = train_test_split(X_undersampled, y_undersampled, test_size=0.3)
lr_undersampled = LogisticRegression(C=1)

# Run model
cmat, pred = RunModel(lr_undersampled, X_undersampled_train, y_undersampled_train, X_undersampled_test ,y_undersampled_test)
PrintStats(cmat,y_undersampled_test ,pred)

Implementując powyższe zmiany wynik przedstawia się jak poniżej. Dokładność spadła, ale wszystkie pozostałe wyniki wzrosły. Patrząc na macierz błędu, można zobaczyć znacznie wyższy procent poprawnych klasyfikacji fałszywych danych.

[[138 1]
[ 22 135]]
Accuracy: 92.23%
Cohen Kappa: 0.845
Sensitivity/Recall for Model : 0.86
F1 Scorre for Model : 0.92

Większa liczba klasyfikacji oszustw prawie zawsze związana jest z większą liczbę ważnych transakcji również zaklasyfikowanych jako oszustwo. Teraz użyjemy „nowego” klasyfikatora regresji logistycznej względem oryginalnych danych testowych:

Widzimy, że algorytm znacznie lepiej poradził sobie z wychwyceniem nieuczciwych transakcji błąd II stopnia (16 błędnych do 57), ale znacznie gorzej wypada w klasyfikacji dobrych jako fraud (błąd I stopnia) (1551 vs. 11)

[[83757 1551]
[ 16 119]]
Accuracy: 98.17%
Cohen Kappa: 0.129
Sensitivity/Recall for Model : 0.88
F1 Scorre for Model : 0.13

PODSUMOWANIE

Każdy przypadek biznesowy jest różny i wymaga indywidualnego podejścia, dlatego należy spojrzeć na problem i dokonać odpowiedniego kompromisu w podejściu. Ogólnie rzecz biorąc, koszty braku fałszywej transakcji (błąd II stopnia) są wielokrotnie większe niż błędna klasyfikacja dobrej transakcji jako oszustwa ( błąd I stopnia).

0 Komentarzy

Napisz komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

SALESMAN Sprzedaż Analityka Smarketing ©2019

lub

Zaloguj się używając swojego loginu i hasła

lub     

Nie pamiętasz hasła ?

lub

Create Account