{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "e2889168-c959-4143-8a16-47f7e8f9c855", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mon Dec 8 12:36:06 2025 \n", "+-----------------------------------------------------------------------------------------+\n", "| NVIDIA-SMI 580.95.05 Driver Version: 580.95.05 CUDA Version: 13.0 |\n", "+-----------------------------------------+------------------------+----------------------+\n", "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|=========================================+========================+======================|\n", "| 0 Tesla V100-SXM2-32GB On | 00000000:3B:00.0 Off | 0 |\n", "| N/A 38C P0 40W / 300W | 0MiB / 32768MiB | 0% Default |\n", "| | | N/A |\n", "+-----------------------------------------+------------------------+----------------------+\n", "\n", "+-----------------------------------------------------------------------------------------+\n", "| Processes: |\n", "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=========================================================================================|\n", "| No running processes found |\n", "+-----------------------------------------------------------------------------------------+\n" ] } ], "source": [ "!nvidia-smi" ] }, { "cell_type": "markdown", "id": "b2c68ed0-28c2-487c-b3b4-c2f86dcb17d9", "metadata": {}, "source": [ "# Credit Card Fraud Detection\n", "\n", "Link: https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud\n", "\n", "Time taken: 90 minutes (deep work)\n", "\n", "Author: [Aayush Bajaj](https://abaj.ai)\n", "\n", "Version control: https://github.com/abaj8494/10khrs-ai-ml-dl/blob/main/projects/interview/credit-card-fraud.ipynb" ] }, { "cell_type": "markdown", "id": "328bafbc-9a10-4b77-8c80-d023ec98ee28", "metadata": {}, "source": [ "## Problem Statement" ] }, { "cell_type": "markdown", "id": "55b33d34-8a70-4271-a609-5de8b9971243", "metadata": {}, "source": [ "It is important that credit card companies are able to recognise fraudulent credit card transactions so that customers are not charged for items that they did not purchase.\n", "\n", "This dataset contains transactions made by credit cards in September 2013 by European cardholders.\n", "\n", "This dataset presents transactions that occurred in two days, where we have 492 frauds out of 284,807 transactions. The dataset is **highly unbalanced**, the positive class (frauds) account for 0.172% of all transactions. (considering mixture loss, focal perhaps).\n", "\n", "It contains only numerical input variables which are the result of a PCA transformation (naturally all the feature would be too large of a dataset to share; also confidentiality!). 28 features with only 'Time' and 'Amount' not being transformed.\n", "\n", "'Time' contains *seconds elapsed* between each transaction and the **first** transaction in the dataset. 'Amount' is the transaction amount (naturally) -- this feature can be used for example-dependant cost-sensitive learning. Feature 'Class' is the response variable and takes value `1` in case of fraud, else `0`.\n", "\n", "Importantly, given the class imbalance ratio, we should measure accuracy using the **Area Under the Precision-Recall Curve** (AUPRC). Realise that **confusion matrix accuracy** is not meaningful for unbalanced classification." ] }, { "cell_type": "code", "execution_count": 11, "id": "bd631168-ca94-41f7-a37c-14cebbd76a4f", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/srv/scratch/z5362216/.venvs/kits/lib64/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Downloading from https://www.kaggle.com/api/v1/datasets/download/mlg-ulb/creditcardfraud?dataset_version_number=3...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 66.0M/66.0M [00:17<00:00, 3.89MB/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Extracting files...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Path to dataset files: /home/z5362216/.cache/kagglehub/datasets/mlg-ulb/creditcardfraud/versions/3\n" ] } ], "source": [ "import kagglehub\n", "\n", "path = kagglehub.dataset_download(\"mlg-ulb/creditcardfraud\")\n", "\n", "print(\"Path to dataset files:\", path)" ] }, { "cell_type": "markdown", "id": "ac4373c4-2731-492d-b0fa-07cd6d243996", "metadata": {}, "source": [ "## Exploratory Data Analysis" ] }, { "cell_type": "code", "execution_count": 12, "id": "007779a2-db00-487b-863c-faa9ddefbd34", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from pathlib import Path" ] }, { "cell_type": "code", "execution_count": 18, "id": "0173c185-16a3-45ab-98d9-ccaf43451417", "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "csv_path = Path(path + '/' + 'creditcard.csv')\n", "df = pd.read_csv(csv_path)" ] }, { "cell_type": "code", "execution_count": 19, "id": "31384a77-6b18-498d-8f44-123e7688c11f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | Time | \n", "V1 | \n", "V2 | \n", "V3 | \n", "V4 | \n", "V5 | \n", "V6 | \n", "V7 | \n", "V8 | \n", "V9 | \n", "... | \n", "V21 | \n", "V22 | \n", "V23 | \n", "V24 | \n", "V25 | \n", "V26 | \n", "V27 | \n", "V28 | \n", "Amount | \n", "Class | \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", "... | \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", "
| 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", "... | \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", "
| 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", "... | \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", "
| 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", "... | \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", "
| 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", "... | \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", "
5 rows × 31 columns
\n", "| \n", " | Time | \n", "V1 | \n", "V2 | \n", "V3 | \n", "V4 | \n", "V5 | \n", "V6 | \n", "V7 | \n", "V8 | \n", "V9 | \n", "... | \n", "V21 | \n", "V22 | \n", "V23 | \n", "V24 | \n", "V25 | \n", "V26 | \n", "V27 | \n", "V28 | \n", "Amount | \n", "Class | \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", "... | \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", "
| mean | \n", "94813.859575 | \n", "1.168375e-15 | \n", "3.416908e-16 | \n", "-1.379537e-15 | \n", "2.074095e-15 | \n", "9.604066e-16 | \n", "1.487313e-15 | \n", "-5.556467e-16 | \n", "1.213481e-16 | \n", "-2.406331e-15 | \n", "... | \n", "1.654067e-16 | \n", "-3.568593e-16 | \n", "2.578648e-16 | \n", "4.473266e-15 | \n", "5.340915e-16 | \n", "1.683437e-15 | \n", "-3.660091e-16 | \n", "-1.227390e-16 | \n", "88.349619 | \n", "0.001727 | \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", "... | \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", "
| 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", "... | \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", "
| 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", "... | \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", "
| 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", "... | \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", "
| 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", "... | \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", "
| 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", "... | \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", "
8 rows × 31 columns
\n", "