From 9e33d7a86b1a8455b356dc9604a8d4e9d6067001 Mon Sep 17 00:00:00 2001 From: Nick Lane <52196476+sentientyougert@users.noreply.github.com> Date: Mon, 13 May 2024 16:34:40 +0800 Subject: [PATCH] Complete Works done --- neo_dolfin/ai/Fraud Detection/Class Dist.png | Bin 0 -> 35797 bytes neo_dolfin/ai/Fraud Detection/Model Plot.png | Bin 0 -> 13228 bytes neo_dolfin/ai/Fraud Detection/TrainLoss.png | Bin 0 -> 50845 bytes .../Fraud Detection/dolfin_frauddetection.py | 300 ++++++++++++++++++ 4 files changed, 300 insertions(+) create mode 100644 neo_dolfin/ai/Fraud Detection/Class Dist.png create mode 100644 neo_dolfin/ai/Fraud Detection/Model Plot.png create mode 100644 neo_dolfin/ai/Fraud Detection/TrainLoss.png create mode 100644 neo_dolfin/ai/Fraud Detection/dolfin_frauddetection.py diff --git a/neo_dolfin/ai/Fraud Detection/Class Dist.png b/neo_dolfin/ai/Fraud Detection/Class Dist.png new file mode 100644 index 0000000000000000000000000000000000000000..466f00725f0639d9c742bffec966e6277d1a7119 GIT binary patch literal 35797 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 U=Yo@PEfj@ADhHDeoc#TN0r$V1aR2}S literal 0 HcmV?d00001 diff --git a/neo_dolfin/ai/Fraud Detection/Model Plot.png b/neo_dolfin/ai/Fraud Detection/Model Plot.png new file mode 100644 index 0000000000000000000000000000000000000000..75e0715cf3775d014c02fb350e14d574912bbfef GIT binary patch literal 13228 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 literal 0 HcmV?d00001 diff --git a/neo_dolfin/ai/Fraud Detection/TrainLoss.png b/neo_dolfin/ai/Fraud Detection/TrainLoss.png new file mode 100644 index 0000000000000000000000000000000000000000..7b58b4907fd8fd10ccb49f217200de0612df2ab1 GIT binary patch literal 50845 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

ejA}wGD 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 KclOPY{r?55f%Ogm literal 0 HcmV?d00001 diff --git a/neo_dolfin/ai/Fraud Detection/dolfin_frauddetection.py b/neo_dolfin/ai/Fraud Detection/dolfin_frauddetection.py new file mode 100644 index 00000000..b0afc546 --- /dev/null +++ b/neo_dolfin/ai/Fraud Detection/dolfin_frauddetection.py @@ -0,0 +1,300 @@ +# -*- coding: utf-8 -*- +"""DolFin_FraudDetection.ipynb + +Automatically generated by Colab. + +Original file is located at + https://colab.research.google.com/drive/1buWFaz7KlnwVV2mM-ZlE8VSTKh10Amkc + +# DolFin Fraudulent Transaction Model +The purpose of this code is to develop a fraud detection model, which monitors a number of features to determine if a transaction is fraud. As the DolFin team receive more data they will be able to combine it with this dataset or add/remove features from the provided one. + +The code has been designed to run off Google Colab, be sure to ensure that the dataset directory is updated and the file is located there. + +## Import relevent libaries +""" + +# Import utilities +import numpy as np +import pandas as pd +import datetime +import os +import warnings +import matplotlib.pyplot as plt +import seaborn as sns +warnings.filterwarnings('ignore') + +# Deep Learning +from sklearn.model_selection import train_test_split +from tensorflow.keras.utils import to_categorical +from sklearn.preprocessing import LabelEncoder +import tensorflow as tf +from tensorflow import keras +from tensorflow.keras import layers, Model, regularizers +from sklearn.preprocessing import StandardScaler + +# Import Google Drive to access the file +from google.colab import drive +drive.mount('/content/drive') + +# Color scheme specified by AI Team Lead +colors = ['#343a40', '#0077bb', '#d9d9d9', '#fafafe', '#abb5be'] + +"""## Importing the Dataset""" + +# Specify the dataset location +# Dataset from https://www.kaggle.com/datasets/sauravmishraa/frauddataset +dataset_dir = '/content/drive/MyDrive/Colab_Notebooks/Projects/DolFin_Fraud/' +file_name = 'CreditCardData.csv' + +# Read the dataset and store it in a dataframe +df = pd.read_csv(dataset_dir + file_name) + +# Shuffle the data +df.sample(frac=1).reset_index(drop=True) + +# Display a list of column names +labels = list(df.columns) + +# Determine the number of samples and features +num_samples = df.shape[0] +num_features = df.shape[1] + +# Display this information in the terminal +msg = f'The file {file_name} contains {num_features} features and {num_samples} samples \n' +msg += f'The column names are: {labels}' +print(msg) + +"""## Feature Conditioning +This is to ensure that the currency sign is removed, categorical columns converted to integers, ext... +""" + +# Ensure the Amount dataframe is a string datatype +df['Amount'] = df['Amount'].astype('string') +def remove_currency(text): + if isinstance(text, str): + return text.replace('£','') + else: + return text + +# Apply the remove currency transformation +df['Amount'] = df['Amount'].apply(remove_currency) + +# Specify the categorical columns +categorical_columns = ['Day of Week', 'Type of Card', 'Entry Mode', + 'Type of Transaction', 'Merchant Group', + 'Country of Transaction', 'Country of Residence', + 'Gender', 'Bank'] + +# Apply the categorical transformation +df[categorical_columns] = df[categorical_columns].astype('category') + +# Replace any missing values with 0 +df['Amount'].fillna(0, inplace=True) + +# Convert the numerical columns to float 32 +numerical_columns = ['Amount', 'Age'] + +# Apply the float32 transformation +df[numerical_columns] = df[numerical_columns].astype('float32') + +# Remove the features that will hinder the DNN or won't be avalible +remove_columns = ['Date', 'Time', 'Transaction ID', 'Shipping Address'] +df = df.drop(columns=remove_columns, axis=1) + +# Convert the categorical features to one-hot encoding +df = pd.get_dummies(df, columns=categorical_columns) + +# Apply scaling to the numerical features of the dataframe +scalar = StandardScaler() +df[numerical_columns] = scalar.fit_transform(df[numerical_columns]) + +# Ensure the numerical columns are floats +df[numerical_columns] = df[numerical_columns].astype('float') + +# Ensure that the Fraud label is the last column +df['Fraud'] = df.pop('Fraud') + +"""## Train / Test and Split the Data +To increase training size and limit errors, I ensured the datasets were in the TensorFlow dataset format. +""" + +# Convert the values to int, I had to do this to resolve an error +df = df.astype(int) + +# Split the dataset into train and test. +test_split = 0.2 +train_ds, test_ds = train_test_split(df, test_size=test_split, random_state=42) + +# Convert to numpy array +train_ds = train_ds.to_numpy() +test_ds = test_ds.to_numpy() + +# Split into features and labels +x_train = train_ds[:, :-1] +y_train = train_ds[:, -1] +x_test = test_ds[:, :-1] +y_test = test_ds[:, -1] + +# Convert into tensorflow datasets +train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)) +test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)) + +# Shuffle the datasets and batch +batch_size = 32 +train_ds = train_ds.shuffle(buffer_size=len(train_ds)).batch(batch_size) +test_ds = test_ds.shuffle(buffer_size=len(test_ds)).batch(batch_size) + +# Prefetch the train and test datasets +train_ds = train_ds.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) +test_ds = test_ds.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + +"""## Data Exploration""" + +# Visualisation of dataset +def describe_labels(y_train, y_test): + fig, ax = plt.subplots(1, 2, figsize=(16,6)) +# colors = sns.color_palette('deep') + colors = ['#343a40', '#0077bb', '#d9d9d9', '#fafafe', '#abb5be'] + + train_unique_labels = np.unique(y_train, return_counts=True) + train_labels = train_unique_labels[0] + train_label_count = train_unique_labels[1] + ax[0].bar(x=train_labels, height=train_label_count, color=colors) + ax[0].set_title('Class Count') + + ax[1].pie(x=train_label_count, labels=train_labels, colors=colors, pctdistance=0.8, autopct='%1.1f%%') + ax[1].set_title('Class Distribution') + + plt.colorbar + plt.tight_layout() + plt.show() + return None + +describe_labels(y_train, y_test) + +"""## Model Development +A deep neural net was developed, and then regulation was added to improve model generalability. +""" + +# Develop a function to build and compile the model +def build_model(num_features, num_classes): + + model = keras.Sequential([ + layers.Dense(128, activation='relu', input_shape=(num_features,), + kernel_regularizer=regularizers.l2(0.01)), + layers.Dropout(0.2), + layers.Dense(64, activation='relu', + kernel_regularizer=regularizers.l2(0.01)), + layers.Dropout(0.2), # Consistent dropout rate + layers.Dense(1, activation='sigmoid') + ]) + + # Compile the model + model.compile(loss='binary_crossentropy', optimizer='adam', + metrics=['accuracy']) + + return model + +# Create the input arguments for the model +num_features = df.shape[1] +num_classes = 2 + +# Build the model for use +model = build_model(num_features-1, num_classes) +model.summary() + +# Plot the model architecture +keras.utils.plot_model(model) + +"""## Model Testing +Tensorboard was used to record the training runs. +""" + +# Commented out IPython magic to ensure Python compatibility. +# Create a tensorboard callback +log_dir = os.path.join("logs", "fit", datetime.datetime.now().strftime("%Y%m%d-%H%M%S")) +tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1) + +# Create a early stopping callback to prevent overfitting +early_stopping = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=2, verbose=1) + +# Store the callbacks in a list +tf_callbacks = [tensorboard_callback, early_stopping] + +# Display tensorboard +# %load_ext tensorboard +# %tensorboard --logdir logs + +# Specify the maximum number of epochs +num_epochs=10 + +# Fit the model to the training data +history = model.fit(train_ds, epochs=num_epochs, batch_size=batch_size + , callbacks=tf_callbacks) + +# Save a copy of the model +model.save_weights('fraud_model.h5') + +print(f"Type of x_train: {type(x_train)}") +print(f"Type of y_train: {type(y_train)}") + +"""## Model Validation +The model performed well due to the large amount of training data and only trained for a few epoch before early stopping kicked in. +""" + +# Create a function to display the training accuracy and loss +def plt_accuracy_loss(history): + # Plot the training history + accuracy = history.history['accuracy'] + loss = history.history['loss'] + epochs = range(len(accuracy)) + + figure, ax = plt.subplots(2, 1, figsize=(12, 8)) + + colors = sns.color_palette("crest", n_colors=2) + + ax[0].plot(epochs, accuracy, '-o', color=colors[0]) + ax[0].set_title('Training Accuracy') + ax[0].set_xlabel('Epochs') + ax[0].set_ylabel('Accuracy [%]') + + ax[1].plot(epochs, loss, '-o', color=colors[1]) + ax[1].set_title('Training Loss') + ax[1].set_xlabel('Epochs') + ax[1].set_ylabel('Loss [%]') + + plt.tight_layout() + plt.show() + +plt_accuracy_loss(history) + +def confusion_matrix_heatmap(y_true, y_pred, labels, name): + # Compute the confusion matrix; + num_classes = 2 + conf_matrix = tf.math.confusion_matrix(labels=y_true, predictions=y_pred, + num_classes=num_classes) + + # Plotting the confusion matrix using seaborn + plt.figure(figsize=(12, 6)) + sns.heatmap(conf_matrix, annot=True, fmt='g', cmap=colors, + xticklabels=labels, + yticklabels=labels) + plt.xlabel('Predicted Labels') + plt.ylabel('True Labels') + plt.title(f'{name} Confusion Matrix') + plt.show() + +# Extract true labels from the dataset +name_2 = 'DolFin Fraudulant Transaction Detection' + +# Predict using the model +y_pred = model.predict(test_ds) +y_pred = np.argmax(y_pred, axis=1) +labels = ['Normal Transaction','Fraudulant Transaction'] + +confusion_matrix_heatmap(y_test, y_pred, labels, name_2) + +# Calculate the model accuracy +loss, accuracy = model.evaluate(x_test, y_test) +print(f'Test Accuracy is {accuracy:.2f}') \ No newline at end of file