Kreditkortsvindel er et løbende problem i bankbranchen. Med den kontaktløse betalingsmulighed og e-handel er det endnu lettere at misbruge en anden persons kreditkort.

Hånd der holder et kreditkort

Kreditkortsvindel er dyrt for bankbranchen, da de har brug for at registrere kontantstrømmen og om muligt spore pengene tilbage. Hvis dette ikke er muligt skal banken derimod tilbagebetale det tabte beløb til sin kunde. I 2017 udgjorde kreditkortsvindel 52.6 mio. i Danmark (1). Selvom der udvikles ny teknologi til bekæmpelse af kreditkortsvindel, bliver teknikker såsom site-kloning, falske købmandssteder, skimming og phishing desuden mere avancerede (2).

En sag for machine learning

Ved at se på mønstre er det muligt at forudsige, om et kreditkort bliver misbrugt. Nogle vigtige funktioner kan være transaktionsmængden, transaktionernes kontante sum og geografi.

Det givne svindelproblem er et binært klassificeringsproblem, hvor outputlaget kun har en neuron. Modellen skaber en sandsynlighed, der indikerer et konfidensniveau for den givne forudsigelse. Hvis output er 1, er du sikker på, at det givne kreditkort misbruges, mens en værdi på 0 indikerer en normal transaktion. I Patidar & Sharma indikerer et output under 0,6 eller 0,7, at transaktionen er normal, mens output ovenfor viser et behov for yderligere undersøgelse (2).

Et ubalanceret dataset - praktisk eksempel

ASom et praktisk eksempel på, hvordan vi kan hjælpe med at detektere kreditkortsvindel, er datasættet fra Kaggle brugt. Datasættet indeholder transaktioner over en to-dages periode i september 2013. Tabellen herunder viser datasættet:

n 284,807
n_ok 284,315 (98.828%)
n_svindel 492 (0.172%)

Heldigvis er datasættet, der er samlet over to dage, meget ubalanceret med antallet af svindel transaktioner, værende minoriteten, der kun bidrager med 0,122% af stikprøvestørrelsen.

Nulhypotesen vil være, at transaktionen er i orden, mens den alternative hypotese er, at transaktionen ikke er i orden. Hvis vi bare ville have en model til at forudsige korrekt så mange gange som muligt, kunne vi bare træne modellen til altid at give svaret: Transaktion ok. Vi ville faktisk have en model, der muligvis kunne forudsige korrekt 99,8% af tiden. Dog er vi interesseret i at opdage falske positiver og specifikt falske negativer, vil denne tilgang ikke løse problemet.

H_0 Sand H_0 Falks
Accepter H_0 Korrekt Type II fejl (beta) Falsk Negative
Afvis H_0 Type I fejl (alpha) Falsk Positive Korrekt

Når vi træner en model, er det ofte fordelagtigt at have hver klasse ligeligt repræsenteret. Dette problem kan løses på forskellige måder:

  1. Undersampling
  2. Oversampling
  3. Kombinerede klassemetoder

Når vi prøver at afbalancere datasættet, skal kun træningsdatasættet transformeres, hvorimod valideringen og testdatasættet distribueres som det sande datasæt er distribueret. Det er meget let at transformere trænings datasættet, ved brug af oversampling strategien, og det kan udføres med to linjer kode:

Oversampling med imblearn
1
2
3
4
from imblearn.over_sampling import SMOTE

sm = SMOTE()
X_train_oversampled, y_train_oversampled = sm.fit_sample(X_train, y_train.ravel())
Inden Oversampling Efter Oversampling
X_train 182276, 29 182276, 29
y_train 182276, 1 182276, 1
X_validate 45569, 29 45569, 29
y_validate 45569, 1 45569, 1
X_test 56962, 29 56962, 29
y_test 56962, 1 56962, 1

I dette eksempel har vi designet et meget simpelt neuralt netværk for at vise, hvor stærkt et netværk som dette kan være. Netværket består af kun 2 skjulte lag.

Neurale netværk arkitektur
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from keras.model import Sequential
from keras.layers import Dense

model = keras.Sequential()
model.add(keras.layers.Dense(8,
                             input_shape=(29,),
                             activation="relu",
                             use_bias=True))
model.add(keras.layers.Dropout(0.1))
model.add(keras.layers.Dense(6,
                             activation="relu",
                             use_bias=True))
model.add(keras.layers.Dropout(0.1))
model.add(keras.layers.Dense(1,
                             activation="sigmoid"))

model.compile(optimizer = tf.train.RMSPropOptimizer(0.01), 
                          loss = keras.losses.binary_crossentropy,
                          metrics=[keras.metrics.binary_accuracy]

Den følgende model har en ROC AUC-score på 0,985 og indikerer, at modellen har et potentiale til at opdage de falske negativer og falske positiver. Derudover har det en træn, validering og test nøjagtighed på 0,99. Dette er fantastisk! Modellen fungerer meget godt på både trænings-, test- og valideringsdatasæt. Derudover forudsiger det nøjagtigt, når det introduceres til nye data.

Brug af et simpelt neuralt netværk viser sig at være et stærkt værktøj til at detektere kreditkortsvindel. Imidlertid giver brug af en logistisk regressionsmodel eller en long short-term memory maskinlæringsmodel faktisk en score på næsten 99%.

Endelig, hvis vi vender modellen om og ser på indgående transaktioner i stedet for udgående transaktioner, kan vi desuden være i stand til at opdage svindel fra f.eks. hvidvaskning af penge og svindel på et personligt og virksomhedsniveau. Dette kan potentielt hjælpe banker og revisorer med at opdage svindel blandt deres mange klienter ved kun at få dem til at se på de tilfælde, som modellen genererer en stor sandsynlighed for og dermed har brug for yderligere undersøgelser.

// Maria Hvid, Machine Learning Engineer @ neurospace

Referencer

[1] dankort.dk

[2] Patidar & Sharma (2011) Credit Card Fraud Detection Using Neural Network. International Journal of Soft Computing and Engineering (IJSCE) (1) NCAI2011 (p. 32-38)