{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Credit card fraud detector using Amazon Fraud Detector"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Investigate and process the data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from IPython.display import clear_output\n",
"from datetime import datetime\n",
"from io import StringIO\n",
"from sklearn.model_selection import train_test_split\n",
"from imblearn.under_sampling import RandomUnderSampler\n",
"from imblearn.over_sampling import SMOTENC\n",
"from collections import Counter\n",
"from sklearn.metrics import roc_curve, roc_auc_score, auc, roc_auc_score\n",
"%matplotlib inline\n",
"\n",
"import os\n",
"import sys\n",
"import json\n",
"import uuid\n",
"import numpy as np \n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import boto3\n",
"import time"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's start by downloading the dataset from: https://www.kaggle.com/mlg-ulb/creditcardfraud?select=creditcard.csv and upload it into the notebook file system as creditcard.csv."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"# Resources and env variables setup\n",
"s3_resource = boto3.resource('s3')\n",
"afd_resource = boto3.client('frauddetector')\n",
"\n",
"# suffix is appended to detector and model name for uniqueness \n",
"sufx = datetime.now().strftime(\"%Y%m%d\")\n",
"# replace with the bucket created in the CloudFormation\n",
"S3_BUCKET = \"afd-poc-trainingbucket-1i37svk9elcoe\"\n",
"# Replace the ARN Role with the resources created in CloudFormation stack\n",
"ARN_ROLE = \"arn:aws:iam::387461613214:role/afd-poc-NotebookInstanceExecutionRole-1FNQ41S8H2G68\" "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"pd.set_option('display.max_rows', 500)\n",
"pd.set_option('display.max_columns', 500)\n",
"pd.set_option('display.width', 1000)\n",
"\n",
"data = pd.read_csv('creditcard.csv', delimiter=',')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a peek at our data (we only show a subset of the columns in the table):"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['Time', 'V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 'V11', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19', 'V20', 'V21', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28', 'Amount', 'Class'], dtype='object')\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Time \n",
" V1 \n",
" V2 \n",
" V3 \n",
" V4 \n",
" V5 \n",
" V6 \n",
" V7 \n",
" V8 \n",
" V9 \n",
" V10 \n",
" V11 \n",
" V12 \n",
" V13 \n",
" V14 \n",
" V15 \n",
" V16 \n",
" V17 \n",
" V18 \n",
" V19 \n",
" V20 \n",
" V21 \n",
" V22 \n",
" V23 \n",
" V24 \n",
" V25 \n",
" V26 \n",
" V27 \n",
" V28 \n",
" Amount \n",
" Class \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 284807.000000 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 2.848070e+05 \n",
" 284807.000000 \n",
" 284807.000000 \n",
" \n",
" \n",
" mean \n",
" 94813.859575 \n",
" 3.919560e-15 \n",
" 5.688174e-16 \n",
" -8.769071e-15 \n",
" 2.782312e-15 \n",
" -1.552563e-15 \n",
" 2.010663e-15 \n",
" -1.694249e-15 \n",
" -1.927028e-16 \n",
" -3.137024e-15 \n",
" 1.768627e-15 \n",
" 9.170318e-16 \n",
" -1.810658e-15 \n",
" 1.693438e-15 \n",
" 1.479045e-15 \n",
" 3.482336e-15 \n",
" 1.392007e-15 \n",
" -7.528491e-16 \n",
" 4.328772e-16 \n",
" 9.049732e-16 \n",
" 5.085503e-16 \n",
" 1.537294e-16 \n",
" 7.959909e-16 \n",
" 5.367590e-16 \n",
" 4.458112e-15 \n",
" 1.453003e-15 \n",
" 1.699104e-15 \n",
" -3.660161e-16 \n",
" -1.206049e-16 \n",
" 88.349619 \n",
" 0.001727 \n",
" \n",
" \n",
" std \n",
" 47488.145955 \n",
" 1.958696e+00 \n",
" 1.651309e+00 \n",
" 1.516255e+00 \n",
" 1.415869e+00 \n",
" 1.380247e+00 \n",
" 1.332271e+00 \n",
" 1.237094e+00 \n",
" 1.194353e+00 \n",
" 1.098632e+00 \n",
" 1.088850e+00 \n",
" 1.020713e+00 \n",
" 9.992014e-01 \n",
" 9.952742e-01 \n",
" 9.585956e-01 \n",
" 9.153160e-01 \n",
" 8.762529e-01 \n",
" 8.493371e-01 \n",
" 8.381762e-01 \n",
" 8.140405e-01 \n",
" 7.709250e-01 \n",
" 7.345240e-01 \n",
" 7.257016e-01 \n",
" 6.244603e-01 \n",
" 6.056471e-01 \n",
" 5.212781e-01 \n",
" 4.822270e-01 \n",
" 4.036325e-01 \n",
" 3.300833e-01 \n",
" 250.120109 \n",
" 0.041527 \n",
" \n",
" \n",
" min \n",
" 0.000000 \n",
" -5.640751e+01 \n",
" -7.271573e+01 \n",
" -4.832559e+01 \n",
" -5.683171e+00 \n",
" -1.137433e+02 \n",
" -2.616051e+01 \n",
" -4.355724e+01 \n",
" -7.321672e+01 \n",
" -1.343407e+01 \n",
" -2.458826e+01 \n",
" -4.797473e+00 \n",
" -1.868371e+01 \n",
" -5.791881e+00 \n",
" -1.921433e+01 \n",
" -4.498945e+00 \n",
" -1.412985e+01 \n",
" -2.516280e+01 \n",
" -9.498746e+00 \n",
" -7.213527e+00 \n",
" -5.449772e+01 \n",
" -3.483038e+01 \n",
" -1.093314e+01 \n",
" -4.480774e+01 \n",
" -2.836627e+00 \n",
" -1.029540e+01 \n",
" -2.604551e+00 \n",
" -2.256568e+01 \n",
" -1.543008e+01 \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 25% \n",
" 54201.500000 \n",
" -9.203734e-01 \n",
" -5.985499e-01 \n",
" -8.903648e-01 \n",
" -8.486401e-01 \n",
" -6.915971e-01 \n",
" -7.682956e-01 \n",
" -5.540759e-01 \n",
" -2.086297e-01 \n",
" -6.430976e-01 \n",
" -5.354257e-01 \n",
" -7.624942e-01 \n",
" -4.055715e-01 \n",
" -6.485393e-01 \n",
" -4.255740e-01 \n",
" -5.828843e-01 \n",
" -4.680368e-01 \n",
" -4.837483e-01 \n",
" -4.988498e-01 \n",
" -4.562989e-01 \n",
" -2.117214e-01 \n",
" -2.283949e-01 \n",
" -5.423504e-01 \n",
" -1.618463e-01 \n",
" -3.545861e-01 \n",
" -3.171451e-01 \n",
" -3.269839e-01 \n",
" -7.083953e-02 \n",
" -5.295979e-02 \n",
" 5.600000 \n",
" 0.000000 \n",
" \n",
" \n",
" 50% \n",
" 84692.000000 \n",
" 1.810880e-02 \n",
" 6.548556e-02 \n",
" 1.798463e-01 \n",
" -1.984653e-02 \n",
" -5.433583e-02 \n",
" -2.741871e-01 \n",
" 4.010308e-02 \n",
" 2.235804e-02 \n",
" -5.142873e-02 \n",
" -9.291738e-02 \n",
" -3.275735e-02 \n",
" 1.400326e-01 \n",
" -1.356806e-02 \n",
" 5.060132e-02 \n",
" 4.807155e-02 \n",
" 6.641332e-02 \n",
" -6.567575e-02 \n",
" -3.636312e-03 \n",
" 3.734823e-03 \n",
" -6.248109e-02 \n",
" -2.945017e-02 \n",
" 6.781943e-03 \n",
" -1.119293e-02 \n",
" 4.097606e-02 \n",
" 1.659350e-02 \n",
" -5.213911e-02 \n",
" 1.342146e-03 \n",
" 1.124383e-02 \n",
" 22.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" 75% \n",
" 139320.500000 \n",
" 1.315642e+00 \n",
" 8.037239e-01 \n",
" 1.027196e+00 \n",
" 7.433413e-01 \n",
" 6.119264e-01 \n",
" 3.985649e-01 \n",
" 5.704361e-01 \n",
" 3.273459e-01 \n",
" 5.971390e-01 \n",
" 4.539234e-01 \n",
" 7.395934e-01 \n",
" 6.182380e-01 \n",
" 6.625050e-01 \n",
" 4.931498e-01 \n",
" 6.488208e-01 \n",
" 5.232963e-01 \n",
" 3.996750e-01 \n",
" 5.008067e-01 \n",
" 4.589494e-01 \n",
" 1.330408e-01 \n",
" 1.863772e-01 \n",
" 5.285536e-01 \n",
" 1.476421e-01 \n",
" 4.395266e-01 \n",
" 3.507156e-01 \n",
" 2.409522e-01 \n",
" 9.104512e-02 \n",
" 7.827995e-02 \n",
" 77.165000 \n",
" 0.000000 \n",
" \n",
" \n",
" max \n",
" 172792.000000 \n",
" 2.454930e+00 \n",
" 2.205773e+01 \n",
" 9.382558e+00 \n",
" 1.687534e+01 \n",
" 3.480167e+01 \n",
" 7.330163e+01 \n",
" 1.205895e+02 \n",
" 2.000721e+01 \n",
" 1.559499e+01 \n",
" 2.374514e+01 \n",
" 1.201891e+01 \n",
" 7.848392e+00 \n",
" 7.126883e+00 \n",
" 1.052677e+01 \n",
" 8.877742e+00 \n",
" 1.731511e+01 \n",
" 9.253526e+00 \n",
" 5.041069e+00 \n",
" 5.591971e+00 \n",
" 3.942090e+01 \n",
" 2.720284e+01 \n",
" 1.050309e+01 \n",
" 2.252841e+01 \n",
" 4.584549e+00 \n",
" 7.519589e+00 \n",
" 3.517346e+00 \n",
" 3.161220e+01 \n",
" 3.384781e+01 \n",
" 25691.160000 \n",
" 1.000000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Time V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 Amount Class\n",
"count 284807.000000 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 2.848070e+05 284807.000000 284807.000000\n",
"mean 94813.859575 3.919560e-15 5.688174e-16 -8.769071e-15 2.782312e-15 -1.552563e-15 2.010663e-15 -1.694249e-15 -1.927028e-16 -3.137024e-15 1.768627e-15 9.170318e-16 -1.810658e-15 1.693438e-15 1.479045e-15 3.482336e-15 1.392007e-15 -7.528491e-16 4.328772e-16 9.049732e-16 5.085503e-16 1.537294e-16 7.959909e-16 5.367590e-16 4.458112e-15 1.453003e-15 1.699104e-15 -3.660161e-16 -1.206049e-16 88.349619 0.001727\n",
"std 47488.145955 1.958696e+00 1.651309e+00 1.516255e+00 1.415869e+00 1.380247e+00 1.332271e+00 1.237094e+00 1.194353e+00 1.098632e+00 1.088850e+00 1.020713e+00 9.992014e-01 9.952742e-01 9.585956e-01 9.153160e-01 8.762529e-01 8.493371e-01 8.381762e-01 8.140405e-01 7.709250e-01 7.345240e-01 7.257016e-01 6.244603e-01 6.056471e-01 5.212781e-01 4.822270e-01 4.036325e-01 3.300833e-01 250.120109 0.041527\n",
"min 0.000000 -5.640751e+01 -7.271573e+01 -4.832559e+01 -5.683171e+00 -1.137433e+02 -2.616051e+01 -4.355724e+01 -7.321672e+01 -1.343407e+01 -2.458826e+01 -4.797473e+00 -1.868371e+01 -5.791881e+00 -1.921433e+01 -4.498945e+00 -1.412985e+01 -2.516280e+01 -9.498746e+00 -7.213527e+00 -5.449772e+01 -3.483038e+01 -1.093314e+01 -4.480774e+01 -2.836627e+00 -1.029540e+01 -2.604551e+00 -2.256568e+01 -1.543008e+01 0.000000 0.000000\n",
"25% 54201.500000 -9.203734e-01 -5.985499e-01 -8.903648e-01 -8.486401e-01 -6.915971e-01 -7.682956e-01 -5.540759e-01 -2.086297e-01 -6.430976e-01 -5.354257e-01 -7.624942e-01 -4.055715e-01 -6.485393e-01 -4.255740e-01 -5.828843e-01 -4.680368e-01 -4.837483e-01 -4.988498e-01 -4.562989e-01 -2.117214e-01 -2.283949e-01 -5.423504e-01 -1.618463e-01 -3.545861e-01 -3.171451e-01 -3.269839e-01 -7.083953e-02 -5.295979e-02 5.600000 0.000000\n",
"50% 84692.000000 1.810880e-02 6.548556e-02 1.798463e-01 -1.984653e-02 -5.433583e-02 -2.741871e-01 4.010308e-02 2.235804e-02 -5.142873e-02 -9.291738e-02 -3.275735e-02 1.400326e-01 -1.356806e-02 5.060132e-02 4.807155e-02 6.641332e-02 -6.567575e-02 -3.636312e-03 3.734823e-03 -6.248109e-02 -2.945017e-02 6.781943e-03 -1.119293e-02 4.097606e-02 1.659350e-02 -5.213911e-02 1.342146e-03 1.124383e-02 22.000000 0.000000\n",
"75% 139320.500000 1.315642e+00 8.037239e-01 1.027196e+00 7.433413e-01 6.119264e-01 3.985649e-01 5.704361e-01 3.273459e-01 5.971390e-01 4.539234e-01 7.395934e-01 6.182380e-01 6.625050e-01 4.931498e-01 6.488208e-01 5.232963e-01 3.996750e-01 5.008067e-01 4.589494e-01 1.330408e-01 1.863772e-01 5.285536e-01 1.476421e-01 4.395266e-01 3.507156e-01 2.409522e-01 9.104512e-02 7.827995e-02 77.165000 0.000000\n",
"max 172792.000000 2.454930e+00 2.205773e+01 9.382558e+00 1.687534e+01 3.480167e+01 7.330163e+01 1.205895e+02 2.000721e+01 1.559499e+01 2.374514e+01 1.201891e+01 7.848392e+00 7.126883e+00 1.052677e+01 8.877742e+00 1.731511e+01 9.253526e+00 5.041069e+00 5.591971e+00 3.942090e+01 2.720284e+01 1.050309e+01 2.252841e+01 4.584549e+00 7.519589e+00 3.517346e+00 3.161220e+01 3.384781e+01 25691.160000 1.000000"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(data.columns)\n",
"data.describe()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of frauds: 492\n",
"Number of non-frauds: 284315\n",
"Percentage of fradulent data: 0.1727485630620034\n"
]
}
],
"source": [
"nonfrauds, frauds = data.groupby('Class').size()\n",
"print('Number of frauds: ', frauds)\n",
"print('Number of non-frauds: ', nonfrauds)\n",
"print('Percentage of fradulent data:', 100.*frauds/(frauds + nonfrauds))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The class column corresponds to whether or not a transaction is fradulent. We see that the majority of data is non-fraudulent with only $492$ ($.172\\%$), check the Class column mean, of the data corresponding to fraudulent examples."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A PCA have been made lets check the mean and standard deviation of the features."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"data.hist(bins=50,figsize=(20,15))\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Looks good, columns have been normalized to have 0 mean and unit standard deviation as the result of a PCA. Now, lets change the data to be Amazon Fraud Detector compatible."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['time', 'va', 'vb', 'vc', 'vd', 've', 'vf', 'vg', 'vh', 'vi', 'vj', 'vk', 'vl', 'vm', 'vn', 'vo', 'vp', 'vq', 'vr', 'vs', 'vt', 'vu', 'vv', 'vw', 'vx', 'vy', 'vz', 'vaa', 'vab', 'amount', 'class'], dtype='object')\n"
]
}
],
"source": [
"# to lowercase\n",
"data.columns = map(str.lower, data.columns)\n",
"print(data.columns)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['time', 'va', 'vb', 'vc', 'vd', 've', 'vf', 'vg', 'vh', 'vi', 'vj', 'vk', 'vl', 'vm', 'vn', 'vo', 'vp', 'vq', 'vr', 'vs', 'vt', 'vu', 'vv', 'vw', 'vx', 'vy', 'vz', 'vaa', 'vab', 'amount', 'class'], dtype='object')\n"
]
}
],
"source": [
"# mapping column names numbers to letters\n",
"\n",
"def standardize_headers(x):\n",
" if any(char.isdigit() for char in x):\n",
" if int(x[1:]) > 26:\n",
" return 'va'+chr(int(x[1:])+70)\n",
" return 'v'+chr(int(x[1:])+96)\n",
" return x\n",
"\n",
"data.rename(columns=standardize_headers, inplace=True)\n",
"print(data.columns)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then change the timestamp and label column names"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" EVENT_TIMESTAMP \n",
" va \n",
" vb \n",
" vc \n",
" vd \n",
" ve \n",
" vf \n",
" vg \n",
" vh \n",
" vi \n",
" vj \n",
" vk \n",
" vl \n",
" vm \n",
" vn \n",
" vo \n",
" vp \n",
" vq \n",
" vr \n",
" vs \n",
" vt \n",
" vu \n",
" vv \n",
" vw \n",
" vx \n",
" vy \n",
" vz \n",
" vaa \n",
" vab \n",
" amount \n",
" EVENT_LABEL \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0.0 \n",
" -1.359807 \n",
" -0.072781 \n",
" 2.536347 \n",
" 1.378155 \n",
" -0.338321 \n",
" 0.462388 \n",
" 0.239599 \n",
" 0.098698 \n",
" 0.363787 \n",
" 0.090794 \n",
" -0.551600 \n",
" -0.617801 \n",
" -0.991390 \n",
" -0.311169 \n",
" 1.468177 \n",
" -0.470401 \n",
" 0.207971 \n",
" 0.025791 \n",
" 0.403993 \n",
" 0.251412 \n",
" -0.018307 \n",
" 0.277838 \n",
" -0.110474 \n",
" 0.066928 \n",
" 0.128539 \n",
" -0.189115 \n",
" 0.133558 \n",
" -0.021053 \n",
" 149.62 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 0.0 \n",
" 1.191857 \n",
" 0.266151 \n",
" 0.166480 \n",
" 0.448154 \n",
" 0.060018 \n",
" -0.082361 \n",
" -0.078803 \n",
" 0.085102 \n",
" -0.255425 \n",
" -0.166974 \n",
" 1.612727 \n",
" 1.065235 \n",
" 0.489095 \n",
" -0.143772 \n",
" 0.635558 \n",
" 0.463917 \n",
" -0.114805 \n",
" -0.183361 \n",
" -0.145783 \n",
" -0.069083 \n",
" -0.225775 \n",
" -0.638672 \n",
" 0.101288 \n",
" -0.339846 \n",
" 0.167170 \n",
" 0.125895 \n",
" -0.008983 \n",
" 0.014724 \n",
" 2.69 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 1.0 \n",
" -1.358354 \n",
" -1.340163 \n",
" 1.773209 \n",
" 0.379780 \n",
" -0.503198 \n",
" 1.800499 \n",
" 0.791461 \n",
" 0.247676 \n",
" -1.514654 \n",
" 0.207643 \n",
" 0.624501 \n",
" 0.066084 \n",
" 0.717293 \n",
" -0.165946 \n",
" 2.345865 \n",
" -2.890083 \n",
" 1.109969 \n",
" -0.121359 \n",
" -2.261857 \n",
" 0.524980 \n",
" 0.247998 \n",
" 0.771679 \n",
" 0.909412 \n",
" -0.689281 \n",
" -0.327642 \n",
" -0.139097 \n",
" -0.055353 \n",
" -0.059752 \n",
" 378.66 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 1.0 \n",
" -0.966272 \n",
" -0.185226 \n",
" 1.792993 \n",
" -0.863291 \n",
" -0.010309 \n",
" 1.247203 \n",
" 0.237609 \n",
" 0.377436 \n",
" -1.387024 \n",
" -0.054952 \n",
" -0.226487 \n",
" 0.178228 \n",
" 0.507757 \n",
" -0.287924 \n",
" -0.631418 \n",
" -1.059647 \n",
" -0.684093 \n",
" 1.965775 \n",
" -1.232622 \n",
" -0.208038 \n",
" -0.108300 \n",
" 0.005274 \n",
" -0.190321 \n",
" -1.175575 \n",
" 0.647376 \n",
" -0.221929 \n",
" 0.062723 \n",
" 0.061458 \n",
" 123.50 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 2.0 \n",
" -1.158233 \n",
" 0.877737 \n",
" 1.548718 \n",
" 0.403034 \n",
" -0.407193 \n",
" 0.095921 \n",
" 0.592941 \n",
" -0.270533 \n",
" 0.817739 \n",
" 0.753074 \n",
" -0.822843 \n",
" 0.538196 \n",
" 1.345852 \n",
" -1.119670 \n",
" 0.175121 \n",
" -0.451449 \n",
" -0.237033 \n",
" -0.038195 \n",
" 0.803487 \n",
" 0.408542 \n",
" -0.009431 \n",
" 0.798278 \n",
" -0.137458 \n",
" 0.141267 \n",
" -0.206010 \n",
" 0.502292 \n",
" 0.219422 \n",
" 0.215153 \n",
" 69.99 \n",
" 0 \n",
" \n",
" \n",
" 5 \n",
" 2.0 \n",
" -0.425966 \n",
" 0.960523 \n",
" 1.141109 \n",
" -0.168252 \n",
" 0.420987 \n",
" -0.029728 \n",
" 0.476201 \n",
" 0.260314 \n",
" -0.568671 \n",
" -0.371407 \n",
" 1.341262 \n",
" 0.359894 \n",
" -0.358091 \n",
" -0.137134 \n",
" 0.517617 \n",
" 0.401726 \n",
" -0.058133 \n",
" 0.068653 \n",
" -0.033194 \n",
" 0.084968 \n",
" -0.208254 \n",
" -0.559825 \n",
" -0.026398 \n",
" -0.371427 \n",
" -0.232794 \n",
" 0.105915 \n",
" 0.253844 \n",
" 0.081080 \n",
" 3.67 \n",
" 0 \n",
" \n",
" \n",
" 6 \n",
" 4.0 \n",
" 1.229658 \n",
" 0.141004 \n",
" 0.045371 \n",
" 1.202613 \n",
" 0.191881 \n",
" 0.272708 \n",
" -0.005159 \n",
" 0.081213 \n",
" 0.464960 \n",
" -0.099254 \n",
" -1.416907 \n",
" -0.153826 \n",
" -0.751063 \n",
" 0.167372 \n",
" 0.050144 \n",
" -0.443587 \n",
" 0.002821 \n",
" -0.611987 \n",
" -0.045575 \n",
" -0.219633 \n",
" -0.167716 \n",
" -0.270710 \n",
" -0.154104 \n",
" -0.780055 \n",
" 0.750137 \n",
" -0.257237 \n",
" 0.034507 \n",
" 0.005168 \n",
" 4.99 \n",
" 0 \n",
" \n",
" \n",
" 7 \n",
" 7.0 \n",
" -0.644269 \n",
" 1.417964 \n",
" 1.074380 \n",
" -0.492199 \n",
" 0.948934 \n",
" 0.428118 \n",
" 1.120631 \n",
" -3.807864 \n",
" 0.615375 \n",
" 1.249376 \n",
" -0.619468 \n",
" 0.291474 \n",
" 1.757964 \n",
" -1.323865 \n",
" 0.686133 \n",
" -0.076127 \n",
" -1.222127 \n",
" -0.358222 \n",
" 0.324505 \n",
" -0.156742 \n",
" 1.943465 \n",
" -1.015455 \n",
" 0.057504 \n",
" -0.649709 \n",
" -0.415267 \n",
" -0.051634 \n",
" -1.206921 \n",
" -1.085339 \n",
" 40.80 \n",
" 0 \n",
" \n",
" \n",
" 8 \n",
" 7.0 \n",
" -0.894286 \n",
" 0.286157 \n",
" -0.113192 \n",
" -0.271526 \n",
" 2.669599 \n",
" 3.721818 \n",
" 0.370145 \n",
" 0.851084 \n",
" -0.392048 \n",
" -0.410430 \n",
" -0.705117 \n",
" -0.110452 \n",
" -0.286254 \n",
" 0.074355 \n",
" -0.328783 \n",
" -0.210077 \n",
" -0.499768 \n",
" 0.118765 \n",
" 0.570328 \n",
" 0.052736 \n",
" -0.073425 \n",
" -0.268092 \n",
" -0.204233 \n",
" 1.011592 \n",
" 0.373205 \n",
" -0.384157 \n",
" 0.011747 \n",
" 0.142404 \n",
" 93.20 \n",
" 0 \n",
" \n",
" \n",
" 9 \n",
" 9.0 \n",
" -0.338262 \n",
" 1.119593 \n",
" 1.044367 \n",
" -0.222187 \n",
" 0.499361 \n",
" -0.246761 \n",
" 0.651583 \n",
" 0.069539 \n",
" -0.736727 \n",
" -0.366846 \n",
" 1.017614 \n",
" 0.836390 \n",
" 1.006844 \n",
" -0.443523 \n",
" 0.150219 \n",
" 0.739453 \n",
" -0.540980 \n",
" 0.476677 \n",
" 0.451773 \n",
" 0.203711 \n",
" -0.246914 \n",
" -0.633753 \n",
" -0.120794 \n",
" -0.385050 \n",
" -0.069733 \n",
" 0.094199 \n",
" 0.246219 \n",
" 0.083076 \n",
" 3.68 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" EVENT_TIMESTAMP va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz vaa vab amount EVENT_LABEL\n",
"0 0.0 -1.359807 -0.072781 2.536347 1.378155 -0.338321 0.462388 0.239599 0.098698 0.363787 0.090794 -0.551600 -0.617801 -0.991390 -0.311169 1.468177 -0.470401 0.207971 0.025791 0.403993 0.251412 -0.018307 0.277838 -0.110474 0.066928 0.128539 -0.189115 0.133558 -0.021053 149.62 0\n",
"1 0.0 1.191857 0.266151 0.166480 0.448154 0.060018 -0.082361 -0.078803 0.085102 -0.255425 -0.166974 1.612727 1.065235 0.489095 -0.143772 0.635558 0.463917 -0.114805 -0.183361 -0.145783 -0.069083 -0.225775 -0.638672 0.101288 -0.339846 0.167170 0.125895 -0.008983 0.014724 2.69 0\n",
"2 1.0 -1.358354 -1.340163 1.773209 0.379780 -0.503198 1.800499 0.791461 0.247676 -1.514654 0.207643 0.624501 0.066084 0.717293 -0.165946 2.345865 -2.890083 1.109969 -0.121359 -2.261857 0.524980 0.247998 0.771679 0.909412 -0.689281 -0.327642 -0.139097 -0.055353 -0.059752 378.66 0\n",
"3 1.0 -0.966272 -0.185226 1.792993 -0.863291 -0.010309 1.247203 0.237609 0.377436 -1.387024 -0.054952 -0.226487 0.178228 0.507757 -0.287924 -0.631418 -1.059647 -0.684093 1.965775 -1.232622 -0.208038 -0.108300 0.005274 -0.190321 -1.175575 0.647376 -0.221929 0.062723 0.061458 123.50 0\n",
"4 2.0 -1.158233 0.877737 1.548718 0.403034 -0.407193 0.095921 0.592941 -0.270533 0.817739 0.753074 -0.822843 0.538196 1.345852 -1.119670 0.175121 -0.451449 -0.237033 -0.038195 0.803487 0.408542 -0.009431 0.798278 -0.137458 0.141267 -0.206010 0.502292 0.219422 0.215153 69.99 0\n",
"5 2.0 -0.425966 0.960523 1.141109 -0.168252 0.420987 -0.029728 0.476201 0.260314 -0.568671 -0.371407 1.341262 0.359894 -0.358091 -0.137134 0.517617 0.401726 -0.058133 0.068653 -0.033194 0.084968 -0.208254 -0.559825 -0.026398 -0.371427 -0.232794 0.105915 0.253844 0.081080 3.67 0\n",
"6 4.0 1.229658 0.141004 0.045371 1.202613 0.191881 0.272708 -0.005159 0.081213 0.464960 -0.099254 -1.416907 -0.153826 -0.751063 0.167372 0.050144 -0.443587 0.002821 -0.611987 -0.045575 -0.219633 -0.167716 -0.270710 -0.154104 -0.780055 0.750137 -0.257237 0.034507 0.005168 4.99 0\n",
"7 7.0 -0.644269 1.417964 1.074380 -0.492199 0.948934 0.428118 1.120631 -3.807864 0.615375 1.249376 -0.619468 0.291474 1.757964 -1.323865 0.686133 -0.076127 -1.222127 -0.358222 0.324505 -0.156742 1.943465 -1.015455 0.057504 -0.649709 -0.415267 -0.051634 -1.206921 -1.085339 40.80 0\n",
"8 7.0 -0.894286 0.286157 -0.113192 -0.271526 2.669599 3.721818 0.370145 0.851084 -0.392048 -0.410430 -0.705117 -0.110452 -0.286254 0.074355 -0.328783 -0.210077 -0.499768 0.118765 0.570328 0.052736 -0.073425 -0.268092 -0.204233 1.011592 0.373205 -0.384157 0.011747 0.142404 93.20 0\n",
"9 9.0 -0.338262 1.119593 1.044367 -0.222187 0.499361 -0.246761 0.651583 0.069539 -0.736727 -0.366846 1.017614 0.836390 1.006844 -0.443523 0.150219 0.739453 -0.540980 0.476677 0.451773 0.203711 -0.246914 -0.633753 -0.120794 -0.385050 -0.069733 0.094199 0.246219 0.083076 3.68 0"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# rename to the Amazon Fraud Detector name conventions \n",
"data.rename(columns={'time':'EVENT_TIMESTAMP','class':'EVENT_LABEL'}, inplace=True)\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The date column is represented as incremental seconds, lets translate that to real dates."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1600788845.180449\n"
]
}
],
"source": [
"# Get epoch time for the initial dataset date\n",
"epoch = datetime.utcfromtimestamp(0)\n",
"def unix_time_seconds(dt):\n",
" return (dt - epoch).total_seconds()\n",
"\n",
"# Lets pretend that the data is from yesterday and could can test at the end with todays date.\n",
"start_dt = datetime.strptime('Sep 22 2020 12:00AM', '%b %d %Y %I:%M%p')\n",
"start_dt = datetime.now()\n",
"start_ep = unix_time_seconds(start_dt)\n",
"print(start_ep)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Datetime parse test"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2020-09-22 00:00:00\n"
]
}
],
"source": [
"date_str = '9/22/2020 12:00:00 AM'\n",
"date = datetime.strptime(date_str, \"%m/%d/%Y %I:%M:%S %p\")\n",
"print(date)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Translate the current timestamp format (increasing seconds) to ISO 8601 standard"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" EVENT_TIMESTAMP \n",
" va \n",
" vb \n",
" vc \n",
" vd \n",
" ve \n",
" vf \n",
" vg \n",
" vh \n",
" vi \n",
" vj \n",
" vk \n",
" vl \n",
" vm \n",
" vn \n",
" vo \n",
" vp \n",
" vq \n",
" vr \n",
" vs \n",
" vt \n",
" vu \n",
" vv \n",
" vw \n",
" vx \n",
" vy \n",
" vz \n",
" vaa \n",
" vab \n",
" amount \n",
" EVENT_LABEL \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2020-09-22T15:34:05Z \n",
" -1.359807 \n",
" -0.072781 \n",
" 2.536347 \n",
" 1.378155 \n",
" -0.338321 \n",
" 0.462388 \n",
" 0.239599 \n",
" 0.098698 \n",
" 0.363787 \n",
" 0.090794 \n",
" -0.551600 \n",
" -0.617801 \n",
" -0.991390 \n",
" -0.311169 \n",
" 1.468177 \n",
" -0.470401 \n",
" 0.207971 \n",
" 0.025791 \n",
" 0.403993 \n",
" 0.251412 \n",
" -0.018307 \n",
" 0.277838 \n",
" -0.110474 \n",
" 0.066928 \n",
" 0.128539 \n",
" -0.189115 \n",
" 0.133558 \n",
" -0.021053 \n",
" 149.62 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 2020-09-22T15:34:05Z \n",
" 1.191857 \n",
" 0.266151 \n",
" 0.166480 \n",
" 0.448154 \n",
" 0.060018 \n",
" -0.082361 \n",
" -0.078803 \n",
" 0.085102 \n",
" -0.255425 \n",
" -0.166974 \n",
" 1.612727 \n",
" 1.065235 \n",
" 0.489095 \n",
" -0.143772 \n",
" 0.635558 \n",
" 0.463917 \n",
" -0.114805 \n",
" -0.183361 \n",
" -0.145783 \n",
" -0.069083 \n",
" -0.225775 \n",
" -0.638672 \n",
" 0.101288 \n",
" -0.339846 \n",
" 0.167170 \n",
" 0.125895 \n",
" -0.008983 \n",
" 0.014724 \n",
" 2.69 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 2020-09-22T15:34:06Z \n",
" -1.358354 \n",
" -1.340163 \n",
" 1.773209 \n",
" 0.379780 \n",
" -0.503198 \n",
" 1.800499 \n",
" 0.791461 \n",
" 0.247676 \n",
" -1.514654 \n",
" 0.207643 \n",
" 0.624501 \n",
" 0.066084 \n",
" 0.717293 \n",
" -0.165946 \n",
" 2.345865 \n",
" -2.890083 \n",
" 1.109969 \n",
" -0.121359 \n",
" -2.261857 \n",
" 0.524980 \n",
" 0.247998 \n",
" 0.771679 \n",
" 0.909412 \n",
" -0.689281 \n",
" -0.327642 \n",
" -0.139097 \n",
" -0.055353 \n",
" -0.059752 \n",
" 378.66 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 2020-09-22T15:34:06Z \n",
" -0.966272 \n",
" -0.185226 \n",
" 1.792993 \n",
" -0.863291 \n",
" -0.010309 \n",
" 1.247203 \n",
" 0.237609 \n",
" 0.377436 \n",
" -1.387024 \n",
" -0.054952 \n",
" -0.226487 \n",
" 0.178228 \n",
" 0.507757 \n",
" -0.287924 \n",
" -0.631418 \n",
" -1.059647 \n",
" -0.684093 \n",
" 1.965775 \n",
" -1.232622 \n",
" -0.208038 \n",
" -0.108300 \n",
" 0.005274 \n",
" -0.190321 \n",
" -1.175575 \n",
" 0.647376 \n",
" -0.221929 \n",
" 0.062723 \n",
" 0.061458 \n",
" 123.50 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 2020-09-22T15:34:07Z \n",
" -1.158233 \n",
" 0.877737 \n",
" 1.548718 \n",
" 0.403034 \n",
" -0.407193 \n",
" 0.095921 \n",
" 0.592941 \n",
" -0.270533 \n",
" 0.817739 \n",
" 0.753074 \n",
" -0.822843 \n",
" 0.538196 \n",
" 1.345852 \n",
" -1.119670 \n",
" 0.175121 \n",
" -0.451449 \n",
" -0.237033 \n",
" -0.038195 \n",
" 0.803487 \n",
" 0.408542 \n",
" -0.009431 \n",
" 0.798278 \n",
" -0.137458 \n",
" 0.141267 \n",
" -0.206010 \n",
" 0.502292 \n",
" 0.219422 \n",
" 0.215153 \n",
" 69.99 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" EVENT_TIMESTAMP va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz vaa vab amount EVENT_LABEL\n",
"0 2020-09-22T15:34:05Z -1.359807 -0.072781 2.536347 1.378155 -0.338321 0.462388 0.239599 0.098698 0.363787 0.090794 -0.551600 -0.617801 -0.991390 -0.311169 1.468177 -0.470401 0.207971 0.025791 0.403993 0.251412 -0.018307 0.277838 -0.110474 0.066928 0.128539 -0.189115 0.133558 -0.021053 149.62 0\n",
"1 2020-09-22T15:34:05Z 1.191857 0.266151 0.166480 0.448154 0.060018 -0.082361 -0.078803 0.085102 -0.255425 -0.166974 1.612727 1.065235 0.489095 -0.143772 0.635558 0.463917 -0.114805 -0.183361 -0.145783 -0.069083 -0.225775 -0.638672 0.101288 -0.339846 0.167170 0.125895 -0.008983 0.014724 2.69 0\n",
"2 2020-09-22T15:34:06Z -1.358354 -1.340163 1.773209 0.379780 -0.503198 1.800499 0.791461 0.247676 -1.514654 0.207643 0.624501 0.066084 0.717293 -0.165946 2.345865 -2.890083 1.109969 -0.121359 -2.261857 0.524980 0.247998 0.771679 0.909412 -0.689281 -0.327642 -0.139097 -0.055353 -0.059752 378.66 0\n",
"3 2020-09-22T15:34:06Z -0.966272 -0.185226 1.792993 -0.863291 -0.010309 1.247203 0.237609 0.377436 -1.387024 -0.054952 -0.226487 0.178228 0.507757 -0.287924 -0.631418 -1.059647 -0.684093 1.965775 -1.232622 -0.208038 -0.108300 0.005274 -0.190321 -1.175575 0.647376 -0.221929 0.062723 0.061458 123.50 0\n",
"4 2020-09-22T15:34:07Z -1.158233 0.877737 1.548718 0.403034 -0.407193 0.095921 0.592941 -0.270533 0.817739 0.753074 -0.822843 0.538196 1.345852 -1.119670 0.175121 -0.451449 -0.237033 -0.038195 0.803487 0.408542 -0.009431 0.798278 -0.137458 0.141267 -0.206010 0.502292 0.219422 0.215153 69.99 0"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# translate seconds delta to actual datetimes in ISO 8601\n",
"def to_datetime(x):\n",
" current_ep = start_ep + x\n",
" current_dt = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime(current_ep))\n",
" return current_dt\n",
"\n",
"\n",
"data['EVENT_TIMESTAMP'] = data['EVENT_TIMESTAMP'].apply(to_datetime)\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets check for null values"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"EVENT_TIMESTAMP 0\n",
"va 0\n",
"vb 0\n",
"vc 0\n",
"vd 0\n",
"ve 0\n",
"vf 0\n",
"vg 0\n",
"vh 0\n",
"vi 0\n",
"vj 0\n",
"vk 0\n",
"vl 0\n",
"vm 0\n",
"vn 0\n",
"vo 0\n",
"vp 0\n",
"vq 0\n",
"vr 0\n",
"vs 0\n",
"vt 0\n",
"vu 0\n",
"vv 0\n",
"vw 0\n",
"vx 0\n",
"vy 0\n",
"vz 0\n",
"vaa 0\n",
"vab 0\n",
"amount 0\n",
"EVENT_LABEL 0\n",
"dtype: int64"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will split our dataset into a train and test to evaluate the performance of our models. It's important to do so before any techniques meant to alleviate the class imbalance are used. This ensures that we don't leak information from the test set into the train set."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"features = data.drop('EVENT_LABEL', axis=1).values\n",
"labels = (data['EVENT_LABEL'].values).astype('float32')"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"X, X_test, y, y_test = train_test_split(\n",
" features, labels, test_size=0.1, random_state=42)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Counter({0.0: 255880, 1.0: 446})\n"
]
}
],
"source": [
"counter = Counter(y)\n",
"print(counter)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Getting the train DataFrame back together"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['EVENT_TIMESTAMP', 'va', 'vb', 'vc', 'vd', 've', 'vf', 'vg', 'vh', 'vi', 'vj', 'vk', 'vl', 'vm', 'vn', 'vo', 'vp', 'vq', 'vr', 'vs', 'vt', 'vu', 'vv', 'vw', 'vx', 'vy', 'vz', 'vaa', 'vab', 'amount'], dtype='object')\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" EVENT_TIMESTAMP \n",
" va \n",
" vb \n",
" vc \n",
" vd \n",
" ve \n",
" vf \n",
" vg \n",
" vh \n",
" vi \n",
" vj \n",
" vk \n",
" vl \n",
" vm \n",
" vn \n",
" vo \n",
" vp \n",
" vq \n",
" vr \n",
" vs \n",
" vt \n",
" vu \n",
" vv \n",
" vw \n",
" vx \n",
" vy \n",
" vz \n",
" vaa \n",
" vab \n",
" amount \n",
" EVENT_LABEL \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2020-09-22T23:29:20Z \n",
" 1.22664 \n",
" 0.101988 \n",
" -0.0870724 \n",
" 0.111524 \n",
" -0.281992 \n",
" -1.35603 \n",
" 0.46905 \n",
" -0.371725 \n",
" -0.153672 \n",
" -0.145105 \n",
" -0.143505 \n",
" 0.320964 \n",
" 0.149313 \n",
" 0.452515 \n",
" 0.776253 \n",
" 0.0287393 \n",
" -0.177867 \n",
" -1.00475 \n",
" 0.264953 \n",
" 0.0196923 \n",
" -0.3551 \n",
" -1.15366 \n",
" 0.109793 \n",
" 0.420318 \n",
" 0.197932 \n",
" 0.699218 \n",
" -0.114861 \n",
" 0.00758255 \n",
" 50.4 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 2020-09-23T14:39:30Z \n",
" 1.12485 \n",
" 0.125602 \n",
" 0.249962 \n",
" 0.489744 \n",
" -0.0403864 \n",
" 0.167561 \n",
" -0.247614 \n",
" 0.284736 \n",
" -0.0673023 \n",
" -0.170139 \n",
" 1.89512 \n",
" 0.507733 \n",
" -1.00865 \n",
" 0.187249 \n",
" 1.02166 \n",
" 0.13632 \n",
" 0.370186 \n",
" -0.573559 \n",
" -0.625413 \n",
" -0.204465 \n",
" -0.192467 \n",
" -0.576819 \n",
" 0.190343 \n",
" -0.357451 \n",
" 0.000869796 \n",
" 0.139971 \n",
" -0.000993408 \n",
" 0.0115049 \n",
" 1.98 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 2020-09-23T12:33:02Z \n",
" -0.307902 \n",
" 1.00371 \n",
" 1.40428 \n",
" 0.592627 \n",
" 0.311014 \n",
" -0.382106 \n",
" 0.531393 \n",
" -0.0152922 \n",
" -0.758638 \n",
" -0.511597 \n",
" 0.149643 \n",
" 0.245866 \n",
" 0.752802 \n",
" -0.382214 \n",
" 1.59018 \n",
" -0.332546 \n",
" 0.611852 \n",
" -0.510495 \n",
" 0.563779 \n",
" 0.12522 \n",
" -0.131802 \n",
" -0.329268 \n",
" 0.04699 \n",
" 0.0574128 \n",
" -0.65696 \n",
" 0.193192 \n",
" 0.142038 \n",
" 0.157501 \n",
" 1.98 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 2020-09-24T11:00:03Z \n",
" 2.17492 \n",
" -1.53544 \n",
" -0.726428 \n",
" -1.43079 \n",
" -1.51726 \n",
" -0.751038 \n",
" -1.15534 \n",
" -0.180811 \n",
" -1.11188 \n",
" 1.5361 \n",
" -0.735705 \n",
" -0.771714 \n",
" 0.238603 \n",
" -0.44705 \n",
" -0.0858861 \n",
" -0.568345 \n",
" 0.591162 \n",
" -0.104975 \n",
" -0.327292 \n",
" -0.334351 \n",
" -0.112766 \n",
" 0.0500184 \n",
" 0.294666 \n",
" 1.12332 \n",
" -0.306025 \n",
" -0.241343 \n",
" 0.00655296 \n",
" -0.0275668 \n",
" 64 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 2020-09-24T12:42:48Z \n",
" -2.22156 \n",
" 1.26199 \n",
" 2.04764 \n",
" 4.65927 \n",
" -0.535941 \n",
" 4.54204 \n",
" -3.71553 \n",
" -5.3117 \n",
" -0.955321 \n",
" 0.200601 \n",
" -1.34262 \n",
" 0.879905 \n",
" 0.241171 \n",
" -0.36554 \n",
" -1.73541 \n",
" 0.564495 \n",
" 0.380648 \n",
" 1.21669 \n",
" 1.87271 \n",
" 0.89599 \n",
" -1.82039 \n",
" 0.873723 \n",
" -2.6486 \n",
" -0.16218 \n",
" -0.492111 \n",
" 0.60149 \n",
" 0.62703 \n",
" 0.088289 \n",
" 379.29 \n",
" 0 \n",
" \n",
" \n",
" 5 \n",
" 2020-09-23T23:13:57Z \n",
" -0.335198 \n",
" 0.871378 \n",
" 0.632703 \n",
" 4.16424 \n",
" 1.70258 \n",
" 1.95435 \n",
" 0.396722 \n",
" 0.495056 \n",
" -2.50602 \n",
" 1.60914 \n",
" 1.02925 \n",
" -0.143569 \n",
" -0.129187 \n",
" 0.862428 \n",
" 1.05951 \n",
" -0.862144 \n",
" 0.597711 \n",
" -0.509967 \n",
" 0.217672 \n",
" 0.260404 \n",
" 0.529635 \n",
" 1.47356 \n",
" 0.0334131 \n",
" -1.33327 \n",
" -0.779961 \n",
" 0.595196 \n",
" 0.231547 \n",
" 0.193332 \n",
" 57.78 \n",
" 0 \n",
" \n",
" \n",
" 6 \n",
" 2020-09-22T20:44:58Z \n",
" -1.30598 \n",
" 1.77212 \n",
" 0.74173 \n",
" 0.912351 \n",
" 0.498898 \n",
" 1.73749 \n",
" -0.957795 \n",
" -1.6923 \n",
" 0.755233 \n",
" -0.641461 \n",
" 0.900131 \n",
" -0.935381 \n",
" 3.06823 \n",
" 1.56476 \n",
" -1.35744 \n",
" -0.216156 \n",
" 0.712878 \n",
" 0.354701 \n",
" 0.95993 \n",
" -0.579386 \n",
" 1.98545 \n",
" -1.29011 \n",
" 0.108807 \n",
" -1.42794 \n",
" 0.140905 \n",
" -0.393444 \n",
" 0.078297 \n",
" -0.0525052 \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
" 7 \n",
" 2020-09-24T04:38:10Z \n",
" -0.303356 \n",
" 1.145 \n",
" -0.843639 \n",
" -1.04661 \n",
" 0.945826 \n",
" -1.8227 \n",
" 1.69451 \n",
" -0.465604 \n",
" -0.0954349 \n",
" -0.150239 \n",
" -1.00453 \n",
" -0.509581 \n",
" -1.0396 \n",
" 0.805069 \n",
" -0.0770889 \n",
" -0.649795 \n",
" -0.363229 \n",
" -0.307477 \n",
" -0.163633 \n",
" 0.00746885 \n",
" 0.208148 \n",
" 0.84297 \n",
" -0.20149 \n",
" 0.0761925 \n",
" -0.277275 \n",
" 0.0933392 \n",
" 0.497711 \n",
" 0.33648 \n",
" 17 \n",
" 0 \n",
" \n",
" \n",
" 8 \n",
" 2020-09-23T15:48:17Z \n",
" -0.46592 \n",
" 0.628365 \n",
" 1.44957 \n",
" 4.41735 \n",
" 1.03465 \n",
" 1.08391 \n",
" 0.103565 \n",
" -0.624355 \n",
" -0.22619 \n",
" 2.9792 \n",
" -1.31971 \n",
" -1.13684 \n",
" -0.027942 \n",
" -0.972251 \n",
" 0.758803 \n",
" -0.104912 \n",
" -0.462734 \n",
" 0.521972 \n",
" 1.0497 \n",
" -0.0554636 \n",
" 0.192156 \n",
" 1.23173 \n",
" -0.113115 \n",
" 0.603061 \n",
" -1.89004 \n",
" 0.0698536 \n",
" -0.907822 \n",
" -0.13317 \n",
" 11.31 \n",
" 0 \n",
" \n",
" \n",
" 9 \n",
" 2020-09-23T02:50:52Z \n",
" 0.271095 \n",
" -2.72049 \n",
" 0.427427 \n",
" -0.080256 \n",
" -2.07731 \n",
" 0.334682 \n",
" -0.620412 \n",
" 0.174167 \n",
" 0.0874801 \n",
" 0.347286 \n",
" 0.319218 \n",
" -0.528176 \n",
" -1.56046 \n",
" -0.28146 \n",
" -1.10355 \n",
" 1.18135 \n",
" 0.433565 \n",
" -0.623177 \n",
" 1.16548 \n",
" 1.06845 \n",
" 0.341998 \n",
" -0.188797 \n",
" -0.504412 \n",
" 0.0272953 \n",
" 0.140939 \n",
" -0.294037 \n",
" -0.0638468 \n",
" 0.102788 \n",
" 552.89 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" EVENT_TIMESTAMP va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz vaa vab amount EVENT_LABEL\n",
"0 2020-09-22T23:29:20Z 1.22664 0.101988 -0.0870724 0.111524 -0.281992 -1.35603 0.46905 -0.371725 -0.153672 -0.145105 -0.143505 0.320964 0.149313 0.452515 0.776253 0.0287393 -0.177867 -1.00475 0.264953 0.0196923 -0.3551 -1.15366 0.109793 0.420318 0.197932 0.699218 -0.114861 0.00758255 50.4 0\n",
"1 2020-09-23T14:39:30Z 1.12485 0.125602 0.249962 0.489744 -0.0403864 0.167561 -0.247614 0.284736 -0.0673023 -0.170139 1.89512 0.507733 -1.00865 0.187249 1.02166 0.13632 0.370186 -0.573559 -0.625413 -0.204465 -0.192467 -0.576819 0.190343 -0.357451 0.000869796 0.139971 -0.000993408 0.0115049 1.98 0\n",
"2 2020-09-23T12:33:02Z -0.307902 1.00371 1.40428 0.592627 0.311014 -0.382106 0.531393 -0.0152922 -0.758638 -0.511597 0.149643 0.245866 0.752802 -0.382214 1.59018 -0.332546 0.611852 -0.510495 0.563779 0.12522 -0.131802 -0.329268 0.04699 0.0574128 -0.65696 0.193192 0.142038 0.157501 1.98 0\n",
"3 2020-09-24T11:00:03Z 2.17492 -1.53544 -0.726428 -1.43079 -1.51726 -0.751038 -1.15534 -0.180811 -1.11188 1.5361 -0.735705 -0.771714 0.238603 -0.44705 -0.0858861 -0.568345 0.591162 -0.104975 -0.327292 -0.334351 -0.112766 0.0500184 0.294666 1.12332 -0.306025 -0.241343 0.00655296 -0.0275668 64 0\n",
"4 2020-09-24T12:42:48Z -2.22156 1.26199 2.04764 4.65927 -0.535941 4.54204 -3.71553 -5.3117 -0.955321 0.200601 -1.34262 0.879905 0.241171 -0.36554 -1.73541 0.564495 0.380648 1.21669 1.87271 0.89599 -1.82039 0.873723 -2.6486 -0.16218 -0.492111 0.60149 0.62703 0.088289 379.29 0\n",
"5 2020-09-23T23:13:57Z -0.335198 0.871378 0.632703 4.16424 1.70258 1.95435 0.396722 0.495056 -2.50602 1.60914 1.02925 -0.143569 -0.129187 0.862428 1.05951 -0.862144 0.597711 -0.509967 0.217672 0.260404 0.529635 1.47356 0.0334131 -1.33327 -0.779961 0.595196 0.231547 0.193332 57.78 0\n",
"6 2020-09-22T20:44:58Z -1.30598 1.77212 0.74173 0.912351 0.498898 1.73749 -0.957795 -1.6923 0.755233 -0.641461 0.900131 -0.935381 3.06823 1.56476 -1.35744 -0.216156 0.712878 0.354701 0.95993 -0.579386 1.98545 -1.29011 0.108807 -1.42794 0.140905 -0.393444 0.078297 -0.0525052 1 0\n",
"7 2020-09-24T04:38:10Z -0.303356 1.145 -0.843639 -1.04661 0.945826 -1.8227 1.69451 -0.465604 -0.0954349 -0.150239 -1.00453 -0.509581 -1.0396 0.805069 -0.0770889 -0.649795 -0.363229 -0.307477 -0.163633 0.00746885 0.208148 0.84297 -0.20149 0.0761925 -0.277275 0.0933392 0.497711 0.33648 17 0\n",
"8 2020-09-23T15:48:17Z -0.46592 0.628365 1.44957 4.41735 1.03465 1.08391 0.103565 -0.624355 -0.22619 2.9792 -1.31971 -1.13684 -0.027942 -0.972251 0.758803 -0.104912 -0.462734 0.521972 1.0497 -0.0554636 0.192156 1.23173 -0.113115 0.603061 -1.89004 0.0698536 -0.907822 -0.13317 11.31 0\n",
"9 2020-09-23T02:50:52Z 0.271095 -2.72049 0.427427 -0.080256 -2.07731 0.334682 -0.620412 0.174167 0.0874801 0.347286 0.319218 -0.528176 -1.56046 -0.28146 -1.10355 1.18135 0.433565 -0.623177 1.16548 1.06845 0.341998 -0.188797 -0.504412 0.0272953 0.140939 -0.294037 -0.0638468 0.102788 552.89 0"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"saved_cols = data.drop('EVENT_LABEL', axis=1).columns\n",
"print(saved_cols)\n",
"data = pd.DataFrame(X, columns = saved_cols)\n",
"data['EVENT_LABEL']=y.astype(int)\n",
"data.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" EVENT_TIMESTAMP \n",
" va \n",
" vb \n",
" vc \n",
" vd \n",
" ve \n",
" vf \n",
" vg \n",
" vh \n",
" vi \n",
" vj \n",
" vk \n",
" vl \n",
" vm \n",
" vn \n",
" vo \n",
" vp \n",
" vq \n",
" vr \n",
" vs \n",
" vt \n",
" vu \n",
" vv \n",
" vw \n",
" vx \n",
" vy \n",
" vz \n",
" vaa \n",
" vab \n",
" amount \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2020-09-23T03:05:50Z \n",
" -16.5265 \n",
" 8.58497 \n",
" -18.6499 \n",
" 9.50559 \n",
" -13.7938 \n",
" -2.8324 \n",
" -16.7017 \n",
" 7.51734 \n",
" -8.50706 \n",
" -14.1102 \n",
" 5.29924 \n",
" -10.834 \n",
" 1.67112 \n",
" -9.37386 \n",
" 0.360806 \n",
" -9.89925 \n",
" -19.2363 \n",
" -8.39855 \n",
" 3.10174 \n",
" -1.51492 \n",
" 1.19074 \n",
" -1.12767 \n",
" -2.35858 \n",
" 0.673461 \n",
" -1.4137 \n",
" -0.462762 \n",
" -2.01858 \n",
" -1.0428 \n",
" 364.19 \n",
" \n",
" \n",
" 1 \n",
" 2020-09-23T03:51:46Z \n",
" 0.339812 \n",
" -2.74375 \n",
" -0.13407 \n",
" -1.38573 \n",
" -1.45141 \n",
" 1.01589 \n",
" -0.524379 \n",
" 0.22406 \n",
" 0.899746 \n",
" -0.565012 \n",
" -0.0876703 \n",
" 0.979427 \n",
" 0.0768828 \n",
" -0.217884 \n",
" -0.13683 \n",
" -2.14289 \n",
" 0.126956 \n",
" 1.75266 \n",
" 0.432546 \n",
" 0.506044 \n",
" -0.213436 \n",
" -0.942525 \n",
" -0.526819 \n",
" -1.15699 \n",
" 0.311211 \n",
" -0.746647 \n",
" 0.0409958 \n",
" 0.102038 \n",
" 520.12 \n",
" \n",
" \n",
" 2 \n",
" 2020-09-23T01:25:29Z \n",
" 1.39959 \n",
" -0.590701 \n",
" 0.168619 \n",
" -1.02995 \n",
" -0.539806 \n",
" 0.0404441 \n",
" -0.712567 \n",
" 0.00229859 \n",
" -0.971747 \n",
" 0.756801 \n",
" 0.543827 \n",
" 0.112453 \n",
" 1.07538 \n",
" -0.245772 \n",
" 0.180483 \n",
" 1.76986 \n",
" -0.533172 \n",
" -0.5333 \n",
" 1.19225 \n",
" 0.212877 \n",
" 0.102398 \n",
" 0.168269 \n",
" -0.166639 \n",
" -0.81025 \n",
" 0.505083 \n",
" -0.23234 \n",
" 0.0114086 \n",
" 0.00463414 \n",
" 31 \n",
" \n",
" \n",
" 3 \n",
" 2020-09-24T13:59:28Z \n",
" -0.432071 \n",
" 1.6479 \n",
" -1.66936 \n",
" -0.349504 \n",
" 0.785785 \n",
" -0.630647 \n",
" 0.27699 \n",
" 0.586025 \n",
" -0.484715 \n",
" -1.37665 \n",
" -1.32834 \n",
" 0.223621 \n",
" 1.13263 \n",
" -0.550875 \n",
" 0.616568 \n",
" 0.497974 \n",
" 0.502195 \n",
" 0.981343 \n",
" 0.101264 \n",
" -0.244633 \n",
" 0.358932 \n",
" 0.873663 \n",
" -0.178642 \n",
" -0.0171708 \n",
" -0.207392 \n",
" -0.157756 \n",
" -0.237386 \n",
" 0.00193412 \n",
" 1.5 \n",
" \n",
" \n",
" 4 \n",
" 2020-09-24T14:21:58Z \n",
" 2.01416 \n",
" -0.137394 \n",
" -1.01584 \n",
" 0.327269 \n",
" -0.182179 \n",
" -0.956571 \n",
" 0.0432408 \n",
" -0.160746 \n",
" 0.363241 \n",
" 0.259452 \n",
" 0.942162 \n",
" 0.850038 \n",
" -0.616166 \n",
" 0.592634 \n",
" -0.603845 \n",
" 0.0910772 \n",
" -0.471867 \n",
" -0.333816 \n",
" 0.404711 \n",
" -0.255293 \n",
" -0.238644 \n",
" -0.6164 \n",
" 0.347045 \n",
" 0.0615612 \n",
" -0.360196 \n",
" 0.17473 \n",
" -0.0780435 \n",
" -0.0705705 \n",
" 0.89 \n",
" \n",
" \n",
" 5 \n",
" 2020-09-23T10:25:23Z \n",
" -0.64133 \n",
" -0.0573039 \n",
" 1.49 \n",
" -1.68813 \n",
" -1.15104 \n",
" 0.259996 \n",
" -1.39107 \n",
" -2.33408 \n",
" 1.16864 \n",
" -2.08408 \n",
" 0.480381 \n",
" 0.473738 \n",
" -2.19228 \n",
" 0.773942 \n",
" 0.294484 \n",
" 0.406074 \n",
" -0.541855 \n",
" 1.03145 \n",
" 0.0170758 \n",
" 0.618411 \n",
" -1.23163 \n",
" 0.257164 \n",
" -0.371953 \n",
" -0.0385661 \n",
" 1.39751 \n",
" -0.665947 \n",
" 0.031003 \n",
" 0.180357 \n",
" 100 \n",
" \n",
" \n",
" 6 \n",
" 2020-09-24T11:56:48Z \n",
" 2.02395 \n",
" -0.12014 \n",
" -1.08692 \n",
" 0.423019 \n",
" -0.142901 \n",
" -1.12775 \n",
" 0.178493 \n",
" -0.303234 \n",
" 0.564509 \n",
" 0.0628307 \n",
" -0.720047 \n",
" 0.366835 \n",
" -0.110857 \n",
" 0.319094 \n",
" 0.108359 \n",
" -0.153633 \n",
" -0.221312 \n",
" -0.934141 \n",
" 0.0705527 \n",
" -0.210864 \n",
" -0.276175 \n",
" -0.697708 \n",
" 0.335631 \n",
" -0.0171964 \n",
" -0.324904 \n",
" 0.200023 \n",
" -0.071566 \n",
" -0.0582239 \n",
" 16.99 \n",
" \n",
" \n",
" 7 \n",
" 2020-09-24T06:21:16Z \n",
" -0.688944 \n",
" 1.29215 \n",
" -0.564281 \n",
" -1.45753 \n",
" 2.25833 \n",
" -0.32327 \n",
" 1.67898 \n",
" -0.104128 \n",
" -1.28535 \n",
" -1.30343 \n",
" 0.282728 \n",
" -0.402525 \n",
" -0.548687 \n",
" -0.504283 \n",
" -0.685339 \n",
" 0.714828 \n",
" -0.0926736 \n",
" 0.798953 \n",
" -0.150085 \n",
" -0.0371504 \n",
" -0.00687953 \n",
" -0.171568 \n",
" -0.720019 \n",
" -0.419435 \n",
" 1.21199 \n",
" 0.670916 \n",
" -0.103986 \n",
" 0.0300842 \n",
" 8.95 \n",
" \n",
" \n",
" 8 \n",
" 2020-09-24T04:46:29Z \n",
" 2.11936 \n",
" 0.142639 \n",
" -2.37334 \n",
" 0.541949 \n",
" 0.608419 \n",
" -1.77556 \n",
" 0.955775 \n",
" -0.599383 \n",
" 0.0104198 \n",
" 0.295305 \n",
" -0.936569 \n",
" -0.452478 \n",
" -1.3408 \n",
" 1.07746 \n",
" -0.0995836 \n",
" -0.815072 \n",
" 0.0184811 \n",
" -0.639446 \n",
" -0.0654267 \n",
" -0.323573 \n",
" 0.264264 \n",
" 0.898266 \n",
" -0.168063 \n",
" 0.0593112 \n",
" 0.626949 \n",
" 0.729035 \n",
" -0.12912 \n",
" -0.0947133 \n",
" 10 \n",
" \n",
" \n",
" 9 \n",
" 2020-09-23T07:53:34Z \n",
" -5.58426 \n",
" -4.73241 \n",
" -0.448452 \n",
" -0.121442 \n",
" -0.707412 \n",
" -0.114376 \n",
" -1.55463 \n",
" 1.40213 \n",
" -0.0316932 \n",
" -0.942358 \n",
" -2.4395 \n",
" -0.552312 \n",
" -0.295588 \n",
" -0.250246 \n",
" -1.19773 \n",
" 1.54955 \n",
" 0.933237 \n",
" -1.23769 \n",
" 0.416832 \n",
" -1.0469 \n",
" 0.0416507 \n",
" 0.621789 \n",
" 0.223467 \n",
" -0.770137 \n",
" 0.621182 \n",
" -0.0287379 \n",
" 0.505194 \n",
" -1.89832 \n",
" 101.49 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" EVENT_TIMESTAMP va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz vaa vab amount\n",
"0 2020-09-23T03:05:50Z -16.5265 8.58497 -18.6499 9.50559 -13.7938 -2.8324 -16.7017 7.51734 -8.50706 -14.1102 5.29924 -10.834 1.67112 -9.37386 0.360806 -9.89925 -19.2363 -8.39855 3.10174 -1.51492 1.19074 -1.12767 -2.35858 0.673461 -1.4137 -0.462762 -2.01858 -1.0428 364.19\n",
"1 2020-09-23T03:51:46Z 0.339812 -2.74375 -0.13407 -1.38573 -1.45141 1.01589 -0.524379 0.22406 0.899746 -0.565012 -0.0876703 0.979427 0.0768828 -0.217884 -0.13683 -2.14289 0.126956 1.75266 0.432546 0.506044 -0.213436 -0.942525 -0.526819 -1.15699 0.311211 -0.746647 0.0409958 0.102038 520.12\n",
"2 2020-09-23T01:25:29Z 1.39959 -0.590701 0.168619 -1.02995 -0.539806 0.0404441 -0.712567 0.00229859 -0.971747 0.756801 0.543827 0.112453 1.07538 -0.245772 0.180483 1.76986 -0.533172 -0.5333 1.19225 0.212877 0.102398 0.168269 -0.166639 -0.81025 0.505083 -0.23234 0.0114086 0.00463414 31\n",
"3 2020-09-24T13:59:28Z -0.432071 1.6479 -1.66936 -0.349504 0.785785 -0.630647 0.27699 0.586025 -0.484715 -1.37665 -1.32834 0.223621 1.13263 -0.550875 0.616568 0.497974 0.502195 0.981343 0.101264 -0.244633 0.358932 0.873663 -0.178642 -0.0171708 -0.207392 -0.157756 -0.237386 0.00193412 1.5\n",
"4 2020-09-24T14:21:58Z 2.01416 -0.137394 -1.01584 0.327269 -0.182179 -0.956571 0.0432408 -0.160746 0.363241 0.259452 0.942162 0.850038 -0.616166 0.592634 -0.603845 0.0910772 -0.471867 -0.333816 0.404711 -0.255293 -0.238644 -0.6164 0.347045 0.0615612 -0.360196 0.17473 -0.0780435 -0.0705705 0.89\n",
"5 2020-09-23T10:25:23Z -0.64133 -0.0573039 1.49 -1.68813 -1.15104 0.259996 -1.39107 -2.33408 1.16864 -2.08408 0.480381 0.473738 -2.19228 0.773942 0.294484 0.406074 -0.541855 1.03145 0.0170758 0.618411 -1.23163 0.257164 -0.371953 -0.0385661 1.39751 -0.665947 0.031003 0.180357 100\n",
"6 2020-09-24T11:56:48Z 2.02395 -0.12014 -1.08692 0.423019 -0.142901 -1.12775 0.178493 -0.303234 0.564509 0.0628307 -0.720047 0.366835 -0.110857 0.319094 0.108359 -0.153633 -0.221312 -0.934141 0.0705527 -0.210864 -0.276175 -0.697708 0.335631 -0.0171964 -0.324904 0.200023 -0.071566 -0.0582239 16.99\n",
"7 2020-09-24T06:21:16Z -0.688944 1.29215 -0.564281 -1.45753 2.25833 -0.32327 1.67898 -0.104128 -1.28535 -1.30343 0.282728 -0.402525 -0.548687 -0.504283 -0.685339 0.714828 -0.0926736 0.798953 -0.150085 -0.0371504 -0.00687953 -0.171568 -0.720019 -0.419435 1.21199 0.670916 -0.103986 0.0300842 8.95\n",
"8 2020-09-24T04:46:29Z 2.11936 0.142639 -2.37334 0.541949 0.608419 -1.77556 0.955775 -0.599383 0.0104198 0.295305 -0.936569 -0.452478 -1.3408 1.07746 -0.0995836 -0.815072 0.0184811 -0.639446 -0.0654267 -0.323573 0.264264 0.898266 -0.168063 0.0593112 0.626949 0.729035 -0.12912 -0.0947133 10\n",
"9 2020-09-23T07:53:34Z -5.58426 -4.73241 -0.448452 -0.121442 -0.707412 -0.114376 -1.55463 1.40213 -0.0316932 -0.942358 -2.4395 -0.552312 -0.295588 -0.250246 -1.19773 1.54955 0.933237 -1.23769 0.416832 -1.0469 0.0416507 0.621789 0.223467 -0.770137 0.621182 -0.0287379 0.505194 -1.89832 101.49"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test = pd.DataFrame(X_test, columns = saved_cols)\n",
"test.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" EVENT_TIMESTAMP \n",
" va \n",
" vb \n",
" vc \n",
" vd \n",
" ve \n",
" vf \n",
" vg \n",
" vh \n",
" vi \n",
" vj \n",
" vk \n",
" vl \n",
" vm \n",
" vn \n",
" vo \n",
" vp \n",
" vq \n",
" vr \n",
" vs \n",
" vt \n",
" vu \n",
" vv \n",
" vw \n",
" vx \n",
" vy \n",
" vz \n",
" vaa \n",
" vab \n",
" amount \n",
" EVENT_LABEL \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2020-09-23T03:05:50Z \n",
" -16.5265 \n",
" 8.58497 \n",
" -18.6499 \n",
" 9.50559 \n",
" -13.7938 \n",
" -2.8324 \n",
" -16.7017 \n",
" 7.51734 \n",
" -8.50706 \n",
" -14.1102 \n",
" 5.29924 \n",
" -10.834 \n",
" 1.67112 \n",
" -9.37386 \n",
" 0.360806 \n",
" -9.89925 \n",
" -19.2363 \n",
" -8.39855 \n",
" 3.10174 \n",
" -1.51492 \n",
" 1.19074 \n",
" -1.12767 \n",
" -2.35858 \n",
" 0.673461 \n",
" -1.4137 \n",
" -0.462762 \n",
" -2.01858 \n",
" -1.0428 \n",
" 364.19 \n",
" 1 \n",
" \n",
" \n",
" 1 \n",
" 2020-09-23T03:51:46Z \n",
" 0.339812 \n",
" -2.74375 \n",
" -0.13407 \n",
" -1.38573 \n",
" -1.45141 \n",
" 1.01589 \n",
" -0.524379 \n",
" 0.22406 \n",
" 0.899746 \n",
" -0.565012 \n",
" -0.0876703 \n",
" 0.979427 \n",
" 0.0768828 \n",
" -0.217884 \n",
" -0.13683 \n",
" -2.14289 \n",
" 0.126956 \n",
" 1.75266 \n",
" 0.432546 \n",
" 0.506044 \n",
" -0.213436 \n",
" -0.942525 \n",
" -0.526819 \n",
" -1.15699 \n",
" 0.311211 \n",
" -0.746647 \n",
" 0.0409958 \n",
" 0.102038 \n",
" 520.12 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 2020-09-23T01:25:29Z \n",
" 1.39959 \n",
" -0.590701 \n",
" 0.168619 \n",
" -1.02995 \n",
" -0.539806 \n",
" 0.0404441 \n",
" -0.712567 \n",
" 0.00229859 \n",
" -0.971747 \n",
" 0.756801 \n",
" 0.543827 \n",
" 0.112453 \n",
" 1.07538 \n",
" -0.245772 \n",
" 0.180483 \n",
" 1.76986 \n",
" -0.533172 \n",
" -0.5333 \n",
" 1.19225 \n",
" 0.212877 \n",
" 0.102398 \n",
" 0.168269 \n",
" -0.166639 \n",
" -0.81025 \n",
" 0.505083 \n",
" -0.23234 \n",
" 0.0114086 \n",
" 0.00463414 \n",
" 31 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 2020-09-24T13:59:28Z \n",
" -0.432071 \n",
" 1.6479 \n",
" -1.66936 \n",
" -0.349504 \n",
" 0.785785 \n",
" -0.630647 \n",
" 0.27699 \n",
" 0.586025 \n",
" -0.484715 \n",
" -1.37665 \n",
" -1.32834 \n",
" 0.223621 \n",
" 1.13263 \n",
" -0.550875 \n",
" 0.616568 \n",
" 0.497974 \n",
" 0.502195 \n",
" 0.981343 \n",
" 0.101264 \n",
" -0.244633 \n",
" 0.358932 \n",
" 0.873663 \n",
" -0.178642 \n",
" -0.0171708 \n",
" -0.207392 \n",
" -0.157756 \n",
" -0.237386 \n",
" 0.00193412 \n",
" 1.5 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 2020-09-24T14:21:58Z \n",
" 2.01416 \n",
" -0.137394 \n",
" -1.01584 \n",
" 0.327269 \n",
" -0.182179 \n",
" -0.956571 \n",
" 0.0432408 \n",
" -0.160746 \n",
" 0.363241 \n",
" 0.259452 \n",
" 0.942162 \n",
" 0.850038 \n",
" -0.616166 \n",
" 0.592634 \n",
" -0.603845 \n",
" 0.0910772 \n",
" -0.471867 \n",
" -0.333816 \n",
" 0.404711 \n",
" -0.255293 \n",
" -0.238644 \n",
" -0.6164 \n",
" 0.347045 \n",
" 0.0615612 \n",
" -0.360196 \n",
" 0.17473 \n",
" -0.0780435 \n",
" -0.0705705 \n",
" 0.89 \n",
" 0 \n",
" \n",
" \n",
" 5 \n",
" 2020-09-23T10:25:23Z \n",
" -0.64133 \n",
" -0.0573039 \n",
" 1.49 \n",
" -1.68813 \n",
" -1.15104 \n",
" 0.259996 \n",
" -1.39107 \n",
" -2.33408 \n",
" 1.16864 \n",
" -2.08408 \n",
" 0.480381 \n",
" 0.473738 \n",
" -2.19228 \n",
" 0.773942 \n",
" 0.294484 \n",
" 0.406074 \n",
" -0.541855 \n",
" 1.03145 \n",
" 0.0170758 \n",
" 0.618411 \n",
" -1.23163 \n",
" 0.257164 \n",
" -0.371953 \n",
" -0.0385661 \n",
" 1.39751 \n",
" -0.665947 \n",
" 0.031003 \n",
" 0.180357 \n",
" 100 \n",
" 0 \n",
" \n",
" \n",
" 6 \n",
" 2020-09-24T11:56:48Z \n",
" 2.02395 \n",
" -0.12014 \n",
" -1.08692 \n",
" 0.423019 \n",
" -0.142901 \n",
" -1.12775 \n",
" 0.178493 \n",
" -0.303234 \n",
" 0.564509 \n",
" 0.0628307 \n",
" -0.720047 \n",
" 0.366835 \n",
" -0.110857 \n",
" 0.319094 \n",
" 0.108359 \n",
" -0.153633 \n",
" -0.221312 \n",
" -0.934141 \n",
" 0.0705527 \n",
" -0.210864 \n",
" -0.276175 \n",
" -0.697708 \n",
" 0.335631 \n",
" -0.0171964 \n",
" -0.324904 \n",
" 0.200023 \n",
" -0.071566 \n",
" -0.0582239 \n",
" 16.99 \n",
" 0 \n",
" \n",
" \n",
" 7 \n",
" 2020-09-24T06:21:16Z \n",
" -0.688944 \n",
" 1.29215 \n",
" -0.564281 \n",
" -1.45753 \n",
" 2.25833 \n",
" -0.32327 \n",
" 1.67898 \n",
" -0.104128 \n",
" -1.28535 \n",
" -1.30343 \n",
" 0.282728 \n",
" -0.402525 \n",
" -0.548687 \n",
" -0.504283 \n",
" -0.685339 \n",
" 0.714828 \n",
" -0.0926736 \n",
" 0.798953 \n",
" -0.150085 \n",
" -0.0371504 \n",
" -0.00687953 \n",
" -0.171568 \n",
" -0.720019 \n",
" -0.419435 \n",
" 1.21199 \n",
" 0.670916 \n",
" -0.103986 \n",
" 0.0300842 \n",
" 8.95 \n",
" 0 \n",
" \n",
" \n",
" 8 \n",
" 2020-09-24T04:46:29Z \n",
" 2.11936 \n",
" 0.142639 \n",
" -2.37334 \n",
" 0.541949 \n",
" 0.608419 \n",
" -1.77556 \n",
" 0.955775 \n",
" -0.599383 \n",
" 0.0104198 \n",
" 0.295305 \n",
" -0.936569 \n",
" -0.452478 \n",
" -1.3408 \n",
" 1.07746 \n",
" -0.0995836 \n",
" -0.815072 \n",
" 0.0184811 \n",
" -0.639446 \n",
" -0.0654267 \n",
" -0.323573 \n",
" 0.264264 \n",
" 0.898266 \n",
" -0.168063 \n",
" 0.0593112 \n",
" 0.626949 \n",
" 0.729035 \n",
" -0.12912 \n",
" -0.0947133 \n",
" 10 \n",
" 0 \n",
" \n",
" \n",
" 9 \n",
" 2020-09-23T07:53:34Z \n",
" -5.58426 \n",
" -4.73241 \n",
" -0.448452 \n",
" -0.121442 \n",
" -0.707412 \n",
" -0.114376 \n",
" -1.55463 \n",
" 1.40213 \n",
" -0.0316932 \n",
" -0.942358 \n",
" -2.4395 \n",
" -0.552312 \n",
" -0.295588 \n",
" -0.250246 \n",
" -1.19773 \n",
" 1.54955 \n",
" 0.933237 \n",
" -1.23769 \n",
" 0.416832 \n",
" -1.0469 \n",
" 0.0416507 \n",
" 0.621789 \n",
" 0.223467 \n",
" -0.770137 \n",
" 0.621182 \n",
" -0.0287379 \n",
" 0.505194 \n",
" -1.89832 \n",
" 101.49 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" EVENT_TIMESTAMP va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz vaa vab amount EVENT_LABEL\n",
"0 2020-09-23T03:05:50Z -16.5265 8.58497 -18.6499 9.50559 -13.7938 -2.8324 -16.7017 7.51734 -8.50706 -14.1102 5.29924 -10.834 1.67112 -9.37386 0.360806 -9.89925 -19.2363 -8.39855 3.10174 -1.51492 1.19074 -1.12767 -2.35858 0.673461 -1.4137 -0.462762 -2.01858 -1.0428 364.19 1\n",
"1 2020-09-23T03:51:46Z 0.339812 -2.74375 -0.13407 -1.38573 -1.45141 1.01589 -0.524379 0.22406 0.899746 -0.565012 -0.0876703 0.979427 0.0768828 -0.217884 -0.13683 -2.14289 0.126956 1.75266 0.432546 0.506044 -0.213436 -0.942525 -0.526819 -1.15699 0.311211 -0.746647 0.0409958 0.102038 520.12 0\n",
"2 2020-09-23T01:25:29Z 1.39959 -0.590701 0.168619 -1.02995 -0.539806 0.0404441 -0.712567 0.00229859 -0.971747 0.756801 0.543827 0.112453 1.07538 -0.245772 0.180483 1.76986 -0.533172 -0.5333 1.19225 0.212877 0.102398 0.168269 -0.166639 -0.81025 0.505083 -0.23234 0.0114086 0.00463414 31 0\n",
"3 2020-09-24T13:59:28Z -0.432071 1.6479 -1.66936 -0.349504 0.785785 -0.630647 0.27699 0.586025 -0.484715 -1.37665 -1.32834 0.223621 1.13263 -0.550875 0.616568 0.497974 0.502195 0.981343 0.101264 -0.244633 0.358932 0.873663 -0.178642 -0.0171708 -0.207392 -0.157756 -0.237386 0.00193412 1.5 0\n",
"4 2020-09-24T14:21:58Z 2.01416 -0.137394 -1.01584 0.327269 -0.182179 -0.956571 0.0432408 -0.160746 0.363241 0.259452 0.942162 0.850038 -0.616166 0.592634 -0.603845 0.0910772 -0.471867 -0.333816 0.404711 -0.255293 -0.238644 -0.6164 0.347045 0.0615612 -0.360196 0.17473 -0.0780435 -0.0705705 0.89 0\n",
"5 2020-09-23T10:25:23Z -0.64133 -0.0573039 1.49 -1.68813 -1.15104 0.259996 -1.39107 -2.33408 1.16864 -2.08408 0.480381 0.473738 -2.19228 0.773942 0.294484 0.406074 -0.541855 1.03145 0.0170758 0.618411 -1.23163 0.257164 -0.371953 -0.0385661 1.39751 -0.665947 0.031003 0.180357 100 0\n",
"6 2020-09-24T11:56:48Z 2.02395 -0.12014 -1.08692 0.423019 -0.142901 -1.12775 0.178493 -0.303234 0.564509 0.0628307 -0.720047 0.366835 -0.110857 0.319094 0.108359 -0.153633 -0.221312 -0.934141 0.0705527 -0.210864 -0.276175 -0.697708 0.335631 -0.0171964 -0.324904 0.200023 -0.071566 -0.0582239 16.99 0\n",
"7 2020-09-24T06:21:16Z -0.688944 1.29215 -0.564281 -1.45753 2.25833 -0.32327 1.67898 -0.104128 -1.28535 -1.30343 0.282728 -0.402525 -0.548687 -0.504283 -0.685339 0.714828 -0.0926736 0.798953 -0.150085 -0.0371504 -0.00687953 -0.171568 -0.720019 -0.419435 1.21199 0.670916 -0.103986 0.0300842 8.95 0\n",
"8 2020-09-24T04:46:29Z 2.11936 0.142639 -2.37334 0.541949 0.608419 -1.77556 0.955775 -0.599383 0.0104198 0.295305 -0.936569 -0.452478 -1.3408 1.07746 -0.0995836 -0.815072 0.0184811 -0.639446 -0.0654267 -0.323573 0.264264 0.898266 -0.168063 0.0593112 0.626949 0.729035 -0.12912 -0.0947133 10 0\n",
"9 2020-09-23T07:53:34Z -5.58426 -4.73241 -0.448452 -0.121442 -0.707412 -0.114376 -1.55463 1.40213 -0.0316932 -0.942358 -2.4395 -0.552312 -0.295588 -0.250246 -1.19773 1.54955 0.933237 -1.23769 0.416832 -1.0469 0.0416507 0.621789 0.223467 -0.770137 0.621182 -0.0287379 0.505194 -1.89832 101.49 0"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# The testing dataset with the labels to perform evaluations latter on\n",
"test_label = pd.DataFrame(X_test, columns = saved_cols)\n",
"test_label['EVENT_LABEL']=y_test.astype(int)\n",
"test_label.head()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of frauds in test data: 46\n",
"Number of non-frauds in test data: 28435\n",
"Percentage of fradulent data: 0.16151118289385907\n"
]
}
],
"source": [
"#validating the test dataset with labels\n",
"nonfrauds, frauds = test_label.groupby('EVENT_LABEL').size()\n",
"print('Number of frauds in test data: ', frauds)\n",
"print('Number of non-frauds in test data: ', nonfrauds)\n",
"print('Percentage of fradulent data:', 100.*frauds/(frauds + nonfrauds))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of frauds: 446\n",
"Number of non-frauds: 255880\n",
"Percentage of fradulent data: 0.17399717547186005\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#validating the training dataset\n",
"nonfrauds, frauds = data.groupby('EVENT_LABEL').size()\n",
"print('Number of frauds: ', frauds)\n",
"print('Number of non-frauds: ', nonfrauds)\n",
"print('Percentage of fradulent data:', 100.*frauds/(frauds + nonfrauds))\n",
"\n",
"count_class_0, count_class_1 = data.EVENT_LABEL.value_counts()\n",
"data.EVENT_LABEL.value_counts().plot(kind='bar', title='Count (EVENT_LABEL)');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Uploading the data for training"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'ResponseMetadata': {'RequestId': 'CE5955583F8DEF3F',\n",
" 'HostId': '9KFf1TqYSU63r33be9Rr6yi3KLpN8eZUEl1bPIaSHbT25EZXtnOG/0nHiFO7lgSAMBXq/qHd6zE=',\n",
" 'HTTPStatusCode': 200,\n",
" 'HTTPHeaders': {'x-amz-id-2': '9KFf1TqYSU63r33be9Rr6yi3KLpN8eZUEl1bPIaSHbT25EZXtnOG/0nHiFO7lgSAMBXq/qHd6zE=',\n",
" 'x-amz-request-id': 'CE5955583F8DEF3F',\n",
" 'date': 'Tue, 22 Sep 2020 15:49:02 GMT',\n",
" 'x-amz-server-side-encryption': 'AES256',\n",
" 'etag': '\"d28f6b034afe0855dc3140edf895eb29\"',\n",
" 'content-length': '0',\n",
" 'server': 'AmazonS3'},\n",
" 'RetryAttempts': 0},\n",
" 'ETag': '\"d28f6b034afe0855dc3140edf895eb29\"',\n",
" 'ServerSideEncryption': 'AES256'}"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_buffer = StringIO()\n",
"data.to_csv(csv_buffer, index=False)\n",
"s3_resource.Object(S3_BUCKET, 'dataset-training.csv').put(Body=csv_buffer.getvalue())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Uploading the data for testing"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'ResponseMetadata': {'RequestId': '4YAJCW9VAM8XFR4Y',\n",
" 'HostId': 'ytH2B37HSHmc1uJeMhHErSg02Zv+MOZa5YrJwrkAZQkTsL9qMOhgWQ3Wwhuufgd58WdWdTSVLto=',\n",
" 'HTTPStatusCode': 200,\n",
" 'HTTPHeaders': {'x-amz-id-2': 'ytH2B37HSHmc1uJeMhHErSg02Zv+MOZa5YrJwrkAZQkTsL9qMOhgWQ3Wwhuufgd58WdWdTSVLto=',\n",
" 'x-amz-request-id': '4YAJCW9VAM8XFR4Y',\n",
" 'date': 'Tue, 22 Sep 2020 15:49:08 GMT',\n",
" 'x-amz-server-side-encryption': 'AES256',\n",
" 'etag': '\"d097d1d2e99495c26975acad965d81a5\"',\n",
" 'content-length': '0',\n",
" 'server': 'AmazonS3'},\n",
" 'RetryAttempts': 0},\n",
" 'ETag': '\"d097d1d2e99495c26975acad965d81a5\"',\n",
" 'ServerSideEncryption': 'AES256'}"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csv_buffer = StringIO()\n",
"test.to_csv(csv_buffer, index=False)\n",
"\n",
"s3_resource.Object(S3_BUCKET, 'dataset-test.csv').put(Body=csv_buffer.getvalue())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once we have the datasets ready we need create the necesary entities for build and deploy the fraud detection model. This can be done within the Amazon Fraud Detector console visually or through the API as shown in the following seccion."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"# -- This is all you need to fill out. Once complete simply interactively run each code cell. -- \n",
"# your_entity_name\n",
"ENTITY_TYPE = \"creditcardtrans{0}\".format(sufx) \n",
"ENTITY_DESC = \"creditcard transactions: {0}\".format(sufx) \n",
"# your_event_type\n",
"EVENT_TYPE = \"creditcard{0}\".format(sufx) \n",
"EVENT_DESC = \"creditcard card payment events: {0}\".format(sufx) \n",
"# your_model_name\n",
"MODEL_NAME = \"fraud_detector_model{0}\".format(sufx) \n",
"MODEL_DESC = \"model trained on: {0}\".format(sufx) \n",
"# your_detector_name\n",
"DETECTOR_NAME = \"fraud_detector_endpoint{0}\".format(sufx) \n",
"DETECTOR_DESC = \"detects synthetic fraud events created: {0}\".format(sufx) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. Profile Your Dataset \n",
"-----\n",
"\n",
" \n",
" đź’ˇ Profiling \n",
"\n",
"The function below will: 1. profile your data, creating descriptive statistics, 2. perform basic data quality checks (nulls, unique variables, etc.), and 3. return summary statistics and the EVENT and MODEL schemas used to define your EVENT_TYPE and TRAIN your MODEL.\n",
"\n",
"\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- summary stats ---\n",
" feature_name dtype count nunique null not_null null_pct nunique_pct feature_type feature_warning\n",
"0 EVENT_TIMESTAMP object 256326 119735 0 256326 0.0 0.4671 EVENT_TIMESTAMP NO WARNING\n",
"1 va object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"2 vb object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"3 vc object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"4 vd object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"5 ve object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"6 vf object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"7 vg object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"8 vh object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"9 vi object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"10 vj object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"11 vk object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"12 vl object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"13 vm object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"14 vn object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"15 vo object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"16 vp object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"17 vq object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"18 vr object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"19 vs object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"20 vt object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"21 vu object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"22 vv object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"23 vw object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"24 vx object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"25 vy object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"26 vz object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"27 vaa object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"28 vab object 256326 248553 0 256326 0.0 0.9697 CATEGORY NO WARNING\n",
"29 amount object 256326 31154 0 256326 0.0 0.1215 PRICE NO WARNING\n",
"30 EVENT_LABEL int64 256326 2 0 256326 0.0 0.0000 TARGET NO WARNING\n",
"\n",
"\n",
"--- event variables ---\n",
"['va', 'vb', 'vc', 'vd', 've', 'vf', 'vg', 'vh', 'vi', 'vj', 'vk', 'vl', 'vm', 'vn', 'vo', 'vp', 'vq', 'vr', 'vs', 'vt', 'vu', 'vv', 'vw', 'vx', 'vy', 'vz', 'vaa', 'vab', 'amount']\n",
"\n",
"\n",
"--- event labels ---\n",
"[0, 1]\n",
"\n",
"\n",
"--- training data schema ---\n",
"{'modelVariables': ['va', 'vb', 'vc', 'vd', 've', 'vf', 'vg', 'vh', 'vi', 'vj', 'vk', 'vl', 'vm', 'vn', 'vo', 'vp', 'vq', 'vr', 'vs', 'vt', 'vu', 'vv', 'vw', 'vx', 'vy', 'vz', 'vaa', 'vab'], 'labelSchema': {'labelMapper': {'FRAUD': ['1'], 'LEGIT': ['0']}}}\n",
"\n",
"\n"
]
}
],
"source": [
"# --- no changes; just run this code block ---\n",
"def summary_stats(df):\n",
" \"\"\" Generate summary statistics for a panda's data frame \n",
" Args:\n",
" df (DataFrame): panda's dataframe to create summary statistics for.\n",
" Returns:\n",
" DataFrame of summary statistics, training data schema, event variables and event lables \n",
" \"\"\"\n",
" df = df.copy()\n",
" rowcnt = len(df)\n",
" df_s1 = df.agg(['count', 'nunique']).transpose().reset_index().rename(columns={\"index\":\"feature_name\"})\n",
" df_s1[\"null\"] = (rowcnt - df_s1[\"count\"]).astype('int64')\n",
" df_s1[\"not_null\"] = rowcnt - df_s1[\"null\"]\n",
" df_s1[\"null_pct\"] = df_s1[\"null\"] / rowcnt\n",
" df_s1[\"nunique_pct\"] = df_s1['nunique']/ rowcnt\n",
" dt = pd.DataFrame(df.dtypes).reset_index().rename(columns={\"index\":\"feature_name\", 0:\"dtype\"})\n",
" df_stats = pd.merge(dt, df_s1, on='feature_name', how='inner').round(4)\n",
" df_stats['nunique'] = df_stats['nunique'].astype('int64')\n",
" df_stats['count'] = df_stats['count'].astype('int64')\n",
" \n",
" # -- variable type mapper -- \n",
" df_stats['feature_type'] = \"UNKOWN\"\n",
" df_stats.loc[df_stats[\"dtype\"] == object, 'feature_type'] = \"CATEGORY\"\n",
" df_stats.loc[(df_stats[\"dtype\"] == \"int64\") | (df_stats[\"dtype\"] == \"float64\"), 'feature_type'] = \"NUMERIC\"\n",
" df_stats.loc[df_stats[\"feature_name\"].str.contains(\"ipaddress|ip_address|ipcli\"), 'feature_type'] = \"IP_ADDRESS\"\n",
" df_stats.loc[df_stats[\"feature_name\"].str.contains(\"email|email_address|emailaddr\"), 'feature_type'] = \"EMAIL_ADDRESS\"\n",
" df_stats.loc[df_stats[\"feature_name\"].str.contains(\"canal|channel\"), 'feature_type'] = \"USERAGENT\"\n",
" df_stats.loc[df_stats[\"feature_name\"].str.contains(\"monto|amount\"), 'feature_type'] = \"PRICE\"\n",
" df_stats.loc[df_stats[\"feature_name\"].str.contains(\"nomdes|name\"), 'feature_type'] = \"BILLING_NAME\"\n",
" df_stats.loc[df_stats[\"feature_name\"] == \"EVENT_LABEL\", 'feature_type'] = \"TARGET\"\n",
" df_stats.loc[df_stats[\"feature_name\"] == \"EVENT_TIMESTAMP\", 'feature_type'] = \"EVENT_TIMESTAMP\"\n",
" \n",
" # -- variable warnings -- \n",
" df_stats['feature_warning'] = \"NO WARNING\"\n",
" df_stats.loc[(df_stats[\"nunique\"] != 2) & (df_stats[\"feature_name\"] == \"EVENT_LABEL\"),'feature_warning' ] = \"LABEL WARNING, NON-BINARY EVENT LABEL\"\n",
" df_stats.loc[(df_stats[\"nunique_pct\"] > 0.97) & (df_stats['feature_type'] == \"CATEGORY\") ,'feature_warning' ] = \"EXCLUDE, GT 97% UNIQUE\"\n",
" df_stats.loc[(df_stats[\"null_pct\"] > 0.2) & (df_stats[\"null_pct\"] <= 0.5), 'feature_warning' ] = \"NULL WARNING, GT 20% MISSING\"\n",
" df_stats.loc[df_stats[\"null_pct\"] > 0.5,'feature_warning' ] = \"EXCLUDE, GT 50% MISSING\"\n",
" df_stats.loc[((df_stats['dtype'] == \"int64\" ) | (df_stats['dtype'] == \"float64\" ) ) & (df_stats['nunique'] < 0.2), 'feature_warning' ] = \"LIKELY CATEGORICAL, NUMERIC w. LOW CARDINALITY\"\n",
" \n",
" # -- target check -- \n",
" exclude_fields = df_stats.loc[(df_stats['feature_warning'] != 'NO WARNING')]['feature_name'].to_list()\n",
" event_variables = df_stats.loc[(~df_stats['feature_name'].isin(['EVENT_LABEL', 'EVENT_TIMESTAMP']))]['feature_name'].to_list()\n",
" event_labels = df[\"EVENT_LABEL\"].unique().tolist()\n",
" \n",
" trainingDataSchema = {\n",
" 'modelVariables' : df_stats.loc[(df_stats['feature_type'].isin(['IP_ADDRESS', 'EMAIL_ADDRESS', 'CATEGORY', 'NUMERIC' ]))]['feature_name'].to_list(),\n",
" 'labelSchema' : {\n",
" 'labelMapper' : {\n",
" 'FRAUD' : [str(df[\"EVENT_LABEL\"].value_counts().idxmin())],\n",
" 'LEGIT' : [str(df[\"EVENT_LABEL\"].value_counts().idxmax())]\n",
" }\n",
" }\n",
" }\n",
" \n",
" \n",
" model_variables = df_stats.loc[(df_stats['feature_type'].isin(['IP_ADDRESS', 'EMAIL_ADDRESS', 'CATEGORY', 'NUMERIC' ]))]['feature_name'].to_list()\n",
" \n",
" \n",
" # -- label schema -- \n",
" label_map = {\n",
" 'FRAUD' : [df[\"EVENT_LABEL\"].value_counts().idxmin()],\n",
" 'LEGIT' : [df[\"EVENT_LABEL\"].value_counts().idxmax()]\n",
" }\n",
" \n",
" \n",
" print(\"--- summary stats ---\")\n",
" print(df_stats)\n",
" print(\"\\n\")\n",
" print(\"--- event variables ---\")\n",
" print(event_variables)\n",
" print(\"\\n\")\n",
" print(\"--- event labels ---\")\n",
" print(event_labels)\n",
" print(\"\\n\")\n",
" print(\"--- training data schema ---\")\n",
" print(trainingDataSchema)\n",
" print(\"\\n\")\n",
" \n",
" return df_stats, trainingDataSchema, event_variables, event_labels\n",
"\n",
"# -- connect to S3, snag file, and convert to a panda's dataframe --\n",
"#s3 = boto3.resource('s3')\n",
"#obj = s3.Object(S3_BUCKET, S3_FILE)\n",
"#body = obj.get()['Body']\n",
"#df = pd.read_csv(body)\n",
"\n",
"# -- call profiling function -- \n",
"df_stats, trainingDataSchema, eventVariables, eventLabels = summary_stats(data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. Create Variables\n",
"-----\n",
"\n",
" đź’ˇ Create Variables. \n",
"\n",
"The following section will automatically create your modeling input variables and your model scoring variable for you. \n",
"\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# --- no changes just run this code block ---\n",
"def create_label(df, FRAUD_LABEL):\n",
" \"\"\"\n",
" Returns a dictionary for the model labelSchema, by identifying the rare event as fraud / and common as not-fraud \n",
" \n",
" Arguments:\n",
" df -- input dataframe \n",
" FRAUD_LABEL -- the name of the field that contains fraud label \n",
" \n",
" Returns:\n",
" labelSchema -- a dictionary containing labelKey & labelMapper \n",
" \"\"\"\n",
" label_summary = df[FRAUD_LABEL].value_counts()\n",
" labelSchema = {'labelKey': FRAUD_LABEL,\n",
" \"labelMapper\" : { \"FRAUD\": [str(label_summary.idxmin())], \n",
" \"LEGIT\": [str(label_summary.idxmax())]}\n",
" }\n",
" afd_resource.put_label(\n",
" name = str(label_summary.idxmin()),\n",
" description = 'FRAUD')\n",
" \n",
" afd_resource.put_label(\n",
" name = str(label_summary.idxmax()),\n",
" description = 'LEGIT')\n",
" \n",
" return labelSchema\n",
" \n",
"# -- function to create all your variables --- \n",
"def create_variables(df_stats, MODEL_NAME):\n",
" \"\"\"\n",
" Returns a variable list of model input variables, checks to see if variable exists,\n",
" and, if not, then it adds the variable to Fraud Detector \n",
" \n",
" Arguments: \n",
" enrichment_features -- dictionary of optional features, mapped to specific variable types enriched (CARD_BIN, USERAGENT)\n",
" numeric_features -- optional list of numeric field names \n",
" categorical_features -- optional list of categorical features \n",
" \n",
" Returns:\n",
" variable_list -- a list of variable dictionaries \n",
" \n",
" \"\"\"\n",
" enrichment_features = df_stats.loc[(df_stats['feature_type'].isin(['IP_ADDRESS', 'EMAIL_ADDRESS', 'USERAGENT', 'BILLING_NAME', 'PRICE']))]['feature_name'].to_dict()\n",
" enrichment_type = df_stats.loc[(df_stats['feature_type'].isin(['IP_ADDRESS', 'EMAIL_ADDRESS', 'USERAGENT', 'BILLING_NAME', 'PRICE']))]['feature_type'].to_dict()\n",
" numeric_features = df_stats.loc[(df_stats['feature_type'].isin(['NUMERIC']))]['feature_name'].to_dict()\n",
" categorical_features = df_stats.loc[(df_stats['feature_type'].isin(['CATEGORY']))]['feature_name'].to_dict()\n",
" \n",
" variable_list = []\n",
" # -- first do the enrichment features\n",
" for feature in enrichment_features.keys(): \n",
" variable_list.append( {'name' : enrichment_features[feature]+\"\"})\n",
" try:\n",
" varname = enrichment_features[feature]+\"\"\n",
" afd_resource.get_variables(name=varname)\n",
" except:\n",
" print(\"Creating variable: {0}\".format(enrichment_features[feature]))\n",
" if enrichment_type[feature] == \"PRICE\":\n",
" resp = afd_resource.create_variable(\n",
" name = varname,\n",
" dataType = 'FLOAT',\n",
" dataSource ='EVENT',\n",
" defaultValue = '0', \n",
" description = enrichment_features[feature],\n",
" variableType = enrichment_type[feature] )\n",
" else:\n",
" resp = afd_resource.create_variable(\n",
" name = varname,\n",
" dataType = 'STRING',\n",
" dataSource ='EVENT',\n",
" defaultValue = '', \n",
" description = enrichment_features[feature],\n",
" variableType = enrichment_type[feature] )\n",
" \n",
" \n",
" # -- check and update the numeric features \n",
" for feature in numeric_features: \n",
" variable_list.append( {'name' : numeric_features[feature]+\"\"})\n",
" try:\n",
" varname = numeric_features[feature]+\"\"\n",
" afd_resource.get_variables(name=varname)\n",
" except:\n",
" print(\"Creating variable: {0}\".format(numeric_features[feature]))\n",
" resp = afd_resource.create_variable(\n",
" name = varname,\n",
" dataType = 'FLOAT',\n",
" dataSource ='EVENT',\n",
" defaultValue = '0.0', \n",
" description = numeric_features[feature],\n",
" variableType = 'NUMERIC' )\n",
" \n",
" # -- check and update the categorical features \n",
" for feature in categorical_features: \n",
" variable_list.append( {'name' : categorical_features[feature]+\"\"})\n",
" try:\n",
" varname = categorical_features[feature]+\"\"\n",
" afd_resource.get_variables(name=varname)\n",
" except:\n",
" print(\"Creating variable: {0}\".format(categorical_features[feature]))\n",
" resp = afd_resource.create_variable(\n",
" name = varname,\n",
" dataType = 'STRING',\n",
" dataSource ='EVENT',\n",
" defaultValue = '', \n",
" description = categorical_features[feature],\n",
" variableType = 'CATEGORICAL' )\n",
" \n",
" # -- create a model score feature \n",
" model_feature = \"{0}_insightscore\".format(MODEL_NAME) \n",
" # variable_list.append( {'name' : model_feature})\n",
" try:\n",
" afd_resource.get_variables(name=model_feature)\n",
" except:\n",
" print(\"Creating variable: {0}\".format(model_feature))\n",
" resp = afd_resource.create_variable(\n",
" name = model_feature,\n",
" dataType = 'FLOAT',\n",
" dataSource ='MODEL_SCORE',\n",
" defaultValue = '0.0', \n",
" description = model_feature,\n",
" variableType = 'NUMERIC' )\n",
" \n",
" return variable_list\n",
"\n",
"\n",
"model_variables = create_variables(df_stats, MODEL_NAME)\n",
"print(\"\\n --- model variable dict --\")\n",
"print(model_variables)\n",
"\n",
"\n",
"model_label = create_label(data, \"EVENT_LABEL\")\n",
"print(\"\\n --- model label schema dict --\")\n",
"print(model_label)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. Create Entity and Event Types\n",
"-----\n",
" \n",
" đź’ˇ Entity and Event. \n",
" \n",
"The following code block will automatically create your entity and event types for you.\n",
"\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#Amazon Fraud Detector expect the labels to be strings.\n",
"eventLabels = list(map(str, eventLabels))\n",
"print(eventLabels)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# --- no changes just run this code block ---\n",
"response = afd_resource.put_entity_type(\n",
" name = ENTITY_TYPE,\n",
" description = ENTITY_DESC\n",
")\n",
"print(\"-- create entity --\")\n",
"print(response)\n",
"\n",
"response = afd_resource.put_event_type (\n",
" name = EVENT_TYPE,\n",
" eventVariables = eventVariables,\n",
" labels = eventLabels,\n",
" entityTypes = [ENTITY_TYPE])\n",
"print(\"-- create event type --\")\n",
"print(response)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4. Create & Train your Model\n",
"-----\n",
" \n",
" đź’ˇ Train Model. \n",
"\n",
"The following section will automatically train and activate your model for you. \n",
"\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# -- create our model --\n",
"response = afd_resource.create_model(\n",
" description = MODEL_DESC,\n",
" eventTypeName = EVENT_TYPE,\n",
" modelId = MODEL_NAME,\n",
" modelType = 'ONLINE_FRAUD_INSIGHTS')\n",
"print(\"-- initalize model --\")\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# -- initializes the model, it's now ready to train -- \n",
"S3_FILE = \"dataset-training.csv\"\n",
"S3_FILE_LOC = \"s3://{0}/{1}\".format(S3_BUCKET,S3_FILE)\n",
"\n",
"response = afd_resource.create_model_version(\n",
" modelId = MODEL_NAME,\n",
" modelType = 'ONLINE_FRAUD_INSIGHTS',\n",
" trainingDataSource = 'EXTERNAL_EVENTS',\n",
" trainingDataSchema = trainingDataSchema,\n",
" externalEventsDetail = {\n",
" 'dataLocation' : S3_FILE_LOC,\n",
" 'dataAccessRoleArn': ARN_ROLE\n",
" }\n",
")\n",
"print(\"-- model training --\")\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# -- model training takes time, we'll loop until it's complete -- \n",
"print(\"-- wait for model training to complete --\")\n",
"stime = time.time()\n",
"while True:\n",
" clear_output(wait=True)\n",
" response = afd_resource.get_model_version(modelId=MODEL_NAME, modelType = \"ONLINE_FRAUD_INSIGHTS\", modelVersionNumber = '1.0')\n",
" if response['status'] == 'TRAINING_IN_PROGRESS':\n",
" print(f\"current progress: {(time.time() - stime)/60:{3}.{3}} minutes\")\n",
" time.sleep(60) # -- sleep for 60 seconds \n",
" if response['status'] != 'TRAINING_IN_PROGRESS':\n",
" print(\"Model status : \" + response['status'])\n",
" break\n",
" \n",
"etime = time.time()\n",
"\n",
"# -- summarize -- \n",
"print(\"\\n --- model training complete --\")\n",
"print(\"Elapsed time : %s\" % (etime - stime) + \" seconds \\n\" )\n",
"print(response)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5. Activate the Model and evaluate the performance\n",
"-----\n",
" \n",
" đź’ˇ Train Model. \n",
"\n",
"The following section will automatically train and activate your model for you. \n",
"\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"response = afd_resource.update_model_version_status (\n",
" modelId = MODEL_NAME,\n",
" modelType = 'ONLINE_FRAUD_INSIGHTS',\n",
" modelVersionNumber = '1.0',\n",
" status = 'ACTIVE'\n",
")\n",
"print(\"-- activating model --\")\n",
"print(response)\n",
"\n",
"#-- wait until model is active \n",
"print(\"--- waiting until model status is active \")\n",
"stime = time.time()\n",
"while True:\n",
" clear_output(wait=True)\n",
" response = afd_resource.get_model_version(modelId=MODEL_NAME, modelType = \"ONLINE_FRAUD_INSIGHTS\", modelVersionNumber = '1.0')\n",
" if response['status'] != 'ACTIVE':\n",
" print(f\"current progress: {(time.time() - stime)/60:{3}.{3}} minutes\")\n",
" time.sleep(60) # sleep for 1 minute \n",
" if response['status'] == 'ACTIVE':\n",
" print(\"Model status : \" + response['status'])\n",
" break\n",
" \n",
"etime = time.time()\n",
"print(\"Elapsed time : %s\" % (etime - stime) + \" seconds \\n\" )\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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CcvJyadv3wm8++4K0tNTmTVrCOedpwImUhKVMBEROSE5Oflcc814Zs1aRY0aFZkzZyjnnFPf71giEU8lTERETkhKSiKNGlWhdu1KzJ07jDPPrOt3JJGooBImIiIn5NASFBs27KFJk2p+xxGJGjo7UkREjtuuXTncdNN0srMPAJCYmKACJnKcNBImIiLHJSvrAJdf/gYLFmwkOzuHt97q53ckkaikEiYiIqW2fft+unZ9ncWLN9O8eXUef7yr35FEopZKmIiIlMqWLXvp3DmTb7/dRsuWNZk7dxiNGlX1O5ZI1FIJExGRY9q4cQ+dO2eybNl2WrWqzZw5Q6lfv4rfsUSimkqYiIgc08svL2TZsu2ceWYd5swZRp06lf2OJBL1VMJEROSY/vSnjiQmJnDLLe2oWbOS33FEYoJKmIiIHNWqVVmkp6dSs2YlEhKM++/v4HckkZiidcJEROQIy5Zt59JLX6NbtzfYuTPH7zgiMUklTERECvnmm61cdtkoNm3aS5UqKSQl6U+FSDhoOlJERH7y1Veb6dLldbZv30+XLs2ZOnUAlSol+x1LJCbpvzciIgLAggUb6dRpNNu37+eKK05h+vSBKmAiYaQSJiIirF6dTZcumWRn53DNNacyZUp/UlM1WSISTvoJExERmjVLp3//1mRl5TB2bB+SkxP9jiQS81TCRETimHMOMyMhwfj3v68iEHA6EF+knOgnTUQkTs2atYqLL36VrKwDACQkmAqYSDnST5uISBx6993v6dlzHJ98sp6XXlrodxyRuKQSJiISZ95+exm9e79Jbm4Bt956HnfffbHfkUTikkqYiEgceeutb+nX7y3y8gLceecF/OtfV5CQYH7HEolLKmEiInFizJivGTBgEvn5Af7wh4v55z+7YaYCJuIXlTARkTjx2WcbCAQcDzzQgUce6awCJuIzLVEhIhInnnqqO5dffjJXXtnS7ygigkbCRERi2htvfM327fsBbwkKFTCRyKESJiISo/75z/8xdOgUunV7ndzcAr/jiEgRKmEiIjHob3/7iLvumg3AiBFtSUnR2xCJRJqwljAz625my81spZndU8w+15nZUjP71szGhjOPiEisc87xl7+8z333zcMMXn31akaMaOd3LBE5irAdmG9micBzQFdgPfCFmU1zzi0N2acF8EfgYudctpnVCVceEZFY55zjvvvm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/kRERHyRSlgZsWLFHm6//RPS0tLp06cpU6feQ/nygU7HEhERkQKohJURLpclK8syaFBzPvnkLoKCdGhFRER8meaqyoh27eqwdu0DNGkSSUCAroIUERHxdRouKcXmzPmRL774KXu5WbMoFTAREZFSQiNhpdT06Vvp128mAQGGjRsfolGjak5HEhERkSLQSFgpNHnyZvr0+YzMTBfDh99Iw4ZVnY4kIiIiRaQSVsokJm5kwICZuFyWZ575HWPHJuiT8EVEREohlbBS5P33/829987BWhgz5jbGjGmnAiYiIlJK6ZywUuLQoROMGLEQa+GVVxL4059ucTqSiIiIXAaVsFIiKiqUuXP7snnzYYYNu9HpOCIiInKZVMJ83I4dR6lX70rA/Vlg7drVcTiRiIiIFAedE+ajrLWMGbOCxo3f5Msvf7r4E0RERKRU0UiYD7LW8swzy3jxxW8ICDAcPXra6UgiIiJSzFTCfIy1lj/9aTH/93+rCAw0TJp0N717N3U6loiIiBQzlTAfYq1l+PAFjBu3lqCgAD799B7uvruR07FERETEC1TCfMhjjy1m3Li1lC8fyIwZPenatYHTkURERMRLdGK+D+nWrQFVqgQzZ04fFTAREZEyTiNhPuR3v4th9+4/EhZWwekoIiIi4mUaCXNQRkYWAwbMZM6cH7PXqYCJiIj4B5Uwh6SnZ9G79wwmTdrMAw/M5cSJdKcjiYiISAnSdKQDzpzJ5J57pvHllz9TuXJF5s3rR2hoeadjiYiISAlSCSthp09n0L37pyxatJMqVYJZvHggLVvWcDqWiIiIlDCVsBJ08mQ6XbtOYdmyPURGhrBkyUCaNYtyOpaIiIg4QCWsBP3002+sXZtM9eqhLF06iEaNqjkdSURERByiElaCWraswfz5/YmKCqV+/SpOxxEREREH6epILzt69DSLFu3MXv6f/4lRARMRERGVMG86cuQU8fETueOOySxYsMPpOCIiIuJDVMK85NChE9x22wQ2bjzINddE0KxZpNORRERExIfonDAv2L8/jfj4ifz44xEaN67GkiUDqVEjzOlYIiIi4kNUworZL78cJy5uIjt2HKVZs0iWLBlEZGSI07FERETEx2g6shi5XJauXaewY8dRrruuBsuWDVYBExERkXyphBWjgADDm292Ji6uDl99NYgqVa5wOpKIiIj4KE1HFoPTpzMIDi4HwC23XM2SJQMxxjicSkRERHyZRsKKQWzsP5k5c3v2sgqYiIiIXIxKWDFITk7jww83YK11OoqIiIiUEiphl2j9+v3Z33fqVI/PPuulETAREREpNJWwS7B6dRLx8ROzl2fN6k3Fijq9TkRERApPJayIvv12H+3bf0xq6tnsdRUqqICJiIhI0aiEFVG5cgEYA337NnU6ioiIiJRiGsIpohtvrMWaNQ9Qv34VmOJ0GhERESmtNBJWCPPm/cy0aVuzlxs1qkZgoH50IiIicuk0EnYRs2f/SK9e03G5LLGxV9KyZQ2nI4mIiEgZoBJ2AdOnb6Vfv5lkZroYMaINLVpUdzqSiIijXC4XSUlJnDx50ukoIj4jJCSEWrVqERBQtFkyr5YwY0xH4A0gEPjAWjs2z+MVgIlAK+A3oLe1do83MxXW5AXpDPzLZ7hclj//+RZefjlenwMmIn7vyJEjGGNo0KBBkf/BESmLXC4XycnJHDlyhMjIyCI912vvIGNMIPAm0AloDPQ1xjTOs9n9wDFrbT3g78Ar3spTFBPWtWDAM6dxuSx/+cvvVMBERDxSUlKIiopSARPxCAgIICoqiuPHjxf9uV7Ic84NwA5r7S5rbTowFbgzzzZ3Aome72cA8cbhtnM01TDi89uxFl54oR3PPddOBUxExCMrK4ty5co5HUPEp5QrV47MzMwiP8+b05FXAb/kWE4CbixoG2ttpjHmOFAFOJJzI2PMg8CDAFdffbW38gJwZSXL/Acmsbrcowx/6nde3ZeISGmk/5iK5Hap7wlvlrD8EuW9w3VhtsFa+x7wHkDr1q29e5fsW56nzQ1P0KZ8qFd3IyIiIv7Nm9ORSUB0juVawP6CtjHGBAHhwFEvZrq48mEQEgXlQhyNISIicjm2bdtG69atnY5RJowcOZJ33nmn2F/XmyVsHRBrjKljjCkP9AE+z7PN58Bgz/f3AEuttd4d6RIRkTKpdu3aBAcHExoaSvXq1RkyZAgnTpzItc3KlSuJi4sjLCyM8PBwunbtyrZt23Jtk5qayvDhw7n66qsJDQ2lXr16DB8+nCNHcp0p4/OeeeYZRo8e7XSMy3L27Fnuu+8+KlWqRPXq1Xn99dcvuO2IESOoWbMmERERPPLII2RkZGQ/HhoamusrMDCQoUOHAv8trBEREURERJCQkJDr78Vjjz3Giy++SHp6erH++bxWwqy1mcCjwEJgOzDNWrvVGDPGGNPNs9mHQBVjzA5gJPC4t/KIiEjZN3fuXE6cOMHGjRvZsGEDL7/8cvZjq1atokOHDtx5553s37+f3bt307x5c2655RZ27doFQHp6OvHx8WzdupUFCxaQmprKypUrqVKlCmvXrvVa7ks5qftCDhw4wLJly+jevbtP5LlUzz77LD///DN79+5l2bJlvPrqqyxYsCDfbceOHcv69evZsmULP/30E99//z0vvPBC9uMnTpzI/jp06BDBwcH07NkTgJo1azJjxgyOHj3KkSNH6NatG3369Ml+bo0aNWjYsCGff553LOkyWWtL1VerVq2szwD3l4iIn9i2bZvTEQoUExNjFy9enL382GOP2c6dO2cv33rrrfYPf/jDec/r2LGjHThwoLXW2vfff99GRkbatLS0Qu93y5YtNiEhwUZERNjIyEj74osvWmutHTx4sH3qqaeyt1u2bJm96qqrcuUdO3asbdasmS1fvrx9/vnnbY8ePXK99rBhw+zQoUOttdampKTY++67z1avXt3WrFnTPvXUUzYzMzPfTImJiTY+Pj7Xupdfftlec801NjQ01DZq1MjOnDkz+7F//etf9uabb7bDhw+3ERER2bk//PBD27BhQ1u5cmXboUMHu2fPnlzZatWqZcPCwux1111nv/7660L/zAqrZs2aduHChdnLTz/9tO3du3e+27Zq1cpOmzYte3nSpEm2Vq1a+W47YcIEW6dOHetyuc57LCMjw44fP94GBwfnWv/CCy/YIUOGFJi1oPcGsN4W0Gn0ifkiInLpXiuhKyVHFe1MlaSkJObPn09cXBwAp06dYuXKlYwZM+a8bXv16sWTTz4JwJIlS+jYsSOhoYW7OCstLY2EhARGjx7N3LlzycjIOG9680KmTJnCl19+SdWqVTl8+DAvvfQSqampVKpUiaysLKZNm8asWbMAGDx4MFFRUezYsYOTJ0/SpUsXoqOjeeihh8573c2bN9OgQYNc6+rWrcs333xD9erVmT59OgMGDGDHjh3UqOG+Hd+aNWvo06cPhw8fJiMjg9mzZ/PSSy8xd+5cYmNjGTt2LH379mXlypUAXH/99fzlL38hPDycN954g549e7Jnzx4qVqx4Xp6xY8cyduzY89afk5KSct66Y8eOsX//fpo3b569rnnz5syePTvf1zhXbHIuJyUlcfz4ccLDw3Ntm5iYyKBBg867qrFy5cqcOHECl8t13t+VRo0a8dlnnxX4Z7gU+rQ9EREpM7p3705YWBjR0dFERkby3HPPAXD06FFcLld24cipRo0a2ed7/fbbb/luU5AvvviC6tWrM2rUKCpWrEhYWBg33pj305gKNmzYMKKjowkODiYmJobrrrsuu2QsXbqUK664gjZt2nDo0CHmz5/PP/7xD0JCQoiMjGTEiBFMnTo139dNSUkhLCws17qePXtSs2ZNAgIC6N27N7GxsbmmWGvWrMnQoUMJCgoiODiYd999lyeeeIJGjRoRFBTEk08+ycaNG9m7dy8AAwYMoEqVKgQFBTFq1CjOnj3Lf/7zn3zzPP7446SkpBT4lZ9z5/PlLFDh4eGkpaXlu32nTp144403+PXXXzl48CDjxo0D3AU8p3379rFixQoGDx583mukpKRw/Phxxo8fT8uWLXM9FhYWVmDWS6WRMBERuXRFHKHyttmzZ5OQkMCKFSvo168fR44coXLlykRERBAQEMCBAwdo2LBhruccOHCAqlWrAlClShUOHDhQ6P398ssv1K1b95LzRkdH51ru168fU6ZMYdCgQUyePJl+/foBsHfvXjIyMnIVRJfLdd7zz4mIiDivrEycOJHXX3+dPXv2AO6Sk/Nig7yvtXfvXv74xz8yatSo7HXWWpKTk4mJieG1117jgw8+YP/+/RhjSE1NLdaLF86NRqampmaPrqWmpp5XLs956qmnSElJoUWLFlSoUIHf//73bNiw4bxbCU2cOJFbb72VOnXq5Ps6ISEhPPzww1SrVo3t27dnPz8tLY3KlSsX1x8P0EiYiIiUQW3btmXIkCHZVweGhIRw0003MX369PO2nTZtGvHx8QAkJCSwcOHCQt+gPDo6mp07d+b7WEhISK5RmIMHD563Td7psJ49e7J8+XKSkpKYNWtWdgmLjo6mQoUKHDlyJHv0KDU1la1bt+a772uvvZaffvope3nv3r38/ve/Z/z48fz222+kpKTQtGnTXNN3ebNER0fz7rvv5hqxOn36NDfffDPffPMNr7zyCtOmTePYsWOkpKQQHh6e6/Vyeumll867OjHnV34iIiKoUaMGmzZtyl63adMmmjRpku/2wcHBjB8/nuTkZHbt2kWVKlVo1aoVgYGBubabOHFivqNgOblcLk6dOkVy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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# -- model performance summary -- \n",
"auc = afd_resource.describe_model_versions(\n",
" modelId= MODEL_NAME,\n",
" modelVersionNumber='1.0',\n",
" modelType='ONLINE_FRAUD_INSIGHTS',\n",
" maxResults=10\n",
")['modelVersionDetails'][0]['trainingResult']['trainingMetrics']['auc']\n",
"\n",
"\n",
"df_model = pd.DataFrame(afd_resource.describe_model_versions(\n",
" modelId= MODEL_NAME,\n",
" modelVersionNumber='1.0',\n",
" modelType='ONLINE_FRAUD_INSIGHTS',\n",
" maxResults=10\n",
")['modelVersionDetails'][0]['trainingResult']['trainingMetrics']['metricDataPoints'])\n",
"\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.plot(df_model[\"fpr\"], df_model[\"tpr\"], color='darkorange',\n",
" lw=2, label='ROC curve (area = %0.3f)' % auc)\n",
"plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')\n",
"plt.xlabel('False Positive Rate')\n",
"plt.ylabel('True Positive Rate')\n",
"plt.title( MODEL_NAME + ' ROC Chart')\n",
"plt.legend(loc=\"lower right\",fontsize=12)\n",
"plt.axvline(x = 0.02 ,linewidth=2, color='r')\n",
"plt.axhline(y = 0.73 ,linewidth=2, color='r')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 6. Create Detector, generate Rules and assemble your Detector\n",
"\n",
"-----\n",
" \n",
" đź’ˇ Generate Rules, Create and Publish a Detector. \n",
" \n",
"The following section will automatically generate a number of fraud, investigate and approve rules based on the false positive rate and score thresholds of your model. These are just example rules that you could create, it is recommended that you fine tune your rules specifically to your business use case.\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# -- initialize your detector -- \n",
"response = afd_resource.put_detector(detectorId = DETECTOR_NAME, \n",
" description = DETECTOR_DESC, \n",
" eventTypeName = EVENT_TYPE )\n",
"\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# -- make rules -- \n",
"model_stat = df_model.round(decimals=2) \n",
"\n",
"m = model_stat.loc[model_stat.groupby([\"fpr\"])[\"threshold\"].idxmax()] \n",
"\n",
"def make_rule(x):\n",
" rule = \"\"\n",
" if x['fpr'] <= 0.05: \n",
" rule = \"${0}_insightscore > {1}\".format(MODEL_NAME,x['threshold'])\n",
" if x['fpr'] == 0.06:\n",
" rule = \"${0}_insightscore <= {1}\".format(MODEL_NAME,x['threshold_prev'])\n",
" return rule\n",
" \n",
"m[\"threshold_prev\"] = m['threshold'].shift(1)\n",
"m['rule'] = m.apply(lambda x: make_rule(x), axis=1)\n",
"\n",
"m['outcome'] = \"approve\"\n",
"m.loc[m['fpr'] <= 0.03, \"outcome\"] = \"fraud\"\n",
"m.loc[(m['fpr'] > 0.03) & (m['fpr'] <= 0.05), \"outcome\"] = \"investigate\"\n",
"\n",
"print (\" --- score thresholds 1% to 6% --- \")\n",
"print(m[[\"fpr\", \"tpr\", \"threshold\", \"rule\", \"outcome\"]].loc[(m['fpr'] > 0.0 ) & (m['fpr'] <= 0.06)].reset_index(drop=True))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# -- create outcomes -- \n",
"def create_outcomes(outcomes):\n",
" \"\"\" create Fraud Detector Outcomes \n",
" \n",
" \"\"\" \n",
" for outcome in outcomes:\n",
" print(\"creating outcome variable: {0} \".format(outcome))\n",
" response = afd_resource.put_outcome(\n",
" name=outcome,\n",
" description=outcome)\n",
"\n",
"# -- get distinct outcomes \n",
"outcomes = m[\"outcome\"].unique().tolist()\n",
"\n",
"create_outcomes(outcomes)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"rule_set = m[(m[\"fpr\"] > 0.0) & (m[\"fpr\"] <= 0.06)][[\"outcome\", \"rule\"]].to_dict('records')\n",
"rule_list = []\n",
"for i, rule in enumerate(rule_set):\n",
" ruleId = \"rule{0}_{1}\".format(i, MODEL_NAME)\n",
" rule_list.append({\"ruleId\": ruleId, \n",
" \"ruleVersion\" : '1',\n",
" \"detectorId\" : DETECTOR_NAME\n",
" \n",
" })\n",
" print(\"creating rule: {0}: IF {1} THEN {2}\".format(ruleId, rule[\"rule\"], rule['outcome']))\n",
" try:\n",
" response = afd_resource.create_rule(\n",
" ruleId = ruleId,\n",
" detectorId = DETECTOR_NAME,\n",
" expression = rule['rule'],\n",
" language = 'DETECTORPL',\n",
" outcomes = [rule['outcome']]\n",
" )\n",
" except:\n",
" print(\"this rule already exists in this detector\")\n",
"rule_list"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"afd_resource.create_detector_version(\n",
" detectorId = DETECTOR_NAME,\n",
" rules = rule_list,\n",
" modelVersions = [{\"modelId\":MODEL_NAME, \n",
" \"modelType\" : \"ONLINE_FRAUD_INSIGHTS\",\n",
" \"modelVersionNumber\" : \"1.0\"}],\n",
" ruleExecutionMode = 'FIRST_MATCHED'\n",
" )\n",
"\n",
"print(\"\\n -- detector created -- \")\n",
"print(response) "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"response = afd_resource.update_detector_version_status(\n",
" detectorId= DETECTOR_NAME,\n",
" detectorVersionId='1',\n",
" status='ACTIVE'\n",
")\n",
"print(\"\\n -- detector activated -- \")\n",
"print(response)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Testing our model endpoint"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"S3_FILE = \"dataset-test.csv\"\n",
"S3_FILE_LOC = \"s3://{0}/{1}\".format(S3_BUCKET,S3_FILE)\n",
"\n",
"s3_resource.Bucket(S3_BUCKET).download_file(S3_FILE, 'dataset-test.csv')"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" EVENT_TIMESTAMP \n",
" tipologia \n",
" canal \n",
" segmento \n",
" rut \n",
" dv \n",
" ctaori \n",
" ctades \n",
" nomdes \n",
" nombancdes \n",
" rutdes \n",
" monto \n",
" ipcli \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2020-07-08 11:26:33 \n",
" Pagos y Transferencias \n",
" APP \n",
" PF \n",
" 8b7b9dc18f37bf63f95dd21bc153e392 \n",
" 45c48cce2e2d7fbdea1afc51c7c6ad26 \n",
" 06bb5bef0faf68e34425cfd721ac983e \n",
" b59e491ccfc02f404b1be01976b471e0 \n",
" christian basoalto \n",
" Banco de Chile / Edwards-Citi \n",
" fd357482b5f76349fc81af3ba52e29b3 \n",
" 199999.0 \n",
" 192.168.88.137 \n",
" \n",
" \n",
" 1 \n",
" 2020-07-19 22:06:00 \n",
" Pagos y Transferencias \n",
" APP \n",
" PF \n",
" c455c3cf1fc59f7e6aa7079b43625395 \n",
" a87ff679a2f3e71d9181a67b7542122c \n",
" 9a81863b7b1156dd84576b404efd847b \n",
" ee60570fc4f7efbfb4acd953884969e0 \n",
" maria eugenia gonzalez videla \n",
" Banco Santander-Santiago \n",
" 5845e9d5ed68b3333f8aaffa0f8a110e \n",
" 130000.0 \n",
" 192.168.88.137 \n",
" \n",
" \n",
" 2 \n",
" 2020-07-31 11:59:45 \n",
" Pagos y Transferencias \n",
" APP \n",
" PF \n",
" 9d4d67cab011a7a9e3171d8096d8a5ac \n",
" a5f3c6a11b03839d46af9fb43c97c188 \n",
" 2a2a2feb2ee7b91b962937d3df4fa4fd \n",
" f54d524ade8984180c9ccb50e74e9768 \n",
" Cassandra Ornano \n",
" Banco Santander-Santiago \n",
" e242a0a3af653999d878598dd7025810 \n",
" 15890.0 \n",
" 192.168.88.137 \n",
" \n",
" \n",
" 3 \n",
" 2020-07-02 23:42:51 \n",
" Pagos y Transferencias \n",
" WEB \n",
" PF \n",
" 8f0c2c558aed3b7b27961f9102d19bfe \n",
" e4da3b7fbbce2345d7772b0674a318d5 \n",
" ce4b1bbc50cad868d8c9152582bc8652 \n",
" e3eb10ec1a4ec2a86826f00f8df019ee \n",
" Claudio Jara Molina \n",
" Banco Santander-Santiago \n",
" c72af796f3ce0fae237e1c6b216ceb28 \n",
" 20000.0 \n",
" 186.11.62.185 \n",
" \n",
" \n",
" 4 \n",
" 2020-07-02 11:22:15 \n",
" Pagos y Transferencias \n",
" APP \n",
" PF \n",
" 7c56e083a2408573386883ae08da9a72 \n",
" c9f0f895fb98ab9159f51fd0297e236d \n",
" 1d2089c0b7a1449669b29fcbe6ffa27b \n",
" f0ea88913593ba576a22d67e52dc5b99 \n",
" hugo muñoz \n",
" Banco Falabella \n",
" ce846b2b5b17b28180d9e4d160cfd453 \n",
" 120000.0 \n",
" 192.168.88.137 \n",
" \n",
" \n",
" 5 \n",
" 2020-07-26 20:07:28 \n",
" Pagos y Transferencias \n",
" WEB \n",
" PF \n",
" 496b9cb13a8ccec4dab279a53555adf6 \n",
" eccbc87e4b5ce2fe28308fd9f2a7baf3 \n",
" 95b20c920b33cc0ed271ab7eba1c1cd4 \n",
" b261ea0ad9a0d4065d079906494ce454 \n",
" matilde maddaleno herrera \n",
" Banco de Chile \n",
" d216482286e31df42bc1f025e90fd5de \n",
" 12000.0 \n",
" 201.239.242.46 \n",
" \n",
" \n",
" 6 \n",
" 2020-07-21 08:46:07 \n",
" Pagos y Transferencias \n",
" WEB \n",
" PJ \n",
" d41e62a45537cc9e47da4aa4856beed6 \n",
" a87ff679a2f3e71d9181a67b7542122c \n",
" a3d2de7675556553a5f08e4c88d2c228 \n",
" a3d2de7675556553a5f08e4c88d2c228 \n",
" newiol/bic.iol.Transferencias.tef.tefa3ros \n",
" IENQ005FP_ConfTrEjecutada \n",
" fb21e94fb209a71e831f6019fad298bc \n",
" 0.0 \n",
" 190.45.200.29 \n",
" \n",
" \n",
" 7 \n",
" 2020-07-17 21:32:16 \n",
" Pagos y Transferencias \n",
" APP \n",
" PF \n",
" fa54fef00d81db63d36ffa08d26c43ff \n",
" 45c48cce2e2d7fbdea1afc51c7c6ad26 \n",
" b4ec8b2dd178d847c6df71da9264d352 \n",
" b12a6281f35a48703dd04ceeac690dac \n",
" Laura Vera \n",
" Banco Estado \n",
" bbddfd8cc3eafb60001c5c06cdc6183b \n",
" 2300.0 \n",
" 192.168.88.137 \n",
" \n",
" \n",
" 8 \n",
" 2020-07-13 21:12:01 \n",
" Pagos y Transferencias \n",
" WEB \n",
" PF \n",
" 7d5e960687d13c11ccce83bd0518d717 \n",
" c81e728d9d4c2f636f067f89cc14862c \n",
" 877b46e92286b0aa728e4ae16c65134d \n",
" e9b7a87bb5689e44b24a68e033766aea \n",
" texia navarro pasten \n",
" Banco del Estado de Chile \n",
" bcd414eac4268b89b98639b012b6af76 \n",
" 90000.0 \n",
" 201.215.86.174 \n",
" \n",
" \n",
" 9 \n",
" 2020-07-17 14:35:05 \n",
" Pagos y Transferencias \n",
" Webmobile \n",
" PF \n",
" 3176e3cf35af1994d3b0ba7a13237d74 \n",
" c4ca4238a0b923820dcc509a6f75849b \n",
" 031af4f2f5ea6a3d51e69fd55ddc1903 \n",
" e634726547937b614ebefa9986a6537e \n",
" Cristian aguero \n",
" Banco del Estado de Chile \n",
" c4c1b24523ef03e3aecc2c6da0a83b55 \n",
" 9000.0 \n",
" 152.231.126.216 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" EVENT_TIMESTAMP tipologia canal segmento rut dv ctaori ctades nomdes nombancdes rutdes monto ipcli\n",
"0 2020-07-08 11:26:33 Pagos y Transferencias APP PF 8b7b9dc18f37bf63f95dd21bc153e392 45c48cce2e2d7fbdea1afc51c7c6ad26 06bb5bef0faf68e34425cfd721ac983e b59e491ccfc02f404b1be01976b471e0 christian basoalto Banco de Chile / Edwards-Citi fd357482b5f76349fc81af3ba52e29b3 199999.0 192.168.88.137 \n",
"1 2020-07-19 22:06:00 Pagos y Transferencias APP PF c455c3cf1fc59f7e6aa7079b43625395 a87ff679a2f3e71d9181a67b7542122c 9a81863b7b1156dd84576b404efd847b ee60570fc4f7efbfb4acd953884969e0 maria eugenia gonzalez videla Banco Santander-Santiago 5845e9d5ed68b3333f8aaffa0f8a110e 130000.0 192.168.88.137 \n",
"2 2020-07-31 11:59:45 Pagos y Transferencias APP PF 9d4d67cab011a7a9e3171d8096d8a5ac a5f3c6a11b03839d46af9fb43c97c188 2a2a2feb2ee7b91b962937d3df4fa4fd f54d524ade8984180c9ccb50e74e9768 Cassandra Ornano Banco Santander-Santiago e242a0a3af653999d878598dd7025810 15890.0 192.168.88.137 \n",
"3 2020-07-02 23:42:51 Pagos y Transferencias WEB PF 8f0c2c558aed3b7b27961f9102d19bfe e4da3b7fbbce2345d7772b0674a318d5 ce4b1bbc50cad868d8c9152582bc8652 e3eb10ec1a4ec2a86826f00f8df019ee Claudio Jara Molina Banco Santander-Santiago c72af796f3ce0fae237e1c6b216ceb28 20000.0 186.11.62.185 \n",
"4 2020-07-02 11:22:15 Pagos y Transferencias APP PF 7c56e083a2408573386883ae08da9a72 c9f0f895fb98ab9159f51fd0297e236d 1d2089c0b7a1449669b29fcbe6ffa27b f0ea88913593ba576a22d67e52dc5b99 hugo muñoz Banco Falabella ce846b2b5b17b28180d9e4d160cfd453 120000.0 192.168.88.137 \n",
"5 2020-07-26 20:07:28 Pagos y Transferencias WEB PF 496b9cb13a8ccec4dab279a53555adf6 eccbc87e4b5ce2fe28308fd9f2a7baf3 95b20c920b33cc0ed271ab7eba1c1cd4 b261ea0ad9a0d4065d079906494ce454 matilde maddaleno herrera Banco de Chile d216482286e31df42bc1f025e90fd5de 12000.0 201.239.242.46 \n",
"6 2020-07-21 08:46:07 Pagos y Transferencias WEB PJ d41e62a45537cc9e47da4aa4856beed6 a87ff679a2f3e71d9181a67b7542122c a3d2de7675556553a5f08e4c88d2c228 a3d2de7675556553a5f08e4c88d2c228 newiol/bic.iol.Transferencias.tef.tefa3ros IENQ005FP_ConfTrEjecutada fb21e94fb209a71e831f6019fad298bc 0.0 190.45.200.29 \n",
"7 2020-07-17 21:32:16 Pagos y Transferencias APP PF fa54fef00d81db63d36ffa08d26c43ff 45c48cce2e2d7fbdea1afc51c7c6ad26 b4ec8b2dd178d847c6df71da9264d352 b12a6281f35a48703dd04ceeac690dac Laura Vera Banco Estado bbddfd8cc3eafb60001c5c06cdc6183b 2300.0 192.168.88.137 \n",
"8 2020-07-13 21:12:01 Pagos y Transferencias WEB PF 7d5e960687d13c11ccce83bd0518d717 c81e728d9d4c2f636f067f89cc14862c 877b46e92286b0aa728e4ae16c65134d e9b7a87bb5689e44b24a68e033766aea texia navarro pasten Banco del Estado de Chile bcd414eac4268b89b98639b012b6af76 90000.0 201.215.86.174 \n",
"9 2020-07-17 14:35:05 Pagos y Transferencias Webmobile PF 3176e3cf35af1994d3b0ba7a13237d74 c4ca4238a0b923820dcc509a6f75849b 031af4f2f5ea6a3d51e69fd55ddc1903 e634726547937b614ebefa9986a6537e Cristian aguero Banco del Estado de Chile c4c1b24523ef03e3aecc2c6da0a83b55 9000.0 152.231.126.216"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.set_option('display.max_rows', 500)\n",
"pd.set_option('display.max_columns', 500)\n",
"pd.set_option('display.width', 1000)\n",
"\n",
"test = pd.read_csv('dataset-test.csv', delimiter=',')\n",
"test.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cleaning the test dataset from training columns and defining the start datetime."
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tipologia canal segmento rut dv ctaori ctades nomdes nombancdes rutdes monto ipcli\n"
]
}
],
"source": [
"record_count = 400\n",
"model_variables = [column for column in test.columns if column not in ['EVENT_LABEL', 'EVENT_TIMESTAMP']]\n",
"#dateTimeObj = datetime.strptime('Sep 3 2013 12:00AM', '%b %d %Y %I:%M%p')\n",
"dateTimeObj = datetime.now()\n",
"timestampStr = dateTimeObj.strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n",
"print(' '.join(model_variables))"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'modelScores': [{'modelVersion': {'modelId': 'fraud_det_model20200908', 'modelType': 'ONLINE_FRAUD_INSIGHTS', 'modelVersionNumber': '2.0'}, 'scores': {'fraud_det_model20200908_insightscore': 432.0}}], 'ruleResults': [{'ruleId': 'rule1_fraud_det_model20200908', 'outcomes': ['investigate']}], 'ResponseMetadata': {'RequestId': '4e7d4056-fc33-4d26-b6a9-1d9b561bcc89', 'HTTPStatusCode': 200, 'HTTPHeaders': {'content-type': 'application/x-amz-json-1.1', 'date': 'Mon, 14 Sep 2020 20:41:17 GMT', 'x-amzn-requestid': '4e7d4056-fc33-4d26-b6a9-1d9b561bcc89', 'content-length': '277', 'connection': 'keep-alive'}, 'RetryAttempts': 0}}\n"
]
}
],
"source": [
"import uuid\n",
"\n",
"# test the endpoint with a single prediction.\n",
"eventId = uuid.uuid1()\n",
"testrecord = test[model_variables].head(15).astype(str).to_dict(orient='records')[6]\n",
"pred = afd_resource.get_event_prediction(detectorId=DETECTOR_NAME, \n",
" detectorVersionId='1',\n",
" eventId = str(eventId),\n",
" eventTypeName = EVENT_TYPE,\n",
" eventTimestamp = timestampStr, \n",
" entities = [{'entityType': ENTITY_TYPE, 'entityId':str(eventId.int)}],\n",
" eventVariables= testrecord)\n",
"print(pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next block will use some parallelization to run several test against the fraud detector endpoint."
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"current progress: 100.0 %\n",
"Process took 4.35 seconds\n",
"Scored 404 records\n"
]
}
],
"source": [
"import dask \n",
"import time\n",
"from IPython.core.display import display, HTML\n",
"#display(HTML(\"\"))\n",
"\n",
"start = time.time()\n",
"\n",
"@dask.delayed\n",
"def _predict(record):\n",
" eventId = uuid.uuid1()\n",
" try:\n",
" pred = afd_resource.get_event_prediction(detectorId=DETECTOR_NAME, \n",
" detectorVersionId='1',\n",
" eventId = str(eventId),\n",
" eventTypeName = EVENT_TYPE,\n",
" eventTimestamp = timestampStr, \n",
" entities = [{'entityType': ENTITY_TYPE, 'entityId':str(eventId.int)}],\n",
" eventVariables= record) \n",
" \n",
" record[\"score\"] = pred['modelScores'][0]['scores'][\"{0}_insightscore\".format(MODEL_NAME)]\n",
" if len(pred['ruleResults']) > 0:\n",
" record[\"outcomes\"]= pred['ruleResults'][0]['outcomes']\n",
" else:\n",
" record[\"outcomes\"]= 'approve'\n",
" return record\n",
" \n",
" except:\n",
" pred = afd_resource.get_event_prediction(detectorId=DETECTOR_NAME, \n",
" detectorVersionId='1',\n",
" eventId = str(eventId),\n",
" eventTypeName = EVENT_TYPE,\n",
" eventTimestamp = timestampStr, \n",
" entities = [{'entityType': ENTITY_TYPE, 'entityId':str(eventId.int)}],\n",
" eventVariables= record) \n",
" record[\"score\"] = \"-999\"\n",
" record[\"outcomes\"]= \"error\"\n",
" return record\n",
"\n",
"predict_data = test[model_variables].head(record_count).astype(str).to_dict(orient='records')\n",
"predict_score = []\n",
"\n",
"i=0\n",
"for record in predict_data:\n",
" clear_output(wait=True)\n",
" rec = dask.delayed(_predict)(record)\n",
" predict_score.append(rec)\n",
" i += 1\n",
" print(\"current progress: \", round((i/record_count)*100,2), \"%\" )\n",
" \n",
"predict_recs = dask.compute(*predict_score)\n",
"\n",
"# Calculate time taken and print results\n",
"time_taken = time.time() - start\n",
"tps = len(predict_recs) / time_taken\n",
"\n",
"print ('Process took %0.2f seconds' %time_taken)\n",
"print ('Scored %d records' %len(predict_recs))"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" tipologia \n",
" canal \n",
" segmento \n",
" rut \n",
" dv \n",
" ctaori \n",
" ctades \n",
" nomdes \n",
" nombancdes \n",
" rutdes \n",
" monto \n",
" ipcli \n",
" score \n",
" outcomes \n",
" \n",
" \n",
" \n",
" \n",
" 401 \n",
" Sin tipologia \n",
" WEB \n",
" PF \n",
" 05ef2b2ec63b0451e753da506407ce59 \n",
" c4ca4238a0b923820dcc509a6f75849b \n",
" 8d8b98d0765127cadd3e850af72f8b4d \n",
" 35298865c6b58ae65570b30e2cfaf83b \n",
" victoria \n",
" Banco del Estado de Chile \n",
" b2d3f8b557944f6780d6d60f7b923eaf \n",
" 200000.0 \n",
" 186.11.58.2 \n",
" 1000 \n",
" [fraud] \n",
" \n",
" \n",
" 402 \n",
" Pagos y Transferencias \n",
" WEB \n",
" PF \n",
" 4a379677c0f2edd6a98cebc2c46f4707 \n",
" 45c48cce2e2d7fbdea1afc51c7c6ad26 \n",
" 457ad069eebf1f77dd529fca55e1ec6a \n",
" 952cd2c29bb380044ecb086d43acdb05 \n",
" alan cerda \n",
" Banco del Estado de Chile \n",
" 781c1bcc58864eab9c42b5e2a8b40660 \n",
" 200000.0 \n",
" 186.10.157.179 \n",
" 999 \n",
" [fraud] \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" tipologia canal segmento rut dv ctaori ctades nomdes nombancdes rutdes monto ipcli score outcomes\n",
"401 Sin tipologia WEB PF 05ef2b2ec63b0451e753da506407ce59 c4ca4238a0b923820dcc509a6f75849b 8d8b98d0765127cadd3e850af72f8b4d 35298865c6b58ae65570b30e2cfaf83b victoria Banco del Estado de Chile b2d3f8b557944f6780d6d60f7b923eaf 200000.0 186.11.58.2 1000 [fraud]\n",
"402 Pagos y Transferencias WEB PF 4a379677c0f2edd6a98cebc2c46f4707 45c48cce2e2d7fbdea1afc51c7c6ad26 457ad069eebf1f77dd529fca55e1ec6a 952cd2c29bb380044ecb086d43acdb05 alan cerda Banco del Estado de Chile 781c1bcc58864eab9c42b5e2a8b40660 200000.0 186.10.157.179 999 [fraud]"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# lets take a look to the predicted frauds\n",
"predictions = pd.DataFrame.from_dict(predict_recs, orient='columns')\n",
"predictions.loc[predictions['score'].astype('float32') > 900]"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Fecha \n",
" TipologĂa \n",
" Canal \n",
" Segmento \n",
" Rut \n",
" Dv \n",
" CtaOri \n",
" CtaDes \n",
" NomDes \n",
" NomBancDes \n",
" RUTDES \n",
" MONTO \n",
" Fraude \n",
" IPCLI \n",
" \n",
" \n",
" \n",
" \n",
" 369910 \n",
" 2020-07-07 12:37:23 \n",
" NaN \n",
" WEB \n",
" PF \n",
" 05ef2b2ec63b0451e753da506407ce59 \n",
" c4ca4238a0b923820dcc509a6f75849b \n",
" 8d8b98d0765127cadd3e850af72f8b4d \n",
" 35298865c6b58ae65570b30e2cfaf83b \n",
" victoria \n",
" Banco del Estado de Chile \n",
" b2d3f8b557944f6780d6d60f7b923eaf \n",
" 200000.0 \n",
" SI \n",
" 186.11.58.2 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Fecha TipologĂa Canal Segmento Rut Dv CtaOri CtaDes NomDes NomBancDes RUTDES MONTO Fraude IPCLI\n",
"369910 2020-07-07 12:37:23 NaN WEB PF 05ef2b2ec63b0451e753da506407ce59 c4ca4238a0b923820dcc509a6f75849b 8d8b98d0765127cadd3e850af72f8b4d 35298865c6b58ae65570b30e2cfaf83b victoria Banco del Estado de Chile b2d3f8b557944f6780d6d60f7b923eaf 200000.0 SI 186.11.58.2 "
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[(data[\"NomDes\"]==\"victoria\") & (data[\"RUTDES\"]== 'b2d3f8b557944f6780d6d60f7b923eaf')]"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Fecha \n",
" TipologĂa \n",
" Canal \n",
" Segmento \n",
" Rut \n",
" Dv \n",
" CtaOri \n",
" CtaDes \n",
" NomDes \n",
" NomBancDes \n",
" RUTDES \n",
" MONTO \n",
" Fraude \n",
" IPCLI \n",
" \n",
" \n",
" \n",
" \n",
" 895701 \n",
" 2020-07-16 13:39:57 \n",
" Pagos y Transferencias \n",
" WEB \n",
" PF \n",
" 4a379677c0f2edd6a98cebc2c46f4707 \n",
" 45c48cce2e2d7fbdea1afc51c7c6ad26 \n",
" 457ad069eebf1f77dd529fca55e1ec6a \n",
" 952cd2c29bb380044ecb086d43acdb05 \n",
" alan cerda \n",
" Banco del Estado de Chile \n",
" 781c1bcc58864eab9c42b5e2a8b40660 \n",
" 200000.0 \n",
" SI \n",
" 186.10.157.179 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Fecha TipologĂa Canal Segmento Rut Dv CtaOri CtaDes NomDes NomBancDes RUTDES MONTO Fraude IPCLI\n",
"895701 2020-07-16 13:39:57 Pagos y Transferencias WEB PF 4a379677c0f2edd6a98cebc2c46f4707 45c48cce2e2d7fbdea1afc51c7c6ad26 457ad069eebf1f77dd529fca55e1ec6a 952cd2c29bb380044ecb086d43acdb05 alan cerda Banco del Estado de Chile 781c1bcc58864eab9c42b5e2a8b40660 200000.0 SI 186.10.157.179 "
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[(data[\"NomDes\"]==\"alan cerda\") & (data[\"RUTDES\"]== '781c1bcc58864eab9c42b5e2a8b40660')]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"See the model metrics on CloudWatch and the prediction history in Fraud Detector."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# save the results to a csv file and upload it to the output s3 bucket\n",
"csv_buffer = StringIO()\n",
"predictions.to_csv(csv_buffer, index=False)\n",
"s3_resource.Object(S3_BUCKET, MODEL_NAME + \"precictions{}.csv\".format(sufx)).put(Body=csv_buffer.getvalue())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#data.loc[data['vaa'] == 0.14205158164005, 'vaa':'EVENT_LABEL']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finish"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "conda_python3",
"language": "python",
"name": "conda_python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}