├── PR_TEMPLATE.md ├── README.md ├── data ├── APA-DDoS-Dataset.csv ├── Apoorv012.txt ├── CONTRIBUTING.md ├── Jarviss77.txt ├── analysis_tonyStark-Jr.ipynb ├── k7aditya.csv ├── kushal7201.ipynb ├── network_data.csv ├── sarthakvermaa.txt ├── tonyStark-Jr.csv └── tonyStark-Jr.txt ├── model ├── main_model.py └── sarthakvermaa.txt └── reports ├── data ├── Mihir.ipynb ├── Mihir.pdf ├── analysis.pdf ├── analysis_tonyStark-Jr.ipynb ├── sarthakvermaa.ipynb └── sarthakvermaa.pdf └── model └── model_reports.pdf /PR_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Issue: #`ISSUE NUMBER` 2 | 3 | 4 | 5 | 6 | #### Short description of what this resolves: 7 | 8 | #### Changes proposed in this pull request and/or Screenshots of changes: 9 | 10 | - 11 | - 12 | - 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # YADD 2 | 3 | YADD, aka Yet Another DDoS Detector, is an open-source AI-based DDoS detection system designed to safeguard networks from malicious distributed denial-of-service attacks. 4 | 5 | ## Features 6 | 7 | - Utilizes advanced machine learning algorithms for real-time DDoS detection. 8 | - Provides accurate threat analysis and mitigation strategies. 9 | - Scalable and adaptable to various network infrastructures. 10 | - Continuous monitoring and updates to adapt to evolving attack patterns. 11 | 12 | ## Timeline 13 | 14 | ### Week 1: Data Collection and Formatting 15 | 16 | - Gather relevant datasets for training and testing the model. 17 | - Preprocess and format the data to make it suitable for training. 18 | 19 | ### Week 2: Model Development 20 | 21 | - Design and implement a robust AI model for DDoS detection. 22 | - Train the model on the collected dataset to learn patterns of normal and malicious network behavior. 23 | 24 | ### Week 3: Model Tuning, Evaluation, Testing, and Deployment 25 | 26 | - Fine-tune the model parameters for optimal performance. 27 | - Evaluate the model's accuracy, precision, recall, and other relevant metrics. 28 | - Test the model extensively to ensure its reliability and effectiveness. 29 | - Prepare the model for deployment. 30 | 31 | ### Week 4: Deploying on Real-time Network 32 | 33 | - Implement the deployment of the trained model on a real-time network environment. 34 | - Integrate the DDoS detection system into the network infrastructure. 35 | - Conduct thorough testing in a live environment to validate the system's functionality. 36 | 37 | ## Claim an issue 38 | Comment on the issue. In case of no activity on the issue even after 2 days, the issue will be reassigned. If you have difficulty approaching the issue, feel free to ask on our discord channel. 39 | ## Communication 40 | Whether you are working on a new feature or facing a doubt please feel free to ask us on our [discord](https://discord.com/channels/885149696249708635/1182981039564525579) channel. We will be happy to help you out. 41 | 42 | ## About the Mentor 43 | 44 | **Devam Desai** 45 | 46 | `DRedDevil04` 47 | 48 | *Developer by day, Hacker by night* 49 | 50 | 51 | ## Guidelines 52 | Please help us follow the best practice to make it easy for the reviewer as well as the contributor. We want to focus on the code quality more than on managing pull request ethics. 53 | 54 | - People before code: If any of the following rules are violated, the pull-requests must not be rejected. This is to create an easy and joyful onboarding process for new programmers and first-time contributors. 55 | 56 | - Single commit per pull request and name the commit as something meaningful, example: Adding <-your-name-> in students/mentors section. 57 | 58 | - Reference the issue numbers in the commit message if it resolves an open issue. Follow the PR Template 59 | 60 | - Provide the link to live gh-pages from your forked repository or relevant screenshot for easier review. 61 | 62 | - Pull Request older than 3 days with no response from the contributor shall be marked closed. 63 | 64 | - Do not make PR which is not related to any issues. You can create an issue and solve it once we approve them. 65 | 66 | - Avoid duplicate PRs, if need be comment on the older PR with the PR number of the follow-up (new PR) and close the obsolete PR yourself. 67 | 68 | - Be polite: Be polite to other community members. 69 | -------------------------------------------------------------------------------- /data/Apoorv012.txt: -------------------------------------------------------------------------------- 1 | https://drive.google.com/file/d/1k_CIJFl0WSTBSCD8n2aB2G4QHDr5e47b/view?usp=drive_link 2 | 3 | This dataset has 2 categories: 4 | 1. BENIGN 5 | 2. NetBIOS 6 | 7 | The Labels are as follows: 8 | 1. Unnamed: 0 9 | 2. Flow ID 10 | 3. Source IP 11 | 4. Source Port 12 | 5. Destination IP 13 | 6. Destination Port 14 | 7. Protocol 15 | 8. Timestamp 16 | 9. Flow Duration 17 | 10. Total Fwd Packets 18 | 11. Total Backward Packets 19 | 12. Total Length of Fwd Packets 20 | 13. Total Length of Bwd Packets 21 | 14. Fwd Packet Length Max 22 | 15. Fwd Packet Length Min 23 | 16. Fwd Packet Length Mean 24 | 17. Fwd Packet Length Std 25 | 18. Bwd Packet Length Max 26 | 19. Bwd Packet Length Min 27 | 20. Bwd Packet Length Mean 28 | 21. Bwd Packet Length Std 29 | 22. Flow Bytes/s 30 | 23. Flow Packets/s 31 | 24. Flow IAT Mean 32 | 25. Flow IAT Std 33 | 26. Flow IAT Max 34 | 27. Flow IAT Min 35 | 28. Fwd IAT Total 36 | 29. Fwd IAT Mean 37 | 30. Fwd IAT Std 38 | 31. Fwd IAT Max 39 | 32. Fwd IAT Min 40 | 33. Bwd IAT Total 41 | 34. Bwd IAT Mean 42 | 35. Bwd IAT Std 43 | 36. Bwd IAT Max 44 | 37. Bwd IAT Min 45 | 38. Fwd PSH Flags 46 | 39. Bwd PSH Flags 47 | 40. Fwd URG Flags 48 | 41. Bwd URG Flags 49 | 42. Fwd Header Length 50 | 43. Bwd Header Length 51 | 44. Fwd Packets/s 52 | 45. Bwd Packets/s 53 | 46. Min Packet Length 54 | 47. Max Packet Length 55 | 48. Packet Length Mean 56 | 49. Packet Length Std 57 | 50. Packet Length Variance 58 | 51. FIN Flag Count 59 | 52. SYN Flag Count 60 | 53. RST Flag Count 61 | 54. PSH Flag Count 62 | 55. ACK Flag Count 63 | 56. URG Flag Count 64 | 57. CWE Flag Count 65 | 58. ECE Flag Count 66 | 59. Down/Up Ratio 67 | 60. Average Packet Size 68 | 61. Avg Fwd Segment Size 69 | 62. Avg Bwd Segment Size 70 | 63. Fwd Header Length.1 71 | 64. Fwd Avg Bytes/Bulk 72 | 65. Fwd Avg Packets/Bulk 73 | 66. Fwd Avg Bulk Rate 74 | 67. Bwd Avg Bytes/Bulk 75 | 68. Bwd Avg Packets/Bulk 76 | 69. Bwd Avg Bulk Rate 77 | 70. Subflow Fwd Packets 78 | 71. Subflow Fwd Bytes 79 | 72. Subflow Bwd Packets 80 | 73. Subflow Bwd Bytes 81 | 74. Init_Win_bytes_forward 82 | 75. Init_Win_bytes_backward 83 | 76. act_data_pkt_fwd 84 | 77. min_seg_size_forward 85 | 78. Active Mean 86 | 79. Active Std 87 | 80. Active Max 88 | 81. Active Min 89 | 82. Idle Mean 90 | 83. Idle Std 91 | 84. Idle Max 92 | 85. Idle Min 93 | 86. SimillarHTTP 94 | 87. Inbound 95 | 88. Label 96 | -------------------------------------------------------------------------------- /data/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Dataset Contribution Guidelines 2 | 3 | Thank you for considering contributing to our dataset repository! Please follow the guidelines below to ensure a smooth contribution process. 4 | 5 | ## Dataset Format 6 | 7 | Our dataset follows a specific format with the following columns: 8 | 9 | 1. `ip.src` 10 | 2. `ip.dst` 11 | 3. `tcp.srcport` 12 | 4. `tcp.dstport` 13 | 5. `ip.proto` 14 | 6. `frame.len` 15 | 7. `tcp.flags.syn` 16 | 8. `tcp.flags.reset` 17 | 9. `tcp.flags.push` 18 | 10. `tcp.flags.ack` 19 | 11. `ip.flags.mf` 20 | 12. `ip.flags.df` 21 | 13. `ip.flags.rb` 22 | 14. `tcp.seq` 23 | 15. `tcp.ack` 24 | 16. `frame.time` 25 | 17. `Packets` 26 | 18. `Bytes` 27 | 19. `Tx Packets` 28 | 20. `Tx Bytes` 29 | 21. `Rx Packets` 30 | 22. `Rx Bytes` 31 | 23. `Label` 32 | 33 | Ensure that your dataset adheres to this column structure for consistency. 34 | 35 | In case, you have data but with some missing columns, kindly contact us on the specified Discord Channel(given in Readme.md) 36 | 37 | Also do checkout the `APA-DDoS-Dataset.csv` for reference. 38 | 39 | ## Contribution Process 40 | 41 | 1. **Fork the Repository:** Start by forking the repository to your GitHub account. 42 | 43 | 2. **Clone the Repository:** Clone the forked repository to your local machine. 44 | 45 | ```bash 46 | git clone https://github.com//YADD.git 47 | 48 | ## Feel free to post questions on the OpenCode Discord Server! 49 | 50 | 51 | -------------------------------------------------------------------------------- /data/Jarviss77.txt: -------------------------------------------------------------------------------- 1 | link: https://drive.google.com/file/d/1GLc2eKQstrDiVgTJ1A1Fw0Z4vYKhcR-3/view?usp=share_link -------------------------------------------------------------------------------- /data/kushal7201.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 3, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "Index(['Unnamed: 0.1', 'Unnamed: 0', 'Flow ID', 'Src IP', 'Src Port', 'Dst IP',\n", 13 | " 'Dst Port', 'Protocol', 'Timestamp', 'Flow Duration', 'Tot Fwd Pkts',\n", 14 | " 'Tot Bwd Pkts', 'TotLen Fwd Pkts', 'TotLen Bwd Pkts', 'Fwd Pkt Len Max',\n", 15 | " 'Fwd Pkt Len Min', 'Fwd Pkt Len Mean', 'Fwd Pkt Len Std',\n", 16 | " 'Bwd Pkt Len Max', 'Bwd Pkt Len Min', 'Bwd Pkt Len Mean',\n", 17 | " 'Bwd Pkt Len Std', 'Flow Byts/s', 'Flow Pkts/s', 'Flow IAT Mean',\n", 18 | " 'Flow IAT Std', 'Flow IAT Max', 'Flow IAT Min', 'Fwd IAT Tot',\n", 19 | " 'Fwd IAT Mean', 'Fwd IAT Std', 'Fwd IAT Max', 'Fwd IAT Min',\n", 20 | " 'Bwd IAT Tot', 'Bwd IAT Mean', 'Bwd IAT Std', 'Bwd IAT Max',\n", 21 | " 'Bwd IAT Min', 'Fwd PSH Flags', 'Bwd PSH Flags', 'Fwd URG Flags',\n", 22 | " 'Bwd URG Flags', 'Fwd Header Len', 'Bwd Header Len', 'Fwd Pkts/s',\n", 23 | " 'Bwd Pkts/s', 'Pkt Len Min', 'Pkt Len Max', 'Pkt Len Mean',\n", 24 | " 'Pkt Len Std', 'Pkt Len Var', 'FIN Flag Cnt', 'SYN Flag Cnt',\n", 25 | " 'RST Flag Cnt', 'PSH Flag Cnt', 'ACK Flag Cnt', 'URG Flag Cnt',\n", 26 | " 'CWE Flag Count', 'ECE Flag Cnt', 'Down/Up Ratio', 'Pkt Size Avg',\n", 27 | " 'Fwd Seg Size Avg', 'Bwd Seg Size Avg', 'Fwd Byts/b Avg',\n", 28 | " 'Fwd Pkts/b Avg', 'Fwd Blk Rate Avg', 'Bwd Byts/b Avg',\n", 29 | " 'Bwd Pkts/b Avg', 'Bwd Blk Rate Avg', 'Subflow Fwd Pkts',\n", 30 | " 'Subflow Fwd Byts', 'Subflow Bwd Pkts', 'Subflow Bwd Byts',\n", 31 | " 'Init Fwd Win Byts', 'Init Bwd Win Byts', 'Fwd Act Data Pkts',\n", 32 | " 'Fwd Seg Size Min', 'Active Mean', 'Active Std', 'Active Max',\n", 33 | " 'Active Min', 'Idle Mean', 'Idle Std', 'Idle Max', 'Idle Min', 'Label'],\n", 34 | " dtype='object')\n", 35 | "Index(['ip.src', 'ip.dst', 'tcp.srcport', 'tcp.dstport', 'ip.proto',\n", 36 | " 'frame.len', 'tcp.flags.syn', 'tcp.flags.reset', 'tcp.flags.push',\n", 37 | " 'tcp.flags.ack', 'ip.flags.mf', 'ip.flags.df', 'ip.flags.rb', 'tcp.seq',\n", 38 | " 'tcp.ack', 'frame.time', 'Packets', 'Bytes', 'Tx Packets', 'Tx Bytes',\n", 39 | " 'Rx Packets', 'Rx Bytes', 'Label'],\n", 40 | " dtype='object')\n", 41 | "Index(['dt', 'switch', 'src', 'dst', 'pktcount', 'bytecount', 'dur',\n", 42 | " 'dur_nsec', 'tot_dur', 'flows', 'packetins', 'pktperflow',\n", 43 | " 'byteperflow', 'pktrate', 'Pairflow', 'Protocol', 'port_no', 'tx_bytes',\n", 44 | " 'rx_bytes', 'tx_kbps', 'rx_kbps', 'tot_kbps', 'label'],\n", 45 | " dtype='object')\n" 46 | ] 47 | } 48 | ], 49 | "source": [ 50 | "# Importing necessary libraries...\n", 51 | "import pandas as pd\n", 52 | "from sklearn.preprocessing import StandardScaler\n", 53 | "\n", 54 | "# Define a function to read data from a CSV file\n", 55 | "def read_data(file_path):\n", 56 | " return pd.read_csv(file_path)\n", 57 | "\n", 58 | "# Read data from the three datasets\n", 59 | "dataset1 = read_data('k7aditya.csv')\n", 60 | "dataset2 = read_data('APA-DDoS-Dataset.csv')\n", 61 | "dataset3 = read_data('tonyStark-Jr.csv')\n", 62 | "print(dataset1.columns)\n", 63 | "print(dataset2.columns)\n", 64 | "print(dataset3.columns)" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 4, 70 | "metadata": {}, 71 | "outputs": [ 72 | { 73 | "name": "stdout", 74 | "output_type": "stream", 75 | "text": [ 76 | " unnamed: 0.1 unnamed: 0 src port dst port protocol flow duration \\\n", 77 | "0 -1.732039 -1.732039 1.660090 0.0 0.0 -0.481011 \n", 78 | "1 -1.732016 -1.732016 1.659866 0.0 0.0 -0.483635 \n", 79 | "2 -1.731993 -1.731993 1.659642 0.0 0.0 -0.489148 \n", 80 | "3 -1.731970 -1.731970 1.660314 0.0 0.0 -0.494445 \n", 81 | "4 -1.731947 -1.731947 -1.564743 0.0 0.0 -0.469008 \n", 82 | "... ... ... ... ... ... ... \n", 83 | "149995 1.731947 1.731947 -1.774386 0.0 0.0 -0.486475 \n", 84 | "149996 1.731970 1.731970 -1.774610 0.0 0.0 -0.489124 \n", 85 | "149997 1.731993 1.731993 -1.774834 0.0 0.0 -0.490007 \n", 86 | "149998 1.732016 1.732016 1.433200 0.0 0.0 -0.500506 \n", 87 | "149999 1.732039 1.732039 1.432976 0.0 0.0 -0.498692 \n", 88 | "\n", 89 | " tot fwd pkts tot bwd pkts totlen fwd pkts totlen bwd pkts ... \\\n", 90 | "0 0.0 0.0 0.0 0.0 ... \n", 91 | "1 0.0 0.0 0.0 0.0 ... \n", 92 | "2 0.0 0.0 0.0 0.0 ... \n", 93 | "3 0.0 0.0 0.0 0.0 ... \n", 94 | "4 0.0 0.0 0.0 0.0 ... \n", 95 | "... ... ... ... ... ... \n", 96 | "149995 0.0 0.0 0.0 0.0 ... \n", 97 | "149996 0.0 0.0 0.0 0.0 ... \n", 98 | "149997 0.0 0.0 0.0 0.0 ... \n", 99 | "149998 0.0 0.0 0.0 0.0 ... \n", 100 | "149999 0.0 0.0 0.0 0.0 ... \n", 101 | "\n", 102 | " fwd seg size min active mean active std active max active min \\\n", 103 | "0 0.0 0.0 0.0 0.0 0.0 \n", 104 | "1 0.0 0.0 0.0 0.0 0.0 \n", 105 | "2 0.0 0.0 0.0 0.0 0.0 \n", 106 | "3 0.0 0.0 0.0 0.0 0.0 \n", 107 | "4 0.0 0.0 0.0 0.0 0.0 \n", 108 | "... ... ... ... ... ... \n", 109 | "149995 0.0 0.0 0.0 0.0 0.0 \n", 110 | "149996 0.0 0.0 0.0 0.0 0.0 \n", 111 | "149997 0.0 0.0 0.0 0.0 0.0 \n", 112 | "149998 0.0 0.0 0.0 0.0 0.0 \n", 113 | "149999 0.0 0.0 0.0 0.0 0.0 \n", 114 | "\n", 115 | " idle mean idle std idle max idle min label \n", 116 | "0 0.0 0.0 0.0 0.0 0.0 \n", 117 | "1 0.0 0.0 0.0 0.0 0.0 \n", 118 | "2 0.0 0.0 0.0 0.0 0.0 \n", 119 | "3 0.0 0.0 0.0 0.0 0.0 \n", 120 | "4 0.0 0.0 0.0 0.0 0.0 \n", 121 | "... ... ... ... ... ... \n", 122 | "149995 0.0 0.0 0.0 0.0 0.0 \n", 123 | "149996 0.0 0.0 0.0 0.0 0.0 \n", 124 | "149997 0.0 0.0 0.0 0.0 0.0 \n", 125 | "149998 0.0 0.0 0.0 0.0 0.0 \n", 126 | "149999 0.0 0.0 0.0 0.0 0.0 \n", 127 | "\n", 128 | "[150000 rows x 82 columns]\n", 129 | " src port dst port protocol frame.len tcp.flags.syn \\\n", 130 | "0 -1.271463 0.0 0.0 -0.632141 0.0 \n", 131 | "1 -1.271412 0.0 0.0 -0.632141 0.0 \n", 132 | "2 -1.271361 0.0 0.0 -0.632141 0.0 \n", 133 | "3 -1.271310 0.0 0.0 -0.632141 0.0 \n", 134 | "4 -1.271259 0.0 0.0 -0.632141 0.0 \n", 135 | "... ... ... ... ... ... \n", 136 | "151195 0.508437 0.0 0.0 -0.463664 0.0 \n", 137 | "151196 0.508538 0.0 0.0 -0.463664 0.0 \n", 138 | "151197 0.508640 0.0 0.0 -0.463664 0.0 \n", 139 | "151198 0.508742 0.0 0.0 -0.463664 0.0 \n", 140 | "151199 0.508844 0.0 0.0 -0.463664 0.0 \n", 141 | "\n", 142 | " tcp.flags.reset tcp.flags.push tcp.flags.ack ip.flags.mf \\\n", 143 | "0 0.0 1.0 0.0 0.0 \n", 144 | "1 0.0 1.0 0.0 0.0 \n", 145 | "2 0.0 1.0 0.0 0.0 \n", 146 | "3 0.0 1.0 0.0 0.0 \n", 147 | "4 0.0 1.0 0.0 0.0 \n", 148 | "... ... ... ... ... \n", 149 | "151195 0.0 -1.0 0.0 0.0 \n", 150 | "151196 0.0 -1.0 0.0 0.0 \n", 151 | "151197 0.0 -1.0 0.0 0.0 \n", 152 | "151198 0.0 -1.0 0.0 0.0 \n", 153 | "151199 0.0 -1.0 0.0 0.0 \n", 154 | "\n", 155 | " ip.flags.df ip.flags.rb tcp.seq tcp.ack packets totlen fwd pkts \\\n", 156 | "0 -1.0 0.0 0.0 0.0 -0.508386 -0.983051 \n", 157 | "1 -1.0 0.0 0.0 0.0 0.430752 -0.694094 \n", 158 | "2 -1.0 0.0 0.0 0.0 1.369890 -0.405137 \n", 159 | "3 -1.0 0.0 0.0 0.0 0.430752 -0.694094 \n", 160 | "4 -1.0 0.0 0.0 0.0 -1.447524 -1.272008 \n", 161 | "... ... ... ... ... ... ... \n", 162 | "151195 1.0 0.0 0.0 0.0 0.430752 0.927277 \n", 163 | "151196 1.0 0.0 0.0 0.0 0.430752 0.940655 \n", 164 | "151197 1.0 0.0 0.0 0.0 0.430752 0.921926 \n", 165 | "151198 1.0 0.0 0.0 0.0 0.430752 1.004867 \n", 166 | "151199 1.0 0.0 0.0 0.0 0.430752 0.927277 \n", 167 | "\n", 168 | " tx packets tx bytes tot bwd pkts totlen bwd pkts label \n", 169 | "0 -0.774686 -0.985676 -0.035187 -0.977848 1.0 \n", 170 | "1 -0.036029 -0.680974 1.003123 -0.703883 1.0 \n", 171 | "2 0.702627 -0.376273 2.041433 -0.429917 1.0 \n", 172 | "3 -0.036029 -0.680974 1.003123 -0.703883 1.0 \n", 173 | "4 -1.513342 -1.290377 -1.073497 -1.251814 1.0 \n", 174 | "... ... ... ... ... ... \n", 175 | "151195 0.702627 0.955386 -0.035187 0.899322 -1.0 \n", 176 | "151196 0.702627 0.955386 -0.035187 0.924689 -1.0 \n", 177 | "151197 0.702627 0.955386 -0.035187 0.889175 -1.0 \n", 178 | "151198 0.702627 0.955386 -0.035187 1.046452 -1.0 \n", 179 | "151199 0.702627 0.955386 -0.035187 0.899322 -1.0 \n", 180 | "\n", 181 | "[151200 rows x 20 columns]\n", 182 | " timestamp switch pktcount bytes dur dur_nsec tot_dur \\\n", 183 | "0 -0.542890 -1.643016 -0.145262 0.207217 -0.781249 0.919175 -0.779412 \n", 184 | "1 -0.527862 -1.643016 1.413491 1.979416 -0.146367 0.984157 -0.144270 \n", 185 | "2 -0.542890 -1.643016 0.720298 1.191301 -0.428537 1.020258 -0.426555 \n", 186 | "3 -0.542890 -1.643016 0.720298 1.191301 -0.428537 1.020258 -0.426555 \n", 187 | "4 -0.542890 -1.643016 0.720298 1.191301 -0.428537 1.020258 -0.426555 \n", 188 | "... ... ... ... ... ... ... ... \n", 189 | "104340 -1.057435 -0.620687 -1.014589 -0.782718 -0.848265 1.374048 -0.847012 \n", 190 | "104341 -1.057435 -0.620687 -1.014589 -0.782718 -0.848265 1.374048 -0.847012 \n", 191 | "104342 -1.057435 -0.620687 -1.015512 -0.782815 -1.024621 1.240474 -1.023570 \n", 192 | "104343 -1.057435 -0.620687 -1.015512 -0.782815 -1.024621 1.240474 -1.023570 \n", 193 | "104344 -1.057435 -0.620687 -1.015512 -0.782815 -1.024621 1.240474 -1.023570 \n", 194 | "\n", 195 | " flows packets pktperflow totlen bwd pkts pktrate pairflow \\\n", 196 | "0 -0.899733 -0.619631 0.966041 1.284664 0.967330 -1.227267 \n", 197 | "1 -1.238714 -0.619631 0.965501 1.284100 0.967330 -1.227267 \n", 198 | "2 -0.899733 -0.619631 0.965906 1.284523 0.967330 -1.227267 \n", 199 | "3 -0.899733 -0.619631 0.965906 1.284523 0.967330 -1.227267 \n", 200 | "4 -0.899733 -0.619631 0.965906 1.284523 0.967330 -1.227267 \n", 201 | "... ... ... ... ... ... ... \n", 202 | "104340 -0.221772 -0.987332 -0.857925 -0.623447 -0.859661 -1.227267 \n", 203 | "104341 -0.221772 -0.987332 -0.857925 -0.623447 -0.859661 -1.227267 \n", 204 | "104342 -0.221772 -0.987332 -0.857790 -0.623434 -0.855610 -1.227267 \n", 205 | "104343 -0.221772 -0.987332 -0.857790 -0.623434 -0.855610 -1.227267 \n", 206 | "104344 -0.221772 -0.987332 -0.857790 -0.623434 -0.855610 -1.227267 \n", 207 | "\n", 208 | " src port tx_bytes rx_bytes flow_bytes_per_sec \\\n", 209 | "0 0.616885 0.333532 -0.701328 -0.412179 \n", 210 | "1 1.539116 -0.613732 -0.701331 -0.412179 \n", 211 | "2 -1.227575 -0.613733 -0.701348 -0.412179 \n", 212 | "3 -0.305345 -0.613733 -0.701346 -0.412179 \n", 213 | "4 0.616885 -0.613735 -0.701330 -0.412179 \n", 214 | "... ... ... ... ... \n", 215 | "104340 -1.227575 -0.613657 -0.701262 -0.411767 \n", 216 | "104341 0.616885 -0.613658 -0.701247 -0.411767 \n", 217 | "104342 -0.305345 -0.613735 -0.701329 -0.412179 \n", 218 | "104343 -1.227575 -0.613657 -0.701262 -0.411767 \n", 219 | "104344 0.616885 -0.613658 -0.701247 -0.411767 \n", 220 | "\n", 221 | " flow_packets_per_sec tot_kbps label \n", 222 | "0 -0.488502 -0.638457 0.0 \n", 223 | "1 -0.488502 -0.638457 0.0 \n", 224 | "2 -0.488502 -0.638457 0.0 \n", 225 | "3 -0.488502 -0.638457 0.0 \n", 226 | "4 -0.488502 -0.638457 0.0 \n", 227 | "... ... ... ... \n", 228 | "104340 -0.488015 -0.637821 0.0 \n", 229 | "104341 -0.488015 -0.637821 0.0 \n", 230 | "104342 -0.488502 -0.638457 0.0 \n", 231 | "104343 -0.488015 -0.637821 0.0 \n", 232 | "104344 -0.488015 -0.637821 0.0 \n", 233 | "\n", 234 | "[104345 rows x 20 columns]\n" 235 | ] 236 | } 237 | ], 238 | "source": [ 239 | "\n", 240 | "# Convert all column names to lowercase\n", 241 | "dataset1.columns = dataset1.columns.str.lower()\n", 242 | "dataset2.columns = dataset2.columns.str.lower()\n", 243 | "dataset3.columns = dataset3.columns.str.lower()\n", 244 | "\n", 245 | "# Standardize labels in each dataset\n", 246 | "dataset1['label'] = dataset1['label'].astype(str).str.lower().apply(lambda x: 1 if 'ddos' in x else 0)\n", 247 | "dataset2['label'] = dataset2['label'].astype(str).str.lower().apply(lambda x: 1 if 'ddos' in x else 0)\n", 248 | "dataset3['label'] = dataset3['label'].astype(str).str.lower().apply(lambda x: 1 if 'ddos' in x else 0)\n", 249 | "\n", 250 | "\n", 251 | "\n", 252 | "# Convert all column names to lowercase in DATASET1\n", 253 | "dataset1.columns = dataset1.columns.str.lower()\n", 254 | "\n", 255 | "# Rename features in DATASET1\n", 256 | "rename_mapping_dataset1 = {\n", 257 | " 'fwd pkt len max': 'max_fwd_pkt_len',\n", 258 | " 'fwd pkt len min': 'min_fwd_pkt_len',\n", 259 | " 'fwd pkt len mean': 'mean_fwd_pkt_len',\n", 260 | " 'fwd pkt len std': 'std_fwd_pkt_len',\n", 261 | " 'bwd pkt len max': 'max_bwd_pkt_len',\n", 262 | " 'bwd pkt len min': 'min_bwd_pkt_len',\n", 263 | " 'bwd pkt len mean': 'mean_bwd_pkt_len',\n", 264 | " 'bwd pkt len std': 'std_bwd_pkt_len',\n", 265 | " 'flow byts/s': 'flow_bytes_per_sec',\n", 266 | " 'flow pkts/s': 'flow_packets_per_sec',\n", 267 | " 'flow iat mean': 'flow_iat_mean',\n", 268 | " 'flow iat std': 'flow_iat_std',\n", 269 | " 'flow iat max': 'flow_iat_max',\n", 270 | " 'flow iat min': 'flow_iat_min'\n", 271 | "}\n", 272 | "\n", 273 | "dataset1.rename(columns=rename_mapping_dataset1, inplace=True)\n", 274 | "\n", 275 | "# Convert all column names to lowercase in DATASET2\n", 276 | "dataset2.columns = dataset2.columns.str.lower()\n", 277 | "\n", 278 | "# Rename features in DATASET2\n", 279 | "rename_mapping_dataset2 = {\n", 280 | " 'ip.src': 'src ip',\n", 281 | " 'tcp.srcport': 'src port',\n", 282 | " 'ip.dst': 'dst ip',\n", 283 | " 'tcp.dstport': 'dst port',\n", 284 | " 'ip.proto': 'protocol',\n", 285 | " 'frame.time': 'timestamp',\n", 286 | " 'bytes': 'totlen fwd pkts',\n", 287 | " 'rx packets': 'tot bwd pkts',\n", 288 | " 'rx bytes': 'totlen bwd pkts',\n", 289 | "}\n", 290 | "\n", 291 | "dataset2.rename(columns=rename_mapping_dataset2, inplace=True)\n", 292 | "\n", 293 | "# Convert all column names to lowercase in DATASET3\n", 294 | "dataset3.columns = dataset3.columns.str.lower()\n", 295 | "\n", 296 | "# Rename features in DATASET3\n", 297 | "rename_mapping_dataset3 = {\n", 298 | " 'src': 'src ip',\n", 299 | " 'port_no': 'src port',\n", 300 | " 'dst': 'dst ip',\n", 301 | " 'protocol': 'ip.proto',\n", 302 | " 'dt': 'timestamp',\n", 303 | " 'packetins': 'packets',\n", 304 | " 'bytecount': 'bytes',\n", 305 | " 'byteperflow': 'totlen bwd pkts',\n", 306 | " 'packetperflow': 'tot bwd pkts',\n", 307 | " 'tx_kbps': 'flow_bytes_per_sec',\n", 308 | " 'rx_kbps': 'flow_packets_per_sec',\n", 309 | "}\n", 310 | "dataset3.rename(columns=rename_mapping_dataset3, inplace=True)\n", 311 | "\n", 312 | "\n", 313 | "# Drop columns that have no entries\n", 314 | "dataset1 = dataset1.dropna(axis=1, how='all')\n", 315 | "dataset2 = dataset2.dropna(axis=1, how='all')\n", 316 | "dataset3 = dataset3.dropna(axis=1, how='all')\n", 317 | "\n", 318 | "# Select only numeric columns from each dataset\n", 319 | "numeric_features1 = dataset1.select_dtypes(include=['float64', 'int64'])\n", 320 | "numeric_features2 = dataset2.select_dtypes(include=['float64', 'int64'])\n", 321 | "numeric_features3 = dataset3.select_dtypes(include=['float64', 'int64'])\n", 322 | "\n", 323 | "# Initialize a StandardScaler\n", 324 | "scaler = StandardScaler()\n", 325 | "\n", 326 | "# Apply the scaler to the numeric columns of each dataset\n", 327 | "dataset1[numeric_features1.columns] = scaler.fit_transform(numeric_features1)\n", 328 | "dataset2[numeric_features2.columns] = scaler.fit_transform(numeric_features2)\n", 329 | "dataset3[numeric_features3.columns] = scaler.fit_transform(numeric_features3)\n", 330 | "\n", 331 | "# Print the standardized data\n", 332 | "print(dataset1[numeric_features1.columns])\n", 333 | "print(dataset2[numeric_features2.columns])\n", 334 | "print(dataset3[numeric_features3.columns])\n", 335 | "\n" 336 | ] 337 | }, 338 | { 339 | "cell_type": "code", 340 | "execution_count": 5, 341 | "metadata": {}, 342 | "outputs": [ 343 | { 344 | "name": "stdout", 345 | "output_type": "stream", 346 | "text": [ 347 | "['src ip', 'dst ip', 'totlen bwd pkts', 'label', 'src port', 'timestamp']\n" 348 | ] 349 | } 350 | ], 351 | "source": [ 352 | "# Identify common features in all datasets\n", 353 | "common_features = list(set(dataset1.columns).intersection(set(dataset2.columns), set(dataset3.columns)))\n", 354 | "print(common_features)" 355 | ] 356 | }, 357 | { 358 | "cell_type": "code", 359 | "execution_count": 6, 360 | "metadata": {}, 361 | "outputs": [ 362 | { 363 | "ename": "", 364 | "evalue": "", 365 | "output_type": "error", 366 | "traceback": [ 367 | "\u001b[1;31mThe Kernel crashed while executing code in the the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click here for more info. View Jupyter log for further details." 368 | ] 369 | } 370 | ], 371 | "source": [ 372 | "\n", 373 | "# Drop uncommon features from each dataset\n", 374 | "dataset1 = dataset1.drop(columns=[col for col in dataset1.columns if col not in common_features])\n", 375 | "dataset2 = dataset2.drop(columns=[col for col in dataset2.columns if col not in common_features])\n", 376 | "dataset3 = dataset3.drop(columns=[col for col in dataset3.columns if col not in common_features])\n", 377 | "\n", 378 | "# Concatenate the three datasets\n", 379 | "dataset = pd.concat([dataset1, dataset2, dataset3])\n", 380 | "\n", 381 | "# Handle missing values by filling them with the mean of each column\n", 382 | "dataset = dataset.fillna(dataset.mean())\n", 383 | "\n", 384 | "# Handle outliers by removing any rows where any column has a value less than Q1 - 1.5 * IQR or greater than Q3 + 1.5 * IQR\n", 385 | "Q1 = dataset.quantile(0.25)\n", 386 | "Q3 = dataset.quantile(0.75)\n", 387 | "IQR = Q3 - Q1\n", 388 | "dataset = dataset[~((dataset < (Q1 - 1.5 * IQR)) |(dataset > (Q3 + 1.5 * IQR))).any(axis=1)]\n", 389 | "\n", 390 | "# Assign features to variable X and labels to variable Y\n", 391 | "X = dataset.drop('label', axis=1)\n", 392 | "Y = dataset['label']\n", 393 | "\n", 394 | "print(X)\n", 395 | "print(Y)" 396 | ] 397 | } 398 | ], 399 | "metadata": { 400 | "kernelspec": { 401 | "display_name": "Python 3", 402 | "language": "python", 403 | "name": "python3" 404 | }, 405 | "language_info": { 406 | "codemirror_mode": { 407 | "name": "ipython", 408 | "version": 3 409 | }, 410 | "file_extension": ".py", 411 | "mimetype": "text/x-python", 412 | "name": "python", 413 | "nbconvert_exporter": "python", 414 | "pygments_lexer": "ipython3", 415 | "version": "3.12.0" 416 | } 417 | }, 418 | "nbformat": 4, 419 | "nbformat_minor": 2 420 | } 421 | -------------------------------------------------------------------------------- /data/network_data.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/YADD/66bfff366d33bc082201cbe4f73cbc93fa282330/data/network_data.csv -------------------------------------------------------------------------------- /data/sarthakvermaa.txt: -------------------------------------------------------------------------------- 1 | https://drive.google.com/file/d/1N9ZKFQjyIZYMTV6yv-3XVuD9KgR7NOMa/view?usp=sharing 2 | 3 | This dataset has been labelled into: Benign and Portmap 4 | 5 | 88 Features: 6 | Unnamed 7 | Flow ID 8 | Source IP 9 | Source Port 10 | Destination IP 11 | Destination Port 12 | Protocol 13 | Timestamp 14 | Flow Duration 15 | Total Fwd Packets 16 | Total Backward Packets 17 | Total Length of Fwd Packets 18 | Total Length of Bwd Packets 19 | Fwd Packet Length Max 20 | Fwd Packet Length Min 21 | Fwd Packet Length Mean 22 | Fwd Packet Length Std 23 | Bwd Packet Length Max 24 | Bwd Packet Length Min 25 | Bwd Packet Length Mean 26 | Bwd Packet Length Std 27 | Flow Bytes/s 28 | Flow Packets/s 29 | Flow IAT Mean 30 | Flow IAT Std 31 | Flow IAT Max 32 | Flow IAT Min 33 | Fwd IAT Total 34 | Fwd IAT Mean 35 | Fwd IAT Std 36 | Fwd IAT Max 37 | Fwd IAT Min 38 | Bwd IAT Total 39 | Bwd IAT Mean 40 | Bwd IAT Std 41 | Bwd IAT Max 42 | Bwd IAT Min 43 | Fwd PSH Flags 44 | Bwd PSH Flags 45 | Fwd URG Flags 46 | Bwd URG Flags 47 | Fwd Header Length 48 | Bwd Header Length 49 | Fwd Packets/s 50 | Bwd Packets/s 51 | Min Packet Length 52 | Max Packet Length 53 | Packet Length Mean 54 | Packet Length Std 55 | Packet Length Variance 56 | FIN Flag Count 57 | SYN Flag Count 58 | RST Flag Count 59 | PSH Flag Count 60 | ACK Flag Count 61 | URG Flag Count 62 | CWE Flag Count 63 | ECE Flag Count 64 | Down/Up Ratio 65 | Average Packet Size 66 | Avg Fwd Segment Size 67 | Avg Bwd Segment Size 68 | Fwd Header Length.1 69 | Fwd Avg Bytes/Bulk 70 | Fwd Avg Packets/Bulk 71 | Fwd Avg Bulk Rate 72 | Bwd Avg Bytes/Bulk 73 | Bwd Avg Packets/Bulk 74 | Bwd Avg Bulk Rate 75 | Subflow Fwd Packets 76 | Subflow Fwd Bytes 77 | Subflow Bwd Packets 78 | Subflow Bwd Bytes 79 | Init_Win_bytes_forward 80 | Init_Win_bytes_backward 81 | act_data_pkt_fwd 82 | min_seg_size_forward 83 | Active Mean 84 | Active Std 85 | Active Max 86 | Active Min 87 | Idle Mean 88 | Idle Std 89 | Idle Max 90 | Idle Min 91 | SimillarHTTP 92 | Inbound 93 | Label 94 | -------------------------------------------------------------------------------- /data/tonyStark-Jr.txt: -------------------------------------------------------------------------------- 1 | Dataset Link: https://drive.google.com/file/d/1-7B7w6PARCTiWnoYPe73422V_l-nC-v7/view?usp=sharing 2 | 3 | It is classified into two category benign or LDAP-DDOS attack. 4 | 5 | Total Features: 84 6 | 7 | Features: 8 | 'Flow ID', 9 | ' Source IP', 10 | ' Source Port', 11 | ' Destination IP', 12 | ' Destination Port', 13 | ' Protocol', 14 | ' Timestamp', 15 | ' Flow Duration', 16 | ' Total Fwd Packets', 17 | ' Total Backward Packets', 18 | 'Total Length of Fwd Packets', 19 | ' Total Length of Bwd Packets', 20 | ' Fwd Packet Length Max', 21 | ' Fwd Packet Length Min', 22 | ' Fwd Packet Length Mean', 23 | ' Fwd Packet Length Std', 24 | 'Bwd Packet Length Max', 25 | ' Bwd Packet Length Min', 26 | ' Bwd Packet Length Mean', 27 | ' Bwd Packet Length Std', 28 | 'Flow Bytes/s', 29 | ' Flow Packets/s', 30 | ' Flow IAT Mean', 31 | ' Flow IAT Std', 32 | ' Flow IAT Max', 33 | ' Flow IAT Min', 34 | 'Fwd IAT Total', 35 | ' Fwd IAT Mean', 36 | ' Fwd IAT Std', 37 | ' Fwd IAT Max', 38 | ' Fwd IAT Min', 39 | 'Bwd IAT Total', 40 | ' Bwd IAT Mean', 41 | ' Bwd IAT Std', 42 | ' Bwd IAT Max', 43 | ' Bwd IAT Min', 44 | 'Fwd PSH Flags', 45 | ' Bwd PSH Flags', 46 | ' Fwd URG Flags', 47 | ' Bwd URG Flags', 48 | ' Fwd Header Length', 49 | ' Bwd Header Length', 50 | 'Fwd Packets/s', 51 | ' Bwd Packets/s', 52 | ' Min Packet Length', 53 | ' Max Packet Length', 54 | ' Packet Length Mean', 55 | ' Packet Length Std', 56 | ' Packet Length Variance', 57 | 'FIN Flag Count', 58 | ' SYN Flag Count', 59 | ' RST Flag Count', 60 | ' PSH Flag Count', 61 | ' ACK Flag Count', 62 | ' URG Flag Count', 63 | ' CWE Flag Count', 64 | ' ECE Flag Count', 65 | ' Down/Up Ratio', 66 | ' Average Packet Size', 67 | ' Avg Fwd Segment Size', 68 | ' Avg Bwd Segment Size', 69 | ' Fwd Header Length.1', 70 | 'Fwd Avg Bytes/Bulk', 71 | ' Fwd Avg Packets/Bulk', 72 | ' Fwd Avg Bulk Rate', 73 | ' Bwd Avg Bytes/Bulk', 74 | ' Bwd Avg Packets/Bulk', 75 | 'Bwd Avg Bulk Rate', 76 | 'Subflow Fwd Packets', 77 | ' Subflow Fwd Bytes', 78 | ' Subflow Bwd Packets', 79 | ' Subflow Bwd Bytes', 80 | 'Init_Win_bytes_forward', 81 | ' Init_Win_bytes_backward', 82 | ' act_data_pkt_fwd', 83 | ' min_seg_size_forward', 84 | 'Active Mean', 85 | ' Active Std', 86 | ' Active Max', 87 | ' Active Min', 88 | 'Idle Mean', 89 | ' Idle Std', 90 | ' Idle Max', 91 | ' Idle Min', 92 | 'SimillarHTTP', 93 | ' Inbound', 94 | ' Label' 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /model/main_model.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/YADD/66bfff366d33bc082201cbe4f73cbc93fa282330/model/main_model.py -------------------------------------------------------------------------------- /model/sarthakvermaa.txt: -------------------------------------------------------------------------------- 1 | Link shared with email iit2022035@iiita.ac.in 2 | 3 | https://colab.research.google.com/drive/1PQkMDiVLMAb92T6aVU-OcAybGwYxQSxd?usp=sharing 4 | 5 | model_tonyStark-Jr 6 | https://colab.research.google.com/drive/1R1Pq56YIEg_EV6QoSCtpBjxfCLkXBlj6 7 | -------------------------------------------------------------------------------- /reports/data/Mihir.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "96078db8-a6be-4ae3-a23a-52129e351766", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "import numpy as np\n", 11 | "import pandas as pd\n", 12 | "import seaborn as sns\n", 13 | "import matplotlib.pyplot as plt" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 2, 19 | "id": "21b9cb29-8af5-425a-b5b6-dcfdd4aeb7ab", 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "dataset= pd.read_csv(\"data/APA-DDoS-Dataset.csv\")" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 3, 29 | "id": "9253fb56-c939-4931-8a63-2bdef897ca7a", 30 | "metadata": {}, 31 | "outputs": [ 32 | { 33 | "data": { 34 | "text/html": [ 35 | "
\n", 36 | "\n", 49 | "\n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | "
ip.srcip.dsttcp.srcporttcp.dstportip.protoframe.lentcp.flags.syntcp.flags.resettcp.flags.pushtcp.flags.ack...tcp.seqtcp.ackframe.timePacketsBytesTx PacketsTx BytesRx PacketsRx BytesLabel
0192.168.1.1192.168.23.2241280006540011...1116-Jun 2020 20:18:15.071112000 Mountain Dayli...843242164216DDoS-PSH-ACK
1192.168.1.1192.168.23.2241380006540011...1116-Jun 2020 20:18:15.071138000 Mountain Dayli...1054052705270DDoS-PSH-ACK
2192.168.1.1192.168.23.2241480006540011...1116-Jun 2020 20:18:15.071146000 Mountain Dayli...1264863246324DDoS-PSH-ACK
3192.168.1.1192.168.23.2241580006540011...1116-Jun 2020 20:18:15.071152000 Mountain Dayli...1054052705270DDoS-PSH-ACK
4192.168.1.1192.168.23.2241680006540011...1116-Jun 2020 20:18:15.071159000 Mountain Dayli...632431623162DDoS-PSH-ACK
..................................................................
151195192.168.19.1192.168.23.23736080006660001...1116-Jun 2020 22:10:46.923006000 Mountain Dayli...10114665604586Benign
151196192.168.19.1192.168.23.23736280006660001...1116-Jun 2020 22:10:46.935672000 Mountain Dayli...10115165604591Benign
151197192.168.19.1192.168.23.23736480006660001...1116-Jun 2020 22:10:46.957469000 Mountain Dayli...10114465604584Benign
151198192.168.19.1192.168.23.23736680006660001...1116-Jun 2020 22:10:46.970971000 Mountain Dayli...10117565604615Benign
151199192.168.19.1192.168.23.23736880006660001...1116-Jun 2020 22:10:46.984798000 Mountain Dayli...10114665604586Benign
\n", 343 | "

151200 rows × 23 columns

\n", 344 | "
" 345 | ], 346 | "text/plain": [ 347 | " ip.src ip.dst tcp.srcport tcp.dstport ip.proto \\\n", 348 | "0 192.168.1.1 192.168.23.2 2412 8000 6 \n", 349 | "1 192.168.1.1 192.168.23.2 2413 8000 6 \n", 350 | "2 192.168.1.1 192.168.23.2 2414 8000 6 \n", 351 | "3 192.168.1.1 192.168.23.2 2415 8000 6 \n", 352 | "4 192.168.1.1 192.168.23.2 2416 8000 6 \n", 353 | "... ... ... ... ... ... \n", 354 | "151195 192.168.19.1 192.168.23.2 37360 8000 6 \n", 355 | "151196 192.168.19.1 192.168.23.2 37362 8000 6 \n", 356 | "151197 192.168.19.1 192.168.23.2 37364 8000 6 \n", 357 | "151198 192.168.19.1 192.168.23.2 37366 8000 6 \n", 358 | "151199 192.168.19.1 192.168.23.2 37368 8000 6 \n", 359 | "\n", 360 | " frame.len tcp.flags.syn tcp.flags.reset tcp.flags.push \\\n", 361 | "0 54 0 0 1 \n", 362 | "1 54 0 0 1 \n", 363 | "2 54 0 0 1 \n", 364 | "3 54 0 0 1 \n", 365 | "4 54 0 0 1 \n", 366 | "... ... ... ... ... \n", 367 | "151195 66 0 0 0 \n", 368 | "151196 66 0 0 0 \n", 369 | "151197 66 0 0 0 \n", 370 | "151198 66 0 0 0 \n", 371 | "151199 66 0 0 0 \n", 372 | "\n", 373 | " tcp.flags.ack ... tcp.seq tcp.ack \\\n", 374 | "0 1 ... 1 1 \n", 375 | "1 1 ... 1 1 \n", 376 | "2 1 ... 1 1 \n", 377 | "3 1 ... 1 1 \n", 378 | "4 1 ... 1 1 \n", 379 | "... ... ... ... ... \n", 380 | "151195 1 ... 1 1 \n", 381 | "151196 1 ... 1 1 \n", 382 | "151197 1 ... 1 1 \n", 383 | "151198 1 ... 1 1 \n", 384 | "151199 1 ... 1 1 \n", 385 | "\n", 386 | " frame.time Packets Bytes \\\n", 387 | "0 16-Jun 2020 20:18:15.071112000 Mountain Dayli... 8 432 \n", 388 | "1 16-Jun 2020 20:18:15.071138000 Mountain Dayli... 10 540 \n", 389 | "2 16-Jun 2020 20:18:15.071146000 Mountain Dayli... 12 648 \n", 390 | "3 16-Jun 2020 20:18:15.071152000 Mountain Dayli... 10 540 \n", 391 | "4 16-Jun 2020 20:18:15.071159000 Mountain Dayli... 6 324 \n", 392 | "... ... ... ... \n", 393 | "151195 16-Jun 2020 22:10:46.923006000 Mountain Dayli... 10 1146 \n", 394 | "151196 16-Jun 2020 22:10:46.935672000 Mountain Dayli... 10 1151 \n", 395 | "151197 16-Jun 2020 22:10:46.957469000 Mountain Dayli... 10 1144 \n", 396 | "151198 16-Jun 2020 22:10:46.970971000 Mountain Dayli... 10 1175 \n", 397 | "151199 16-Jun 2020 22:10:46.984798000 Mountain Dayli... 10 1146 \n", 398 | "\n", 399 | " Tx Packets Tx Bytes Rx Packets Rx Bytes Label \n", 400 | "0 4 216 4 216 DDoS-PSH-ACK \n", 401 | "1 5 270 5 270 DDoS-PSH-ACK \n", 402 | "2 6 324 6 324 DDoS-PSH-ACK \n", 403 | "3 5 270 5 270 DDoS-PSH-ACK \n", 404 | "4 3 162 3 162 DDoS-PSH-ACK \n", 405 | "... ... ... ... ... ... \n", 406 | "151195 6 560 4 586 Benign \n", 407 | "151196 6 560 4 591 Benign \n", 408 | "151197 6 560 4 584 Benign \n", 409 | "151198 6 560 4 615 Benign \n", 410 | "151199 6 560 4 586 Benign \n", 411 | "\n", 412 | "[151200 rows x 23 columns]" 413 | ] 414 | }, 415 | "execution_count": 3, 416 | "metadata": {}, 417 | "output_type": "execute_result" 418 | } 419 | ], 420 | "source": [ 421 | "dataset" 422 | ] 423 | }, 424 | { 425 | "cell_type": "code", 426 | "execution_count": 4, 427 | "id": "5920a89c-29e1-41d4-b6e7-03e9b7ddbb29", 428 | "metadata": {}, 429 | "outputs": [ 430 | { 431 | "name": "stdout", 432 | "output_type": "stream", 433 | "text": [ 434 | "(151200, 23)\n" 435 | ] 436 | } 437 | ], 438 | "source": [ 439 | "print(dataset.shape)" 440 | ] 441 | }, 442 | { 443 | "cell_type": "code", 444 | "execution_count": 5, 445 | "id": "22699c59-6340-48c1-84e4-9bc1d35aed49", 446 | "metadata": {}, 447 | "outputs": [ 448 | { 449 | "data": { 450 | "text/plain": [ 451 | "Index(['ip.src', 'ip.dst', 'tcp.srcport', 'tcp.dstport', 'ip.proto',\n", 452 | " 'frame.len', 'tcp.flags.syn', 'tcp.flags.reset', 'tcp.flags.push',\n", 453 | " 'tcp.flags.ack', 'ip.flags.mf', 'ip.flags.df', 'ip.flags.rb', 'tcp.seq',\n", 454 | " 'tcp.ack', 'frame.time', 'Packets', 'Bytes', 'Tx Packets', 'Tx Bytes',\n", 455 | " 'Rx Packets', 'Rx Bytes', 'Label'],\n", 456 | " dtype='object')" 457 | ] 458 | }, 459 | "execution_count": 5, 460 | "metadata": {}, 461 | "output_type": "execute_result" 462 | } 463 | ], 464 | "source": [ 465 | "dataset.columns" 466 | ] 467 | }, 468 | { 469 | "cell_type": "code", 470 | "execution_count": 6, 471 | "id": "b1557903-3e07-4ff7-b9a4-37fe80636414", 472 | "metadata": {}, 473 | "outputs": [ 474 | { 475 | "name": "stdout", 476 | "output_type": "stream", 477 | "text": [ 478 | "no such feature\n" 479 | ] 480 | } 481 | ], 482 | "source": [ 483 | "## to capture any nan values in the dataset\n", 484 | "features_nan=[feature for feature in dataset.columns if dataset[feature].isnull().sum()>1 and dataset[feature].dtypes=='O']\n", 485 | "if len(features_nan) !=0:\n", 486 | " for feature in features_nan:\n", 487 | " print(\"{} has: {}% missing values\".format(feature,np.round(dataset[feature].isnull().mean(),4)*100)) \n", 488 | "else :\n", 489 | " print(\"no such feature\")" 490 | ] 491 | }, 492 | { 493 | "cell_type": "code", 494 | "execution_count": 7, 495 | "id": "8f305fc9-ab1d-4154-9173-c0c4124d624b", 496 | "metadata": {}, 497 | "outputs": [ 498 | { 499 | "name": "stdout", 500 | "output_type": "stream", 501 | "text": [ 502 | "number of numerical variables 19\n" 503 | ] 504 | } 505 | ], 506 | "source": [ 507 | "numerical_features=[feature for feature in dataset.columns if dataset[feature].dtypes!='O']\n", 508 | "print(\"number of numerical variables \",len(numerical_features))" 509 | ] 510 | }, 511 | { 512 | "cell_type": "code", 513 | "execution_count": 8, 514 | "id": "f7978539-814f-4f35-b2a1-57d55f33f31f", 515 | "metadata": {}, 516 | "outputs": [ 517 | { 518 | "data": { 519 | "text/html": [ 520 | "
\n", 521 | "\n", 534 | "\n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | "
tcp.srcporttcp.dstportip.protoframe.lentcp.flags.syntcp.flags.resettcp.flags.pushtcp.flags.ackip.flags.mfip.flags.dfip.flags.rbtcp.seqtcp.ackPacketsBytesTx PacketsTx BytesRx PacketsRx Bytes
024128000654001100011843242164216
1241380006540011000111054052705270
2241480006540011000111264863246324
3241580006540011000111054052705270
424168000654001100011632431623162
\n", 672 | "
" 673 | ], 674 | "text/plain": [ 675 | " tcp.srcport tcp.dstport ip.proto frame.len tcp.flags.syn \\\n", 676 | "0 2412 8000 6 54 0 \n", 677 | "1 2413 8000 6 54 0 \n", 678 | "2 2414 8000 6 54 0 \n", 679 | "3 2415 8000 6 54 0 \n", 680 | "4 2416 8000 6 54 0 \n", 681 | "\n", 682 | " tcp.flags.reset tcp.flags.push tcp.flags.ack ip.flags.mf ip.flags.df \\\n", 683 | "0 0 1 1 0 0 \n", 684 | "1 0 1 1 0 0 \n", 685 | "2 0 1 1 0 0 \n", 686 | "3 0 1 1 0 0 \n", 687 | "4 0 1 1 0 0 \n", 688 | "\n", 689 | " ip.flags.rb tcp.seq tcp.ack Packets Bytes Tx Packets Tx Bytes \\\n", 690 | "0 0 1 1 8 432 4 216 \n", 691 | "1 0 1 1 10 540 5 270 \n", 692 | "2 0 1 1 12 648 6 324 \n", 693 | "3 0 1 1 10 540 5 270 \n", 694 | "4 0 1 1 6 324 3 162 \n", 695 | "\n", 696 | " Rx Packets Rx Bytes \n", 697 | "0 4 216 \n", 698 | "1 5 270 \n", 699 | "2 6 324 \n", 700 | "3 5 270 \n", 701 | "4 3 162 " 702 | ] 703 | }, 704 | "execution_count": 8, 705 | "metadata": {}, 706 | "output_type": "execute_result" 707 | } 708 | ], 709 | "source": [ 710 | "dataset[numerical_features].head()" 711 | ] 712 | }, 713 | { 714 | "cell_type": "code", 715 | "execution_count": 9, 716 | "id": "19d74934-031d-4482-a9e1-a13fdad3c74c", 717 | "metadata": {}, 718 | "outputs": [], 719 | "source": [ 720 | "#values of some features has same value throughout the dataset and does not affect labels,so dropping them\n", 721 | "dataset=dataset.drop(columns=[\"tcp.dstport\",\"ip.proto\",\"tcp.flags.syn\",\"tcp.flags.reset\",\"tcp.flags.ack\",\"ip.flags.mf\",\"ip.flags.rb\",\"tcp.seq\",\"tcp.ack\",\"frame.time\"])" 722 | ] 723 | }, 724 | { 725 | "cell_type": "code", 726 | "execution_count": 10, 727 | "id": "acd67db1-c920-4467-a72b-bc5bf2136f32", 728 | "metadata": {}, 729 | "outputs": [ 730 | { 731 | "data": { 732 | "text/plain": [ 733 | "Index(['ip.src', 'ip.dst', 'tcp.srcport', 'frame.len', 'tcp.flags.push',\n", 734 | " 'ip.flags.df', 'Packets', 'Bytes', 'Tx Packets', 'Tx Bytes',\n", 735 | " 'Rx Packets', 'Rx Bytes', 'Label'],\n", 736 | " dtype='object')" 737 | ] 738 | }, 739 | "execution_count": 10, 740 | "metadata": {}, 741 | "output_type": "execute_result" 742 | } 743 | ], 744 | "source": [ 745 | "dataset.columns" 746 | ] 747 | }, 748 | { 749 | "cell_type": "code", 750 | "execution_count": 11, 751 | "id": "08502a70-3bca-48fb-a126-fecc37418cce", 752 | "metadata": {}, 753 | "outputs": [ 754 | { 755 | "data": { 756 | "text/html": [ 757 | "
\n", 758 | "\n", 771 | "\n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | "
ip.srcip.dsttcp.srcportframe.lentcp.flags.puship.flags.dfPacketsBytesTx PacketsTx BytesRx PacketsRx BytesLabel
151195192.168.19.1192.168.23.237360660110114665604586Benign
151196192.168.19.1192.168.23.237362660110115165604591Benign
151197192.168.19.1192.168.23.237364660110114465604584Benign
151198192.168.19.1192.168.23.237366660110117565604615Benign
151199192.168.19.1192.168.23.237368660110114665604586Benign
\n", 873 | "
" 874 | ], 875 | "text/plain": [ 876 | " ip.src ip.dst tcp.srcport frame.len tcp.flags.push \\\n", 877 | "151195 192.168.19.1 192.168.23.2 37360 66 0 \n", 878 | "151196 192.168.19.1 192.168.23.2 37362 66 0 \n", 879 | "151197 192.168.19.1 192.168.23.2 37364 66 0 \n", 880 | "151198 192.168.19.1 192.168.23.2 37366 66 0 \n", 881 | "151199 192.168.19.1 192.168.23.2 37368 66 0 \n", 882 | "\n", 883 | " ip.flags.df Packets Bytes Tx Packets Tx Bytes Rx Packets \\\n", 884 | "151195 1 10 1146 6 560 4 \n", 885 | "151196 1 10 1151 6 560 4 \n", 886 | "151197 1 10 1144 6 560 4 \n", 887 | "151198 1 10 1175 6 560 4 \n", 888 | "151199 1 10 1146 6 560 4 \n", 889 | "\n", 890 | " Rx Bytes Label \n", 891 | "151195 586 Benign \n", 892 | "151196 591 Benign \n", 893 | "151197 584 Benign \n", 894 | "151198 615 Benign \n", 895 | "151199 586 Benign " 896 | ] 897 | }, 898 | "execution_count": 11, 899 | "metadata": {}, 900 | "output_type": "execute_result" 901 | } 902 | ], 903 | "source": [ 904 | "dataset.tail()" 905 | ] 906 | }, 907 | { 908 | "cell_type": "code", 909 | "execution_count": 12, 910 | "id": "bc4511e2-190a-4278-9c5f-03bbc05c9534", 911 | "metadata": {}, 912 | "outputs": [], 913 | "source": [ 914 | "label_dummy=pd.get_dummies(dataset['Label'])" 915 | ] 916 | }, 917 | { 918 | "cell_type": "code", 919 | "execution_count": 13, 920 | "id": "a083974b-dec4-41ec-bfdf-8397de60d302", 921 | "metadata": {}, 922 | "outputs": [], 923 | "source": [ 924 | "dataset=pd.concat([dataset,label_dummy], axis=1)" 925 | ] 926 | }, 927 | { 928 | "cell_type": "code", 929 | "execution_count": 14, 930 | "id": "43fc72eb-f75f-4061-b21d-d7f3de39fdc9", 931 | "metadata": {}, 932 | "outputs": [], 933 | "source": [ 934 | "from sklearn.preprocessing import LabelEncoder" 935 | ] 936 | }, 937 | { 938 | "cell_type": "code", 939 | "execution_count": 15, 940 | "id": "f59d68b7-dca5-4c8d-99a0-f37716840837", 941 | "metadata": {}, 942 | "outputs": [], 943 | "source": [ 944 | "le=LabelEncoder()" 945 | ] 946 | }, 947 | { 948 | "cell_type": "code", 949 | "execution_count": 16, 950 | "id": "f4bad7d1-a5e8-4b8f-b9e9-6969592e5dec", 951 | "metadata": {}, 952 | "outputs": [], 953 | "source": [ 954 | "dataset['DDoS-PSH-ACK']=le.fit_transform(dataset['DDoS-PSH-ACK'])\n", 955 | "dataset['Benign']=le.fit_transform(dataset['Benign'])\n", 956 | "dataset['DDoS-ACK']=le.fit_transform(dataset['DDoS-ACK'])" 957 | ] 958 | }, 959 | { 960 | "cell_type": "code", 961 | "execution_count": 17, 962 | "id": "2639d707-f0dc-4e20-86fc-eb76c5819068", 963 | "metadata": {}, 964 | "outputs": [ 965 | { 966 | "data": { 967 | "text/html": [ 968 | "
\n", 969 | "\n", 982 | "\n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | "
ip.srcip.dsttcp.srcportframe.lentcp.flags.puship.flags.dfPacketsBytesTx PacketsTx BytesRx PacketsRx BytesLabelBenignDDoS-ACKDDoS-PSH-ACK
151195192.168.19.1192.168.23.237360660110114665604586Benign100
151196192.168.19.1192.168.23.237362660110115165604591Benign100
151197192.168.19.1192.168.23.237364660110114465604584Benign100
151198192.168.19.1192.168.23.237366660110117565604615Benign100
151199192.168.19.1192.168.23.237368660110114665604586Benign100
\n", 1102 | "
" 1103 | ], 1104 | "text/plain": [ 1105 | " ip.src ip.dst tcp.srcport frame.len tcp.flags.push \\\n", 1106 | "151195 192.168.19.1 192.168.23.2 37360 66 0 \n", 1107 | "151196 192.168.19.1 192.168.23.2 37362 66 0 \n", 1108 | "151197 192.168.19.1 192.168.23.2 37364 66 0 \n", 1109 | "151198 192.168.19.1 192.168.23.2 37366 66 0 \n", 1110 | "151199 192.168.19.1 192.168.23.2 37368 66 0 \n", 1111 | "\n", 1112 | " ip.flags.df Packets Bytes Tx Packets Tx Bytes Rx Packets \\\n", 1113 | "151195 1 10 1146 6 560 4 \n", 1114 | "151196 1 10 1151 6 560 4 \n", 1115 | "151197 1 10 1144 6 560 4 \n", 1116 | "151198 1 10 1175 6 560 4 \n", 1117 | "151199 1 10 1146 6 560 4 \n", 1118 | "\n", 1119 | " Rx Bytes Label Benign DDoS-ACK DDoS-PSH-ACK \n", 1120 | "151195 586 Benign 1 0 0 \n", 1121 | "151196 591 Benign 1 0 0 \n", 1122 | "151197 584 Benign 1 0 0 \n", 1123 | "151198 615 Benign 1 0 0 \n", 1124 | "151199 586 Benign 1 0 0 " 1125 | ] 1126 | }, 1127 | "execution_count": 17, 1128 | "metadata": {}, 1129 | "output_type": "execute_result" 1130 | } 1131 | ], 1132 | "source": [ 1133 | "dataset.tail()" 1134 | ] 1135 | }, 1136 | { 1137 | "cell_type": "code", 1138 | "execution_count": 18, 1139 | "id": "476778b6-7ef6-4863-84ab-11b37db80364", 1140 | "metadata": {}, 1141 | "outputs": [], 1142 | "source": [ 1143 | "feature_scale=[feature for feature in dataset.columns if feature not in ['ip.src','ip.dst','Benign','DDoS-ACK','DDoS-PSH-ACK','Label']]\n" 1144 | ] 1145 | }, 1146 | { 1147 | "cell_type": "code", 1148 | "execution_count": 19, 1149 | "id": "8a9976ce-dcc5-4b5c-a666-be845acede1c", 1150 | "metadata": {}, 1151 | "outputs": [], 1152 | "source": [ 1153 | "from sklearn.preprocessing import StandardScaler" 1154 | ] 1155 | }, 1156 | { 1157 | "cell_type": "code", 1158 | "execution_count": 20, 1159 | "id": "82196ac7-1e64-4ad3-abd2-1f2f1d79d6d6", 1160 | "metadata": {}, 1161 | "outputs": [], 1162 | "source": [ 1163 | "scaler=StandardScaler()" 1164 | ] 1165 | }, 1166 | { 1167 | "cell_type": "code", 1168 | "execution_count": 21, 1169 | "id": "263f317f-5c60-4871-a596-c8ec3fbdc6c3", 1170 | "metadata": {}, 1171 | "outputs": [ 1172 | { 1173 | "data": { 1174 | "text/html": [ 1175 | "
StandardScaler()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" 1176 | ], 1177 | "text/plain": [ 1178 | "StandardScaler()" 1179 | ] 1180 | }, 1181 | "execution_count": 21, 1182 | "metadata": {}, 1183 | "output_type": "execute_result" 1184 | } 1185 | ], 1186 | "source": [ 1187 | "scaler.fit(dataset[feature_scale])" 1188 | ] 1189 | }, 1190 | { 1191 | "cell_type": "code", 1192 | "execution_count": 22, 1193 | "id": "5ec20821-66ad-4027-bdea-59108dba542c", 1194 | "metadata": {}, 1195 | "outputs": [ 1196 | { 1197 | "data": { 1198 | "text/plain": [ 1199 | "array([[-1.27146315, -0.63214064, 1. , ..., -0.98567572,\n", 1200 | " -0.03518717, -0.97784837],\n", 1201 | " [-1.27141222, -0.63214064, 1. , ..., -0.68097412,\n", 1202 | " 1.00312277, -0.70388293],\n", 1203 | " [-1.27136129, -0.63214064, 1. , ..., -0.37627252,\n", 1204 | " 2.0414327 , -0.4299175 ],\n", 1205 | " ...,\n", 1206 | " [ 0.50864024, -0.46366387, -1. , ..., 0.95538634,\n", 1207 | " -0.03518717, 0.88917535],\n", 1208 | " [ 0.5087421 , -0.46366387, -1. , ..., 0.95538634,\n", 1209 | " -0.03518717, 1.0464518 ],\n", 1210 | " [ 0.50884396, -0.46366387, -1. , ..., 0.95538634,\n", 1211 | " -0.03518717, 0.89932222]])" 1212 | ] 1213 | }, 1214 | "execution_count": 22, 1215 | "metadata": {}, 1216 | "output_type": "execute_result" 1217 | } 1218 | ], 1219 | "source": [ 1220 | "scaler.transform(dataset[feature_scale])" 1221 | ] 1222 | }, 1223 | { 1224 | "cell_type": "code", 1225 | "execution_count": 23, 1226 | "id": "27703530-3c60-4bcc-8900-6acf1ac325fb", 1227 | "metadata": {}, 1228 | "outputs": [ 1229 | { 1230 | "data": { 1231 | "text/html": [ 1232 | "
\n", 1233 | "\n", 1246 | "\n", 1247 | " \n", 1248 | " \n", 1249 | " \n", 1250 | " \n", 1251 | " \n", 1252 | " \n", 1253 | " \n", 1254 | " \n", 1255 | " \n", 1256 | " \n", 1257 | " \n", 1258 | " \n", 1259 | " \n", 1260 | " \n", 1261 | " \n", 1262 | " \n", 1263 | " \n", 1264 | " \n", 1265 | " \n", 1266 | " \n", 1267 | " \n", 1268 | " \n", 1269 | " \n", 1270 | " \n", 1271 | " \n", 1272 | " \n", 1273 | " \n", 1274 | " \n", 1275 | " \n", 1276 | " \n", 1277 | " \n", 1278 | " \n", 1279 | " \n", 1280 | " \n", 1281 | " \n", 1282 | " \n", 1283 | " \n", 1284 | " \n", 1285 | " \n", 1286 | " \n", 1287 | " \n", 1288 | " \n", 1289 | " \n", 1290 | " \n", 1291 | " \n", 1292 | " \n", 1293 | " \n", 1294 | " \n", 1295 | " \n", 1296 | " \n", 1297 | " \n", 1298 | " \n", 1299 | " \n", 1300 | " \n", 1301 | " \n", 1302 | " \n", 1303 | " \n", 1304 | " \n", 1305 | " \n", 1306 | " \n", 1307 | " \n", 1308 | " \n", 1309 | " \n", 1310 | " \n", 1311 | " \n", 1312 | " \n", 1313 | " \n", 1314 | " \n", 1315 | " \n", 1316 | " \n", 1317 | " \n", 1318 | " \n", 1319 | " \n", 1320 | " \n", 1321 | " \n", 1322 | " \n", 1323 | " \n", 1324 | " \n", 1325 | " \n", 1326 | " \n", 1327 | " \n", 1328 | " \n", 1329 | " \n", 1330 | " \n", 1331 | " \n", 1332 | " \n", 1333 | " \n", 1334 | " \n", 1335 | " \n", 1336 | " \n", 1337 | " \n", 1338 | " \n", 1339 | " \n", 1340 | " \n", 1341 | " \n", 1342 | " \n", 1343 | " \n", 1344 | " \n", 1345 | " \n", 1346 | " \n", 1347 | " \n", 1348 | " \n", 1349 | " \n", 1350 | " \n", 1351 | " \n", 1352 | " \n", 1353 | " \n", 1354 | " \n", 1355 | " \n", 1356 | " \n", 1357 | " \n", 1358 | " \n", 1359 | " \n", 1360 | " \n", 1361 | " \n", 1362 | " \n", 1363 | " \n", 1364 | " \n", 1365 | "
ip.srcip.dsttcp.srcportframe.lentcp.flags.puship.flags.dfPacketsBytesTx PacketsTx BytesRx PacketsRx BytesLabelBenignDDoS-ACKDDoS-PSH-ACK
0192.168.1.1192.168.23.224125410843242164216DDoS-PSH-ACK001
1192.168.1.1192.168.23.2241354101054052705270DDoS-PSH-ACK001
2192.168.1.1192.168.23.2241454101264863246324DDoS-PSH-ACK001
3192.168.1.1192.168.23.2241554101054052705270DDoS-PSH-ACK001
4192.168.1.1192.168.23.224165410632431623162DDoS-PSH-ACK001
\n", 1366 | "
" 1367 | ], 1368 | "text/plain": [ 1369 | " ip.src ip.dst tcp.srcport frame.len tcp.flags.push \\\n", 1370 | "0 192.168.1.1 192.168.23.2 2412 54 1 \n", 1371 | "1 192.168.1.1 192.168.23.2 2413 54 1 \n", 1372 | "2 192.168.1.1 192.168.23.2 2414 54 1 \n", 1373 | "3 192.168.1.1 192.168.23.2 2415 54 1 \n", 1374 | "4 192.168.1.1 192.168.23.2 2416 54 1 \n", 1375 | "\n", 1376 | " ip.flags.df Packets Bytes Tx Packets Tx Bytes Rx Packets Rx Bytes \\\n", 1377 | "0 0 8 432 4 216 4 216 \n", 1378 | "1 0 10 540 5 270 5 270 \n", 1379 | "2 0 12 648 6 324 6 324 \n", 1380 | "3 0 10 540 5 270 5 270 \n", 1381 | "4 0 6 324 3 162 3 162 \n", 1382 | "\n", 1383 | " Label Benign DDoS-ACK DDoS-PSH-ACK \n", 1384 | "0 DDoS-PSH-ACK 0 0 1 \n", 1385 | "1 DDoS-PSH-ACK 0 0 1 \n", 1386 | "2 DDoS-PSH-ACK 0 0 1 \n", 1387 | "3 DDoS-PSH-ACK 0 0 1 \n", 1388 | "4 DDoS-PSH-ACK 0 0 1 " 1389 | ] 1390 | }, 1391 | "execution_count": 23, 1392 | "metadata": {}, 1393 | "output_type": "execute_result" 1394 | } 1395 | ], 1396 | "source": [ 1397 | "dataset.head()" 1398 | ] 1399 | }, 1400 | { 1401 | "cell_type": "code", 1402 | "execution_count": 24, 1403 | "id": "2163dd06-2fc7-4a99-b215-9fc42237f680", 1404 | "metadata": {}, 1405 | "outputs": [], 1406 | "source": [ 1407 | "dataset=pd.concat([dataset[['ip.src','ip.dst','Benign','DDoS-ACK','DDoS-PSH-ACK','Label']].reset_index(drop=True),pd.DataFrame(scaler.transform(dataset[feature_scale]),columns=feature_scale)],\n", 1408 | " axis=1)" 1409 | ] 1410 | }, 1411 | { 1412 | "cell_type": "code", 1413 | "execution_count": 25, 1414 | "id": "9c520b85-0bed-4e32-8d74-88b2b9d069a4", 1415 | "metadata": {}, 1416 | "outputs": [ 1417 | { 1418 | "data": { 1419 | "text/html": [ 1420 | "
\n", 1421 | "\n", 1434 | "\n", 1435 | " \n", 1436 | " \n", 1437 | " \n", 1438 | " \n", 1439 | " \n", 1440 | " \n", 1441 | " \n", 1442 | " \n", 1443 | " \n", 1444 | " \n", 1445 | " \n", 1446 | " \n", 1447 | " \n", 1448 | " \n", 1449 | " \n", 1450 | " \n", 1451 | " \n", 1452 | " \n", 1453 | " \n", 1454 | " \n", 1455 | " \n", 1456 | " \n", 1457 | " \n", 1458 | " \n", 1459 | " \n", 1460 | " \n", 1461 | " \n", 1462 | " \n", 1463 | " \n", 1464 | " \n", 1465 | " \n", 1466 | " \n", 1467 | " \n", 1468 | " \n", 1469 | " \n", 1470 | " \n", 1471 | " \n", 1472 | " \n", 1473 | " \n", 1474 | " \n", 1475 | " \n", 1476 | " \n", 1477 | " \n", 1478 | " \n", 1479 | " \n", 1480 | " \n", 1481 | " \n", 1482 | " \n", 1483 | " \n", 1484 | " \n", 1485 | " \n", 1486 | " \n", 1487 | " \n", 1488 | " \n", 1489 | " \n", 1490 | " \n", 1491 | " \n", 1492 | " \n", 1493 | " \n", 1494 | " \n", 1495 | " \n", 1496 | " \n", 1497 | " \n", 1498 | " \n", 1499 | " \n", 1500 | " \n", 1501 | " \n", 1502 | " \n", 1503 | " \n", 1504 | " \n", 1505 | " \n", 1506 | " \n", 1507 | " \n", 1508 | " \n", 1509 | " \n", 1510 | " \n", 1511 | " \n", 1512 | " \n", 1513 | " \n", 1514 | " \n", 1515 | " \n", 1516 | " \n", 1517 | " \n", 1518 | " \n", 1519 | " \n", 1520 | " \n", 1521 | " \n", 1522 | " \n", 1523 | " \n", 1524 | " \n", 1525 | " \n", 1526 | " \n", 1527 | " \n", 1528 | " \n", 1529 | " \n", 1530 | " \n", 1531 | " \n", 1532 | " \n", 1533 | " \n", 1534 | " \n", 1535 | " \n", 1536 | " \n", 1537 | " \n", 1538 | " \n", 1539 | " \n", 1540 | " \n", 1541 | " \n", 1542 | " \n", 1543 | " \n", 1544 | " \n", 1545 | " \n", 1546 | " \n", 1547 | " \n", 1548 | " \n", 1549 | " \n", 1550 | " \n", 1551 | " \n", 1552 | " \n", 1553 | "
ip.srcip.dstBenignDDoS-ACKDDoS-PSH-ACKLabeltcp.srcportframe.lentcp.flags.puship.flags.dfPacketsBytesTx PacketsTx BytesRx PacketsRx Bytes
0192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271463-0.6321411.0-1.0-0.508386-0.983051-0.774686-0.985676-0.035187-0.977848
1192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271412-0.6321411.0-1.00.430752-0.694094-0.036029-0.6809741.003123-0.703883
2192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271361-0.6321411.0-1.01.369890-0.4051370.702627-0.3762732.041433-0.429917
3192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271310-0.6321411.0-1.00.430752-0.694094-0.036029-0.6809741.003123-0.703883
4192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271259-0.6321411.0-1.0-1.447524-1.272008-1.513342-1.290377-1.073497-1.251814
\n", 1554 | "
" 1555 | ], 1556 | "text/plain": [ 1557 | " ip.src ip.dst Benign DDoS-ACK DDoS-PSH-ACK Label \\\n", 1558 | "0 192.168.1.1 192.168.23.2 0 0 1 DDoS-PSH-ACK \n", 1559 | "1 192.168.1.1 192.168.23.2 0 0 1 DDoS-PSH-ACK \n", 1560 | "2 192.168.1.1 192.168.23.2 0 0 1 DDoS-PSH-ACK \n", 1561 | "3 192.168.1.1 192.168.23.2 0 0 1 DDoS-PSH-ACK \n", 1562 | "4 192.168.1.1 192.168.23.2 0 0 1 DDoS-PSH-ACK \n", 1563 | "\n", 1564 | " tcp.srcport frame.len tcp.flags.push ip.flags.df Packets Bytes \\\n", 1565 | "0 -1.271463 -0.632141 1.0 -1.0 -0.508386 -0.983051 \n", 1566 | "1 -1.271412 -0.632141 1.0 -1.0 0.430752 -0.694094 \n", 1567 | "2 -1.271361 -0.632141 1.0 -1.0 1.369890 -0.405137 \n", 1568 | "3 -1.271310 -0.632141 1.0 -1.0 0.430752 -0.694094 \n", 1569 | "4 -1.271259 -0.632141 1.0 -1.0 -1.447524 -1.272008 \n", 1570 | "\n", 1571 | " Tx Packets Tx Bytes Rx Packets Rx Bytes \n", 1572 | "0 -0.774686 -0.985676 -0.035187 -0.977848 \n", 1573 | "1 -0.036029 -0.680974 1.003123 -0.703883 \n", 1574 | "2 0.702627 -0.376273 2.041433 -0.429917 \n", 1575 | "3 -0.036029 -0.680974 1.003123 -0.703883 \n", 1576 | "4 -1.513342 -1.290377 -1.073497 -1.251814 " 1577 | ] 1578 | }, 1579 | "execution_count": 25, 1580 | "metadata": {}, 1581 | "output_type": "execute_result" 1582 | } 1583 | ], 1584 | "source": [ 1585 | "dataset.head()" 1586 | ] 1587 | }, 1588 | { 1589 | "cell_type": "code", 1590 | "execution_count": 26, 1591 | "id": "6c4d5c3c-b07c-4dcd-9b6e-abdbdec18317", 1592 | "metadata": {}, 1593 | "outputs": [], 1594 | "source": [ 1595 | "from sklearn.model_selection import train_test_split\n", 1596 | "rest_data, sampled_data = train_test_split(dataset, test_size=0.005, stratify=dataset['Label'], random_state=42)" 1597 | ] 1598 | }, 1599 | { 1600 | "cell_type": "code", 1601 | "execution_count": 27, 1602 | "id": "a33a78d0-8f56-42a8-8042-c064023f8fb5", 1603 | "metadata": {}, 1604 | "outputs": [ 1605 | { 1606 | "data": { 1607 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr4AAAIjCAYAAADlfxjoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJiUlEQVR4nO3dd3gUVf///9cGyCYhjRISSgj1pnfpCEGCoQqIBRQpAn6VIghKsSEo5iOIoN4oKB1siBRFQZAkSFdKUBFQkCYQUEpCQAIk5/eHv+zNkkICm8Y8H9e118XMnJl5z2Z28+Lk7FmbMcYIAAAAuMO55XYBAAAAQE4g+AIAAMASCL4AAACwBIIvAAAALIHgCwAAAEsg+AIAAMASCL4AAACwBIIvAAAALIHgCwAAAEsg+AK55JVXXpHNZsuRc4WGhio0NNSxHB0dLZvNpiVLluTI+fv27aty5crlyLluVUJCggYMGKCgoCDZbDYNHz483bbXrl3TqFGjFBwcLDc3N3Xt2jXH6sxOKfdFdHR0bpdyUzabTUOGDMntMiwlO9435s2bJ5vNpsOHD7vsmEBGCL6AC6S8eac8PDw8VKpUKYWHh+udd97RhQsXXHKeEydO6JVXXlFMTIxLjudKebm2zHj99dc1b948PfXUU1q4cKEee+yxdNvOmTNHkydP1gMPPKD58+frmWeeycFKrWPz5s165ZVXdP78+dwuJd9K+Q/233//ndulAHlCwdwuALiTTJgwQeXLl9fVq1cVGxur6OhoDR8+XG+99Za+/PJL1a5d29H2xRdf1JgxY7J0/BMnTmj8+PEqV66c6tatm+n91qxZk6Xz3IqMavvwww+VnJyc7TXcjsjISDVp0kTjxo3LVNvSpUtr6tSpOVCZdW3evFnjx49X37595e/vn9vlALgDEHwBF2rfvr3uuusux/LYsWMVGRmpTp066b777tPevXvl6ekpSSpYsKAKFszel+ClS5fk5eUld3f3bD3PzRQqVChXz58Zp0+fVvXq1TPdNjNB7Nq1a0pOTs715x85Kzk5WVeuXJGHh0dulwLgBgx1ALLZPffco5deeklHjhzRokWLHOvTGuO7du1atWjRQv7+/vL29laVKlX0/PPPS/p3fF3Dhg0lSf369XMMq5g3b56kf8fx1qxZUzt27FDLli3l5eXl2PfGMb4pkpKS9PzzzysoKEiFCxfWfffdp2PHjjm1KVeunPr27Ztq3+uPebPa0hrje/HiRY0cOVLBwcGy2+2qUqWK3nzzTRljnNqljOVcvny5atasKbvdrho1amj16tVpP+E3OH36tPr376/AwEB5eHioTp06mj9/vmN7yrjFQ4cO6euvv3bUntaYw8OHD8tmsykqKkp79uxxtI2OjnZse/PNNzVt2jRVrFhRdrtdv/76q65cuaKXX35ZDRo0kJ+fnwoXLqy7775bUVFRaR7/zTff1PTp01WhQgV5eXnp3nvv1bFjx2SM0auvvqoyZcrI09NTXbp00dmzZ1PVuWrVKt19990qXLiwfHx81LFjR+3ZsydTz1datm3bpnbt2snPz09eXl5q1aqVNm3a5NQm5X4+cOCAo4fWz89P/fr106VLl5za/vPPP3r66adVvHhx+fj46L777tPx48dls9n0yiuvOI733HPPSZLKly+f7s/lVu6LzP48pH9D7Ntvv61atWrJw8NDAQEBateunbZv3+5ok3KPfvTRR6pRo4bsdrujjl27dql9+/by9fWVt7e32rRpo61btzqd4+rVqxo/frwqV64sDw8PFStWTC1atNDatWsdbWJjY9WvXz+VKVNGdrtdJUuWVJcuXVwyNvbs2bN69tlnVatWLXl7e8vX11ft27fX7t2702yfmfcNKXP3TVq2b9+u8PBwFS9eXJ6enipfvrwef/zx275OQKLHF8gRjz32mJ5//nmtWbNGAwcOTLPNnj171KlTJ9WuXVsTJkyQ3W7XgQMHHL8oqlWrpgkTJujll1/WE088obvvvluS1KxZM8cxzpw5o/bt26tHjx7q1auXAgMDM6xr4sSJstlsGj16tE6fPq1p06YpLCxMMTExjp7pzMhMbdczxui+++5TVFSU+vfvr7p16+rbb7/Vc889p+PHj6caQrBx40YtXbpUgwYNko+Pj9555x11795dR48eVbFixdKt659//lFoaKgOHDigIUOGqHz58vr888/Vt29fnT9/XsOGDVO1atW0cOFCPfPMMypTpoxGjhwpSQoICEh1vICAAC1cuFATJ05UQkKCIiIiHNf/zz//SJLmzp2ry5cv64knnpDdblfRokUVHx+vWbNmqWfPnho4cKAuXLig2bNnKzw8XD/88EOqoSEfffSRrly5oqFDh+rs2bOaNGmSHnroId1zzz2Kjo7W6NGjdeDAAb377rt69tlnNWfOHMe+CxcuVJ8+fRQeHq433nhDly5d0vvvv68WLVpo165dWf6QYWRkpNq3b68GDRpo3LhxcnNz09y5c3XPPfdow4YNatSokVP7hx56SOXLl1dERIR27typWbNmqUSJEnrjjTccbfr27avFixfrscceU5MmTbR+/Xp17NjR6Tj333+/fvvtN33yySeaOnWqihcvnurncqv3RVZ+Hv3799e8efPUvn17DRgwQNeuXdOGDRu0detWp7/uREZGavHixRoyZIiKFy+ucuXKac+ePbr77rvl6+urUaNGqVChQpo5c6ZCQ0O1fv16NW7cWNK/IT8iIkIDBgxQo0aNFB8fr+3bt2vnzp1q27atJKl79+7as2ePhg4dqnLlyun06dNau3atjh49etsfHP3jjz+0fPlyPfjggypfvrxOnTqlmTNnqlWrVvr1119VqlQpp/aZed/I6n2T4vTp07r33nsVEBCgMWPGyN/fX4cPH9bSpUtv6xoBBwPgts2dO9dIMj/++GO6bfz8/Ey9evUcy+PGjTPXvwSnTp1qJJm//vor3WP8+OOPRpKZO3duqm2tWrUyksyMGTPS3NaqVSvHclRUlJFkSpcubeLj4x3rFy9ebCSZt99+27EuJCTE9OnT56bHzKi2Pn36mJCQEMfy8uXLjSTz2muvObV74IEHjM1mMwcOHHCsk2Tc3d2d1u3evdtIMu+++26qc11v2rRpRpJZtGiRY92VK1dM06ZNjbe3t9O1h4SEmI4dO2Z4vBStWrUyNWrUcFp36NAhI8n4+vqa06dPO227du2aSUxMdFp37tw5ExgYaB5//PFUxwgICDDnz593rB87dqyRZOrUqWOuXr3qWN+zZ0/j7u5uLl++bIwx5sKFC8bf398MHDjQ6VyxsbHGz88v1fobpdwXUVFRxhhjkpOTTeXKlU14eLhJTk52tLt06ZIpX768adu2rWNdyv18/fUYY0y3bt1MsWLFHMs7duwwkszw4cOd2vXt29dIMuPGjXOsmzx5spFkDh06lKrW27kvMvvziIyMNJLM008/neoY1z8fkoybm5vZs2ePU5uuXbsad3d3c/DgQce6EydOGB8fH9OyZUvHujp16mR47507d85IMpMnT87wutKS8nPJ6H3l8uXLJikpyWndoUOHjN1uNxMmTHCsy+z7Rlbum5T3zpSf8bJly276XgrcDoY6ADnE29s7w9kdUsaMrlix4pY/CGa329WvX79Mt+/du7d8fHwcyw888IBKliypb7755pbOn1nffPONChQooKefftpp/ciRI2WM0apVq5zWh4WFqWLFio7l2rVry9fXV3/88cdNzxMUFKSePXs61hUqVEhPP/20EhIStH79ehdcjbPu3bun6i0uUKCAY5xvcnKyzp49q2vXrumuu+7Szp07Ux3jwQcflJ+fn2M5pWewV69eTuPCGzdurCtXruj48eOS/h0qc/78efXs2VN///2341GgQAE1btw4zT/lZyQmJka///67HnnkEZ05c8ZxvIsXL6pNmzb6/vvvU92rTz75pNPy3XffrTNnzig+Pl6SHEMABg0a5NRu6NChWapNuvX7IrM/jy+++EI2my3NDzzeOEypVatWTmPEk5KStGbNGnXt2lUVKlRwrC9ZsqQeeeQRbdy40fGc+Pv7a8+ePfr999/TrNfT01Pu7u6Kjo7WuXPnMry2W2G32+Xm5uao+8yZM46hVmndnzd737iV+yZFyvvgypUrdfXqVRdfKcAYXyDHJCQkOP2yuNHDDz+s5s2ba8CAAQoMDFSPHj20ePHiLIXg0qVLZ+mDVJUrV3ZattlsqlSpUrbPqXnkyBGVKlUq1fNRrVo1x/brlS1bNtUxihQpctMQcOTIEVWuXNnxS/1m53GF8uXLp7l+/vz5ql27tmMMZ0BAgL7++mvFxcWlanvj9aaE4ODg4DTXpzwPKcHpnnvuUUBAgNNjzZo1On36dJauJeV4ffr0SXW8WbNmKTExMVX9N9ZepEgRpxqPHDkiNze3VM9TpUqVslRbWudKOV9mwmFmfh4HDx5UqVKlVLRo0Zse78br+euvv3Tp0iVVqVIlVdtq1aopOTnZMS52woQJOn/+vP7zn/+oVq1aeu655/TTTz852tvtdr3xxhtatWqVAgMD1bJlS02aNEmxsbE3rSszkpOTNXXqVFWuXFl2u13FixdXQECAfvrppzTvz5u9b9zKfZOiVatW6t69u8aPH6/ixYurS5cumjt3rhITE11yrQBjfIEc8OeffyouLi7DX+6enp76/vvvFRUVpa+//lqrV6/WZ599pnvuuUdr1qxRgQIFbnqerIzLzaz0vmQjKSkpUzW5QnrnMTd8EC4vSOtnsGjRIvXt21ddu3bVc889pxIlSqhAgQKKiIjQwYMHU7VP73pv9jyk/Cdp4cKFCgoKStUuq7OIpBxv8uTJ6U6f5+3tnaUaXelWz5XVn0dm3M5rr2XLljp48KBWrFihNWvWaNasWZo6dapmzJihAQMGSJKGDx+uzp07a/ny5fr222/10ksvKSIiQpGRkapXr94tn1v6dw7rl156SY8//rheffVVFS1aVG5ubho+fPgt/fXpVu6bFClfkLF161Z99dVX+vbbb/X4449rypQp2rp1a7r7AZlF8AVywMKFCyVJ4eHhGbZzc3NTmzZt1KZNG7311lt6/fXX9cILLygqKkphYWEu/6a3G/+0aozRgQMHnOYbLlKkSJpfIHDkyBGnP+FmpbaQkBB99913unDhglOv7759+xzbXSEkJEQ//fSTkpOTnXp9XX2em1myZIkqVKigpUuXOj1PmZkzOCtS/uxfokQJhYWFuex4vr6+Ljme9O9znpycrEOHDjn1HB44cCBV2+z6ZsPM/jwqVqyob7/9VmfPns1Ur+/1AgIC5OXlpf3796fatm/fPrm5uTn14BctWlT9+vVTv379lJCQoJYtW+qVV15xBN+UekaOHKmRI0fq999/V926dTVlyhSn2WJuxZIlS9S6dWvNnj3baf358+cdHyq83s3eN1xx3zRp0kRNmjTRxIkT9fHHH+vRRx/Vp59+6vR8ALeCoQ5ANouMjNSrr76q8uXL69FHH023XVrTUqX0lqT8ma9w4cKS5LJvslqwYIHTuOMlS5bo5MmTat++vWNdxYoVtXXrVl25csWxbuXKlammL8pKbR06dFBSUpL++9//Oq2fOnWqbDab0/lvR4cOHRQbG6vPPvvMse7atWt699135e3trVatWrnkPDeT0jN5fU/ktm3btGXLFpeeJzw8XL6+vnr99dfTHB/5119/Zel4DRo0UMWKFfXmm28qISHhto+XUqMkvffee07r33333VRtXX2/p8jsz6N79+4yxmj8+PGpjnGzXuUCBQro3nvv1YoVK5yGDp06dUoff/yxWrRoIV9fX0n/zsZyPW9vb1WqVMnxur906ZIuX77s1KZixYry8fFxyRCAAgUKpLqezz//3DF2/EY3e9+4nfvm3LlzqWq58X0QuB30+AIutGrVKu3bt0/Xrl3TqVOnFBkZqbVr1yokJERffvllhhPaT5gwQd9//706duyokJAQ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tmxZjR07VsePH9eCBQskSdOmTVP58uVVo0YNXb58WbNmzVJkZKTWrFmTW5cAAACAXJKvgu/27dvVunVrx3LKWNw+ffpo3rx5OnnypI4ePerYfuXKFY0cOVLHjx+Xl5eXateure+++87pGAAAALAGmzHG5HYReVl8fLz8/PwUFxcnX1/f3C4HAADkoG7duuncuXNpbitSpIiWLVuWwxUhLZnNa5Yb4wsAAABrIvgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACyB4AsAAABLIPgCAADAEgi+AAAAsASCLwAAACwhXwXf77//Xp07d1apUqVks9m0fPnym+4THR2t+vXry263q1KlSpo3b1621wkAAIC8J18F34sXL6pOnTqaPn16ptofOnRIHTt2VOvWrRUTE6Phw4drwIAB+vbbb7O5UgAAAOQ1BXO7gKxo37692rdvn+n2M2bMUPny5TVlyhRJUrVq1bRx40ZNnTpV4eHh2VUmAAAA8qB81eObVVu2bFFYWJjTuvDwcG3ZsiXdfRITExUfH+/0AAAAQP53Rwff2NhYBQYGOq0LDAxUfHy8/vnnnzT3iYiIkJ+fn+MRHBycE6UCAAAgm93RwfdWjB07VnFxcY7HsWPHcrskAAAAuEC+GuObVUFBQTp16pTTulOnTsnX11eenp5p7mO322W323OiPAAAAOSgO7rHt2nTplq3bp3TurVr16pp06a5VBEAAAByS74KvgkJCYqJiVFMTIykf6cri4mJ0dGjRyX9O0yhd+/ejvZPPvmk/vjjD40aNUr79u3Te++9p8WLF+uZZ57JjfIBAACQi/JV8N2+fbvq1aunevXqSZJGjBihevXq6eWXX5YknTx50hGCJal8+fL6+uuvtXbtWtWpU0dTpkzRrFmzmMoMAADAgvLVGN/Q0FAZY9Ldnta3soWGhmrXrl3ZWBUAAADyg3zV4wsAAADcKoIvAAAALIHgCwAAAEsg+AIAAMASCL4AAACwBIIvAAAALCHL05klJSVp3rx5WrdunU6fPq3k5GSn7ZGRkS4rDgAAAHCVLAffYcOGad68eerYsaNq1qwpm82WHXUBAAAALpXl4Pvpp59q8eLF6tChQ3bUAwAAAGSLLI/xdXd3V6VKlbKjFgAAACDbZDn4jhw5Um+//XaGXx0MAAAA5DVZHuqwceNGRUVFadWqVapRo4YKFSrktH3p0qUuKw4AAABwlSwHX39/f3Xr1i07agEAAACyTZaD79y5c7OjDgAAACBb3dIXWFy7dk3fffedZs6cqQsXLkiSTpw4oYSEBJcWBwAAALhKlnt8jxw5onbt2uno0aNKTExU27Zt5ePjozfeeEOJiYmaMWNGdtQJAAAA3JYs9/gOGzZMd911l86dOydPT0/H+m7dumndunUuLQ4AAABwlSz3+G7YsEGbN2+Wu7u70/py5crp+PHjLisMAAAAcKUs9/gmJycrKSkp1fo///xTPj4+LikKAAAAcLUsB997771X06ZNcyzbbDYlJCRo3LhxfI0xAAAA8qwsD3WYMmWKwsPDVb16dV2+fFmPPPKIfv/9dxUvXlyffPJJdtQIAAAA3LYsB98yZcpo9+7d+vTTT/XTTz8pISFB/fv316OPPur0YTcAAAAgL8ly8JWkggULqlevXq6uBQAAAMg2mQq+X375ZaYPeN99991yMQAAAEB2yVTw7dq1a6YOZrPZ0pzxAQAAAMhtmQq+ycnJ2V0HAAAAkK2yPJ0ZAAAAkB+5LPhu375d33//vasOBwAAALjULc3qkJbHHntMv/32G2N8AQAAkCe5LPiuW7dOV69eddXhAAAAAJdyWfAtVaqUqw4FAAAAuNwtjfE9ePCgXnzxRfXs2VOnT5+WJK1atUp79uxxaXEAAACAq2Q5+K5fv161atXStm3btHTpUiUkJEiSdu/erXHjxrm8QAAAAMAVshx8x4wZo9dee01r166Vu7u7Y/0999yjrVu3urQ4AAAAwFWyHHx//vlndevWLdX6EiVK6O+//3ZJUQAAAICrZTn4+vv76+TJk6nW79q1S6VLl3ZJUQAAAICrZTn49ujRQ6NHj1ZsbKxsNpuSk5O1adMmPfvss+rdu3d21AgAAADctiwH39dff11Vq1ZVcHCwEhISVL16dbVs2VLNmjXTiy++mB01AgAAALcty/P4uru768MPP9RLL72kX375RQkJCapXr54qV66cHfUBAAAALnHLX2BRtmxZlS1b1pW1AAAAANkmy8HXGKMlS5YoKipKp0+fVnJystP2pUuXuqw4AAAAwFWyHHyHDx+umTNnqnXr1goMDJTNZsuOugAAAACXynLwXbhwoZYuXaoOHTpkRz0AAABAtsjyrA5+fn6qUKFCdtQCAAAAZJssB99XXnlF48eP1z///JMd9QAAAADZIstDHR566CF98sknKlGihMqVK6dChQo5bd+5c6fLigMAAABcJcvBt0+fPtqxY4d69erFh9sAAACQb2Q5+H799df69ttv1aJFi+yoBwAAAMgWWR7jGxwcLF9f3+yoJVOmT5+ucuXKycPDQ40bN9YPP/yQbtt58+bJZrM5PTw8PHKwWgAAAOQVWQ6+U6ZM0ahRo3T48OFsKCdjn332mUaMGKFx48Zp586dqlOnjsLDw3X69Ol09/H19dXJkycdjyNHjuRgxQAAAMgrsjzUoVevXrp06ZIqVqwoLy+vVB9uO3v2rMuKu9Fbb72lgQMHql+/fpKkGTNm6Ouvv9acOXM0ZsyYNPex2WwKCgrKtpoAAACQP2Q5+E6bNi0byri5K1euaMeOHRo7dqxjnZubm8LCwrRly5Z090tISFBISIiSk5NVv359vf7666pRo0a67RMTE5WYmOhYjo+Pd80FAAAAIFfd0qwOueHvv/9WUlKSAgMDndYHBgZq3759ae5TpUoVzZkzR7Vr11ZcXJzefPNNNWvWTHv27FGZMmXS3CciIkLjx493ef0AAADIXVke43u9y5cvKz4+3umRlzRt2lS9e/dW3bp11apVKy1dulQBAQGaOXNmuvuMHTtWcXFxjsexY8dysGIAAABklyz3+F68eFGjR4/W4sWLdebMmVTbk5KSXFLYjYoXL64CBQro1KlTTutPnTqV6TG8hQoVUr169XTgwIF029jtdtnt9tuqFQAAAHlPlnt8R40apcjISL3//vuy2+2aNWuWxo8fr1KlSmnBggXZUaMkyd3dXQ0aNNC6desc65KTk7Vu3To1bdo0U8dI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28fNijlz5mjUqFGaM2dOqm2HDx9WgwYNFBkZqcmTJ+vnn3/W6tWr1bp1aw0ePDjN4yUlJal///5asGCBoqKiFBoa6tJ6cedIea2ePHlS69atU8GCBdWpUyeXniMgIEBeXl4uPSaymQFuQZ8+fUyXLl1SrV+3bp2RZD788ENjjDEhISFm6tSpqdq9/PLLxs3Nzezbt8+xLjo62jRs2NC4u7uboKAgM3r0aHP16lVjjDHnzp0zkkx0dPQt1du3b18zZswYs2rVKvOf//zHaduxY8eMu7u7GT58eJr7njt3zhhjTFRUlJFkzp07Z3bv3m2CgoLMI4884qgRd778dN9LMsuWLXMsHz9+3EgyM2bMyPRx07uOcePGmTp16ty0hujoaFO6dGlz5coVU6pUKbNp0yan7e3btzelS5c2CQkJqfZNed1dX8fly5dNt27dTHBwsNNzCNwordfqhg0bjCRz+vRpY4wxR48eNQ8++KDx8/MzRYoUMffdd585dOhQqmNMnjzZBAUFmaJFi5pBgwaZK1euONrc+BrZu3evad68ubHb7aZatWpm7dq1Tq/FQ4cOGUnmiy++MKGhocbT09PUrl3bbN68ObueCtyAHl+41D333KM6depo6dKlGbYbNmyYjDFasWKFJOn48ePq0KGDGjZsqN27d+v999/X7Nmz9dprr0mSvL295e3treXLlysxMTFLNV24cEGff/65evXqpbZt2youLk4bNmxwbP/888915coVjRo1Ks39/f39nZY3b96sVq1aqXv37lq0aJEKFiyYpXpw58mL9/2NPD09JUlXrlxx6XEzMnv2bPXs2VOFChVSz549NXv2bMe2s2fPavXq1Ro8eLAKFy6cat8bX3cJCQnq2LGjfv31V23atElVqlTJtrpx50lISNCiRYtUqVIlFStWTFevXlV4eLh8fHy0YcMGbdq0Sd7e3mrXrp2uXLni2C8qKkoHDx5UVFSU5s+fr3nz5mnevHlpniMpKUldu3aVl5eXtm3bpg8++EAvvPBCmm1feOEFPfvss4qJidF//vMf9ezZ0+kvRshGuZ28kT+l1/NljDEPP/ywqVatmjEm/R4jY4wJDAw0Tz31lDHGmOeff95UqVLFJCcnO7ZPnz7deHt7m6SkJGOMMUuWLDFFihQxHh4eplmzZmbs2LFm9+7dN631gw8+MHXr1nUsDxs2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", 1608 | "text/plain": [ 1609 | "
" 1610 | ] 1611 | }, 1612 | "metadata": {}, 1613 | "output_type": "display_data" 1614 | }, 1615 | { 1616 | "data": { 1617 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAArEAAAIjCAYAAAAUdENlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/RUlEQVR4nO3deXhN5/7//9eOyBYZDSElkSBqaItSOmiJiprpoEopUfRocGgNrQ6UQ33RGqo1dDD3tIai0zHV0FZKD1ppq2j1oCHmIQmtILl/f/SX/bElIonEdtfzcV37urruda+13it7L33lzr3WdhhjjAAAAACLeHm6AAAAACCvCLEAAACwDiEWAAAA1iHEAgAAwDqEWAAAAFiHEAsAAADrEGIBAABgHUIsAAAArEOIBQAAgHUIscB17JVXXpHD4bgmx4qOjlZ0dLRref369XI4HFq8ePE1OX5sbKwiIyOvybHy6/Tp0+rZs6dCQ0PlcDg0YMAAT5fkMnv2bDkcDm3ZssXTpaAAZf4bcOzYsQLbpw3XGpAbhFjgGskMGZmvYsWKqVy5cmrWrJneeOMNpaamFshxkpKS9Morr2jbtm0Fsr+CdD3XlhuvvvqqZs+eraefflrz5s3TE088cdm+kZGRbu93mTJldN9992np0qXXsOL8e/XVV7Vs2TJPl2Gl6Oho3XrrrZ4uA/jb8/Z0AcCNZuTIkapYsaLOnz+vQ4cOaf369RowYIAmTJigTz75RDVr1nT1femll/T888/naf9JSUkaMWKEIiMjVbt27Vxvt2rVqjwdJz9yqu2dd95RRkZGoddwNdauXau77rpLw4cPz1X/2rVra+DAgZL+OvcZM2bo4Ycf1rRp09S7d+/CLPWqvfrqq2rfvr0efPBBT5cCANkixALXWIsWLXTHHXe4locOHaq1a9eqdevWatu2rXbs2CFfX19Jkre3t7y9C/cy/eOPP1S8eHH5+PgU6nGupGjRoh49fm4cOXJENWrUyHX/8uXLq0uXLq7lrl27KioqShMnTrzuQ6xtzp49Kx8fH3l58QdG4EbB1Q5cB+6//369/PLL2rdvn+bPn+9qz25O7OrVq3XvvfcqODhY/v7+qlq1ql544QVJf81jrVevniSpe/furj9lz549W9L//Zlz69atatiwoYoXL+7a9tI5sZnS09P1wgsvKDQ0VH5+fmrbtq0SExPd+kRGRio2NjbLthfv80q1ZTdP78yZMxo4cKDCw8PldDpVtWpVvfbaazLGuPVzOBzq27evli1bpltvvVVOp1O33HKLVqxYkf0P/BJHjhxRjx49VLZsWRUrVky1atXSnDlzXOsz5wfv2bNHn3/+uav2vXv35mr/mUJDQ1W9enXt2bNHkvTDDz8oNjZWlSpVUrFixRQaGqonn3xSx48fz7LtgQMH1KNHD5UrV05Op1MVK1bU008/rXPnzl32eCdPnlT9+vUVFhamXbt2SZLS0tI0fPhwRUVFyel0Kjw8XEOGDFFaWpprO4fDoTNnzmjOnDmuc818f1NTUzVgwABFRkbK6XSqTJkyatq0qb777rscz33fvn2Ki4tT1apV5evrq1KlSunRRx/N9md46tQpPfPMM65jhIWFqWvXrq55oZnvx4cffqiXXnpJ5cuXV/HixZWSkiJJWrRokerWrStfX1+VLl1aXbp00YEDB9yOcejQIXXv3l1hYWFyOp266aab1K5dO7d6tmzZombNmql06dLy9fVVxYoV9eSTT+Z4nrmVl/deko4dO6YOHTooMDBQpUqVUv/+/XX27Nks/ebPn+8695IlS6pjx45ZrtfsfPjhh6pbt64CAgIUGBio2267TZMnT77q8wQKEyOxwHXiiSee0AsvvKBVq1apV69e2fbZvn27WrdurZo1a2rkyJFyOp3avXu34uPjJUnVq1fXyJEjNWzYMD311FO67777JEn33HOPax/Hjx9XixYt1LFjR3Xp0kVly5bNsa7Ro0fL4XDoueee05EjRzRp0iTFxMRo27ZtrhHj3MhNbRczxqht27Zat26devToodq1a2vlypUaPHiwDhw4oIkTJ7r137Bhg5YsWaK4uDgFBATojTfe0COPPKLff/9dpUqVumxdf/75p6Kjo7V792717dtXFStW1KJFixQbG6tTp06pf//+ql69uubNm6dnnnlGYWFhrikCISEhuT5/STp//rwSExNd9axevVr/+9//1L17d4WGhmr79u16++23tX37dm3atMn1C0xSUpLq16+vU6dO6amnnlK1atV04MABLV68WH/88Ue2o+jHjh1T06ZNdeLECX355ZeqXLmyMjIy1LZtW23YsEFPPfWUqlevrh9//FETJ07UL7/84poDO2/ePPXs2VP169fXU089JUmqXLmyJKl3795avHix+vbtqxo1auj48ePasGGDduzYoTp16lz23Ddv3qxvvvlGHTt2VFhYmPbu3atp06YpOjpaP//8s4oXLy7pr5vn7rvvPu3YsUNPPvmk6tSpo2PHjumTTz7R/v37Vbp0adc+//Wvf8nHx0eDBg1SWlqafHx8NHv2bHXv3l316tXTmDFjdPjwYU2ePFnx8fH6/vvvFRwcLEl65JFHtH37dvXr10+RkZE6cuSIVq9erd9//921/MADDygkJETPP/+8goODtXfvXi1ZsiRP7/nl5Pa9z9ShQwdFRkZqzJgx2rRpk9544w2dPHlSc+fOdfUZPXq0Xn75ZXXo0EE9e/bU0aNHNWXKFDVs2NDt3LOrpVOnTmrSpInGjh0rSdqxY4fi4+PVv3//AjlfoFAYANfErFmzjCSzefPmy/YJCgoyt99+u2t5+PDh5uLLdOLEiUaSOXr06GX3sXnzZiPJzJo1K8u6Ro0aGUlm+vTp2a5r1KiRa3ndunVGkilfvrxJSUlxtS9cuNBIMpMnT3a1RUREmG7dul1xnznV1q1bNxMREeFaXrZsmZFkRo0a5davffv2xuFwmN27d7vaJBkfHx+3toSEBCPJTJkyJcuxLjZp0iQjycyfP9/Vdu7cOXP33Xcbf39/t3OPiIgwrVq1ynF/F/d94IEHzNGjR83Ro0dNQkKC6dixo5Fk+vXrZ4wx5o8//siy3QcffGAkma+++srV1rVrV+Pl5ZXtZycjI8MY4/75OnjwoLnllltMpUqVzN69e119582bZ7y8vMzXX3/tto/p06cbSSY+Pt7V5ufnl+17GhQUZPr06ZOrn8HFsjvXjRs3Gklm7ty5rrZhw4YZSWbJkiWXPdfMz2alSpXc9nvu3DlTpkwZc+utt5o///zT1f7ZZ58ZSWbYsGHGGGNOnjxpJJnx48dftt6lS5de8Xq9nEaNGplbbrklxz65fe8z/w1o27atW9+4uDgjySQkJBhjjNm7d68pUqSIGT16tFu/H3/80Xh7e7u1X3qt9e/f3wQGBpoLFy7k+hyB6wHTCYDriL+/f45PKcgcSfn444/zfROU0+lU9+7dc92/a9euCggIcC23b99eN910k/7zn//k6/i59Z///EdFihTRP//5T7f2gQMHyhij5cuXu7XHxMS4RgslqWbNmgoMDNT//ve/Kx4nNDRUnTp1crUVLVpU//znP3X69Gl9+eWX+T6HVatWKSQkRCEhIapVq5YWLVqkJ554wjXadfFI9tmzZ3Xs2DHdddddkuT683xGRoaWLVumNm3auM2lznTpiN3+/fvVqFEjnT9/Xl999ZUiIiJc6xYtWqTq1aurWrVqOnbsmOt1//33S5LWrVt3xXMKDg7Wt99+q6SkpDz9LC4+1/Pnz+v48eOKiopScHCw21SEjz76SLVq1dJDDz10xXPt1q2b2363bNmiI0eOKC4uTsWKFXO1t2rVStWqVdPnn3/uqsXHx0fr16/XyZMnL3uekvTZZ5/p/PnzeTrX3MjNe3+xPn36uC3369dPklzX4ZIlS5SRkaEOHTq4vbehoaGqUqVKju9tcHCwzpw5o9WrV1/1eQHXEiEWuI6cPn3aLTBe6rHHHlODBg3Us2dPlS1bVh07dtTChQvzFGjLly+fp5u4qlSp4rbscDgUFRWV5/mgebVv3z6VK1cuy8+jevXqrvUXq1ChQpZ9lChR4rIh5eLjVKlSJcsNQZc7Tl7ceeedWr16tb744gt98803OnbsmObOnesKMCdOnFD//v1VtmxZ+fr6KiQkRBUrVpQkJScnS5KOHj2qlJSUXD+y6YknntCRI0f05Zdfqnz58m7rfv31V23fvt0VrDNfN998s6S/5gZfybhx4/TTTz8pPDxc9evX1yuvvHLFXxSkv6ZtDBs2zDW/uXTp0goJCdGpU6dc5ypJv/32W67PNfNnlSnzvapatWqWvtWqVXOtdzqdGjt2rJYvX66yZcuqYcOGGjdunA4dOuTq36hRIz3yyCMaMWKESpcurXbt2mnWrFluc4evRm7e+4tdeh1WrlxZXl5eruvw119/lTFGVapUyfL+7tixI8f3Ni4uTjfffLNatGihsLAwPfnkk7meTw54EnNigevE/v37lZycrKioqMv28fX11VdffaV169bp888/14oVK7RgwQLdf//9WrVqlYoUKXLF4+RlHmtuXe4LGdLT03NVU0G43HHMJTeBXUulS5dWTEzMZdd36NBB33zzjQYPHqzatWvL399fGRkZat68eb5H2h9++GHNnTtXkydP1pgxY9zWZWRk6LbbbtOECROy3TY8PPyK++/QoYPreberVq3S+PHjNXbsWC1ZskQtWrS47Hb9+vXTrFmzNGDAAN19990KCgqSw+FQx44d832uV/NZHjBggNq0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Mca88MILpmrVqiYjI8O1/q233jL+/v4mPT3dGGPM4sWLTYkSJUyxYsXMPffcY4YOHWoSEhKuWOvbb79tateu7Vru37+/6datm2v56aefNoGBgVfcT+ZIrI+Pj3niiSeu2B9/PzZ97nXR6M+ZM2dMXFycKVKkiGvb3Ow3IiLC+Pj4GD8/P7dX0aJFrzgSm5ycbHx9fc22bduMMcZ8//33xt/f36SmphpjjPn222+NJLNkyZIrnktmHaVKlXKNogE56datmylSpIjrMyvJ3HTTTWbr1q3GGGPmzZuX5dpLS0szvr6+ZuXKla59REREmAsXLrj6PProo+axxx5zLV98rS9fvtx4e3ubgwcPutZfbiT23XffdfXZvn27kWR27NhR4D8HZMVILHJkjJHD4chTvx07dujuu+92265BgwY6ffq09u/fL+mvOXxJSUn65JNP1Lx5c61fv1516tRx/Vbcu3dv1wiTv7+/az8zZ85Uly5dXMtdunTRokWLlJqamqd6M7Vr105Lly51G80FrrfPvSR16tRJ/v7+CggI0EcffaT33ntPNWvWzNV+Mw0ePFjbtm1ze/Xu3du1/uuvv3Y7/vvvvy9J+uCDD1S5cmXVqlVLklS7dm1FRERowYIFrp9DXjzwwAM6c+aMXn311TxthxtX48aNXZ/Z//73v2rWrJlatGihffv2KSEhQbt371ZAQIDrs1uyZEmdPXtWv/32m2sft9xyi4oUKeJavummm3TkyJFsj7dr1y6Fh4crNDTU1Va/fv1s+2Zeh5n7lHTZ/aJg8bdT5GjHjh2qWLFijn2OHz+uo0ePXrHfpYoVK6amTZuqadOmevnll9WzZ08NHz5csbGxGjlypAYNGuTW/+eff9amTZv03//+V88995yrPT09XR9++KF69eqlm2++WcnJyTp48KDrH5OczJgxQ0OGDFGLFi30n//8Rw0bNszTOeDv6Xr63GeaOHGiYmJiFBQUpJCQkDztN1Pp0qUVFRXltl3JkiVd/33HHXdo27ZtruWyZctK+msqwfbt292m22RkZGjmzJnq0aOHqlSpIofDoZ07d+bqZ9CkSRP169dP7dq1U0ZGhiZPnpyr7XDj8vPzc/vsvvvuuwoKCtI777yj06dPq27duq5fui528bVStGhRt3UOh8PtSST5dfF+M3+JLYj94soYicVlrV27Vj/++KMe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", 1618 | "text/plain": [ 1619 | "
" 1620 | ] 1621 | }, 1622 | "metadata": {}, 1623 | "output_type": "display_data" 1624 | }, 1625 | { 1626 | "data": { 1627 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr4AAAIjCAYAAADlfxjoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACH0ElEQVR4nOzdd3hUVf4G8Pfemcyk9x5KGqQAAQFBylKkhKKCshZsgKirqGvBhrurK7vKb3Wtq7ugUsSyq4KAFaSKIkU6UgKhJaQBgfRk6vn9McyFIT1Mzbyf55mHzJ1bvhPmZt45c+45khBCgIiIiIionZNdXQARERERkTMw+BIRERGRV2DwJSIiIiKvwOBLRERERF6BwZeIiIiIvAKDLxERERF5BQZfIiIiIvIKDL5ERERE5BUYfImIiIjIKzD4Enmwv/71r5AkySnHGjZsGIYNG6bc37BhAyRJwpIlS5xy/KlTpyIxMdEpx2qrqqoq3HvvvYiNjYUkSXjsscdcXRIRAMecr4sWLYIkSThx4oTd9knkaAy+RG7C+iZivfn6+iI+Ph7Z2dl4++23UVlZaZfjFBYW4q9//St2795tl/3ZkzvX1hIvv/wyFi1ahAcffBAfffQR7rrrrkbXTUxMtPn/DggIQL9+/bB48WK71nTixAmb40iShODgYPTq1QvvvPMOTCZTm/b78ssvY/ny5XatlWxZP9iePXvW1aUQtRtqVxdARLZmz56NpKQkGAwGFBcXY8OGDXjsscfw+uuv46uvvkJWVpay7p///Gc8++yzrdp/YWEhXnzxRSQmJqJXr14t3u6HH35o1XHaoqna3n//fZjNZofXcCXWrVuHa665Bi+88EKL1u/VqxdmzpwJACgqKsIHH3yAKVOmQKfT4b777rNrbZMnT8a4ceMAAOXl5fjuu+/wyCOP4OTJk3j11Vdbvb+XX34Zv//97zFx4kS71klE5EgMvkRuZuzYsejbt69yf9asWVi3bh2uu+463HDDDTh48CD8/PwAAGq1Gmq1Y0/jmpoa+Pv7Q6PROPQ4zfHx8XHp8Vvi9OnTyMzMbPH6CQkJuPPOO5X7U6dORXJyMt544w27B9/evXvbHGvGjBno378/Pv300zYF3/bKbDZDr9fD19fX1aUQkQOwqwORB7j22mvxl7/8BSdPnsTHH3+sLG+oj+/q1asxePBghIaGIjAwEGlpaXjuuecAWPr5XX311QCAadOmKV99L1q0CIClH2/37t2xY8cODBkyBP7+/sq2l/fxtTKZTHjuuecQGxuLgIAA3HDDDcjPz7dZJzExEVOnTq237aX7bK62hvr4VldXY+bMmejYsSO0Wi3S0tLwz3/+E0IIm/UkScLDDz+M5cuXo3v37tBqtejWrRtWrlzZ8C/8MqdPn8b06dMRExMDX19f9OzZEx9++KHyuLX/5PHjx/Htt98qtbe272NUVBTS09Nx9OhRZZkQAsOHD0dUVBROnz6tLNfr9ejRowdSUlJQXV3dquMAlt9JTEyMzQenKVOmIDIyEgaDod76o0ePRlpamrJtdXU1PvzwQ+W5Xvr/W1BQgHvuuQcxMTHK73rBggX19vmvf/0L3bp1g7+/P8LCwtC3b198+umnTdat1+vx/PPPo0+fPggJCUFAQAB+97vfYf369fXWNZvNeOutt9CjRw/4+voiKioKY8aMwfbt221+Dw8//DA++eQTdOvWDVqtVnld7Nq1C2PHjkVwcDACAwMxYsQIbNmyxeYYBoMBL774Irp06QJfX19ERERg8ODBWL16tbJOcXExpk2bhg4dOkCr1SIuLg4TJkywS9/Yc+fO4cknn0SPHj0QGBiI4OBgjB07Fnv27Glw/ZacrwCwdetWjBkzBiEhIfD398fQoUOxadOmZuvZvn07srOzERkZCT8/PyQlJeGee+654udJZC9s8SXyEHfddReee+45/PDDD422Bu7fvx/XXXcdsrKyMHv2bGi1WuTm5ipvWBkZGZg9ezaef/553H///fjd734HABg4cKCyj9LSUowdOxa33XYb7rzzTsTExDRZ10svvQRJkvDMM8/g9OnTePPNNzFy5Ejs3r1baZluiZbUdikhBG644QasX78e06dPR69evbBq1So89dRTKCgowBtvvGGz/s8//4wvv/wSM2bMQFBQEN5++21MmjQJeXl5iIiIaLSu2tpaDBs2DLm5uXj44YeRlJSEL774AlOnTkVZWRkeffRRZGRk4KOPPsLjjz+ODh06KN0XoqKiWvz8AcBoNOLUqVMICwtTlkmShAULFiArKwsPPPAAvvzySwDACy+8gP3792PDhg0ICAhodt81NTVKX9GKigp8//33WLlyJWbNmqWsc9ddd2Hx4sVYtWoVrrvuOmV5cXEx1q1bp3Th+Oijj3DvvfeiX79+uP/++wEAKSkpAICSkhJcc801SqCMiorC999/j+nTp6OiokK54O/999/HH//4R/z+97/Ho48+irq6Ouzduxdbt27F7bff3ujzqKiowAcffIDJkyfjvvvuQ2VlJebPn4/s7Gxs27bNpovM9OnTsWjRIowdOxb33nsvjEYjfvrpJ2zZssXmW5V169bh888/x8MPP4zIyEgkJiZi//79+N3vfofg4GA8/fTT8PHxwbx58zBs2DD8+OOP6N+/PwDLh885c+Yov4+Kigps374dO3fuxKhRowAAkyZNwv79+/HII48gMTERp0+fxurVq5GXl3fFF2weO3YMy5cvx80334ykpCSUlJRg3rx5GDp0KA4cOID4+Hib9Vtyvq5btw5jx45Fnz598MILL0CWZSxcuBDXXnstfvrpJ/Tr16/BWk6fPo3Ro0cjKioKzz77LEJDQ3HixAnlNUvkFgQRuYWFCxcKAOLXX39tdJ2QkBBx1VVXKfdfeOEFcelp/MYbbwgA4syZM43u49dffxUAxMKFC+s9NnToUAFAzJ07t8HHhg4dqtxfv369ACASEhJERUWFsvzzzz8XAMRbb72lLOvcubOYMmVKs/tsqrYpU6aIzp07K/eXL18uAIi///3vNuv9/ve/F5IkidzcXGUZAKHRaGyW7dmzRwAQ//rXv+od61JvvvmmACA+/vhjZZlerxcDBgwQgYGBNs+9c+fOYvz48U3u79J1R48eLc6cOSPOnDkj9u3bJ+666y4BQDz00EP11p83b55Sx5YtW4RKpRKPPfZYs8c5fvy4ANDg7cEHHxRms1lZ12QyiQ4dOohbb73VZh+vv/66kCRJHDt2TFkWEBDQ4P/p9OnTRVxcnDh79qzN8ttuu02EhISImpoaIYQQEyZMEN26dWu2/ssZjUah0+lslp0/f17ExMSIe+65R1m2bt06AUD88Y9/rLePS58zACHLsti/f7/NOhMnThQajUYcPXpUWVZYWCiCgoLEkCFDlGU9e/Zs8v/8/PnzAoB49dVXW/4kL7Ce302dz3V1dcJkMtksO378uNBqtWL27NnKspaer2azWXTp0kVkZ2fb/J5qampEUlKSGDVqlLLM+jfr+PHjQgghli1b1uzfMCJXY1cHIg8SGBjY5OgOoaGhAIAVK1a0+UIwrVaLadOmtXj9u+++G0FBQcr93//+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EhEREZFXYPAlIiIiIq/A4EtEREREXoHBl4iIiIi8AoMvEREREXkFBl8iIiIi8goMvkRERETkFTwu+L777rtITEyEr68v+vfvj23btjW67qJFiyBJks3N19fXidUSERERkbvwqOD72Wef4YknnsALL7yAnTt3omfPnsjOzsbp06cb3SY4OBhFRUXK7eTJk06smIiIiIjchUcF39dffx333Xcfpk2bhszMTMydOxf+/v5YsGBBo9tIkoTY2FjlFhMT48SKiYiIiMhdeEzw1ev12LFjB0aOHKksk2UZI0eOxObNmxvdrqqqCp07d0bHjh0xYcIE7N+/v8nj6HQ6VFRU2NyIiIiIyPN5TPA9e/YsTCZTvRbbmJgYFBcXN7hNWloaFixYgBUrVuDjjz+G2WzGwIEDcerUqUaPM2fOHISEhCi3jh072vV5EBEREZFreEzwbYsBAwbg7rvvRq9evTB06FB8+eWXiIqKwrx58xrdZtasWSgvL1du+fn5TqyYiIiIiBxF7eoCWioyMhIqlQolJSU2y0tKShAbG9uiffj4+OCqq65Cbm5uo+totVpotdorqpWIiIiI3I/HtPhqNBr06dMHa9euVZaZzWasXbsWAwYMaNE+TCYT9u3bh7i4OEeVSURERERuymNafAHgiSeewJQpU9C3b1/069cPb775JqqrqzFt2jQAwN13342EhATMmTMHADB79mxcc801SE1NRVlZGV599VWcPHkS9957ryufBhERERG5gEcF31tvvRVnzpzB888/j+LiYvTq1QsrV65ULnjLy8uDLF9sxD5//jzuu+8+FBcXIywsDH369MEvv/yCzMxMVz0FIiIiInIRSQghXF2EO6uoqEBISAjKy8sRHBzs6nKIiIiI6DItzWse08eXiIiIiOhKMPgSERERkVdg8CUiIiIir8DgS0RERERegcGXiIiIiLwCgy8RkZcxmUzIy8sDB/UhIm/D4EtE5GU++ugj3H333diyZYurSyEicioGXyIiL/PFF18AAPbs2ePiSoiInIvBl4iIiIi8AoMveSwhBHbt2oWysjJXl0LkkdjHl4i8DYMveazc3Fw8/vjjeOGFF1xdCpFHkiTJ1SUQETkVgy95rPLycgDsp0jUWtbAy+BLRN6GwZc8Fr+mJboyPIeIyNsw+JLHMpvNri6ByKOxxZeIvA2DL3ksg8Hg6hKI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", 1628 | "text/plain": [ 1629 | "
" 1630 | ] 1631 | }, 1632 | "metadata": {}, 1633 | "output_type": "display_data" 1634 | } 1635 | ], 1636 | "source": [ 1637 | "plt.figure(figsize=(8, 6))\n", 1638 | "sns.violinplot(data= sampled_data, x='Label', y='frame.len')\n", 1639 | "plt.title('Distribution of frame length across Labels')\n", 1640 | "plt.xlabel('Label')\n", 1641 | "plt.ylabel('frame.len')\n", 1642 | "plt.show()\n", 1643 | "\n", 1644 | "plt.figure(figsize=(8, 6))\n", 1645 | "sns.violinplot(data= sampled_data, x='Label', y='Packets')\n", 1646 | "plt.title('Distribution of Packets across Labels')\n", 1647 | "plt.xlabel('Label')\n", 1648 | "plt.ylabel('Packets')\n", 1649 | "plt.show()\n", 1650 | "\n", 1651 | "plt.figure(figsize=(8, 6))\n", 1652 | "sns.violinplot(data= sampled_data, x='Label', y='Rx Bytes')\n", 1653 | "plt.title('Distribution of Rx Bytes across Labels')\n", 1654 | "plt.xlabel('Label')\n", 1655 | "plt.ylabel('Rx Bytes')\n", 1656 | "plt.show()" 1657 | ] 1658 | }, 1659 | { 1660 | "cell_type": "code", 1661 | "execution_count": 28, 1662 | "id": "8b2a9560-0253-4f11-8b16-ec31f3ee8f99", 1663 | "metadata": {}, 1664 | "outputs": [ 1665 | { 1666 | "data": { 1667 | "text/html": [ 1668 | "
\n", 1669 | "\n", 1682 | "\n", 1683 | " \n", 1684 | " \n", 1685 | " \n", 1686 | " \n", 1687 | " \n", 1688 | " \n", 1689 | " \n", 1690 | " \n", 1691 | " \n", 1692 | " \n", 1693 | " \n", 1694 | " \n", 1695 | " \n", 1696 | " \n", 1697 | " \n", 1698 | " \n", 1699 | " \n", 1700 | " \n", 1701 | " \n", 1702 | " \n", 1703 | " \n", 1704 | " \n", 1705 | " \n", 1706 | " \n", 1707 | " \n", 1708 | " \n", 1709 | " \n", 1710 | " \n", 1711 | " \n", 1712 | " \n", 1713 | " \n", 1714 | " \n", 1715 | " \n", 1716 | " \n", 1717 | " \n", 1718 | " \n", 1719 | " \n", 1720 | " \n", 1721 | " \n", 1722 | " \n", 1723 | " \n", 1724 | " \n", 1725 | " \n", 1726 | " \n", 1727 | " \n", 1728 | " \n", 1729 | " \n", 1730 | " \n", 1731 | " \n", 1732 | " \n", 1733 | " \n", 1734 | " \n", 1735 | " \n", 1736 | " \n", 1737 | " \n", 1738 | " \n", 1739 | " \n", 1740 | " \n", 1741 | " \n", 1742 | " \n", 1743 | " \n", 1744 | " \n", 1745 | " \n", 1746 | " \n", 1747 | " \n", 1748 | " \n", 1749 | " \n", 1750 | " \n", 1751 | " \n", 1752 | " \n", 1753 | " \n", 1754 | " \n", 1755 | " \n", 1756 | " \n", 1757 | " \n", 1758 | " \n", 1759 | " \n", 1760 | " \n", 1761 | " \n", 1762 | " \n", 1763 | " \n", 1764 | " \n", 1765 | " \n", 1766 | " \n", 1767 | " \n", 1768 | " \n", 1769 | " \n", 1770 | " \n", 1771 | " \n", 1772 | " \n", 1773 | " \n", 1774 | " \n", 1775 | " \n", 1776 | " \n", 1777 | " \n", 1778 | " \n", 1779 | " \n", 1780 | " \n", 1781 | " \n", 1782 | " \n", 1783 | " \n", 1784 | " \n", 1785 | " \n", 1786 | " \n", 1787 | " \n", 1788 | " \n", 1789 | " \n", 1790 | " \n", 1791 | " \n", 1792 | " \n", 1793 | " \n", 1794 | " \n", 1795 | " \n", 1796 | " \n", 1797 | " \n", 1798 | " \n", 1799 | " \n", 1800 | " \n", 1801 | " \n", 1802 | " \n", 1803 | " \n", 1804 | " \n", 1805 | " \n", 1806 | " \n", 1807 | " \n", 1808 | " \n", 1809 | " \n", 1810 | " \n", 1811 | " \n", 1812 | " \n", 1813 | " \n", 1814 | " \n", 1815 | " \n", 1816 | " \n", 1817 | " \n", 1818 | " \n", 1819 | " \n", 1820 | " \n", 1821 | " \n", 1822 | " \n", 1823 | " \n", 1824 | " \n", 1825 | " \n", 1826 | " \n", 1827 | " \n", 1828 | " \n", 1829 | " \n", 1830 | " \n", 1831 | " \n", 1832 | " \n", 1833 | " \n", 1834 | " \n", 1835 | " \n", 1836 | " \n", 1837 | " \n", 1838 | " \n", 1839 | " \n", 1840 | " \n", 1841 | " \n", 1842 | " \n", 1843 | " \n", 1844 | " \n", 1845 | " \n", 1846 | " \n", 1847 | " \n", 1848 | " \n", 1849 | " \n", 1850 | " \n", 1851 | " \n", 1852 | " \n", 1853 | " \n", 1854 | " \n", 1855 | " \n", 1856 | " \n", 1857 | " \n", 1858 | " \n", 1859 | " \n", 1860 | " \n", 1861 | " \n", 1862 | " \n", 1863 | " \n", 1864 | " \n", 1865 | " \n", 1866 | " \n", 1867 | " \n", 1868 | " \n", 1869 | " \n", 1870 | " \n", 1871 | " \n", 1872 | " \n", 1873 | " \n", 1874 | " \n", 1875 | " \n", 1876 | " \n", 1877 | " \n", 1878 | " \n", 1879 | " \n", 1880 | " \n", 1881 | " \n", 1882 | " \n", 1883 | " \n", 1884 | " \n", 1885 | " \n", 1886 | " \n", 1887 | " \n", 1888 | " \n", 1889 | " \n", 1890 | " \n", 1891 | " \n", 1892 | " \n", 1893 | " \n", 1894 | " \n", 1895 | " \n", 1896 | " \n", 1897 | " \n", 1898 | " \n", 1899 | " \n", 1900 | " \n", 1901 | " \n", 1902 | " \n", 1903 | " \n", 1904 | " \n", 1905 | " \n", 1906 | " \n", 1907 | " \n", 1908 | " \n", 1909 | " \n", 1910 | " \n", 1911 | " \n", 1912 | " \n", 1913 | " \n", 1914 | " \n", 1915 | "
ip.srcip.dstBenignDDoS-ACKDDoS-PSH-ACKLabeltcp.srcportframe.lentcp.flags.puship.flags.dfPacketsBytesTx PacketsTx BytesRx PacketsRx Bytes
0192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271463-0.6321411.0-1.0-0.508386-0.983051-0.774686-0.985676-0.035187-0.977848
1192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271412-0.6321411.0-1.00.430752-0.694094-0.036029-0.6809741.003123-0.703883
2192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271361-0.6321411.0-1.01.369890-0.4051370.702627-0.3762732.041433-0.429917
3192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271310-0.6321411.0-1.00.430752-0.694094-0.036029-0.6809741.003123-0.703883
4192.168.1.1192.168.23.2001DDoS-PSH-ACK-1.271259-0.6321411.0-1.0-1.447524-1.272008-1.513342-1.290377-1.073497-1.251814
...................................................
151195192.168.19.1192.168.23.2100Benign0.508437-0.463664-1.01.00.4307520.9272770.7026270.955386-0.0351870.899322
151196192.168.19.1192.168.23.2100Benign0.508538-0.463664-1.01.00.4307520.9406550.7026270.955386-0.0351870.924689
151197192.168.19.1192.168.23.2100Benign0.508640-0.463664-1.01.00.4307520.9219260.7026270.955386-0.0351870.889175
151198192.168.19.1192.168.23.2100Benign0.508742-0.463664-1.01.00.4307521.0048670.7026270.955386-0.0351871.046452
151199192.168.19.1192.168.23.2100Benign0.508844-0.463664-1.01.00.4307520.9272770.7026270.955386-0.0351870.899322
\n", 1916 | "

151200 rows × 16 columns

\n", 1917 | "
" 1918 | ], 1919 | "text/plain": [ 1920 | " ip.src ip.dst Benign DDoS-ACK DDoS-PSH-ACK \\\n", 1921 | "0 192.168.1.1 192.168.23.2 0 0 1 \n", 1922 | "1 192.168.1.1 192.168.23.2 0 0 1 \n", 1923 | "2 192.168.1.1 192.168.23.2 0 0 1 \n", 1924 | "3 192.168.1.1 192.168.23.2 0 0 1 \n", 1925 | "4 192.168.1.1 192.168.23.2 0 0 1 \n", 1926 | "... ... ... ... ... ... \n", 1927 | "151195 192.168.19.1 192.168.23.2 1 0 0 \n", 1928 | "151196 192.168.19.1 192.168.23.2 1 0 0 \n", 1929 | "151197 192.168.19.1 192.168.23.2 1 0 0 \n", 1930 | "151198 192.168.19.1 192.168.23.2 1 0 0 \n", 1931 | "151199 192.168.19.1 192.168.23.2 1 0 0 \n", 1932 | "\n", 1933 | " Label tcp.srcport frame.len tcp.flags.push ip.flags.df \\\n", 1934 | "0 DDoS-PSH-ACK -1.271463 -0.632141 1.0 -1.0 \n", 1935 | "1 DDoS-PSH-ACK -1.271412 -0.632141 1.0 -1.0 \n", 1936 | "2 DDoS-PSH-ACK -1.271361 -0.632141 1.0 -1.0 \n", 1937 | "3 DDoS-PSH-ACK -1.271310 -0.632141 1.0 -1.0 \n", 1938 | "4 DDoS-PSH-ACK -1.271259 -0.632141 1.0 -1.0 \n", 1939 | "... ... ... ... ... ... \n", 1940 | "151195 Benign 0.508437 -0.463664 -1.0 1.0 \n", 1941 | "151196 Benign 0.508538 -0.463664 -1.0 1.0 \n", 1942 | "151197 Benign 0.508640 -0.463664 -1.0 1.0 \n", 1943 | "151198 Benign 0.508742 -0.463664 -1.0 1.0 \n", 1944 | "151199 Benign 0.508844 -0.463664 -1.0 1.0 \n", 1945 | "\n", 1946 | " Packets Bytes Tx Packets Tx Bytes Rx Packets Rx Bytes \n", 1947 | "0 -0.508386 -0.983051 -0.774686 -0.985676 -0.035187 -0.977848 \n", 1948 | "1 0.430752 -0.694094 -0.036029 -0.680974 1.003123 -0.703883 \n", 1949 | "2 1.369890 -0.405137 0.702627 -0.376273 2.041433 -0.429917 \n", 1950 | "3 0.430752 -0.694094 -0.036029 -0.680974 1.003123 -0.703883 \n", 1951 | "4 -1.447524 -1.272008 -1.513342 -1.290377 -1.073497 -1.251814 \n", 1952 | "... ... ... ... ... ... ... \n", 1953 | "151195 0.430752 0.927277 0.702627 0.955386 -0.035187 0.899322 \n", 1954 | "151196 0.430752 0.940655 0.702627 0.955386 -0.035187 0.924689 \n", 1955 | "151197 0.430752 0.921926 0.702627 0.955386 -0.035187 0.889175 \n", 1956 | "151198 0.430752 1.004867 0.702627 0.955386 -0.035187 1.046452 \n", 1957 | "151199 0.430752 0.927277 0.702627 0.955386 -0.035187 0.899322 \n", 1958 | "\n", 1959 | "[151200 rows x 16 columns]" 1960 | ] 1961 | }, 1962 | "execution_count": 28, 1963 | "metadata": {}, 1964 | "output_type": "execute_result" 1965 | } 1966 | ], 1967 | "source": [ 1968 | "dataset" 1969 | ] 1970 | }, 1971 | { 1972 | "cell_type": "code", 1973 | "execution_count": null, 1974 | "id": "6baaa1b8-32e9-4d0b-af37-49114f78d0fb", 1975 | "metadata": {}, 1976 | "outputs": [], 1977 | "source": [] 1978 | } 1979 | ], 1980 | "metadata": { 1981 | "kernelspec": { 1982 | "display_name": "Python 3 (ipykernel)", 1983 | "language": "python", 1984 | "name": "python3" 1985 | }, 1986 | "language_info": { 1987 | "codemirror_mode": { 1988 | "name": "ipython", 1989 | "version": 3 1990 | }, 1991 | "file_extension": ".py", 1992 | "mimetype": "text/x-python", 1993 | "name": "python", 1994 | "nbconvert_exporter": "python", 1995 | "pygments_lexer": "ipython3", 1996 | "version": "3.11.4" 1997 | } 1998 | }, 1999 | "nbformat": 4, 2000 | "nbformat_minor": 5 2001 | } 2002 | -------------------------------------------------------------------------------- /reports/data/Mihir.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/YADD/66bfff366d33bc082201cbe4f73cbc93fa282330/reports/data/Mihir.pdf -------------------------------------------------------------------------------- /reports/data/analysis.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/YADD/66bfff366d33bc082201cbe4f73cbc93fa282330/reports/data/analysis.pdf -------------------------------------------------------------------------------- /reports/data/sarthakvermaa.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/YADD/66bfff366d33bc082201cbe4f73cbc93fa282330/reports/data/sarthakvermaa.pdf -------------------------------------------------------------------------------- /reports/model/model_reports.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/YADD/66bfff366d33bc082201cbe4f73cbc93fa282330/reports/model/model_reports.pdf --------------------------------------------------------------------------------