{ "cells": [ { "cell_type": "code", "execution_count": 2, "id": "complete-wealth", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running on local URL: http://127.0.0.1:7861/\n", "\n", "To create a public link, set `share=True` in `launch()`.\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "(,\n", " 'http://127.0.0.1:7861/',\n", " None)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "950/950 [==============================] - 1s 1ms/step - loss: 0.0024 - accuracy: 0.9988\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "950/950 [==============================] - 1s 882us/step - loss: 0.0021 - accuracy: 0.9991\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import gradio as gr\n", "\n", "\n", "import pandas as pd\n", "from math import sqrt;\n", "from sklearn import preprocessing\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.linear_model import LogisticRegression;\n", "from sklearn.metrics import accuracy_score, r2_score, confusion_matrix, mean_absolute_error, mean_squared_error, f1_score, log_loss\n", "from sklearn.model_selection import train_test_split\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns \n", "import joblib\n", " #load packages for ANN\n", "import tensorflow as tf\n", " \n", "def malware_detection_DL (results, malicious_traffic, benign_traffic):\n", " malicious_dataset = pd.read_csv(malicious_traffic) #Importing Datasets \n", " benign_dataset = pd.read_csv(benign_traffic)\n", " # Removing duplicated rows from benign_dataset (5380 rows removed)\n", " benign_dataset = benign_dataset[benign_dataset.duplicated(keep=False) == False]\n", " # Combining both datasets together\n", " all_flows = pd.concat([malicious_dataset, benign_dataset])\n", " # Reducing the size of the dataset to reduce the amount of time taken in training models\n", " reduced_dataset = all_flows.sample(38000)\n", " #dataset with columns with nan values dropped\n", " df = reduced_dataset.drop(reduced_dataset.columns[np.isnan(reduced_dataset).any()], axis=1)\n", " #### Isolating independent and dependent variables for training dataset\n", " reduced_y = df['isMalware']\n", " reduced_x = df.drop(['isMalware'], axis=1);\n", " # Splitting datasets into training and test data\n", " x_train, x_test, y_train, y_test = train_test_split(reduced_x, reduced_y, test_size=0.2, random_state=42)\n", " \n", " #scale data between 0 and 1\n", " min_max_scaler = preprocessing.MinMaxScaler()\n", " x_scale = min_max_scaler.fit_transform(reduced_x)\n", " # Splitting datasets into training and test data\n", " x_train, x_test, y_train, y_test = train_test_split(x_scale, reduced_y, test_size=0.2, random_state=42)\n", " #type of layers in ann model is sequential, dense and uses relu activation \n", " ann = tf.keras.models.Sequential()\n", " model = tf.keras.Sequential([\n", " tf.keras.layers.Dense(32, activation ='relu', input_shape=(373,)),\n", " tf.keras.layers.Dense(32, activation = 'relu'),\n", " tf.keras.layers.Dense(1, activation = 'sigmoid'),\n", " ])\n", " \n", " \n", " model.compile(optimizer ='adam', \n", " loss = 'binary_crossentropy',\n", " metrics = ['accuracy'])\n", " #model.fit(x_train, y_train, batch_size=32, epochs = 150, validation_data=(x_test, y_test))\n", " #does not output epochs and gives evalutaion of validation data and history of losses and accuracy\n", " history = model.fit(x_train, y_train, batch_size=32, epochs = 50,verbose=0, validation_data=(x_test, y_test))\n", " _, accuracy = model.evaluate(x_train, y_train)\n", " #return history.history\n", " if results==\"Accuracy\":\n", " #summarize history for accuracy\n", " plt.plot(history.history['accuracy'])\n", " plt.plot(history.history['val_accuracy'])\n", " plt.title('model accuracy')\n", " plt.ylabel('accuracy')\n", " plt.xlabel('epoch')\n", " plt.legend(['train', 'test'], loc='upper left')\n", " return plt.show()\n", " else:\n", " # summarize history for loss\n", " plt.plot(history.history['loss'])\n", " plt.plot(history.history['val_loss'])\n", " plt.title('model loss')\n", " plt.ylabel('loss')\n", " plt.xlabel('epoch')\n", " plt.legend(['train', 'test'], loc='upper left')\n", " return plt.show()\n", " \n", " \n", " \n", "iface = gr.Interface(\n", " malware_detection_DL, [gr.inputs.Dropdown([\"Accuracy\",\"Loss\"], label=\"Result Type\"),\n", " gr.inputs.Dropdown([\"malicious_flows.csv\"], label = \"Malicious traffic in .csv\"),\n", " gr.inputs.Dropdown([\"sample_benign_flows.csv\"], label=\"Benign Traffic in .csv\")\n", " ], \"plot\",\n", " \n", " \n", ")\n", "\n", "iface.launch()\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "curious-detector", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }