{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Fastag Fraud Detection" ], "metadata": { "id": "Nx7NdXm-7X4C" } }, { "cell_type": "markdown", "source": [ "## Project Pipeline\n", "\n", "1. **Data Exploration**:\n", " - Explore the dataset to understand the distribution of features and the prevalence of fraud indicators.\n", "\n", "2. **Feature Engineering**:\n", " - Identify and engineer relevant features that contribute to fraud detection accuracy.\n", "\n", "3. **Model Development**:\n", " - Build a machine learning classification model to predict and detect Fastag transaction fraud.\n", " - Evaluate and fine-tune model performance using appropriate metrics.\n", "\n", "4. **Real-time Fraud Detection**:\n", " - Explore the feasibility of implementing the model for real-time Fastag fraud detection.\n", "\n", "5. **Explanatory Analysis**:\n", " - Provide insights into the factors contributing to fraudulent transactions." ], "metadata": { "id": "033Tp9X19HJ5" } }, { "cell_type": "markdown", "source": [ "## Dataset Description\n", "\n", "The dataset contains the following columns:\n", "\n", "1. **Transaction_ID**: Unique identifier for each transaction.\n", "2. **Timestamp**: Date and time of the transaction.\n", "3. **Vehicle_Type**: Type of vehicle involved in the transaction.\n", "4. **FastagID**: Unique identifier for Fastag.\n", "5. **TollBoothID**: Identifier for the toll booth.\n", "6. **Lane_Type**: Type of lane used for the transaction.\n", "7. **Vehicle_Dimensions**: Dimensions of the vehicle.\n", "8. **Transaction_Amount**: Amount associated with the transaction.\n", "9. **Amount_paid**: Amount paid for the transaction.\n", "10. **Geographical_Location**: Location details of the transaction.\n", "11. **Vehicle_Speed**: Speed of the vehicle during the transaction.\n", "12. **Vehicle_Plate_Number**: License plate number of the vehicle.\n", "13. **Fraud_indicator**: Binary indicator of fraudulent activity (target variable).\n" ], "metadata": { "id": "XjP3xfZxCT1r" } }, { "cell_type": "markdown", "source": [ "# Exploratory Data Analysis (EDA)" ], "metadata": { "id": "balcKLWlA8ev" } }, { "cell_type": "code", "execution_count": 67, "metadata": { "id": "7vVanFDO6tx9" }, "outputs": [], "source": [ "# Let's import libraries\n", "import pandas as pd" ] }, { "cell_type": "code", "source": [ "df = pd.read_csv('/content/FastagFraudDetection.csv')" ], "metadata": { "id": "jYByW32N7rJP" }, "execution_count": 68, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's look at columns\n", "df.columns" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7q6qaY-M7x5a", "outputId": "1581087e-3e33-4808-8b87-00ab77352052" }, "execution_count": 69, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['Transaction_ID', 'Timestamp', 'Vehicle_Type', 'FastagID',\n", " 'TollBoothID', 'Lane_Type', 'Vehicle_Dimensions', 'Transaction_Amount',\n", " 'Amount_paid', 'Geographical_Location', 'Vehicle_Speed',\n", " 'Vehicle_Plate_Number', 'Fraud_indicator'],\n", " dtype='object')" ] }, "metadata": {}, "execution_count": 69 } ] }, { "cell_type": "code", "source": [ "# Let's look at first 5 rows\n", "df.head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 313 }, "id": "xjs87Lib9gN6", "outputId": "9829ff57-b80c-48b7-bd1c-0afe12cda61e" }, "execution_count": 70, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Transaction_ID Timestamp Vehicle_Type FastagID TollBoothID \\\n", "0 1 1/6/2023 11:20 Bus FTG-001-ABC-121 A-101 \n", "1 2 1/7/2023 14:55 Car FTG-002-XYZ-451 B-102 \n", "2 3 1/8/2023 18:25 Motorcycle NaN D-104 \n", "3 4 1/9/2023 2:05 Truck FTG-044-LMN-322 C-103 \n", "4 5 1/10/2023 6:35 Van FTG-505-DEF-652 B-102 \n", "\n", " Lane_Type Vehicle_Dimensions Transaction_Amount Amount_paid \\\n", "0 Express Large 350 120 \n", "1 Regular Small 120 100 \n", "2 Regular Small 0 0 \n", "3 Regular Large 350 120 \n", "4 Express Medium 140 100 \n", "\n", " Geographical_Location Vehicle_Speed Vehicle_Plate_Number \\\n", "0 13.059816123454882, 77.77068662374292 65 KA11AB1234 \n", "1 13.059816123454882, 77.77068662374292 78 KA66CD5678 \n", "2 13.059816123454882, 77.77068662374292 53 KA88EF9012 \n", "3 13.059816123454882, 77.77068662374292 92 KA11GH3456 \n", "4 13.059816123454882, 77.77068662374292 60 KA44IJ6789 \n", "\n", " Fraud_indicator \n", "0 Fraud \n", "1 Fraud \n", "2 Not Fraud \n", "3 Fraud \n", "4 Fraud " ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Transaction_IDTimestampVehicle_TypeFastagIDTollBoothIDLane_TypeVehicle_DimensionsTransaction_AmountAmount_paidGeographical_LocationVehicle_SpeedVehicle_Plate_NumberFraud_indicator
011/6/2023 11:20BusFTG-001-ABC-121A-101ExpressLarge35012013.059816123454882, 77.7706866237429265KA11AB1234Fraud
121/7/2023 14:55CarFTG-002-XYZ-451B-102RegularSmall12010013.059816123454882, 77.7706866237429278KA66CD5678Fraud
231/8/2023 18:25MotorcycleNaND-104RegularSmall0013.059816123454882, 77.7706866237429253KA88EF9012Not Fraud
341/9/2023 2:05TruckFTG-044-LMN-322C-103RegularLarge35012013.059816123454882, 77.7706866237429292KA11GH3456Fraud
451/10/2023 6:35VanFTG-505-DEF-652B-102ExpressMedium14010013.059816123454882, 77.7706866237429260KA44IJ6789Fraud
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "df", "summary": "{\n \"name\": \"df\",\n \"rows\": 5000,\n \"fields\": [\n {\n \"column\": \"Transaction_ID\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1443,\n \"min\": 1,\n \"max\": 5000,\n \"num_unique_values\": 5000,\n \"samples\": [\n 1502,\n 2587,\n 2654\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Timestamp\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 4423,\n \"samples\": [\n \"6/25/2023 7:17\",\n \"10/22/2023 2:04\",\n \"2/5/2023 0:42\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Vehicle_Type\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 7,\n \"samples\": [\n \"Bus \",\n \"Car\",\n \"Sedan\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"FastagID\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 4451,\n \"samples\": [\n \"FTG-580-DEF-850\",\n \"FTG-083-PQR-333\",\n \"FTG-125-EDC-765\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"TollBoothID\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 6,\n \"samples\": [\n \"A-101\",\n \"B-102\",\n \"D-106\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Lane_Type\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Regular\",\n \"Express\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Vehicle_Dimensions\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"Large\",\n \"Small\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Transaction_Amount\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 112,\n \"min\": 0,\n \"max\": 350,\n \"num_unique_values\": 20,\n \"samples\": [\n 350,\n 330\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Amount_paid\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 106,\n \"min\": 0,\n \"max\": 350,\n \"num_unique_values\": 23,\n \"samples\": [\n 340,\n 60\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Geographical_Location\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"13.042660878688794, 77.47580097259879\",\n \"13.21331620748757, 77.55413526894684\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Vehicle_Speed\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16,\n \"min\": 10,\n \"max\": 118,\n \"num_unique_values\": 85,\n \"samples\": [\n 35,\n 65\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Vehicle_Plate_Number\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5000,\n \"samples\": [\n \"KA05CD5678\",\n \"KA67LM4267\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Fraud_indicator\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"Not Fraud\",\n \"Fraud\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 70 } ] }, { "cell_type": "code", "source": [ "# Let's check up missing value\n", "df.isnull().any()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "zUdPKKpE9hbR", "outputId": "c02bfa26-c9de-444e-c1a4-220de494385d" }, "execution_count": 71, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Transaction_ID False\n", "Timestamp False\n", "Vehicle_Type False\n", "FastagID True\n", "TollBoothID False\n", "Lane_Type False\n", "Vehicle_Dimensions False\n", "Transaction_Amount False\n", "Amount_paid False\n", "Geographical_Location False\n", "Vehicle_Speed False\n", "Vehicle_Plate_Number False\n", "Fraud_indicator False\n", "dtype: bool" ] }, "metadata": {}, "execution_count": 71 } ] }, { "cell_type": "code", "source": [ "# Let's check up missing value count\n", "df.isnull().sum()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5N47_ZUF9r6Z", "outputId": "da5da61a-df41-4c8a-f34f-32aabc271c96" }, "execution_count": 72, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Transaction_ID 0\n", "Timestamp 0\n", "Vehicle_Type 0\n", "FastagID 549\n", "TollBoothID 0\n", "Lane_Type 0\n", "Vehicle_Dimensions 0\n", "Transaction_Amount 0\n", "Amount_paid 0\n", "Geographical_Location 0\n", "Vehicle_Speed 0\n", "Vehicle_Plate_Number 0\n", "Fraud_indicator 0\n", "dtype: int64" ] }, "metadata": {}, "execution_count": 72 } ] }, { "cell_type": "code", "source": [ "# Let's look at shape of dataframe\n", "df.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "vpftuKMn9wLp", "outputId": "5c9fa3c2-4b81-43b6-ce98-f1fa67f2686d" }, "execution_count": 73, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(5000, 13)" ] }, "metadata": {}, "execution_count": 73 } ] }, { "cell_type": "code", "source": [ "# Let's look at number of unique values\n", "df.nunique()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "YaMBm1lI94ip", "outputId": "a6b35aa6-0311-4e86-aeaa-8e58dd230cb1" }, "execution_count": 74, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Transaction_ID 5000\n", "Timestamp 4423\n", "Vehicle_Type 7\n", "FastagID 4451\n", "TollBoothID 6\n", "Lane_Type 2\n", "Vehicle_Dimensions 3\n", "Transaction_Amount 20\n", "Amount_paid 23\n", "Geographical_Location 5\n", "Vehicle_Speed 85\n", "Vehicle_Plate_Number 5000\n", "Fraud_indicator 2\n", "dtype: int64" ] }, "metadata": {}, "execution_count": 74 } ] }, { "cell_type": "code", "source": [ "for i in df.columns:\n", " print(f'{i}: {df[i].unique()[:15]}')" ], "metadata": { "id": "1aHCyVdgaRgj", "outputId": "bb2b9c33-1a52-4bbb-be24-f17a8be447bc", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": 75, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Transaction_ID: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]\n", "Timestamp: ['1/6/2023 11:20' '1/7/2023 14:55' '1/8/2023 18:25' '1/9/2023 2:05'\n", " '1/10/2023 6:35' '1/11/2023 10:00' '1/12/2023 15:40' '1/13/2023 20:15'\n", " '1/14/2023 1:55' '1/15/2023 7:30' '1/16/2023 12:10' '1/17/2023 17:45'\n", " '1/18/2023 22:20' '1/19/2023 4:00' '1/20/2023 8:30']\n", "Vehicle_Type: ['Bus ' 'Car' 'Motorcycle' 'Truck' 'Van' 'Sedan' 'SUV']\n", "FastagID: ['FTG-001-ABC-121' 'FTG-002-XYZ-451' nan 'FTG-044-LMN-322'\n", " 'FTG-505-DEF-652' 'FTG-066-GHI-987' 'FTG-707-JKL-210' 'FTG-088-UVW-543'\n", " 'FTG-909-RST-876' 'FTG-021-QWE-765' 'FTG-011-ZXC-431' 'FTG-013-POI-104'\n", " 'FTG-014-KJH-872' 'FTG-055-DCV-543' 'FTG-066-NBH-210']\n", "TollBoothID: ['A-101' 'B-102' 'D-104' 'C-103' 'D-105' 'D-106']\n", "Lane_Type: ['Express' 'Regular']\n", "Vehicle_Dimensions: ['Large' 'Small' 'Medium']\n", "Transaction_Amount: [350 120 0 140 160 180 290 110 100 130 60 150 340 300 70]\n", "Amount_paid: [120 100 0 160 90 180 350 140 110 60 290 130 70 190 150]\n", "Geographical_Location: ['13.059816123454882, 77.77068662374292'\n", " '13.042660878688794, 77.47580097259879'\n", " '12.84197701525119, 77.67547528176169'\n", " '12.936687032945434, 77.53113977439017'\n", " '13.21331620748757, 77.55413526894684']\n", "Vehicle_Speed: [ 65 78 53 92 60 105 70 88 45 72 58 81 67 98 50]\n", "Vehicle_Plate_Number: ['KA11AB1234' 'KA66CD5678' 'KA88EF9012' 'KA11GH3456' 'KA44IJ6789'\n", " 'KA77KL0123' 'KA22MN4567' 'KA21OP8901' 'KA16QR2345' 'KA22ST6789'\n", " 'KA12UV0123' 'KA35WX3454' 'KA38YZ6785' 'KA14AB0123' 'KA40CD4557']\n", "Fraud_indicator: ['Fraud' 'Not Fraud']\n" ] } ] }, { "cell_type": "code", "source": [ "# Let's look at info of dataframe\n", "df.info()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "O3oWL-jC98DZ", "outputId": "91be4257-eb2b-492e-9bdc-af61ceec957a" }, "execution_count": 11, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "RangeIndex: 5000 entries, 0 to 4999\n", "Data columns (total 13 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Transaction_ID 5000 non-null int64 \n", " 1 Timestamp 5000 non-null object\n", " 2 Vehicle_Type 5000 non-null object\n", " 3 FastagID 4451 non-null object\n", " 4 TollBoothID 5000 non-null object\n", " 5 Lane_Type 5000 non-null object\n", " 6 Vehicle_Dimensions 5000 non-null object\n", " 7 Transaction_Amount 5000 non-null int64 \n", " 8 Amount_paid 5000 non-null int64 \n", " 9 Geographical_Location 5000 non-null object\n", " 10 Vehicle_Speed 5000 non-null int64 \n", " 11 Vehicle_Plate_Number 5000 non-null object\n", " 12 Fraud_indicator 5000 non-null object\n", "dtypes: int64(4), object(9)\n", "memory usage: 507.9+ KB\n" ] } ] }, { "cell_type": "code", "source": [ "# Let's look at descriptive statistic methods of dataframe\n", "df.describe().T" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 175 }, "id": "RRN5CXeR-Fib", "outputId": "ce8d1f25-c7f1-4307-a9a3-9d57268d98b3" }, "execution_count": 12, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " count mean std min 25% 50% \\\n", "Transaction_ID 5000.0 2500.5000 1443.520003 1.0 1250.75 2500.5 \n", "Transaction_Amount 5000.0 161.0620 112.449950 0.0 100.00 130.0 \n", "Amount_paid 5000.0 141.2610 106.480996 0.0 90.00 120.0 \n", "Vehicle_Speed 5000.0 67.8512 16.597547 10.0 54.00 67.0 \n", "\n", " 75% max \n", "Transaction_ID 3750.25 5000.0 \n", "Transaction_Amount 290.00 350.0 \n", "Amount_paid 160.00 350.0 \n", "Vehicle_Speed 82.00 118.0 " ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countmeanstdmin25%50%75%max
Transaction_ID5000.02500.50001443.5200031.01250.752500.53750.255000.0
Transaction_Amount5000.0161.0620112.4499500.0100.00130.0290.00350.0
Amount_paid5000.0141.2610106.4809960.090.00120.0160.00350.0
Vehicle_Speed5000.067.851216.59754710.054.0067.082.00118.0
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"df\",\n \"rows\": 4,\n \"fields\": [\n {\n \"column\": \"count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0,\n \"min\": 5000.0,\n \"max\": 5000.0,\n \"num_unique_values\": 1,\n \"samples\": [\n 5000.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"mean\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1189.2304350110944,\n \"min\": 67.8512,\n \"max\": 2500.5,\n \"num_unique_values\": 4,\n \"samples\": [\n 161.062\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"std\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 683.9122043112384,\n \"min\": 16.597546634091863,\n \"max\": 1443.5200033252052,\n \"num_unique_values\": 4,\n \"samples\": [\n 112.44994955192665\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"min\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4.856267428111155,\n \"min\": 0.0,\n \"max\": 10.0,\n \"num_unique_values\": 3,\n \"samples\": [\n 1.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"25%\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 585.0419278066032,\n \"min\": 54.0,\n \"max\": 1250.75,\n \"num_unique_values\": 4,\n \"samples\": [\n 100.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"50%\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1197.7357370611153,\n \"min\": 67.0,\n \"max\": 2500.5,\n \"num_unique_values\": 4,\n \"samples\": [\n 130.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"75%\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1788.5173372447357,\n \"min\": 82.0,\n \"max\": 3750.25,\n \"num_unique_values\": 4,\n \"samples\": [\n 290.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"max\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2366.195469524866,\n \"min\": 118.0,\n \"max\": 5000.0,\n \"num_unique_values\": 3,\n \"samples\": [\n 5000.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 12 } ] }, { "cell_type": "code", "source": [ "# Let's look at data types of columns\n", "df.dtypes" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "PRni1U5T-HRB", "outputId": "b5e4b93f-7752-42a8-e71c-5b850c9aebfa" }, "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Transaction_ID int64\n", "Timestamp object\n", "Vehicle_Type object\n", "FastagID object\n", "TollBoothID object\n", "Lane_Type object\n", "Vehicle_Dimensions object\n", "Transaction_Amount int64\n", "Amount_paid int64\n", "Geographical_Location object\n", "Vehicle_Speed int64\n", "Vehicle_Plate_Number object\n", "Fraud_indicator object\n", "dtype: object" ] }, "metadata": {}, "execution_count": 11 } ] }, { "cell_type": "markdown", "source": [ "# Feature Engineering" ], "metadata": { "id": "ppPsYltUBLkK" } }, { "cell_type": "code", "source": [ "df.head(2)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 214 }, "id": "vIcdUS_9BKTZ", "outputId": "8618db92-10ed-4c40-e5de-a391b91c45fd" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Transaction_ID Timestamp FastagID TollBoothID \\\n", "0 1 1/6/2023 11:20 FTG-001-ABC-121 101 \n", "1 2 1/7/2023 14:55 FTG-002-XYZ-451 102 \n", "\n", " Transaction_Amount Amount_paid Geographical_Location \\\n", "0 350 120 13.059816123454882, 77.77068662374292 \n", "1 120 100 13.059816123454882, 77.77068662374292 \n", "\n", " Vehicle_Speed Vehicle_Plate_Number Fraud_indicator ... Lane_Type_Regular \\\n", "0 65 KA11AB1234 1 ... False \n", "1 78 KA66CD5678 1 ... True \n", "\n", " Vehicle_Dimensions_Medium Vehicle_Dimensions_Small \\\n", "0 False False \n", "1 False True \n", "\n", " Vehicle_Speed_group_21-41 Vehicle_Speed_group_41-93 \\\n", "0 False True \n", "1 False True \n", "\n", " Vehicle_Speed_group_93-103 Vehicle_Speed_group_<= 21 \\\n", "0 False False \n", "1 False False \n", "\n", " Transaction_Amount_group_330 < Transaction_Amount_group_60-180 \\\n", "0 True False \n", "1 False True \n", "\n", " Transaction_Amount_group_<= 60 \n", "0 False \n", "1 False \n", "\n", "[2 rows x 29 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Transaction_IDTimestampFastagIDTollBoothIDTransaction_AmountAmount_paidGeographical_LocationVehicle_SpeedVehicle_Plate_NumberFraud_indicator...Lane_Type_RegularVehicle_Dimensions_MediumVehicle_Dimensions_SmallVehicle_Speed_group_21-41Vehicle_Speed_group_41-93Vehicle_Speed_group_93-103Vehicle_Speed_group_<= 21Transaction_Amount_group_330 <Transaction_Amount_group_60-180Transaction_Amount_group_<= 60
011/6/2023 11:20FTG-001-ABC-12110135012013.059816123454882, 77.7706866237429265KA11AB12341...FalseFalseFalseFalseTrueFalseFalseTrueFalseFalse
121/7/2023 14:55FTG-002-XYZ-45110212010013.059816123454882, 77.7706866237429278KA66CD56781...TrueFalseTrueFalseTrueFalseFalseFalseTrueFalse
\n", "

2 rows × 29 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "df" } }, "metadata": {}, "execution_count": 53 } ] }, { "cell_type": "code", "source": [ "# # Let's seperate location column to long and lat\n", "# df[['lat', 'long']] = df['Geographical_Location'].apply(lambda x: pd.Series(x.split(',')))" ], "metadata": { "id": "XkGCYoRFo9F0" }, "execution_count": 13, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's find which percent are paid\n", "df['Percent_paid'] = df.apply(lambda row: row['Amount_paid'] / row['Transaction_Amount'] if row['Transaction_Amount'] != 0 else 0, axis=1)" ], "metadata": { "id": "FUkOBL3hp1RE" }, "execution_count": 76, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's convert fraud column to int data type\n", "df['Fraud_indicator'] = df['Fraud_indicator'].replace({'Fraud':1, 'Not Fraud':0})" ], "metadata": { "id": "OwshZBDAqnXz" }, "execution_count": 77, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's choose right group for age group\n", "import matplotlib.pyplot as plt\n", "for i in ['Vehicle_Speed', 'Transaction_Amount']:\n", " age_salary_mean = df.groupby(by=i).aggregate({'Fraud_indicator': 'mean'})\n", " plt.figure(figsize=(10, 3))\n", " plt.plot(age_salary_mean.index, age_salary_mean['Fraud_indicator'], marker='o', linestyle='-', color='b', label='Mean Fraud Indicator')\n", " plt.title(f'Mean Fraud Indicator by {i}', fontsize=16)\n", " plt.xlabel(f'{i}', fontsize=14)\n", " plt.ylabel('Mean Fraud Indicator', fontsize=14)\n", " step_size = 2\n", " plt.xticks(age_salary_mean.index[::step_size], fontsize=12, rotation=90)\n", " plt.yticks(fontsize=12)\n", " plt.grid(True)\n", " plt.tight_layout()\n", "\n", " plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 597 }, "id": "KlvEqtKLHF6H", "outputId": "7c0ebc22-2bf1-4ec2-ba48-8f324ec5f1fc" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAEiCAYAAADklbFjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACxMElEQVR4nOydd3hURReHf3c3m0oKoaYRei9BCaEmRIqA9N6rIopKNYgCgsqHSFdRinSpUpUivUpvgihFJARCqIYkpGd3vj/Gu8lm+93d7G5y3ufJk91779w5M7fsnDlnzhEYYwwEQRAEQRAEQRAEQVgdmb0FIAiCIAiCIAiCIIjCCindBEEQBEEQBEEQBGEjSOkmCIIgCIIgCIIgCBtBSjdBEARBEARBEARB2AhSugmCIAiCIAiCIAjCRpDSTRAEQRAEQRAEQRA2gpRugiAIgiAIgiAIgrARpHQTBEEQBEEQBEEQhI0gpZsgCIIgCIIgCIIgbAQp3QRBFCrKly8PQRAgCAJGjx5t8NjZs2erj3VxcSkgCQuOo0ePqttn6O/Fixf2FlUSsbGxEAQB5cuXN6uceI+sWrXKJnLlR7wOLVq00NguVf6iwKpVqyAIAoYMGWI3GQYNGgRBENCnTx+Tjp8/fz4EQUDNmjUl1ynem7GxsWaVGzJkiFXuaUe4J3fs2IFOnTohMDAQrq6u8PX1ReXKldG2bVt8/vnnuH79ut1ksyUtWrSAIAg4evSovUUhCMIGFL5RJkEQxH+sW7cOs2fPhqurq879K1asKGCJ7MfgwYP17tPXP0ThRxAEAABjzM6SOB7Dhw/H2rVrsWPHDiQmJqJ48eIGj1+5cqW6HGE+SqUSAwcOxIYNGwAAtWrVQsOGDeHh4YG4uDgcP34c+/btQ1JSEubMmWNnaQmCIMyDlG6CIAolDRo0wIULF7Bz50707NlTa/+pU6dw48YNhIeH4/z583aQsGApKKsuYTpBQUH466+/oFAo7C0KoYPIyEhUrlwZf//9N9atW4f33ntP77Hnz5/HtWvXoFAoMHDgwAKUkjNz5kx89NFHCAgIKPC6rcXixYuxYcMGeHt7Y+fOnYiOjtbYn5aWhl27diE7O9tOEhIEQUiH3MsJgiiUDBs2DIB+a/by5cs1jiOIgkahUKB69eqoVKmSvUUhdCAIgvr9IFqx9SHu79ChA0qXLm1z2fITEBCA6tWrw9fXt8DrthYbN24EALz33ntaCjcAeHp6olevXujfv39Bi0YQBGExpHQTBFEoqVOnDho0aID9+/cjPj5eY9/Lly+xefNmBAcHo02bNgbPk5OTgx9++AEtWrSAv78/3NzcUKFCBbzzzju4f/++zjLbtm3Dm2++idq1a6N48eJwd3dHhQoVMGzYMNy8eVNnmbxrMu/evYuBAweibNmycHNzQ6VKlTB58mRkZmZK6wwTyLvuOC0tDVOnTkWNGjXg6empsb7z3LlziImJQcOGDVG2bFm4urqiTJky6NixIw4ePKjz3NOmTYMgCJg2bZrRunWxa9cuREVFwdvbG76+vmjevDl27txpYYsNy/n06VOMGjUKISEhcHV1RUhICN5//32D69/XrFmD8PBweHp6wt/fH23btsWJEyf0Hm9s/WxaWhoWLFiAZs2aoXjx4nBzc0NoaCg6duyI9evXaxx77949zJo1C6+99hrKlSsHNzc3+Pn5oVmzZliyZAlUKpXOtorkX+eff03xvn371Aqlq6srAgMD0bt3b1y4cEGn7HnXp544cQIdO3ZEqVKlIJPJzPa6eP78OUaNGqVuV2hoKMaOHYvExESN41auXAlBEPD666/rPdfDhw+hUCjg4eGB58+fG617yJAhkMvluHTpEq5evarzmIyMDLVLdH7X8osXL6J///5q2f39/fH6669jz549Rus+cuQI2rRpg+LFi8PDwwOvvPIK1qxZo1dOQ2u6L168iMGDB6NChQpwd3eHv78/6tWrhw8//BD37t0zKotIeno65s6di0aNGsHPzw/u7u6oVq0aYmJiTOpPQzx+/BgAzJ60yP/u+vjjj1G5cmW4u7sjMDAQw4cP1/oNyEtiYiI+/fRThIWFwdvbG56enqhTpw6++OILpKWl6S0n5drev38fw4YNQ0BAANzd3VGlShV88sknSE9PN6vNBEE4IYwgCKIQERoaygCwEydOsO+++44BYF988YXGMcuXL2cA2CeffMLu3r3LADC5XK51ruTkZNaiRQsGgBUrVoxFRUWxHj16sGrVqjEArESJEuzSpUta5eRyOfP09GQNGjRg3bp1Y506dWIVK1ZkAJiXlxf77bfftMoMHjyYAWCjR49mPj4+LDQ0lPXq1Yu1atWKeXh4MACsS5cuZvXFkSNHGABmyqtePDYiIoKFh4czLy8v1q5dO9a7d2/WqlUr9XEtW7ZkMpmM1alTh7Vv35717NmTvfLKK+p6FixYoHXuTz/9lAFgn376qcG6o6KitPbNmzdPfe6GDRuyvn37sgYNGjAAbNy4cQwACw0NNbVLGGO598jKlSt1yjls2DAWHBzMypQpw7p168bat2/PfH19GQAWHh7OsrKytM75wQcfMABMJpOxyMhI1qdPH1azZk0mk8nY6NGjdbZPvPd0yR8XF8dq1qzJADBPT0/WunVr1qdPH9a8eXPm6+urVebzzz9nAFiFChVYy5YtWZ8+fVhUVBRzdXVlAFi3bt2YSqVSH799+3b1PQeADR48WOPv6dOn6mMnT57MADBBEFjTpk1Z3759WVhYmPq5Wb58uZb8UVFRDAB79913mUwmYzVr1mR9+vRhbdq0YevXrzd6jVauXMkAsE6dOrFKlSoxPz8/1qVLF9a1a1dWvHhxBoBVq1aNPXnyRF0mIyODlSpVigmCwG7evKnzvFOnTmUA2NChQ43KINKxY0cGgH3wwQc6969bt44BYIGBgSwnJ0e9fcGCBUwmkzEALCwsjPXo0YM1a9ZMfU2mT5+udS7x3pwyZQoTBIG9+uqrrE+fPqxRo0bqazV//nytcuK1zH9PM8bYV199pZajatWqrFevXqxjx46sRo0aWmUM3ZPx8fGsTp06DADz9/dnrVq1Yl27dlXLXL58eRYbG2u0P/XRsmVLBoDVq1ePvXjxwuRy4vujcePGrFGjRszT01P9bgoICGAAWNmyZdmtW7e0yl6/fp2FhIQwACwgIIC1bduWdezYkZUpU0Z93XTJIuXa/vXXX6x06dLqunr27Mnat2/PPDw8WOPGjVnjxo0ZAHbkyBGz+o0gCOeAlG6CIAoVeZXuFy9eMA8PD1a5cmWNY5o2bcoEQWB37twxqHT369ePAWAdOnRgjx8/1tg3f/58BoBVqVJFY6DNGGMbN25kL1++1NimUqnYokWLGABWq1YtDQWIMaahAH3yySca57x27Rrz8vJiANipU6dM7gspSjcAVrduXZaQkKDzuD179rCHDx9qbT916hTz8fFhCoWCPXjwQGOfVKX7999/Z3K5nMlkMvbTTz9p7Pvxxx+ZIAg2UboBsCFDhrCMjAz1vri4OBYUFMQAaCmNu3btUk+oHD9+XGPf//73P/U5TVW6lUqlemKhTZs2GoolY4ylp6ez3bt3a2w7d+4cu3btmlZb4+PjWb169RgAtnnzZq39xu6PvXv3MgDM3d2d7d+/X2PfDz/8wAAwhULB/vjjD419otINgC1atEjv+fUhKt0AWKNGjdjz58/V+xITE1mTJk0YANanTx+Ncp988oleBTkrK4uVLVuWAWAXL140WZYdO3aoJ9kyMzO19rdq1YoBYB9//LF626+//soEQWAlS5Zkx44d0zj+6tWrLDg4mAFgR48e1dgn3psKhYL98ssvOvvE19eXpaWlaezTp3Tv3LlTff02bdqkJfv169fZn3/+qf6u755UqVSsadOmDAAbPnw4S05OVu/Lzs5m48ePZwBYdHS0Vh2msn37dvU19/X1ZQMGDGDfffcdO3PmjM5+F8n77qpcuTK7d++eel96ejrr3r27+j7KS1paGqtUqRIDwCZPnqxRR2pqKuvbt6/OCRqp1zY8PJwBYL169WLp6enq7ffu3VPLQUo3QRReSOkmCKJQkVfpZoyx/v37awyAbty4wQCwFi1aMMaYXqX7zz//ZIIgsMDAQI0BZl7at2/PAGgNjg0hWjOuX7+usV0cNL/66qtaCjljjI0cOZIBYJ999pnJdeUdjOr7EwfpeY/NrziayqRJk3QqWVKV7jfffJMBYL1799ZZrnPnzjZRuoODg1lqaqpWuS+//FJtCc+LqHRNnDhRZ32iVdhUpVtU8gICAlhKSopZbdPFvn37GADWs2dPrX3GlG7R+jhu3Did+zt06MAAsLfeektju6h0v/baa5Jkzqt0X758WWv/1atXmSAITCaTsfv376u3x8fHM4VCwXx9fbUmvjZs2KC2iJpDdna2WlnPP/lz7949tcXz9u3b6u0REREMANuyZYvOc27evJkBYN27d9fYLt6b+vq7evXqOp9RfUq3eO/NnTvXpLbquyfFyZewsDCWnZ2tVU6pVLLatWszADonf0xl+fLlrESJElrvKXd3d9atWzd27tw5rTJ53107duzQ2v/48WPm6enJAGh4GX3//ffqSVVdpKSksNKlSzMXFxf277//qrdLubYnT55UT8w9e/ZMq0zeCQdSugmicELRywmCKNQMGzYM69atw4oVKxAVFaUOrGYsgNqePXvAGEO7du3g7e2t85gWLVpgz549OHXqFDp06KCx7++//8avv/6Kv//+GykpKVAqlQBy1y3evHlTZz7f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aJCMHz9eFi5cKIcPH7bJOCuvVba1+cTERMnPz2/yuE1Rk9cq64x8eXm5LF26VJ555hnJyMiwrG/btk1GjRolAwYMkDvvvFMOHDjwr8lquXdRUZHccccd4ufnJx4eHjJ48GB54403bOoOHDhg800KarJa7q22by2dOnVKkpOTpXv37nb/ENqtWzdJTk6W8vJyrVv9zysoKJBFixY5dJf4srIyycrKaoOunEsREdH6FHciIiIiIiItnD59Gr/99hvMZjO8vLxwzTXXNHlfCKKW4tBNRERERERkR1VVFS5cuICgoCCtWyG03/eDdy8nIiIiIiKyY82aNQgODta6Dfo/7fX94NBNRERERERE5CLuWjdARERERETUVjZv3uxw7eHDh13YCQEd4/3gNd1ERERERNRh6HQ6KIoCR8cgRVFQX1/v4q46ro7wfvCTbiIiIiIi6jD8/f0xZMgQrFixotnat956Cxs2bGiDrjqujvB+cOgmIiIiIqIOY9iwYTh69CgiIiKarc3IyGiDjjq2jvB+8EZqRERERETUYQwbNgxlZWU4e/Zss7UGg6HdfT1Ve9MR3g9e001ERERERB1GTU0N/vjjD/Ts2ROdOnXSup0OryO8Hxy6iYiIiIiIiFyEp5cTERERERERuQiHbiIiIiIiIiIX4dBNRERERERE5CIcuomIiIiIiIhchEM3ERFRG9u0aRMURcGmTZscziiKgujo6FbvGR0dDUVRWp2n/5eYmAhFUVBaWqp1K0RE1A5w6CYiIrrK9OnToSgKtm3b1mTdn3/+Cb1eD4PBALPZ3EbdtQ8nT55ESkoK+vfvD09PT/j4+CA4OBgTJkzA8uXLUVNTo3WLREREbcJd6waIiIj+bR588EFs27YNb7/9Nu67775G67Zt2waz2YxZs2bBy8vLpT0VFxdDr9e7dA9n+fbbbxEdHY2KigpERUUhLi4OPj4+OHnyJLKzs7F7925MnjwZ/fr107pVIiIil+PQTUREdJUxY8YgODgYX375JU6ePImgoCC7dW+//TaAy0O6q4WFhbl8D2dZsGABKioqsHnzZsyYMcPm+by8PAQGBmrQGRERUdvj6eVERERXURQFs2fPxqVLl5CWlma35siRIygoKMDgwYNxyy23AAA++eQTjB07Fv7+/vD09MSgQYOwatUq1NfXN7rX559/jhEjRkCv1yMgIACz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1+tbVf/aa68hKioKM2fOxMcff4z+/fujoKAAhYWFGDlypOXTdyIioubwk24iIqJm+Pr6Ytq0aQAAo9GIu+66y6YmNTUVe/futdxpe/Xq1fj0008td8y+//77nd6Xp6cn9u7di1WrVsHb2xsbN27E+vXrUVxcjKSkJFx33XXNHsMVfe/atQtPP/003N3dsXPnTqxcuRJbt26Fp6cnnnjiCXz//fcIDw+3yYWEhCAnJwdeXl547bXXsHPnTkRHRyM7Oxu33nqrVa3RaERubi5WrFiBzp07Y+vWrVi7di3y8/MxcOBAbN68GYGBga2uHzRoEHJychAbG4uMjAysW7cOnTt3Rk5Ojs1d14mIiJqiiL1zrIiIiIjaSGlpKYKDgzFr1izLjdaIiIj+K/hJNxEREREREZGLcOgmIiIiIiIichHeSI2IiIiaVFpa6tBp3waDAfPnz3d5P0RERO0Jr+kmIiKiJmVlZWH06NHN1vXp0welpaWub4iIiKgd4dBNRERERERE5CK8ppuIiIiIiIjIRTh0ExEREREREbkIh24iIiIiIiIiF+HQTUREREREROQiHLqJiIiIiIiIXIRDNxEREREREZGLcOgmIiIiIiIichEO3UREREREREQuwqGbiIiIiIiIyEX+B1TG3nOpa446AAAAAElFTkSuQmCC\n" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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u7s7li5dij59+qBOnTro1asXChcujP379+PMmTMICAjQ6c08u6WmpiIoKAgKhSLTxL1Xr14YN24c1qxZg3nz5umMfZ1Vc+bMwaFDh/DVV1/h6NGjqFOnDsLDw/H777/D1dUVQUFBWp3RDRkyBF9//TWmT5+OsLAwlC1bFqdPn8bFixcRGBiIQ4cOZSkeU95PIiKyLibTRESU6/j6+uLQoUOYOHEi9u/fj5SUFLz11lvYu3cvIiMjs5xM9+nTBy9evMBff/2FkydPIikpCb6+vhg5ciQmTJiAkiVLApBVd7dv346PP/4Yu3fvxqlTp1C+fHnMmzcPbdq00ZtMly9fHmfPnsWsWbOwbds2LFiwAPnz50f58uV12n//+uuv+PDDD7F9+3bExcVBCIEGDRpkmnz16NEDxYoVw6xZs7Bx40YkJiaiVKlS+PTTTzFp0qRsT1pftX//fkRERCAwMBClS5fOcD0PDw907doVa9aswcaNG9G3b99sjaNw4cI4ceIEvvzyS2zZsgWhoaHw8PBA586d8dlnn6FKlSpa6xctWhQHDx7ERx99hL1798Le3h5NmjTB8ePH8dVXX2U5mQZMez+JiMh6FEIIYe0giIiIiIiIiHIStpkmIiIiIiIiMhKTaSIiIiIiIiIjsc00ERERZdnmzZsRFhb22vUaN26Mxo0bmz0eIiIic2MyTURERFm2efNmrFy50qB1mUwTEVFuwA7IiIiIiIiIiIzENtNERERERERERmIyTURERERERGQkJtNERERERERERmIyTURERERERGQkJtNERERERERERmIyTURERERERGQkJtNERERERERERmIyTURERERERGQkJtNERERERERERvo/qmLeIFb9viIAAAAASUVORK5CYII=\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "# Let's also group Vehicle_Speed, Transaction_Amount columns\n", "def Vehicle_Speed_group(speed):\n", " if speed <= 21:\n", " return '<= 21'\n", " elif speed <= 41:\n", " return '21-41'\n", " elif speed <= 93:\n", " return '41-93'\n", " elif speed <= 103:\n", " return '93-103'\n", " else:\n", " return '103 <'\n", "\n", "def Transaction_Amount_group(amount):\n", " if amount <= 60:\n", " return '<= 60'\n", " elif amount <= 180:\n", " return '60-180'\n", " elif amount <= 330:\n", " return '180-330'\n", " else:\n", " return '330 <'\n", "\n", "df['Vehicle_Speed_group'] = df['Vehicle_Speed'].apply(lambda x: Vehicle_Speed_group(x))\n", "df['Transaction_Amount_group'] = df['Transaction_Amount'].apply(lambda x: Transaction_Amount_group(x))" ], "metadata": { "id": "sTv3x6AxIvUI" }, "execution_count": 78, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's encode categorical features\n", "df = pd.get_dummies(df, columns=['Vehicle_Type', 'Lane_Type','TollBoothID', 'Vehicle_Dimensions','Vehicle_Speed_group','Transaction_Amount_group'], drop_first=True)" ], "metadata": { "id": "r9Jui9rNOUcI" }, "execution_count": 79, "outputs": [] }, { "cell_type": "markdown", "source": [ "# Data Preprocessing" ], "metadata": { "id": "5Kl79dn9PPmH" } }, { "cell_type": "code", "source": [ "df.head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 360 }, "id": "VmXFcpOlxE1y", "outputId": "d76a6def-bef9-444e-ead1-3266aa11d287" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Transaction_ID Timestamp FastagID Transaction_Amount \\\n", "0 1 1/6/2023 11:20 FTG-001-ABC-121 350 \n", "1 2 1/7/2023 14:55 FTG-002-XYZ-451 120 \n", "2 3 1/8/2023 18:25 NaN 0 \n", "3 4 1/9/2023 2:05 FTG-044-LMN-322 350 \n", "4 5 1/10/2023 6:35 FTG-505-DEF-652 140 \n", "\n", " Amount_paid Geographical_Location Vehicle_Speed \\\n", "0 120 13.059816123454882, 77.77068662374292 65 \n", "1 100 13.059816123454882, 77.77068662374292 78 \n", "2 0 13.059816123454882, 77.77068662374292 53 \n", "3 120 13.059816123454882, 77.77068662374292 92 \n", "4 100 13.059816123454882, 77.77068662374292 60 \n", "\n", " Vehicle_Plate_Number Fraud_indicator lat ... \\\n", "0 KA11AB1234 1 13.059816123454882 ... \n", "1 KA66CD5678 1 13.059816123454882 ... \n", "2 KA88EF9012 0 13.059816123454882 ... \n", "3 KA11GH3456 1 13.059816123454882 ... \n", "4 KA44IJ6789 1 13.059816123454882 ... \n", "\n", " TollBoothID_D-106 Vehicle_Dimensions_Medium Vehicle_Dimensions_Small \\\n", "0 False False False \n", "1 False False True \n", "2 False False True \n", "3 False False False \n", "4 False True False \n", "\n", " Vehicle_Speed_group_21-41 Vehicle_Speed_group_41-93 \\\n", "0 False True \n", "1 False True \n", "2 False True \n", "3 False True \n", "4 False True \n", "\n", " Vehicle_Speed_group_93-103 Vehicle_Speed_group_<= 21 \\\n", "0 False False \n", "1 False False \n", "2 False False \n", "3 False False \n", "4 False False \n", "\n", " Transaction_Amount_group_330 < Transaction_Amount_group_60-180 \\\n", "0 True False \n", "1 False True \n", "2 False False \n", "3 True False \n", "4 False True \n", "\n", " Transaction_Amount_group_<= 60 \n", "0 False \n", "1 False \n", "2 True \n", "3 False \n", "4 False \n", "\n", "[5 rows x 33 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Transaction_IDTimestampFastagIDTransaction_AmountAmount_paidGeographical_LocationVehicle_SpeedVehicle_Plate_NumberFraud_indicatorlat...TollBoothID_D-106Vehicle_Dimensions_MediumVehicle_Dimensions_SmallVehicle_Speed_group_21-41Vehicle_Speed_group_41-93Vehicle_Speed_group_93-103Vehicle_Speed_group_<= 21Transaction_Amount_group_330 <Transaction_Amount_group_60-180Transaction_Amount_group_<= 60
011/6/2023 11:20FTG-001-ABC-12135012013.059816123454882, 77.7706866237429265KA11AB1234113.059816123454882...FalseFalseFalseFalseTrueFalseFalseTrueFalseFalse
121/7/2023 14:55FTG-002-XYZ-45112010013.059816123454882, 77.7706866237429278KA66CD5678113.059816123454882...FalseFalseTrueFalseTrueFalseFalseFalseTrueFalse
231/8/2023 18:25NaN0013.059816123454882, 77.7706866237429253KA88EF9012013.059816123454882...FalseFalseTrueFalseTrueFalseFalseFalseFalseTrue
341/9/2023 2:05FTG-044-LMN-32235012013.059816123454882, 77.7706866237429292KA11GH3456113.059816123454882...FalseFalseFalseFalseTrueFalseFalseTrueFalseFalse
451/10/2023 6:35FTG-505-DEF-65214010013.059816123454882, 77.7706866237429260KA44IJ6789113.059816123454882...FalseTrueFalseFalseTrueFalseFalseFalseTrueFalse
\n", "

5 rows × 33 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "df" } }, "metadata": {}, "execution_count": 74 } ] }, { "cell_type": "code", "source": [ "# Let's first remove unnecessary columns\n", "df.drop(columns = ['Transaction_ID','Timestamp','FastagID','Geographical_Location','Vehicle_Plate_Number'], inplace = True)" ], "metadata": { "id": "XsD8KB7oPAUu" }, "execution_count": 80, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's handle missing values\n", "df.isnull().sum()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bgS6H9TeQWCX", "outputId": "57aa3ccd-c563-46d5-f81f-f792a45cc85d" }, "execution_count": 81, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Transaction_Amount 0\n", "Amount_paid 0\n", "Vehicle_Speed 0\n", "Fraud_indicator 0\n", "Percent_paid 0\n", "Vehicle_Type_Car 0\n", "Vehicle_Type_Motorcycle 0\n", "Vehicle_Type_SUV 0\n", "Vehicle_Type_Sedan 0\n", "Vehicle_Type_Truck 0\n", "Vehicle_Type_Van 0\n", "Lane_Type_Regular 0\n", "TollBoothID_B-102 0\n", "TollBoothID_C-103 0\n", "TollBoothID_D-104 0\n", "TollBoothID_D-105 0\n", "TollBoothID_D-106 0\n", "Vehicle_Dimensions_Medium 0\n", "Vehicle_Dimensions_Small 0\n", "Vehicle_Speed_group_21-41 0\n", "Vehicle_Speed_group_41-93 0\n", "Vehicle_Speed_group_93-103 0\n", "Vehicle_Speed_group_<= 21 0\n", "Transaction_Amount_group_330 < 0\n", "Transaction_Amount_group_60-180 0\n", "Transaction_Amount_group_<= 60 0\n", "dtype: int64" ] }, "metadata": {}, "execution_count": 81 } ] }, { "cell_type": "code", "source": [ "# Let's convert all bool to int\n", "for col in df.select_dtypes(include=['bool', 'object']):\n", " try:\n", " df[col] = df[col].astype(int)\n", " except ValueError:\n", " df[col] = df[col].astype(float).round().astype(int)" ], "metadata": { "id": "jI2DrcHtSaUm" }, "execution_count": 82, "outputs": [] }, { "cell_type": "markdown", "source": [ "Okey Great !!!✅" ], "metadata": { "id": "9MD32W9WWjnN" } }, { "cell_type": "code", "source": [ "# Let's check unique values for each columns\n", "for i in df.columns:\n", " print(f'{i}: [{df[i].nunique()}]')" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "KOA4JYADQE01", "outputId": "dea4cb10-14d0-491b-c852-155970d4d39d" }, "execution_count": 20, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Transaction_Amount: [20]\n", "Amount_paid: [23]\n", "Vehicle_Speed: [85]\n", "Fraud_indicator: [2]\n", "lat: [1]\n", "long: [2]\n", "Percent_paid: [84]\n", "Vehicle_Type_Car: [2]\n", "Vehicle_Type_Motorcycle: [2]\n", "Vehicle_Type_SUV: [2]\n", "Vehicle_Type_Sedan: [2]\n", "Vehicle_Type_Truck: [2]\n", "Vehicle_Type_Van: [2]\n", "Lane_Type_Regular: [2]\n", "TollBoothID_B-102: [2]\n", "TollBoothID_C-103: [2]\n", "TollBoothID_D-104: [2]\n", "TollBoothID_D-105: [2]\n", "TollBoothID_D-106: [2]\n", "Vehicle_Dimensions_Medium: [2]\n", "Vehicle_Dimensions_Small: [2]\n", "Vehicle_Speed_group_21-41: [2]\n", "Vehicle_Speed_group_41-93: [2]\n", "Vehicle_Speed_group_93-103: [2]\n", "Vehicle_Speed_group_<= 21: [2]\n", "Transaction_Amount_group_330 <: [2]\n", "Transaction_Amount_group_60-180: [2]\n", "Transaction_Amount_group_<= 60: [2]\n" ] } ] }, { "cell_type": "code", "source": [ "df.dtypes" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ycpdIgLq0UfZ", "outputId": "1b5e2e52-8816-4ac8-d25c-619484b44029" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Transaction_Amount int64\n", "Amount_paid int64\n", "Vehicle_Speed int64\n", "Fraud_indicator int64\n", "lat object\n", "long object\n", "Percent_paid float64\n", "Vehicle_Type_Car int64\n", "Vehicle_Type_Motorcycle int64\n", "Vehicle_Type_SUV int64\n", "Vehicle_Type_Sedan int64\n", "Vehicle_Type_Truck int64\n", "Vehicle_Type_Van int64\n", "Lane_Type_Regular int64\n", "TollBoothID_B-102 int64\n", "TollBoothID_C-103 int64\n", "TollBoothID_D-104 int64\n", "TollBoothID_D-105 int64\n", "TollBoothID_D-106 int64\n", "Vehicle_Dimensions_Medium int64\n", "Vehicle_Dimensions_Small int64\n", "Vehicle_Speed_group_21-41 int64\n", "Vehicle_Speed_group_41-93 int64\n", "Vehicle_Speed_group_93-103 int64\n", "Vehicle_Speed_group_<= 21 int64\n", "Transaction_Amount_group_330 < int64\n", "Transaction_Amount_group_60-180 int64\n", "Transaction_Amount_group_<= 60 int64\n", "dtype: object" ] }, "metadata": {}, "execution_count": 90 } ] }, { "cell_type": "markdown", "source": [ "# Machine Learning Model Development" ], "metadata": { "id": "IXrvqggoYIJW" } }, { "cell_type": "code", "source": [ "# Let's copy dataset\n", "ml_data = df.copy()" ], "metadata": { "id": "WOJmMqrhYD9G" }, "execution_count": 83, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's define target and input value\n", "X = ml_data.drop('Fraud_indicator', axis =1)\n", "y = ml_data['Fraud_indicator']" ], "metadata": { "id": "Qv8Hv72QZROW" }, "execution_count": 84, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's divide dataset to train and test data\n", "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" ], "metadata": { "id": "S4Kkk4sEZS-k" }, "execution_count": 85, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's import necessary libraries\n", "import pandas as pd\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, AdaBoostClassifier\n", "from sklearn.svm import SVC\n", "from sklearn.naive_bayes import GaussianNB\n", "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n", "\n", "# Define classifiers\n", "classifiers = {\n", " \"Logistic Regression\": LogisticRegression(max_iter=1000),\n", " \"K Nearest Neighbors\": KNeighborsClassifier(),\n", " \"Decision Tree\": DecisionTreeClassifier(),\n", " \"Random Forest\": RandomForestClassifier(),\n", " \"Gradient Boosting\": GradientBoostingClassifier(),\n", " \"Support Vector Classification\": SVC(),\n", " \"AdaBoost\": AdaBoostClassifier(),\n", " \"Naive Bayes\": GaussianNB()\n", "}\n", "\n", "for key, classifier in classifiers.items():\n", " classifier.fit(X_train, y_train)\n", " y_pred = classifier.predict(X_test)\n", "\n", " accuracy = accuracy_score(y_test, y_pred)\n", " precision = precision_score(y_test, y_pred, average='weighted')\n", " recall = recall_score(y_test, y_pred, average='weighted')\n", " f1 = f1_score(y_test, y_pred, average='weighted')\n", "\n", " print(\"Classifier:\", key)\n", " print(\"Accuracy:\", round(accuracy * 100, 2), \"%\")\n", " print(\"Precision:\", round(precision * 100, 2), \"%\")\n", " print(\"Recall:\", round(recall * 100, 2), \"%\")\n", " print(\"F1 Score:\", round(f1 * 100, 2), \"%\")\n", " print()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ccls_K3PXz3M", "outputId": "d88d000f-1356-47f1-cd79-088fc5b62f1a" }, "execution_count": 57, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Classifier: Logistic Regression\n", "Accuracy: 98.3 %\n", "Precision: 98.34 %\n", "Recall: 98.3 %\n", "F1 Score: 98.27 %\n", "\n", "Classifier: K Nearest Neighbors\n", "Accuracy: 99.1 %\n", "Precision: 99.11 %\n", "Recall: 99.1 %\n", "F1 Score: 99.09 %\n", "\n", "Classifier: Decision Tree\n", "Accuracy: 100.0 %\n", "Precision: 100.0 %\n", "Recall: 100.0 %\n", "F1 Score: 100.0 %\n", "\n", "Classifier: Random Forest\n", "Accuracy: 99.9 %\n", "Precision: 99.9 %\n", "Recall: 99.9 %\n", "F1 Score: 99.9 %\n", "\n", "Classifier: Gradient Boosting\n", "Accuracy: 100.0 %\n", "Precision: 100.0 %\n", "Recall: 100.0 %\n", "F1 Score: 100.0 %\n", "\n", "Classifier: Support Vector Classification\n", "Accuracy: 98.3 %\n", "Precision: 98.34 %\n", "Recall: 98.3 %\n", "F1 Score: 98.27 %\n", "\n", "Classifier: AdaBoost\n", "Accuracy: 100.0 %\n", "Precision: 100.0 %\n", "Recall: 100.0 %\n", "F1 Score: 100.0 %\n", "\n", "Classifier: Naive Bayes\n", "Accuracy: 50.0 %\n", "Precision: 82.94 %\n", "Recall: 50.0 %\n", "F1 Score: 51.96 %\n", "\n" ] } ] }, { "cell_type": "code", "source": [ "# Let's continue DecisionTreeRegressor -> Random Search\n", "\n", "from sklearn.model_selection import RandomizedSearchCV\n", "from sklearn.tree import DecisionTreeRegressor\n", "\n", "param_grid = {\n", " 'max_depth': [None, 10, 20, 30, 40],\n", " 'min_samples_split': [2, 5, 10],\n", " 'min_samples_leaf': [1, 2, 4]\n", "}\n", "\n", "dt_regressor = DecisionTreeRegressor()\n", "\n", "dt_random = RandomizedSearchCV(estimator=dt_regressor, param_distributions=param_grid,\n", " n_iter=100, cv=3, verbose=2, random_state=42, n_jobs=-1)\n", "\n", "dt_random.fit(X_train, y_train)\n", "\n", "print(\"Best parameters found for Decision Tree Regression:\")\n", "print(dt_random.best_params_)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WhXDVNgbbaUU", "outputId": "b8d2e13f-bb70-4a2f-a2c6-8bd132c29f49" }, "execution_count": 28, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Fitting 3 folds for each of 45 candidates, totalling 135 fits\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.10/dist-packages/sklearn/model_selection/_search.py:305: UserWarning: The total space of parameters 45 is smaller than n_iter=100. Running 45 iterations. For exhaustive searches, use GridSearchCV.\n", " warnings.warn(\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Best parameters found for Decision Tree Regression:\n", "{'min_samples_split': 2, 'min_samples_leaf': 1, 'max_depth': None}\n" ] } ] }, { "cell_type": "markdown", "source": [ "## Decision Tree Classification is the Ideal Model for this Task\n", "If you're looking for a suitable model for this task, Decision Tree Classification stands out as the optimal choice." ], "metadata": { "id": "BMNhTnz4iIIa" } }, { "cell_type": "code", "source": [ "import pickle\n", "from sklearn.tree import DecisionTreeClassifier\n", "\n", "dt = DecisionTreeClassifier(min_samples_split=2, min_samples_leaf=1, max_depth=None, random_state=42)\n", "\n", "dt.fit(X_train, y_train)\n", "\n", "# Let's save the model as a pickle file\n", "with open('dt_model.pkl', 'wb') as file:\n", " pickle.dump(dt, file)\n", "\n", "print(\"Model saved as dt_model.pkl\")" ], "metadata": { "id": "gIeL2M68qIMC", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "d3f78a98-167f-4798-e9b0-5fcb7dcb9fdc" }, "execution_count": 86, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Model saved as dt_model.pkl\n" ] } ] }, { "cell_type": "code", "source": [ "X_train.columns" ], "metadata": { "id": "OThjl6Llw--v", "outputId": "3c88b22b-8f3d-4f69-ffc2-d278e3187923", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": 88, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['Transaction_Amount', 'Amount_paid', 'Vehicle_Speed', 'Percent_paid',\n", " 'Vehicle_Type_Car', 'Vehicle_Type_Motorcycle', 'Vehicle_Type_SUV',\n", " 'Vehicle_Type_Sedan', 'Vehicle_Type_Truck', 'Vehicle_Type_Van',\n", " 'Lane_Type_Regular', 'TollBoothID_B-102', 'TollBoothID_C-103',\n", " 'TollBoothID_D-104', 'TollBoothID_D-105', 'TollBoothID_D-106',\n", " 'Vehicle_Dimensions_Medium', 'Vehicle_Dimensions_Small',\n", " 'Vehicle_Speed_group_21-41', 'Vehicle_Speed_group_41-93',\n", " 'Vehicle_Speed_group_93-103', 'Vehicle_Speed_group_<= 21',\n", " 'Transaction_Amount_group_330 <', 'Transaction_Amount_group_60-180',\n", " 'Transaction_Amount_group_<= 60'],\n", " dtype='object')" ] }, "metadata": {}, "execution_count": 88 } ] }, { "cell_type": "code", "source": [ "# Let's look at input values\n", "X_train.columns" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IEuk2z6ITgtr", "outputId": "e0680821-1a8c-40cc-c53c-9e7f52d30db2" }, "execution_count": 59, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['Transaction_Amount', 'Amount_paid', 'Vehicle_Speed', 'Percent_paid',\n", " 'Vehicle_Type_Car', 'Vehicle_Type_Motorcycle', 'Vehicle_Type_SUV',\n", " 'Vehicle_Type_Sedan', 'Vehicle_Type_Truck', 'Vehicle_Type_Van',\n", " 'Lane_Type_Regular', 'TollBoothID_B-102', 'TollBoothID_C-103',\n", " 'TollBoothID_D-104', 'TollBoothID_D-105', 'TollBoothID_D-106',\n", " 'Vehicle_Dimensions_Medium', 'Vehicle_Dimensions_Small',\n", " 'Vehicle_Speed_group_21-41', 'Vehicle_Speed_group_41-93',\n", " 'Vehicle_Speed_group_93-103', 'Vehicle_Speed_group_<= 21',\n", " 'Transaction_Amount_group_330 <', 'Transaction_Amount_group_60-180',\n", " 'Transaction_Amount_group_<= 60'],\n", " dtype='object')" ] }, "metadata": {}, "execution_count": 59 } ] }, { "cell_type": "markdown", "source": [ "# Neural Network Model Development" ], "metadata": { "id": "N2VZaKBBlPtD" } }, { "cell_type": "code", "source": [ "# Let's copy dataset\n", "nn_data = df.copy()" ], "metadata": { "id": "pWJy3NNOlJ48" }, "execution_count": 31, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's define target and input value\n", "X = ml_data.drop('Fraud_indicator', axis =1)\n", "y = ml_data['Fraud_indicator']" ], "metadata": { "id": "gxeu3DxVd_4g" }, "execution_count": 33, "outputs": [] }, { "cell_type": "code", "source": [ "# Let's divide dataset to train and test data\n", "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" ], "metadata": { "id": "NWbSOOLkd_yo" }, "execution_count": 34, "outputs": [] }, { "cell_type": "code", "source": [ "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.metrics import classification_report, accuracy_score, precision_score, recall_score, f1_score\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Dropout\n", "from tensorflow.keras.callbacks import EarlyStopping\n", "\n", "\n", "# Standardize the features\n", "scaler = StandardScaler()\n", "X_train_scaled = scaler.fit_transform(X_train)\n", "X_test_scaled = scaler.transform(X_test)\n", "\n", "# Build the neural network model for classification\n", "model = Sequential([\n", " Dense(64, activation='relu', input_shape=(X_train_scaled.shape[1],)),\n", " Dropout(0.2),\n", " Dense(32, activation='relu'),\n", " Dropout(0.2),\n", " Dense(1, activation='sigmoid') # Output layer for binary classification\n", "])\n", "\n", "# Compile the model\n", "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", "\n", "# Define early stopping to prevent overfitting\n", "early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)\n", "\n", "# Train the model\n", "history = model.fit(X_train_scaled, y_train, epochs=10, batch_size=32, validation_split=0.2, callbacks=[early_stopping])\n", "\n", "# Predict on the test set\n", "y_pred_prob = model.predict(X_test_scaled)\n", "y_pred = (y_pred_prob > 0.5).astype(int) # Convert probabilities to binary predictions\n", "\n", "# Evaluate the model using classification metrics\n", "accuracy = accuracy_score(y_test, y_pred)\n", "precision = precision_score(y_test, y_pred)\n", "recall = recall_score(y_test, y_pred)\n", "f1 = f1_score(y_test, y_pred)\n", "\n", "print(\"Accuracy:\", round(accuracy * 100, 2), \"%\")\n", "print(\"Precision:\", round(precision * 100, 2), \"%\")\n", "print(\"Recall:\", round(recall * 100, 2), \"%\")\n", "print(\"F1 Score:\", round(f1 * 100, 2), \"%\")\n", "\n", "# Print detailed classification report\n", "print(\"\\nClassification Report:\\n\", classification_report(y_test, y_pred))" ], "metadata": { "id": "gHe_ALIxiOGl", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "20791004-0ff0-456c-d2a6-7bb25de4f84c" }, "execution_count": 36, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/10\n", "100/100 [==============================] - 1s 4ms/step - loss: 0.4956 - accuracy: 0.7534 - val_loss: 0.3198 - val_accuracy: 0.8625\n", "Epoch 2/10\n", "100/100 [==============================] - 0s 2ms/step - loss: 0.2969 - accuracy: 0.8737 - val_loss: 0.2005 - val_accuracy: 0.9225\n", "Epoch 3/10\n", "100/100 [==============================] - 0s 3ms/step - loss: 0.1929 - accuracy: 0.9394 - val_loss: 0.1197 - val_accuracy: 0.9688\n", "Epoch 4/10\n", "100/100 [==============================] - 0s 2ms/step - loss: 0.1404 - accuracy: 0.9591 - val_loss: 0.0882 - val_accuracy: 0.9750\n", "Epoch 5/10\n", "100/100 [==============================] - 0s 3ms/step - loss: 0.1188 - accuracy: 0.9675 - val_loss: 0.0674 - val_accuracy: 0.9787\n", "Epoch 6/10\n", "100/100 [==============================] - 0s 2ms/step - loss: 0.1036 - accuracy: 0.9737 - val_loss: 0.0511 - val_accuracy: 0.9887\n", "Epoch 7/10\n", "100/100 [==============================] - 0s 2ms/step - loss: 0.0865 - accuracy: 0.9806 - val_loss: 0.0468 - val_accuracy: 0.9862\n", "Epoch 8/10\n", "100/100 [==============================] - 0s 2ms/step - loss: 0.0751 - accuracy: 0.9828 - val_loss: 0.0472 - val_accuracy: 0.9887\n", "Epoch 9/10\n", "100/100 [==============================] - 0s 3ms/step - loss: 0.0675 - accuracy: 0.9844 - val_loss: 0.0351 - val_accuracy: 0.9887\n", "Epoch 10/10\n", "100/100 [==============================] - 0s 2ms/step - loss: 0.0609 - accuracy: 0.9894 - val_loss: 0.0337 - val_accuracy: 0.9900\n", "32/32 [==============================] - 0s 2ms/step\n", "Accuracy: 98.5 %\n", "Precision: 100.0 %\n", "Recall: 93.09 %\n", "F1 Score: 96.42 %\n", "\n", "Classification Report:\n", " precision recall f1-score support\n", "\n", " 0 0.98 1.00 0.99 783\n", " 1 1.00 0.93 0.96 217\n", "\n", " accuracy 0.98 1000\n", " macro avg 0.99 0.97 0.98 1000\n", "weighted avg 0.99 0.98 0.98 1000\n", "\n" ] } ] }, { "cell_type": "code", "source": [ "# Optionally, visualize training history\n", "import matplotlib.pyplot as plt\n", "\n", "plt.plot(history.history['loss'], label='Training Loss')\n", "plt.plot(history.history['val_loss'], label='Validation Loss')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Loss')\n", "plt.legend()\n", "plt.show()" ], "metadata": { "id": "sXVGr03siOAi", "colab": { "base_uri": "https://localhost:8080/", "height": 449 }, "outputId": "06544a56-8376-4b8c-c46f-56664d18b0c5" }, "execution_count": 37, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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iSeeICQkhPnz53PnnXfSrFkzevToccHPsNls3HTTTcTExPDrr7+SnZ1dbn5OmeDgYGbNmkV8fDybNm3ivvvuIzg4mMcff5wRI0awefNmFixYwPfffw9AaGjoWe+Rn59P//796dmzJ2vWrCEjI4N7772XcePGlStwP/74I3Fxcfz444/s3r2bESNG0LlzZ+67774Lfj/n+v7Kis1PP/1ESUkJY8eOZcSIESxduhSAkSNH0qVLF9555x0sFgvr1693rjQ+duxYioqK+PnnnwkMDGTr1q0EBQVddI6LoXJTS4Z0imfL4RzmrT+sciMi7qH4BLwYb8xn//kw+ARW6tC7776bV155hZ9++om+ffsCjiGp4cOHExoaSmhoKI899pjz+PHjx7Nw4UI+++yzSpWb77//nu3bt7Nw4ULi4x1/Hi+++OJZ82T+8pe/OLcbN27MY489xuzZs3n88cfx9/cnKCgILy8vYmNjz/tZn376KQUFBXz00UcEBjq+/xkzZjB48GBefvllYmJiAAgPD2fGjBlYLBZat27NoEGDWLJkSZXKzZIlS9i0aRP79u0jISEBgI8++oh27dqxZs0aunfvTnJyMn/6059o3bo1AC1atHC+Pjk5meHDh9OhQwcAmjZtetEZLpaGpWrJDaVDU6v3HyMtu8DgNCIinqN169b06tWLDz74AIDdu3ezbNky7rnnHgCsVivPPfccHTp0ICIigqCgIBYuXEhycnKl3n/btm0kJCQ4iw1Az549zzpuzpw59O7dm9jYWIKCgvjLX/5S6c84/bM6derkLDYAvXv3xmazsWPHDue+du3aYbFYnF/HxcWRkVG1+62VfX9lxQagbdu2hIWFsW3bNgAmTpzIvffeS1JSEi+99BJ79uxxHvvwww/z/PPP07t3b5566qkqTeC+WDpzU0vqh/nTrVE4vx04zjcbD3PvlTXfXEVEapR3gOMMilGffRHuuecexo8fz9tvv82HH35Is2bN6NOnDwCvvPIKf/vb35g+fTodOnQgMDCQCRMmUFRUfXMkV65cyciRI3nmmWfo378/oaGhzJ49m9dee63aPuN0ZUNCZUwmEzabrUY+CxxXet1+++3Mnz+f7777jqeeeorZs2dz4403cu+999K/f3/mz5/PokWLmDZtGq+99hrjx4+vsTw6c1OLhnR2tHqtNSUibsFkcgwNGfGo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\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "# Model Evaluation" ], "metadata": { "id": "cjKuqBQImuXq" } }, { "cell_type": "code", "source": [ "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report\n", "\n", "# Let's predict for Decision Tree Classification\n", "dt_y_pred = dt.predict(X_test)\n", "\n", "# Let's calculate evaluation metrics for classification\n", "dt_accuracy = accuracy_score(y_test, dt_y_pred)\n", "dt_precision = precision_score(y_test, dt_y_pred, average='weighted')\n", "dt_recall = recall_score(y_test, dt_y_pred, average='weighted')\n", "dt_f1 = f1_score(y_test, dt_y_pred, average='weighted')\n", "\n", "print(\"Decision Tree Classification Evaluation Metrics:\")\n", "print(\"Accuracy:\", round(dt_accuracy * 100, 2), \"%\")\n", "print(\"Precision:\", round(dt_precision * 100, 2), \"%\")\n", "print(\"Recall:\", round(dt_recall * 100, 2), \"%\")\n", "print(\"F1 Score:\", round(dt_f1 * 100, 2), \"%\")\n", "\n", "# Print detailed classification report\n", "print(\"\\nClassification Report:\\n\", classification_report(y_test, dt_y_pred))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "S8lDViZvmvnS", "outputId": "fce84480-d8aa-416f-9b07-16e81c7e7304" }, "execution_count": 60, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Decision Tree Classification Evaluation Metrics:\n", "Accuracy: 100.0 %\n", "Precision: 100.0 %\n", "Recall: 100.0 %\n", "F1 Score: 100.0 %\n", "\n", "Classification Report:\n", " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 783\n", " 1 1.00 1.00 1.00 217\n", "\n", " accuracy 1.00 1000\n", " macro avg 1.00 1.00 1.00 1000\n", "weighted avg 1.00 1.00 1.00 1000\n", "\n" ] } ] }, { "cell_type": "markdown", "source": [ "# ML Pipelines and Model Deployment" ], "metadata": { "id": "HhbrXLr-oaQS" } }, { "cell_type": "code", "source": [ "import pandas as pd\n", "import pickle\n", "\n", "# Load the trained Decision Tree Classification model\n", "with open('dt_model.pkl', 'rb') as file:\n", " dt_model = pickle.load(file)\n", "\n", "# Define preprocessing function\n", "def preprocess_input(data):\n", " df = pd.DataFrame(data, index=[0])\n", "\n", " # Let's find which percent are paid\n", " df['Percent_paid'] = df.apply(lambda row: row['Amount_paid'] / row['Transaction_Amount'] if row['Transaction_Amount'] != 0 else 0, axis=1)\n", "\n", " # Let's also group Vehicle_Speed, Transaction_Amount columns\n", " def Vehicle_Speed_group(speed):\n", " if speed <= 21:\n", " return '<= 21'\n", " elif speed <= 41:\n", " return '21-41'\n", " elif speed <= 93:\n", " return '41-93'\n", " elif speed <= 103:\n", " return '93-103'\n", " else:\n", " return '103 <'\n", "\n", " def Transaction_Amount_group(amount):\n", " if amount <= 60:\n", " return '<= 60'\n", " elif amount <= 180:\n", " return '60-180'\n", " elif amount <= 330:\n", " return '180-330'\n", " else:\n", " return '330 <'\n", "\n", " df['Vehicle_Speed_group'] = df['Vehicle_Speed'].apply(lambda x: Vehicle_Speed_group(x))\n", " df['Transaction_Amount_group'] = df['Transaction_Amount'].apply(lambda x: Transaction_Amount_group(x))\n", "\n", " # Let's encode categorical features\n", " df = pd.get_dummies(df, columns=['Vehicle_Type', 'Lane_Type','TollBoothID', 'Vehicle_Dimensions','Vehicle_Speed_group','Transaction_Amount_group'], drop_first=True)\n", "\n", " # Let's first remove unnecessary columns\n", " df.drop(columns = ['Transaction_ID','Timestamp','FastagID','Geographical_Location','Vehicle_Plate_Number'], inplace = True)\n", "\n", " # Let's convert all bool to int\n", " for col in df.select_dtypes(include=['bool', 'object']):\n", " try:\n", " df[col] = df[col].astype(int)\n", " except ValueError:\n", " df[col] = df[col].astype(float).round().astype(int)\n", "\n", " columns_to_add = ['Transaction_Amount', 'Amount_paid', 'Vehicle_Speed', 'Percent_paid',\n", " 'Vehicle_Type_Car', 'Vehicle_Type_Motorcycle', 'Vehicle_Type_SUV',\n", " 'Vehicle_Type_Sedan', 'Vehicle_Type_Truck', 'Vehicle_Type_Van',\n", " 'Lane_Type_Regular', 'TollBoothID_B-102', 'TollBoothID_C-103',\n", " 'TollBoothID_D-104', 'TollBoothID_D-105', 'TollBoothID_D-106',\n", " 'Vehicle_Dimensions_Medium', 'Vehicle_Dimensions_Small',\n", " 'Vehicle_Speed_group_21-41', 'Vehicle_Speed_group_41-93',\n", " 'Vehicle_Speed_group_93-103', 'Vehicle_Speed_group_<= 21',\n", " 'Transaction_Amount_group_330 <', 'Transaction_Amount_group_60-180',\n", " 'Transaction_Amount_group_<= 60']\n", "\n", " # Add missing columns with default value of 0\n", " for column in columns_to_add:\n", " if column not in df.columns:\n", " df[column] = 0\n", "\n", " return df\n", "\n", "# Define function to detect fraud\n", "def predict_salary(transaction_id, timestamp, vehicle_type, fastag_id, tollbooth_id, lane_type, vehicle_dimensions, transaction_amount, amount_paid, geographical_location, vehicle_speed, vehicle_plate_number):\n", " # Preprocess input data\n", " input_data = preprocess_input({\n", " \"Transaction_ID\": transaction_id,\n", " \"Timestamp\": timestamp,\n", " \"Vehicle_Type\": vehicle_type,\n", " \"FastagID\": fastag_id,\n", " \"TollBoothID\": tollbooth_id,\n", " \"Lane_Type\": lane_type,\n", " \"Vehicle_Dimensions\": vehicle_dimensions,\n", " \"Transaction_Amount\": transaction_amount,\n", " \"Amount_paid\": amount_paid,\n", " \"Geographical_Location\": geographical_location,\n", " \"Vehicle_Speed\": vehicle_speed,\n", " \"Vehicle_Plate_Number\": vehicle_plate_number\n", " })\n", "\n", " input_data = input_data[['Transaction_Amount', 'Amount_paid', 'Vehicle_Speed', 'Percent_paid',\n", " 'Vehicle_Type_Car', 'Vehicle_Type_Motorcycle', 'Vehicle_Type_SUV',\n", " 'Vehicle_Type_Sedan', 'Vehicle_Type_Truck', 'Vehicle_Type_Van',\n", " 'Lane_Type_Regular', 'TollBoothID_B-102', 'TollBoothID_C-103',\n", " 'TollBoothID_D-104', 'TollBoothID_D-105', 'TollBoothID_D-106',\n", " 'Vehicle_Dimensions_Medium', 'Vehicle_Dimensions_Small',\n", " 'Vehicle_Speed_group_21-41', 'Vehicle_Speed_group_41-93',\n", " 'Vehicle_Speed_group_93-103', 'Vehicle_Speed_group_<= 21',\n", " 'Transaction_Amount_group_330 <', 'Transaction_Amount_group_60-180',\n", " 'Transaction_Amount_group_<= 60']]\n", "\n", " # Predict Fraud using the trained model\n", " fraud_prediction = dt_model.predict(input_data)\n", " fraud_prediction = ['Fraud❌' if fraud_prediction[0] == 1 else 'Not Fraud✅']\n", " result = f'Transaction ID {transaction_id}, the predicted fraud based on your details is {\"Fraud\" if fraud_prediction[0] == 1 else \"Not Fraud\"}'\n", " return result" ], "metadata": { "id": "9FC9svFciN7f" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Deploy (Gradio)" ], "metadata": { "id": "rvUmlz9aFhJE" } }, { "cell_type": "code", "source": [ "!pip install gradio" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "s9dxQCdns-8Z", "outputId": "ab4361d1-44da-43c0-8121-0d572c50ad99" }, "execution_count": 43, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Collecting gradio\n", " Downloading gradio-4.32.1-py3-none-any.whl (12.3 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.3/12.3 MB\u001b[0m \u001b[31m24.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting aiofiles<24.0,>=22.0 (from gradio)\n", " Downloading aiofiles-23.2.1-py3-none-any.whl (15 kB)\n", "Requirement already satisfied: altair<6.0,>=4.2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (4.2.2)\n", "Collecting fastapi (from gradio)\n", " Downloading fastapi-0.111.0-py3-none-any.whl (91 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.0/92.0 kB\u001b[0m \u001b[31m9.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting ffmpy (from gradio)\n", " Downloading ffmpy-0.3.2.tar.gz (5.5 kB)\n", " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "Collecting gradio-client==0.17.0 (from gradio)\n", " Downloading gradio_client-0.17.0-py3-none-any.whl (316 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m316.3/316.3 kB\u001b[0m \u001b[31m29.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting httpx>=0.24.1 (from gradio)\n", " Downloading httpx-0.27.0-py3-none-any.whl (75 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m75.6/75.6 kB\u001b[0m \u001b[31m10.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: huggingface-hub>=0.19.3 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.23.1)\n", "Requirement already satisfied: importlib-resources<7.0,>=1.3 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.4.0)\n", "Requirement already satisfied: jinja2<4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.1.4)\n", "Requirement already satisfied: markupsafe~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.1.5)\n", "Requirement already satisfied: matplotlib~=3.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.7.1)\n", "Requirement already satisfied: numpy~=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (1.25.2)\n", "Collecting orjson~=3.0 (from gradio)\n", " Downloading orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (142 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m142.5/142.5 kB\u001b[0m \u001b[31m16.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from gradio) (24.0)\n", "Requirement already satisfied: pandas<3.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.0.3)\n", "Requirement already satisfied: pillow<11.0,>=8.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (9.4.0)\n", "Requirement already satisfied: pydantic>=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.7.1)\n", "Collecting pydub (from gradio)\n", " Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n", "Collecting python-multipart>=0.0.9 (from gradio)\n", " Downloading python_multipart-0.0.9-py3-none-any.whl (22 kB)\n", "Requirement already satisfied: pyyaml<7.0,>=5.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.0.1)\n", "Collecting ruff>=0.2.2 (from gradio)\n", " Downloading ruff-0.4.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.8 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.8/8.8 MB\u001b[0m \u001b[31m77.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting semantic-version~=2.0 (from gradio)\n", " Downloading semantic_version-2.10.0-py2.py3-none-any.whl (15 kB)\n", "Collecting tomlkit==0.12.0 (from gradio)\n", " Downloading tomlkit-0.12.0-py3-none-any.whl (37 kB)\n", "Collecting typer<1.0,>=0.12 (from gradio)\n", " Downloading typer-0.12.3-py3-none-any.whl (47 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.2/47.2 kB\u001b[0m \u001b[31m5.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: typing-extensions~=4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (4.11.0)\n", "Requirement already satisfied: urllib3~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.0.7)\n", "Collecting uvicorn>=0.14.0 (from gradio)\n", " Downloading uvicorn-0.30.0-py3-none-any.whl (62 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.4/62.4 kB\u001b[0m \u001b[31m7.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from gradio-client==0.17.0->gradio) (2023.6.0)\n", "Collecting websockets<12.0,>=10.0 (from gradio-client==0.17.0->gradio)\n", " Downloading websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (129 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m129.9/129.9 kB\u001b[0m \u001b[31m14.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: entrypoints in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (0.4)\n", "Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (4.19.2)\n", "Requirement already satisfied: toolz in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (0.12.1)\n", "Requirement already satisfied: anyio in /usr/local/lib/python3.10/dist-packages (from httpx>=0.24.1->gradio) (3.7.1)\n", "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx>=0.24.1->gradio) (2024.2.2)\n", "Collecting httpcore==1.* (from httpx>=0.24.1->gradio)\n", " Downloading httpcore-1.0.5-py3-none-any.whl (77 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m77.9/77.9 kB\u001b[0m \u001b[31m9.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: idna in /usr/local/lib/python3.10/dist-packages (from httpx>=0.24.1->gradio) (3.7)\n", "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from httpx>=0.24.1->gradio) (1.3.1)\n", "Collecting h11<0.15,>=0.13 (from httpcore==1.*->httpx>=0.24.1->gradio)\n", " Downloading h11-0.14.0-py3-none-any.whl (58 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.3/58.3 kB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (3.14.0)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (2.31.0)\n", "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (4.66.4)\n", "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.2.1)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (4.51.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.4.5)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (3.1.2)\n", "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (2.8.2)\n", "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3.0,>=1.0->gradio) (2023.4)\n", "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3.0,>=1.0->gradio) (2024.1)\n", "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2.0->gradio) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.18.2 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2.0->gradio) (2.18.2)\n", "Requirement already satisfied: click>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from typer<1.0,>=0.12->gradio) (8.1.7)\n", "Collecting shellingham>=1.3.0 (from typer<1.0,>=0.12->gradio)\n", " Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)\n", "Requirement already satisfied: rich>=10.11.0 in /usr/local/lib/python3.10/dist-packages (from typer<1.0,>=0.12->gradio) (13.7.1)\n", "Collecting starlette<0.38.0,>=0.37.2 (from fastapi->gradio)\n", " Downloading starlette-0.37.2-py3-none-any.whl (71 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m71.9/71.9 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting fastapi-cli>=0.0.2 (from fastapi->gradio)\n", " Downloading fastapi_cli-0.0.4-py3-none-any.whl (9.5 kB)\n", "Collecting ujson!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,>=4.0.1 (from fastapi->gradio)\n", " Downloading ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (53 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m53.6/53.6 kB\u001b[0m \u001b[31m6.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting email_validator>=2.0.0 (from fastapi->gradio)\n", " Downloading email_validator-2.1.1-py3-none-any.whl (30 kB)\n", "Collecting dnspython>=2.0.0 (from email_validator>=2.0.0->fastapi->gradio)\n", " Downloading dnspython-2.6.1-py3-none-any.whl (307 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m307.7/307.7 kB\u001b[0m \u001b[31m25.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (23.2.0)\n", "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (2023.12.1)\n", "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.35.1)\n", "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.18.1)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio) (1.16.0)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (3.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (2.16.1)\n", "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio->httpx>=0.24.1->gradio) (1.2.1)\n", "Collecting httptools>=0.5.0 (from uvicorn>=0.14.0->gradio)\n", " Downloading httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (341 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m341.4/341.4 kB\u001b[0m \u001b[31m28.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting python-dotenv>=0.13 (from uvicorn>=0.14.0->gradio)\n", " Downloading python_dotenv-1.0.1-py3-none-any.whl (19 kB)\n", "Collecting uvloop!=0.15.0,!=0.15.1,>=0.14.0 (from uvicorn>=0.14.0->gradio)\n", " Downloading uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.4 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.4/3.4 MB\u001b[0m \u001b[31m58.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting watchfiles>=0.13 (from uvicorn>=0.14.0->gradio)\n", " Downloading watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.2/1.2 MB\u001b[0m \u001b[31m46.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub>=0.19.3->gradio) (3.3.2)\n", "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0,>=0.12->gradio) (0.1.2)\n", "Building wheels for collected packages: ffmpy\n", " Building wheel for ffmpy (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for ffmpy: filename=ffmpy-0.3.2-py3-none-any.whl size=5584 sha256=b42c86124f3267644b6ac43645d02865a9d0eccdcd60de9bd4e32544d227d44b\n", " Stored in directory: /root/.cache/pip/wheels/bd/65/9a/671fc6dcde07d4418df0c592f8df512b26d7a0029c2a23dd81\n", "Successfully built ffmpy\n", "Installing collected packages: pydub, ffmpy, websockets, uvloop, ujson, tomlkit, shellingham, semantic-version, ruff, python-multipart, python-dotenv, orjson, httptools, h11, dnspython, aiofiles, watchfiles, uvicorn, starlette, httpcore, email_validator, typer, httpx, gradio-client, fastapi-cli, fastapi, gradio\n", " Attempting uninstall: typer\n", " Found existing installation: typer 0.9.4\n", " Uninstalling typer-0.9.4:\n", " Successfully uninstalled typer-0.9.4\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "spacy 3.7.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\n", "weasel 0.3.4 requires typer<0.10.0,>=0.3.0, but you have typer 0.12.3 which is incompatible.\u001b[0m\u001b[31m\n", "\u001b[0mSuccessfully installed aiofiles-23.2.1 dnspython-2.6.1 email_validator-2.1.1 fastapi-0.111.0 fastapi-cli-0.0.4 ffmpy-0.3.2 gradio-4.32.1 gradio-client-0.17.0 h11-0.14.0 httpcore-1.0.5 httptools-0.6.1 httpx-0.27.0 orjson-3.10.3 pydub-0.25.1 python-dotenv-1.0.1 python-multipart-0.0.9 ruff-0.4.6 semantic-version-2.10.0 shellingham-1.5.4 starlette-0.37.2 tomlkit-0.12.0 typer-0.12.3 ujson-5.10.0 uvicorn-0.30.0 uvloop-0.19.0 watchfiles-0.22.0 websockets-11.0.3\n" ] } ] }, { "cell_type": "code", "source": [ "import pandas as pd\n", "import pickle\n", "import gradio as gr\n", "\n", "# Define preprocessing function\n", "def preprocess_input(data):\n", " df = pd.DataFrame(data, index=[0])\n", "\n", " # Let's find which percent are paid\n", " df['Percent_paid'] = df.apply(lambda row: row['Amount_paid'] / row['Transaction_Amount'] if row['Transaction_Amount'] != 0 else 0, axis=1)\n", "\n", " # Let's also group Vehicle_Speed, Transaction_Amount columns\n", " def Vehicle_Speed_group(speed):\n", " if speed <= 21:\n", " return '<= 21'\n", " elif speed <= 41:\n", " return '21-41'\n", " elif speed <= 93:\n", " return '41-93'\n", " elif speed <= 103:\n", " return '93-103'\n", " else:\n", " return '103 <'\n", "\n", " def Transaction_Amount_group(amount):\n", " if amount <= 60:\n", " return '<= 60'\n", " elif amount <= 180:\n", " return '60-180'\n", " elif amount <= 330:\n", " return '180-330'\n", " else:\n", " return '330 <'\n", "\n", " df['Vehicle_Speed_group'] = df['Vehicle_Speed'].apply(lambda x: Vehicle_Speed_group(x))\n", " df['Transaction_Amount_group'] = df['Transaction_Amount'].apply(lambda x: Transaction_Amount_group(x))\n", "\n", " # Let's encode categorical features\n", " df = pd.get_dummies(df, columns=['Vehicle_Type', 'Lane_Type','TollBoothID', 'Vehicle_Dimensions','Vehicle_Speed_group','Transaction_Amount_group'], drop_first=True)\n", "\n", " # Let's first remove unnecessary columns\n", " df.drop(columns = ['Transaction_ID','Timestamp','FastagID','Geographical_Location','Vehicle_Plate_Number'], inplace = True)\n", "\n", " # Let's convert all bool to int\n", " for col in df.select_dtypes(include=['bool', 'object']):\n", " try:\n", " df[col] = df[col].astype(int)\n", " except ValueError:\n", " df[col] = df[col].astype(float).round().astype(int)\n", "\n", " columns_to_add = ['Transaction_Amount', 'Amount_paid', 'Vehicle_Speed', 'Percent_paid',\n", " 'Vehicle_Type_Car', 'Vehicle_Type_Motorcycle', 'Vehicle_Type_SUV',\n", " 'Vehicle_Type_Sedan', 'Vehicle_Type_Truck', 'Vehicle_Type_Van',\n", " 'Lane_Type_Regular', 'TollBoothID_B-102', 'TollBoothID_C-103',\n", " 'TollBoothID_D-104', 'TollBoothID_D-105', 'TollBoothID_D-106',\n", " 'Vehicle_Dimensions_Medium', 'Vehicle_Dimensions_Small',\n", " 'Vehicle_Speed_group_21-41', 'Vehicle_Speed_group_41-93',\n", " 'Vehicle_Speed_group_93-103', 'Vehicle_Speed_group_<= 21',\n", " 'Transaction_Amount_group_330 <', 'Transaction_Amount_group_60-180',\n", " 'Transaction_Amount_group_<= 60']\n", "\n", " # Add missing columns with default value of 0\n", " for column in columns_to_add:\n", " if column not in df.columns:\n", " df[column] = 0\n", "\n", " return df\n", "\n", "# Load the trained Decision tree classification model\n", "with open('dt_model.pkl', 'rb') as file:\n", " dt_model = pickle.load(file)\n", "\n", "# Define function to detect fraud\n", "def predict_salary(transaction_id, timestamp, vehicle_type, fastag_id, tollbooth_id, lane_type, vehicle_dimensions, transaction_amount, amount_paid, geographical_location, vehicle_speed, vehicle_plate_number):\n", " # Preprocess input data\n", " input_data = preprocess_input({\n", " \"Transaction_ID\": transaction_id,\n", " \"Timestamp\": timestamp,\n", " \"Vehicle_Type\": vehicle_type,\n", " \"FastagID\": fastag_id,\n", " \"TollBoothID\": tollbooth_id,\n", " \"Lane_Type\": lane_type,\n", " \"Vehicle_Dimensions\": vehicle_dimensions,\n", " \"Transaction_Amount\": transaction_amount,\n", " \"Amount_paid\": amount_paid,\n", " \"Geographical_Location\": geographical_location,\n", " \"Vehicle_Speed\": vehicle_speed,\n", " \"Vehicle_Plate_Number\": vehicle_plate_number\n", " })\n", "\n", " input_data = input_data[['Transaction_Amount', 'Amount_paid', 'Vehicle_Speed', 'Percent_paid',\n", " 'Vehicle_Type_Car', 'Vehicle_Type_Motorcycle', 'Vehicle_Type_SUV',\n", " 'Vehicle_Type_Sedan', 'Vehicle_Type_Truck', 'Vehicle_Type_Van',\n", " 'Lane_Type_Regular', 'TollBoothID_B-102', 'TollBoothID_C-103',\n", " 'TollBoothID_D-104', 'TollBoothID_D-105', 'TollBoothID_D-106',\n", " 'Vehicle_Dimensions_Medium', 'Vehicle_Dimensions_Small',\n", " 'Vehicle_Speed_group_21-41', 'Vehicle_Speed_group_41-93',\n", " 'Vehicle_Speed_group_93-103', 'Vehicle_Speed_group_<= 21',\n", " 'Transaction_Amount_group_330 <', 'Transaction_Amount_group_60-180',\n", " 'Transaction_Amount_group_<= 60']]\n", "\n", " # Predict Fraud using the trained model\n", " fraud_prediction = dt_model.predict(input_data)\n", " fraud_prediction = ['Fraud❌' if fraud_prediction[0] == 1 else 'Not Fraud✅']\n", " result = f'Transaction ID {transaction_id}, the predicted fraud based on your details is {\"Fraud\" if fraud_prediction[0] == 1 else \"Not Fraud\"}'\n", " return result\n", "\n", "\n", "# Define Gradio interface\n", "interface = gr.Interface(\n", " fn=predict_salary,\n", " inputs=[\n", " gr.Textbox(label=\"Transaction ID\"),\n", " gr.Textbox(label=\"Timestamp\"),\n", " gr.Dropdown(['Bus ','Car','Motorcycle','Truck','Van','Sedan','SUV'], label=\"Vehicle_Type\"),\n", " gr.Textbox(label=\"Fastag ID\"),\n", " gr.Dropdown(['A-101','B-102','D-104','C-103','D-105','D-106'], label=\"TollBoothID\"),\n", " gr.Dropdown(['Express','Regular'], label=\"Lane_Type\"),\n", " gr.Dropdown(['Large','Small','Medium'], label=\"Vehicle_Dimensions\"),\n", " gr.Number(label=\"Transaction Amount\"),\n", " gr.Number(label=\"Amount Paid\"),\n", " gr.Textbox(label=\"Geographical Location\"),\n", " gr.Number(label=\"Vehicle Speed\"),\n", " gr.Textbox(label=\"Vehicle Plate Number\")\n", " ],\n", " outputs=gr.Textbox(label=\"Predicted Salary\"),\n", " title=\"Fraud Detection Model\",\n", " description=\"Enter details to predict salary.\"\n", ")\n", "\n", "# Launch the Gradio interface\n", "interface.launch()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 653 }, "id": "cbPDEtuCp9zj", "outputId": "15f0138e-e423-43b6-be32-537d7a8bc0c9" }, "execution_count": 89, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Setting queue=True in a Colab notebook requires sharing enabled. Setting `share=True` (you can turn this off by setting `share=False` in `launch()` explicitly).\n", "\n", "Colab notebook detected. To show errors in colab notebook, set debug=True in launch()\n", "Running on public URL: https://abfad13b115a2f01a3.gradio.live\n", "\n", "This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "
" ] }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [] }, "metadata": {}, "execution_count": 89 } ] }, { "cell_type": "markdown", "source": [ "# 🔚The End" ], "metadata": { "id": "QzaMh4h6F-Lc" } } ] }