From 2864ab81144a4284b7fce3229bfad9b2f899eab5 Mon Sep 17 00:00:00 2001 From: Miel Hostens Date: Tue, 10 Oct 2023 11:58:46 +0200 Subject: [PATCH] Created using Colaboratory --- SensorBolusPeakDetectionAndRFAlgorithm.ipynb | 7172 ++++++++++++++++++ 1 file changed, 7172 insertions(+) create mode 100644 SensorBolusPeakDetectionAndRFAlgorithm.ipynb diff --git a/SensorBolusPeakDetectionAndRFAlgorithm.ipynb b/SensorBolusPeakDetectionAndRFAlgorithm.ipynb new file mode 100644 index 0000000..f02da52 --- /dev/null +++ b/SensorBolusPeakDetectionAndRFAlgorithm.ipynb @@ -0,0 +1,7172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MROm8RgH0pb9" + }, + "source": [ + "# Notebook for the algorithm\n", + "\n", + "This is a Google Colab Notebook. It has a google machine in the back which will activate the moment you click the play button from the first cell. You can run cells seperately, or all after eachother, it allows you to prototype much easier then using the PyCharm.\n", + "\n", + "The notebook can be shared and editted by multiple people. If you want to work in your own version, you can make a copy of the notebook first." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WQHVFkd_ZcBs" + }, + "source": [ + "#GDrive\n", + "You need to make a link with the data. This is all stored in your google drive , or in the case of this notebook a bovi-analytics folder.\n", + "\n", + "First run the cell underneath, then open the link in the output and copy the code underneath. That way, the Google Drive is connected." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SiNP_qsYZbLs", + "outputId": "aa4f450f-6e4c-411d-9a74-cb0b1dda36e2" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Mounted at /content/gdrive\n" + ] + } + ], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/gdrive')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Dm_jCmj7At96" + }, + "source": [ + "# Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "6RPBeG88Xcz1" + }, + "outputs": [], + "source": [ + "#import general libraries\n", + "import os\n", + "import glob\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from datetime import datetime\n", + "from scipy.stats import iqr\n", + "from scipy.stats import mode\n", + "from scipy.signal import welch\n", + "from scipy.fftpack import fft\n", + "from scipy import signal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "oeImDZLP78jH" + }, + "outputs": [], + "source": [ + "from sklearn import metrics\n", + "from sklearn.metrics import *\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.metrics import accuracy_score\n", + "from sklearn.metrics import classification_report\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.model_selection import StratifiedKFold\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "#from sklearn.externals import joblib\n", + "from sklearn.utils import resample" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1u1Xv3LxeLBQ" + }, + "source": [ + "# Set directories" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4XEH4X1rYgly" + }, + "outputs": [], + "source": [ + "#define directories\n", + "base_dir = '/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje'\n", + "video_dir = '/data/out/video/'\n", + "bolus_dir = '/data/out/bolus/'\n", + "output_dir= '/data/out/out/'\n", + "video_path = base_dir + video_dir\n", + "bolus_path = base_dir + bolus_dir\n", + "output_path = base_dir + output_dir" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "aAxIKxdeYnQ2" + }, + "outputs": [], + "source": [ + "#create output directory\n", + "if os.path.isdir ( output_path ):\n", + " pass\n", + "else:\n", + " os.mkdir (output_path )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "uBDpWvipbHfB" + }, + "outputs": [], + "source": [ + "#remove old output file\n", + "for f in os.listdir(output_path):\n", + " print('Existing file : ' + f)\n", + " oldfile = output_path + f\n", + " if os.path.isfile(oldfile):\n", + " os.remove(oldfile)\n", + " print('Removed : ' + oldfile)\n", + " else:\n", + " pass\n", + " print('Did not remove : ' + oldfile)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ol9ZN3e9KMKz" + }, + "source": [ + "# PeakDetectionAlgorithm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "leKIwy_23HoI" + }, + "source": [ + "## Algorithm function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "XhjspdZtAPcr" + }, + "outputs": [], + "source": [ + "def picoalgorithm_gain(data, gain_peakdetection = 35,col=0):\n", + " #data window paramters, 0,5s per sample\n", + " start = 1\n", + " Data = 0\n", + " Rumination = 0\n", + " PeakValue = 0\n", + " PressureDetected = 0\n", + " LowTimeCounterHold = 0\n", + "\n", + " #peak detection parameters\n", + " Slope_Rise = 2 * gain_peakdetection;\n", + " Slope_Fall = gain_peakdetection;\n", + " Actual_Rise = float(0)\n", + " Actual_Fall = float(0)\n", + "\n", + " #rumination detection parameters\n", + " State = 1\n", + " Timer_D = 0\n", + " Timer_E = 0\n", + " Timer_F = 0\n", + " Pulse_High_flank = 0\n", + " Rumination_Time = 10 # 0,5s samplerate -> 5s\n", + " D = 10 # 0,5s samplerate -> 5s\n", + " E = 30 # 0,5s samplerate -> 15s\n", + " F = 10 # 0,5s samplerate -> 5s\n", + " Pulse_detected = 0\n", + " Pulse_detected_old = 0\n", + "\n", + " #low time parameters\n", + " Lowtime_counter = 0\n", + "\n", + " #moving average filter\n", + " MA_Filter = 0\n", + " Baseline = 0\n", + " Windowsize = 150\n", + " Highest_peak = 0\n", + "\n", + " #high pressure detection parameters\n", + " High_Pressure_level = 3500\n", + "\n", + " #loop for pulse detection\n", + " for i in range(1,np.size(data[:, col])):\n", + " Actual_Rise = data[i - 8, col] - data[i - 5, col]\n", + " Actual_Fall = data[i - 8, col] - data[i - 10, col]\n", + "\n", + " #measure highest peak\n", + " if ((data[i, col] - Baseline) > Highest_peak and i > (Windowsize + 10)):\n", + " Highest_peak = (data[i, col] - Baseline)\n", + "\n", + " #calculating moving average filter\n", + " MA_Filter = 0\n", + " if i > Windowsize:\n", + " for j in range(1, Windowsize):\n", + " MA_Filter = MA_Filter + data[i - j, col]\n", + " Baseline = int(MA_Filter / Windowsize)\n", + " data[i, 5] = Baseline\n", + "\n", + " #high pressure level detection\n", + " if ((data[i, col] - Baseline) > High_Pressure_level):\n", + " data[i, 8] = 1000\n", + "\n", + " Pulse_detected = 0\n", + " if Actual_Rise >= Slope_Rise and Actual_Fall >= Slope_Fall:\n", + " Pulse_detected = 1\n", + "\n", + " #flank detection\n", + " if Pulse_detected_old == 0 and Pulse_detected == 1:\n", + " Pulse_High_flank = 1\n", + " Pulse_detected_old = Pulse_detected\n", + " Pulse_detected = 0\n", + " data[i, 1] = Pulse_High_flank\n", + " data[i, 2] = State\n", + " data[i, 4] = LowTimeCounterHold\n", + " if State == 1: #wait for minimal low time\n", + " if Timer_D >= D:\n", + " State = 2\n", + " Lowtime_counter = 0\n", + " Highest_peak = 0\n", + "\n", + " if Pulse_High_flank == 1:\n", + " State = 1\n", + " Timer_D = 0\n", + " Pulse_High_flank = 0\n", + "\n", + " elif State == 2: #wait for first pulse\n", + " if Pulse_High_flank == 1:\n", + " State = 3\n", + " Timer_E = 0;\n", + " PulsLowTime = 0\n", + " Pulse_High_flank = 0\n", + "\n", + " elif State == 3: #wait for second pulse\n", + " if Timer_E == E:\n", + " State = 1\n", + " Timer_D = 0\n", + " if Pulse_High_flank == 1:\n", + " Timer_F = 0;\n", + " Pulse_High_flank = 0\n", + " if Timer_E >= Rumination_Time:\n", + " State = 5\n", + " Timer_F = 0;\n", + " else:\n", + " State = 4\n", + " Timer_F = 0;\n", + "\n", + " elif State == 4: #wait for third pulse or minimal low time\n", + " if Timer_F == F:\n", + " State = 1\n", + " Timer_D = 0\n", + " #normal wave detected\n", + " LowTimeCounterHold = Lowtime_counter/2\n", + " data[i, 3] = 1\n", + " data[i, 6] = Highest_peak\n", + " Rumination = 0\n", + " PeakValue = Highest_peak\n", + " if Pulse_High_flank == 1:\n", + " State = 5\n", + " Pulse_High_flank = 0\n", + "\n", + " elif State == 5: #wait for third pulse or minimal low time\n", + " if Timer_F == F:\n", + " State = 1\n", + " Timer_D = 0\n", + " #rumination wave detected\n", + " LowTimeCounterHold = Lowtime_counter/2\n", + " data[i, 3] = 2\n", + " data[i, 6] = Highest_peak\n", + " Rumination = 1\n", + " PeakValue = Highest_peak\n", + " if Pulse_High_flank == 1:\n", + " if Timer_E <= E: # pulse detected within window E\n", + " State == 5\n", + " Pulse_High_flank = 0\n", + " else:\n", + " State = 1\n", + " Timer_D = 0\n", + " Pulse_High_flank = 0\n", + " # Error, no wave detected\n", + "\n", + " #loop timers 0,5s per loop\n", + " Timer_D += 1\n", + " Timer_F += 1\n", + " Timer_E += 1\n", + " Lowtime_counter += 1\n", + "\n", + " #database output\n", + " data[i, 9] = Rumination\n", + " data[i, 7] = PeakValue\n", + " return data\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "9balS6NO90OM" + }, + "outputs": [], + "source": [ + "def process_file(file, base_directory, input_directory, output_directory, sep = \",\", store = True, disp = False, gain = 35, col=0):\n", + " infile = base_directory + input_directory + file\n", + " outfile = base_directory + output_directory + 'processed_' + file\n", + "\n", + " #read the file and make sure to change NaN with 0.0\n", + " #dateparse = lambda x: DateTime.strptime(x, '%Y-%m-%d %H:%M:%S')\n", + " raw_df = pd.read_csv (infile, sep=';', decimal=\",\")\n", + " #, parse_dates={'datetime': ['Date', 'Time']}, date_parser=dateparse)" + ] + }, + { + "cell_type": "code", + "source": [ + "#load all files in directory with *.csv\n", + "pd.set_option('display.max_rows', None)\n", + "\n", + "for f in os.listdir (bolus_path):\n", + " if f.endswith ('.csv'):\n", + " print(\"Started processing: \" + f)\n", + " process_file(f, base_dir, bolus_dir, output_dir, sep=\",\", store=True, disp=True, gain= 3, col=0)\n", + "\n", + " print(\"Done processing: \" + f)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "oW47wU7-tlTP", + "outputId": "8b53adb8-24ae-4cb4-8bfe-53e8588923bf" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Started processing: bolus20210121.csv\n", + "Done processing: bolus20210121.csv\n", + "Started processing: bolus20210122.csv\n", + "Done processing: bolus20210122.csv\n", + "Started processing: bolus20210119.csv\n", + "Done processing: bolus20210119.csv\n", + "Started processing: bolus20210118.csv\n", + "Done processing: bolus20210118.csv\n", + "Started processing: bolus20210208.csv\n", + "Done processing: bolus20210208.csv\n", + "Started processing: bolus20210205.csv\n", + "Done processing: bolus20210205.csv\n", + "Started processing: bolus20210202.csv\n", + "Done processing: bolus20210202.csv\n", + "Started processing: bolus20210211.csv\n", + "Done processing: bolus20210211.csv\n", + "Started processing: bolus20210219.csv\n", + "Done processing: bolus20210219.csv\n", + "Started processing: bolus20210224.csv\n", + "Done processing: bolus20210224.csv\n", + "Started processing: bolus20210225.csv\n", + "Done processing: bolus20210225.csv\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "h2sz6E1x3SsJ" + }, + "source": [ + "## File processing function" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oyZGBgUAhSHR" + }, + "source": [ + "The next algorythm allows\n", + "\n", + "* Fixed gain of 9\n", + "* Allow flexible seperator\n", + "* Allow display/store\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wX6Y6flW9T04" + }, + "outputs": [], + "source": [ + "def process_file(file, base_directory, input_directory, output_directory, sep = \",\", store = True, disp = False, gain = 9, col=0):\n", + " infile = base_directory + input_directory + file\n", + " outfile = base_directory + output_directory + 'processed_' + file\n", + "\n", + " #read the file and make sure to change NaN with 0.0\n", + " raw_df = pd.read_csv (infile, sep, decimal=\",\", dtype={'Date':str, 'Time':str, 'DateTime':str})\n", + " #raw_df['Date']=pd.to_datetime(raw_df['Date'],format=\"%Y-%m-%d\")\n", + " raw_df['MergeDateTime']=pd.to_datetime(raw_df['MergeDateTime'],format=\"%Y-%m-%d %H:%M:%S\")\n", + "\n", + " raw_col = raw_df[['Pressure']].fillna(0)\n", + " raw_merge = raw_df[['MergeDateTime']]\n", + " raw_index = raw_df[['DateTime']]\n", + " raw_pressure = raw_df[['Pressure']]\n", + "\n", + " #explicitely change format to int\n", + " raw_col.Pressure = raw_col.Pressure.astype(float)\n", + "\n", + " #add extra columns with all 0.0 values\n", + " extra_col_df = raw_col.assign(\n", + " pulse_flank = 0.0,\n", + " state = 0.0,\n", + " wave_type = 0.0,\n", + " low_time= 0.0,\n", + " baseline= 0.0,\n", + " highest_peak= 0.0,\n", + " moo= 0.0,\n", + " high_pressure= 0.0,\n", + " time_start= 0.0,\n", + " time_stop= 0.0,\n", + " rumination= 0.0,\n", + " peakvalue= 0.0)\n", + "\n", + " #create numpy array from pandas\n", + " input_array = extra_col_df.to_numpy()\n", + " index_array = raw_index.to_numpy()\n", + " merge_array = raw_merge.to_numpy()\n", + " raw_pressure_array = raw_pressure.to_numpy()\n", + "\n", + " #run picoalgorithm and display result\n", + " result = picoalgorithm_gain(input_array, gain, col)\n", + "\n", + " #create dataframe from result array\n", + " dataset = pd.DataFrame({\n", + " 'DateTime': index_array[:,0],\n", + " 'MergeDateTime': merge_array[:,0],\n", + " 'raw_pressure': raw_pressure_array[:, 0],\n", + " 'ret_pressure': result[:, 0],\n", + " 'pulse_flank': result[:, 1],\n", + " 'state': result[:, 2],\n", + " 'wave_type': result[:, 3],\n", + " 'low_time': result[:, 4],\n", + " 'baseline': result[:, 5],\n", + " 'highest_peak': result[:, 6],\n", + " 'peakvalue': result[:, 7],\n", + " 'high_pressure': result[:, 8],\n", + " 'rumination': result[:, 9]})\n", + "\n", + " #store to csv\n", + " if store == True:\n", + " dataset.to_csv(outfile)\n", + " if disp == True:\n", + " #display(dataset.head(1000))\n", + " dataset.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eeSB_xc5eQSJ" + }, + "source": [ + "## Read input files and creat algorithm output file" + ] + }, + { + "cell_type": "code", + "source": [ + "def process_file(file, base_directory, input_directory, output_directory, sep = \",\", store = True, disp = False, gain = 9, col=0):\n", + " infile = base_directory + input_directory + file\n", + " outfile = base_directory + output_directory + 'processed_' + file\n", + "\n", + " #read the file and make sure to change NaN with 0.0\n", + " raw_df = pd.read_csv (infile, sep, decimal=\",\", dtype={'Date':str, 'Time':str, 'DateTime':str})\n", + " #raw_df['Date']=pd.to_datetime(raw_df['Date'],format=\"%Y-%m-%d\")\n", + " raw_df['MergeDateTime']=pd.to_datetime(raw_df['MergeDateTime'],format=\"%Y-%m-%d %H:%M:%S\")\n", + "\n", + " #store to csv\n", + " if store == True:\n", + " raw_df.to_csv(outfile)\n", + " if disp == True:\n", + " #display(dataset.head(1000))\n", + " raw_df.describe()" + ], + "metadata": { + "id": "Ja8vSQwgwaR1" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def process_file(file, base_directory, input_directory, output_directory, sep = \",\", store = True, disp = False, gain = 9, col=0):\n", + " infile = base_directory + input_directory + file\n", + " outfile = base_directory + output_directory + 'processed_' + file\n", + "\n", + " #read the file and make sure to change NaN with 0.0\n", + " raw_df = pd.read_csv (infile, sep, decimal=\",\", dtype={'Date':str, 'Time':str, 'DateTime':str})\n", + " #raw_df['Date']=pd.to_datetime(raw_df['Date'],format=\"%Y-%m-%d\")\n", + " raw_df['MergeDateTime']=pd.to_datetime(raw_df['MergeDateTime'],format=\"%Y-%m-%d %H:%M:%S\")\n", + "\n", + " raw_col = raw_df[['Pressure']].fillna(0)\n", + " raw_merge = raw_df[['MergeDateTime']]\n", + " raw_index = raw_df[['DateTime']]\n", + " raw_pressure = raw_df[['Pressure']]\n", + "\n", + " #explicitely change format to int\n", + " raw_col.Pressure = raw_col.Pressure.astype(float)\n", + "\n", + " #add extra columns with all 0.0 values\n", + " extra_col_df = raw_col.assign(\n", + " pulse_flank = 0.0,\n", + " state = 0.0,\n", + " wave_type = 0.0,\n", + " low_time= 0.0,\n", + " baseline= 0.0,\n", + " highest_peak= 0.0,\n", + " moo= 0.0,\n", + " high_pressure= 0.0,\n", + " time_start= 0.0,\n", + " time_stop= 0.0,\n", + " rumination= 0.0,\n", + " peakvalue= 0.0)\n", + "\n", + " #create numpy array from pandas\n", + " input_array = extra_col_df.to_numpy()\n", + " index_array = raw_index.to_numpy()\n", + " merge_array = raw_merge.to_numpy()\n", + " raw_pressure_array = raw_pressure.to_numpy()\n", + "\n", + " #run picoalgorithm and display result\n", + " result = picoalgorithm_gain(input_array, gain, col)\n", + "\n", + " #create dataframe from result array\n", + " dataset = pd.DataFrame({\n", + " 'DateTime': index_array[:,0],\n", + " 'MergeDateTime': merge_array[:,0],\n", + " 'raw_pressure': raw_pressure_array[:, 0],\n", + " 'ret_pressure': result[:, 0],\n", + " 'pulse_flank': result[:, 1],\n", + " 'state': result[:, 2],\n", + " 'wave_type': result[:, 3],\n", + " 'low_time': result[:, 4],\n", + " 'baseline': result[:, 5],\n", + " 'highest_peak': result[:, 6],\n", + " 'peakvalue': result[:, 7],\n", + " 'high_pressure': result[:, 8],\n", + " 'rumination': result[:, 9]})\n", + "\n", + " #store to csv\n", + " if store == True:\n", + " dataset.to_csv(outfile)\n", + " if disp == True:\n", + " #display(dataset.head(1000))\n", + " dataset.describe()" + ], + "metadata": { + "id": "JY2QJqvMv-Wi" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_0qMiSkfXTgL", + "outputId": "c021c37f-47a7-4efe-9308-124bce585e37" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Started processing: bolus20210121.csv\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:7: FutureWarning: In a future version of pandas all arguments of read_csv except for the argument 'filepath_or_buffer' will be keyword-only\n", + " import sys\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Done processing: bolus20210121.csv\n", + "Started processing: bolus20210122.csv\n", + "Done processing: bolus20210122.csv\n", + "Started processing: bolus20210119.csv\n", + "Done processing: bolus20210119.csv\n", + "Started processing: bolus20210118.csv\n", + "Done processing: bolus20210118.csv\n", + "Started processing: bolus20210208.csv\n", + "Done processing: bolus20210208.csv\n", + "Started processing: bolus20210205.csv\n", + "Done processing: bolus20210205.csv\n", + "Started processing: bolus20210202.csv\n", + "Done processing: bolus20210202.csv\n", + "Started processing: bolus20210211.csv\n", + "Done processing: bolus20210211.csv\n", + "Started processing: bolus20210219.csv\n", + "Done processing: bolus20210219.csv\n", + "Started processing: bolus20210224.csv\n", + "Done processing: bolus20210224.csv\n", + "Started processing: bolus20210225.csv\n", + "Done processing: bolus20210225.csv\n" + ] + } + ], + "source": [ + "#load all files in directory with *.csv\n", + "pd.set_option('display.max_rows', None)\n", + "\n", + "for f in os.listdir (bolus_path):\n", + " if f.endswith ('.csv'):\n", + " print(\"Started processing: \" + f)\n", + " process_file(f, base_dir, bolus_dir, output_dir, sep=\",\", store=True, disp=True, gain= 3, col=0)\n", + "\n", + " print(\"Done processing: \" + f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "paJjRP5m5dn3", + "outputId": "7f844701-79fb-4094-ed02-4636e0f5b3ae" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210121.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210122.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210119.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210118.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210208.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210205.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210202.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210211.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210219.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210224.csv\n", + "/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/processed_bolus20210225.csv\n" + ] + } + ], + "source": [ + "#create list of processed files\n", + "processed_dir = output_path\n", + "all_files = glob.glob(processed_dir + \"*.csv\")\n", + "\n", + "li = []\n", + "\n", + "for filename in all_files:\n", + " print(filename)\n", + " df = pd.read_csv(filename, index_col=0, header=0, sep = \",\", decimal=\".\")#, dtype={'MergeTime':str}, parse_dates=['MergeTime'])\n", + " #)\n", + " #df['MergeTime']=pd.to_datetime(df['MergeTime'], format=\"%H:%M:%S\")\n", + " #print(type(df['DateTime']))\n", + " df['file'] = filename\n", + " li.append(df)\n", + "\n", + "df_concat_processed = pd.concat(li, axis=0, ignore_index=True)\n", + "\n", + "#create column \"rumination_alg\"\n", + "#df_concat_processed['rumination_alg'] = df_concat_processed['rumination'].apply(lambda x: 1 if x == 1.0 else 0)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ckWnV4EcOlgf" + }, + "source": [ + "## Read input files and creat video output file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pPQj0pfg6JQm", + "outputId": "a0035ce8-49c6-4bbd-b515-6ed921e57b6e" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210121a.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210121a.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210122.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210122.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210121b.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210121b.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210208.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210208.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210205.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210205.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210118.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210118.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210211.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210211.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210202.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210202.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210119.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210119.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210219.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210219.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210224.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210224.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210225.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210225.csv\n" + ] + } + ], + "source": [ + "path_video = video_path\n", + "all_files = glob.glob(path_video + \"*.csv\")\n", + "li = []\n", + "for filename in all_files:\n", + " print(\"Started processing: \" + filename)\n", + " df = pd.read_csv(filename,\n", + " header=0,\n", + " sep = \",\",\n", + " decimal=\".\",\n", + " nrows = 50000\n", + " )[['Cow','Date','Ruminating','Eating','Sleeping','Drinking','Urinate','Moo', 'CodeBehaviour', 'MergeDateTime', 'Lying']].dropna()\n", + " #df['Behaviour']=df['Ruminating']+df['Eating']+df['Drinking']+df['Sleeping']+df['Urinate']+df['Moo']\n", + " df['Resting'] = df['Lying'].apply(lambda x: 1 if (x == 21 or x== 20) else 0)\n", + " li.append(df)\n", + " print(\"Done processing: \" + filename)\n", + "#create a panda dataframe of processed video files\n", + "df_concat_video = pd.concat(li, axis=0, ignore_index=True)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jnxtE4qLO2e_" + }, + "source": [ + "## Merge processsed files and video files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "WlxHuW7xJGHk" + }, + "outputs": [], + "source": [ + "df_inner_merged = pd.merge(df_concat_processed, df_concat_video, on='MergeDateTime', how='inner')\n", + "df_inner_merged['Ruminating'] = df_inner_merged['Ruminating'].replace([8],1.0)\n", + "df_inner_merged['Ruminating'] = df_inner_merged['Ruminating'].replace([0],0.0)" + ] + }, + { + "cell_type": "code", + "source": [ + "file_merged='/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Miel/mergedfile.csv'\n", + "df_inner_merged.to_csv(file_merged)" + ], + "metadata": { + "id": "Ua280AeR_Qhl" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "df_concat='/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/out/df_concat_processed.csv'\n", + "df_concat_processed.to_csv(df_concat)" + ], + "metadata": { + "id": "Um0_ecghANMo" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [], + "metadata": { + "id": "fJbgjym4Gkxo" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "iCx9UP140ecx" + }, + "outputs": [], + "source": [ + "final_data_peak_detection=df_inner_merged[df_inner_merged.Date <20210225]\n", + "final_data_peak_detection_selected=df_inner_merged[df_inner_merged.Date ==20210224]" + ] + }, + { + "cell_type": "code", + "source": [ + "final_data_peak_detection.count()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9jF7yV5INeiO", + "outputId": "b143be33-003b-49dc-ebcb-f0a645b611dd" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DateTime 431163\n", + "MergeDateTime 431163\n", + "raw_pressure 431163\n", + "ret_pressure 431163\n", + "pulse_flank 431163\n", + "state 431163\n", + "wave_type 431163\n", + "low_time 431163\n", + "baseline 431163\n", + "highest_peak 431163\n", + "peakvalue 431163\n", + "high_pressure 431163\n", + "rumination 431163\n", + "file 431163\n", + "Cow 431163\n", + "Date 431163\n", + "Ruminating 431163\n", + "Eating 431163\n", + "Sleeping 431163\n", + "Drinking 431163\n", + "Urinate 431163\n", + "Moo 431163\n", + "CodeBehaviour 431163\n", + "Lying 431163\n", + "Resting 431163\n", + "dtype: int64" + ] + }, + "metadata": {}, + "execution_count": 20 + } + ] + }, + { + "cell_type": "code", + "source": [ + "np.unique(final_data_peak_detection['Cow'], return_counts=True)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "D_Im2-OSNYdr", + "outputId": "40650dd5-c1aa-470a-fd2a-62b06f8017ab" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(array([ 7, 8, 21, 25]), array([134790, 106815, 94803, 94755]))" + ] + }, + "metadata": {}, + "execution_count": 18 + } + ] + }, + { + "cell_type": "code", + "source": [ + "np.unique(final_data_peak_detection['Sleeping'], return_counts=True)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tYddSx2gJZy-", + "outputId": "1fecf56f-fa6d-4dfa-c521-48f91e43fc94" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(array([0, 3]), array([427769, 3394]))" + ] + }, + "metadata": {}, + "execution_count": 47 + } + ] + }, + { + "cell_type": "code", + "source": [ + "final_data_rum= final_data_peak_detection[final_data_peak_detection.Ruminating==1]\n", + "final_data_eat= final_data_peak_detection[final_data_peak_detection.Eating==4]\n", + "final_data_rest= final_data_peak_detection[final_data_peak_detection.Resting==1]\n", + "final_data_sleep= final_data_peak_detection[final_data_peak_detection.Sleeping==3]\n", + "\n", + "\n", + "print(\"Time between contraction cycles during rumination:\")\n", + "print(\"mean:\"+str(final_data_rum['low_time'].mean()))\n", + "print(\"std:\"+str(final_data_rum['low_time'].std()))\n", + "print(\"median:\"+str(final_data_rum['low_time'].median()))\n", + "print(\"iqr:\"+ str(iqr(final_data_rum['low_time']))+\"\\n\")\n", + "\n", + "print(\"Time between contraction cycles during eating:\")\n", + "print(\"mean:\"+str(final_data_eat['low_time'].mean()))\n", + "print(\"std:\"+str(final_data_eat['low_time'].std()))\n", + "print(\"median:\"+str(final_data_eat['low_time'].median()))\n", + "print(\"iqr:\"+ str(iqr(final_data_eat['low_time']))+\"\\n\")\n", + "\n", + "print(\"Time between contraction cycles during sleeping:\")\n", + "print(\"mean:\"+str(final_data_sleep['low_time'].mean()))\n", + "print(\"std:\"+str(final_data_sleep['low_time'].std()))\n", + "print(\"median:\"+str(final_data_sleep['low_time'].median()))\n", + "print(\"iqr:\"+ str(iqr(final_data_sleep['low_time']))+\"\\n\")\n", + "\n", + "print(\"Time between contraction cycles during resting:\")\n", + "print(\"mean:\"+str(final_data_rest['low_time'].mean()))\n", + "print(\"std:\"+str(final_data_rest['low_time'].std()))\n", + "print(\"median:\"+str(final_data_rest['low_time'].median()))\n", + "print(\"iqr:\"+ str(iqr(final_data_rest['low_time']))+\"\\n\")\n", + "\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "m65zhu1QY3F-", + "outputId": "07d175b5-29c2-4a83-938b-d212f650bbf7" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Time between contraction cycles during rumination:\n", + "mean:50.19786760455993\n", + "std:12.688519054375197\n", + "median:50.5\n", + "iqr:14.0\n", + "\n", + "Time between contraction cycles during eating:\n", + "mean:37.92706353220209\n", + "std:18.693595015809986\n", + "median:35.0\n", + "iqr:16.0\n", + "\n", + "Time between contraction cycles during sleeping:\n", + "mean:50.19549204478491\n", + "std:27.07780997084258\n", + "median:44.0\n", + "iqr:13.0\n", + "\n", + "Time between contraction cycles during resting:\n", + "mean:42.375882325186375\n", + "std:21.52999407933072\n", + "median:38.5\n", + "iqr:17.0\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "VR_TZdz0BqdV" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "sns.boxplot(x=\"behaviour\", y=\"low_time\",orient='v', data=final_data_peak_detection_corrected, showfliers=False)\n", + "plt.xlabel('Behaviour')\n", + "plt.ylabel('Time interval between contractions (s)')\n", + "plt.show()" + ], + "metadata": { + "id": "jmon--YHBna4" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "98giER1N353M" + }, + "source": [ + "## Confusion matrix and classification report" + ] + }, + { + "cell_type": "code", + "source": [ + "results = confusion_matrix(final_data_peak_detection['Ruminating'], final_data_peak_detection['rumination'])\n", + "\n", + "print('Confusion matrix peak_detection_algorithm for rumination')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(final_data_peak_detection['Ruminating'], final_data_peak_detection['rumination']))\n", + "print('Report : ')\n", + "print(classification_report(final_data_peak_detection['Ruminating'], final_data_peak_detection['rumination']))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "lGTooBCDqinL", + "outputId": "d33c044c-b49b-49cd-f6b8-40581961c5e8" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Confusion matrix peak_detection_algorithm for rumination\n", + "[[276845 73001]\n", + " [ 22023 59294]]\n", + "Accuracy Score : 0.779610031473016\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0.0 0.93 0.79 0.85 349846\n", + " 1.0 0.45 0.73 0.56 81317\n", + "\n", + " accuracy 0.78 431163\n", + " macro avg 0.69 0.76 0.70 431163\n", + "weighted avg 0.84 0.78 0.80 431163\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "results = confusion_matrix(final_data_peak_detection_selected['Ruminating'], final_data_peak_detection_selected['rumination'])\n", + "\n", + "print('Confusion matrix peak_detection_algorithm for rumination: file10')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(final_data_peak_detection_selected['Ruminating'], final_data_peak_detection_selected['rumination']))\n", + "print('Report : ')\n", + "print(classification_report(final_data_peak_detection_selected['Ruminating'], final_data_peak_detection_selected['rumination']))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qN6zPOYP85oZ", + "outputId": "34b42537-fecc-41a3-d91a-dbfb6315e88b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Confusion matrix peak_detection_algorithm for rumination: file10\n", + "[[29889 878]\n", + " [ 672 11754]]\n", + "Accuracy Score : 0.9641145555992869\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0.0 0.98 0.97 0.97 30767\n", + " 1.0 0.93 0.95 0.94 12426\n", + "\n", + " accuracy 0.96 43193\n", + " macro avg 0.95 0.96 0.96 43193\n", + "weighted avg 0.96 0.96 0.96 43193\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "y67CSm0le5xk" + }, + "source": [ + "# RandomForestAlgorithm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jvus0EKfzBnU" + }, + "source": [ + "## Features" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "slII8zfOzPU4" + }, + "outputs": [], + "source": [ + "def preprocess_feature_file(file, sep = \",\"):\n", + " #read the file and make sure to change NaN with 0.0\n", + " pressure_df = pd.read_csv(file, sep, decimal=\".\")[['DateTime','MergeDateTime', 'Pressure','Temperature']].dropna()\n", + " # normalisation\n", + " pressure_df[\"Pressure\"] /= np.max(np.abs(pressure_df[\"Pressure\"].values),axis=0)\n", + " pressure_df['MergeDateTime']=pd.to_datetime(pressure_df['MergeDateTime'],format=\"%Y-%m-%d %H:%M:%S\")\n", + " # define columns\n", + " #pressure_df[\"DateTime\"] = pressure_df[\"DateTime\"].astype(str).str[:-6].str.replace('T', ' ', regex=False).astype(str)\n", + " pressure_df[\"file_index\"] = pressure_df.index\n", + " pressure_df[\"feature_filename\"] = file\n", + " return pressure_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-8hzA73pyKku", + "outputId": "c0c3e3f8-0986-46b3-f38b-10cb1af9fdcb" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210121.csv\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: FutureWarning: In a future version of pandas all arguments of read_csv except for the argument 'filepath_or_buffer' will be keyword-only\n", + " \"\"\"\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210122.csv\n", + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210119.csv\n", + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210118.csv\n", + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210208.csv\n", + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210205.csv\n", + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210202.csv\n", + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210211.csv\n", + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210219.csv\n", + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210224.csv\n", + "Done processing\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/bolus/bolus20210225.csv\n", + "Done processing\n" + ] + } + ], + "source": [ + "all_feature_files = glob.glob(bolus_path + \"*.csv\")\n", + "list_feature_df = []\n", + "for filename in all_feature_files:\n", + " print(\"Started processing: \" + filename)\n", + " df = preprocess_feature_file(filename, sep=\",\")\n", + " list_feature_df.append(df)\n", + " print(\"Done processing\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "U2OA7lisyx06" + }, + "outputs": [], + "source": [ + "df_concat_features = pd.concat(list_feature_df, axis=0, ignore_index=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fZbtZrhhzHA9" + }, + "source": [ + "## Labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Vu4FHa6I_I2a" + }, + "outputs": [], + "source": [ + "WIN_SIZE = 240\n", + "WIN_OVERLAP = 1\n", + "BEHAVIOUR_1= 'rumination_video'\n", + "BEHAVIOUR_2= 'eating_video'\n", + "BEHAVIOUR_3= 'drinking_video'\n", + "BEHAVIOUR_4= 'sleeping_video'\n", + "BEHAVIOUR_5= 'urinating_video'\n", + "BEHAVIOUR_6= 'mooing_video'\n", + "BEHAVIOUR_7= 'resting_video'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "8LxhFX5Vzd74" + }, + "outputs": [], + "source": [ + "def preprocess_label_file(file, window_size):\n", + " # read the file\n", + " df_raw = pd.read_csv(file, header=0, sep = \",\", decimal=\".\", nrows = 50000)[['Cow','Date','MergeDateTime','Ruminating','Eating','Sleeping','Drinking','Urinate','Moo', 'Lying','CodeBehaviour']].dropna()\n", + " # make a copy without ' ' in specific code\n", + " df=df_raw\n", + " # make extra columns\n", + " df['rumination_video'] = df['Ruminating'].apply(lambda x: 1 if x == 8 else 0)\n", + " df['eating_video'] = df['Eating'].apply(lambda x: 1 if x == 4 else 0)\n", + " df['sleeping_video'] = df['Sleeping'].apply(lambda x: 1 if x == 3 else 0)\n", + " df['urinating_video'] = df['Urinate'].apply(lambda x: 1 if x == 13 else 0)\n", + " df['drinking_video'] = df['Drinking'].apply(lambda x: 1 if x == 5 else 0)\n", + " df['mooing_video'] = df['Moo'].apply(lambda x: 1 if x == 17 else 0)\n", + " df['resting_video'] = df['Lying'].apply(lambda x: 1 if (x == 21 or x== 20) else 0)\n", + " df['MergeDateTime']=pd.to_datetime(df['MergeDateTime'],format=\"%Y-%m-%d %H:%M:%S\")\n", + "\n", + " #create one colum for behaviour\n", + " df_beh= df\n", + " df_beh[\"eating_video\"].replace({1:2}, inplace= True)\n", + " df_beh[\"drinking_video\"].replace({1:3}, inplace= True)\n", + " df_beh[\"sleeping_video\"].replace({1:4}, inplace= True)\n", + " df_beh[\"urinating_video\"].replace({1:5}, inplace= True)\n", + " df_beh[\"mooing_video\"].replace({1:6}, inplace= True)\n", + " df_beh[\"resting_video\"].replace({1:7}, inplace= True)\n", + "\n", + " df['behaviour']=df_beh['rumination_video']+df_beh['eating_video']+df_beh['resting_video']+df_beh['drinking_video']+df_beh['sleeping_video']+df_beh['mooing_video']+df_beh['urinating_video']\n", + " # most frequent behaviour in time frame\n", + " df['label_filename'] = file\n", + " df['behaviour'] = df['behaviour'].astype(str)\n", + " df['rolling_behaviour_backward'] = df.behaviour.rolling(window = window_size, min_periods=0).apply(lambda x: mode(x)[0])\n", + " df['rolling_rumination_backward'] = df['rolling_behaviour_backward'].apply(lambda x: 1 if x == 1 else 0)\n", + " df['rolling_eating_backward'] = df['rolling_behaviour_backward'].apply(lambda x: 1 if x == 2 else 0)\n", + " df['rolling_resting_backward'] = df['rolling_behaviour_backward'].apply(lambda x: 1 if x == 7 else 0)\n", + " df['rolling_sleeping_backward'] = df['rolling_behaviour_backward'].apply(lambda x: 1 if x == 4 else 0)\n", + " df['rolling_drinking_backward'] = df['rolling_behaviour_backward'].apply(lambda x: 1 if x == 3 else 0)\n", + " # behaviour existing in time frame\n", + " #df['was_ruminating_backward'] = df.code_1_5.rolling(window = window_size, min_periods=0).apply(lambda x:1 if 1.0 in x else 0)\n", + " #df['was_eating_backward'] = df.code_1_5.rolling(window = window_size, min_periods=0).apply(lambda x:1 if 4.0 in x else 0)\n", + " #df['was_resting_backward'] = df.code_1_5.rolling(window = window_size, min_periods=0).apply(lambda x:1 if 2.0 in x else 0)\n", + " #df['was_sleeping_backward'] = df.code_1_5.rolling(window = window_size, min_periods=0).apply(lambda x:1 if 3.0 in x else 0)\n", + " #df['was_drinking_backward'] = df.code_1_5.rolling(window = window_size, min_periods=0).apply(lambda x:1 if 5.0 in x else 0)\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WRsaBVE8IXny", + "outputId": "39e48274-5064-4885-947f-f61091df8d45" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210121a.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210121a.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210122.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210122.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210121b.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210121b.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210208.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210208.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210205.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210205.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210118.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210118.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210211.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210211.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210202.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210202.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210119.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210119.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210219.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210219.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210224.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210224.csv\n", + "Started processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210225.csv\n", + "Done processing: /content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Josje/data/out/video/video20210225.csv\n" + ] + } + ], + "source": [ + "all_label_files = glob.glob(video_path + \"*.csv\")\n", + "list_label_df = []\n", + "for filename in all_label_files:\n", + " print(\"Started processing: \" + filename)\n", + " df = preprocess_label_file(filename, WIN_SIZE)\n", + " list_label_df.append(df)\n", + " print(\"Done processing: \" + filename)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "eDYYWCkyg6xS" + }, + "outputs": [], + "source": [ + "df_concat_labels = pd.concat(list_label_df, axis=0, ignore_index=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ab3Rf9kXTPJu" + }, + "source": [ + "## Merge" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "q8d9jc58AjAk" + }, + "outputs": [], + "source": [ + "df_merged = pd.merge(df_concat_features, df_concat_labels, on='MergeDateTime', how='inner')\n", + "df_merged_corr = df_merged[df_merged.DateTime <='2021-02-24 22:30:00']" + ] + }, + { + "cell_type": "code", + "source": [ + "df_merged_corr.count()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ESeeiLd41qPu", + "outputId": "57cd4bdd-466e-4710-ac83-8f92012024ae" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DateTime 431163\n", + "MergeDateTime 431163\n", + "Pressure 431163\n", + "Temperature 431163\n", + "file_index 431163\n", + "feature_filename 431163\n", + "Cow 431163\n", + "Date 431163\n", + "Ruminating 431163\n", + "Eating 431163\n", + "Sleeping 431163\n", + "Drinking 431163\n", + "Urinate 431163\n", + "Moo 431163\n", + "Lying 431163\n", + "CodeBehaviour 431163\n", + "rumination_video 431163\n", + "eating_video 431163\n", + "sleeping_video 431163\n", + "urinating_video 431163\n", + "drinking_video 431163\n", + "mooing_video 431163\n", + "resting_video 431163\n", + "behaviour 431163\n", + "label_filename 431163\n", + "rolling_behaviour_backward 431163\n", + "rolling_rumination_backward 431163\n", + "rolling_eating_backward 431163\n", + "rolling_resting_backward 431163\n", + "rolling_sleeping_backward 431163\n", + "rolling_drinking_backward 431163\n", + "dtype: int64" + ] + }, + "metadata": {}, + "execution_count": 17 + } + ] + }, + { + "cell_type": "code", + "source": [ + "df_merged_corr['eating_video'] = df_merged_corr['eating_video'].replace([2],1)\n", + "df_merged_corr['sleeping_video'] = df_merged_corr['sleeping_video'].replace([4],1)\n", + "df_merged_corr['drinking_video'] = df_merged_corr['drinking_video'].replace([3],1)\n", + "df_merged_corr['urinating_video'] = df_merged_corr['urinating_video'].replace([5],1)\n", + "df_merged_corr['mooing_video'] = df_merged_corr['mooing_video'].replace([6],1)\n", + "df_merged_corr['resting_video'] = df_merged_corr['resting_video'].replace([7],1)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vofP9a7Xf6Nu", + "outputId": "2ac48937-7de5-4ced-84ce-52fbfa99358e" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " \"\"\"Entry point for launching an IPython kernel.\n", + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " \n", + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " This is separate from the ipykernel package so we can avoid doing imports until\n", + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " after removing the cwd from sys.path.\n", + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " \"\"\"\n", + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:6: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " \n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "file_merged='/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Miel/data/out/.csv'\n", + "df_merged.to_csv(file_merged)" + ], + "metadata": { + "id": "VKGVfyOS-4yq", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 328 + }, + "outputId": "1d63fcac-63ca-45bd-d33e-612798095f4c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "error", + "ename": "FileNotFoundError", + "evalue": "ignored", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mfile_merged\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Miel/data/out/.csv'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdf_merged\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile_merged\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mto_csv\u001b[0;34m(self, path_or_buf, sep, na_rep, float_format, columns, header, index, index_label, mode, encoding, compression, quoting, quotechar, line_terminator, chunksize, date_format, doublequote, escapechar, decimal, errors, storage_options)\u001b[0m\n\u001b[1;32m 3480\u001b[0m \u001b[0mdoublequote\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdoublequote\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3481\u001b[0m \u001b[0mescapechar\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mescapechar\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3482\u001b[0;31m \u001b[0mstorage_options\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstorage_options\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3483\u001b[0m )\n\u001b[1;32m 3484\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pandas/io/formats/format.py\u001b[0m in \u001b[0;36mto_csv\u001b[0;34m(self, path_or_buf, encoding, sep, columns, index_label, mode, compression, quoting, quotechar, line_terminator, chunksize, date_format, doublequote, escapechar, errors, storage_options)\u001b[0m\n\u001b[1;32m 1103\u001b[0m \u001b[0mformatter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfmt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1104\u001b[0m )\n\u001b[0;32m-> 1105\u001b[0;31m \u001b[0mcsv_formatter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1106\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1107\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcreated_buffer\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pandas/io/formats/csvs.py\u001b[0m in \u001b[0;36msave\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 241\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 242\u001b[0m \u001b[0mcompression\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompression\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 243\u001b[0;31m \u001b[0mstorage_options\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstorage_options\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 244\u001b[0m ) as handles:\n\u001b[1;32m 245\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pandas/io/common.py\u001b[0m in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 705\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mioargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 706\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 707\u001b[0;31m \u001b[0mnewline\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 708\u001b[0m )\n\u001b[1;32m 709\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/SensorBolus/Miel/data/out/.csv'" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QuvEv0Ntxog9" + }, + "source": [ + "## Sliding windows" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "E7mzzmfggehe" + }, + "outputs": [], + "source": [ + "def np_ffill(arr, axis):\n", + " idx_shape = tuple([slice(None)] + [np.newaxis] * (len(arr.shape) - axis - 1))\n", + " idx = np.where(~np.isnan(arr), np.arange(arr.shape[axis])[idx_shape], 0)\n", + " np.maximum.accumulate(idx, axis=axis, out=idx)\n", + " slc = [np.arange(k)[tuple([slice(None) if dim==i else np.newaxis\n", + " for dim in range(len(arr.shape))])]\n", + " for i, k in enumerate(arr.shape)]\n", + " slc[axis] = idx\n", + " return arr[tuple(slc)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "mCYd4fmFTQAB" + }, + "outputs": [], + "source": [ + "def extract_sliding_windows(df, label_col_1, label_col_2, label_col_3, label_col_4, label_col_5, label_col_6, label_col_7, pressure_col, id_col, sub_window_size, chopped):\n", + " series = []\n", + " max_time = len(df)\n", + " pressure_index = df.columns.get_loc(pressure_col)\n", + " for i in range(max_time-sub_window_size+1):\n", + " if df[\"file_index\"][i] % chopped == 0.0:\n", + " serie = df[pressure_col][i:sub_window_size+i-1].values\n", + " forward_serie = np_ffill(serie, 0)\n", + " backfill_serie = np_ffill(forward_serie[::-1], 0)[::-1]\n", + " id_arr = df[id_col][i:sub_window_size+i-1].values\n", + " id = id_arr[::-1][0]\n", + " label_arr_1 = df[label_col_1][i:sub_window_size+i-1].values\n", + " label_1 = label_arr_1[::-1][0]\n", + " label_arr_2 = df[label_col_2][i:sub_window_size+i-1].values\n", + " label_2 = label_arr_2[::-1][0]\n", + " label_arr_3 = df[label_col_3][i:sub_window_size+i-1].values\n", + " label_3 = label_arr_3[::-1][0]\n", + " label_arr_4 = df[label_col_4][i:sub_window_size+i-1].values\n", + " label_4 = label_arr_4[::-1][0]\n", + " label_arr_5 = df[label_col_5][i:sub_window_size+i-1].values\n", + " label_5 = label_arr_5[::-1][0]\n", + " label_arr_6 = df[label_col_6][i:sub_window_size+i-1].values\n", + " label_6 = label_arr_6[::-1][0]\n", + " label_arr_7 = df[label_col_7][i:sub_window_size+i-1].values\n", + " label_7 = label_arr_7[::-1][0]\n", + " series.append((id, label_1, label_2, label_3, label_4, label_5, label_6, label_7, backfill_serie))\n", + " return np.vstack(series)" + ] + }, + { + "cell_type": "code", + "source": [ + "result_np = extract_sliding_windows(df_merged, BEHAVIOUR_1, BEHAVIOUR_2, BEHAVIOUR_3, BEHAVIOUR_4, BEHAVIOUR_5, BEHAVIOUR_6, BEHAVIOUR_7, \"Pressure\", \"Cow\",WIN_SIZE, WIN_OVERLAP)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1kKRE5vAVHGW", + "outputId": "30d597db-2ea0-4374-db72-bbb8ef141743" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.7/dist-packages/numpy/core/shape_base.py:121: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n", + " ary = asanyarray(ary)\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nPd5OWZGdXFY", + "outputId": "8282fe6d-d3ec-463f-bd23-56bd20d862ba" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.7/dist-packages/numpy/core/shape_base.py:121: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n", + " ary = asanyarray(ary)\n" + ] + } + ], + "source": [ + "result_np_1 = extract_sliding_windows(df_merged_corr, BEHAVIOUR_1, BEHAVIOUR_2, BEHAVIOUR_3, BEHAVIOUR_4, BEHAVIOUR_5, BEHAVIOUR_6, BEHAVIOUR_7, \"Pressure\", \"Cow\",WIN_SIZE, WIN_OVERLAP)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Y4ipE_kPw4FX" + }, + "source": [ + "## Signal processing" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XxoUSDntMJ6Q" + }, + "source": [ + "Adopted from http://nbviewer.ipython.org/github/demotu/BMC/blob/master/notebooks/DetectPeaks.ipynb\n", + "\n", + "Thank you Marcos Duarte" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "WOyUZBM5cOf7" + }, + "outputs": [], + "source": [ + "def detect_peaks(x, mph=None, mpd=1, threshold=0, edge='rising',\n", + " kpsh=False, valley=False, show=False, ax=None):\n", + "\n", + " \"\"\"Detect peaks in data based on their amplitude and other features.\n", + "\n", + " Parameters\n", + " ----------\n", + " x : 1D array_like\n", + " data.\n", + " mph : {None, number}, optional (default = None)\n", + " detect peaks that are greater than minimum peak height.\n", + " mpd : positive integer, optional (default = 1)\n", + " detect peaks that are at least separated by minimum peak distance (in\n", + " number of data).\n", + " threshold : positive number, optional (default = 0)\n", + " detect peaks (valleys) that are greater (smaller) than `threshold`\n", + " in relation to their immediate neighbors.\n", + " edge : {None, 'rising', 'falling', 'both'}, optional (default = 'rising')\n", + " for a flat peak, keep only the rising edge ('rising'), only the\n", + " falling edge ('falling'), both edges ('both'), or don't detect a\n", + " flat peak (None).\n", + " kpsh : bool, optional (default = False)\n", + " keep peaks with same height even if they are closer than `mpd`.\n", + " valley : bool, optional (default = False)\n", + " if True (1), detect valleys (local minima) instead of peaks.\n", + " show : bool, optional (default = False)\n", + " if True (1), plot data in matplotlib figure.\n", + " ax : a matplotlib.axes.Axes instance, optional (default = None).\n", + "\n", + " Returns\n", + " -------\n", + " ind : 1D array_like\n", + " indeces of the peaks in `x`.\n", + "\n", + " Notes\n", + " -----\n", + " The detection of valleys instead of peaks is performed internally by simply\n", + " negating the data: `ind_valleys = detect_peaks(-x)`\n", + "\n", + " The function can handle NaN's\n", + "\n", + " See this IPython Notebook [1]_.\n", + "\n", + " References\n", + " ----------\n", + " .. [1] http://nbviewer.ipython.org/github/demotu/BMC/blob/master/notebooks/DetectPeaks.ipynb\n", + "\n", + " Examples\n", + " --------\n", + " >>> from detect_peaks import detect_peaks\n", + " >>> x = np.random.randn(100)\n", + " >>> x[60:81] = np.nan\n", + " >>> # detect all peaks and plot data\n", + " >>> ind = detect_peaks(x, show=True)\n", + " >>> print(ind)\n", + "\n", + " >>> x = np.sin(2*np.pi*5*np.linspace(0, 1, 200)) + np.random.randn(200)/5\n", + " >>> # set minimum peak height = 0 and minimum peak distance = 20\n", + " >>> detect_peaks(x, mph=0, mpd=20, show=True)\n", + "\n", + " >>> x = [0, 1, 0, 2, 0, 3, 0, 2, 0, 1, 0]\n", + " >>> # set minimum peak distance = 2\n", + " >>> detect_peaks(x, mpd=2, show=True)\n", + "\n", + " >>> x = np.sin(2*np.pi*5*np.linspace(0, 1, 200)) + np.random.randn(200)/5\n", + " >>> # detection of valleys instead of peaks\n", + " >>> detect_peaks(x, mph=0, mpd=20, valley=True, show=True)\n", + "\n", + " >>> x = [0, 1, 1, 0, 1, 1, 0]\n", + " >>> # detect both edges\n", + " >>> detect_peaks(x, edge='both', show=True)\n", + "\n", + " >>> x = [-2, 1, -2, 2, 1, 1, 3, 0]\n", + " >>> # set threshold = 2\n", + " >>> detect_peaks(x, threshold = 2, show=True)\n", + " \"\"\"\n", + "\n", + " x = np.atleast_1d(x).astype('float64')\n", + " if x.size < 3:\n", + " return np.array([], dtype=int)\n", + " if valley:\n", + " x = -x\n", + " # find indices of all peaks\n", + " dx = x[1:] - x[:-1]\n", + " # handle NaN's\n", + " indnan = np.where(np.isnan(x))[0]\n", + " if indnan.size:\n", + " x[indnan] = np.inf\n", + " dx[np.where(np.isnan(dx))[0]] = np.inf\n", + " ine, ire, ife = np.array([[], [], []], dtype=int)\n", + " if not edge:\n", + " ine = np.where((np.hstack((dx, 0)) < 0) & (np.hstack((0, dx)) > 0))[0]\n", + " else:\n", + " if edge.lower() in ['rising', 'both']:\n", + " ire = np.where((np.hstack((dx, 0)) <= 0) & (np.hstack((0, dx)) > 0))[0]\n", + " if edge.lower() in ['falling', 'both']:\n", + " ife = np.where((np.hstack((dx, 0)) < 0) & (np.hstack((0, dx)) >= 0))[0]\n", + " ind = np.unique(np.hstack((ine, ire, ife)))\n", + " # handle NaN's\n", + " if ind.size and indnan.size:\n", + " # NaN's and values close to NaN's cannot be peaks\n", + " ind = ind[np.in1d(ind, np.unique(np.hstack((indnan, indnan-1, indnan+1))), invert=True)]\n", + " # first and last values of x cannot be peaks\n", + " if ind.size and ind[0] == 0:\n", + " ind = ind[1:]\n", + " if ind.size and ind[-1] == x.size-1:\n", + " ind = ind[:-1]\n", + " # remove peaks < minimum peak height\n", + " if ind.size and mph is not None:\n", + " ind = ind[x[ind] >= mph]\n", + " # remove peaks - neighbors < threshold\n", + " if ind.size and threshold > 0:\n", + " dx = np.min(np.vstack([x[ind]-x[ind-1], x[ind]-x[ind+1]]), axis=0)\n", + " ind = np.delete(ind, np.where(dx < threshold)[0])\n", + " # detect small peaks closer than minimum peak distance\n", + " if ind.size and mpd > 1:\n", + " ind = ind[np.argsort(x[ind])][::-1] # sort ind by peak height\n", + " idel = np.zeros(ind.size, dtype=bool)\n", + " for i in range(ind.size):\n", + " if not idel[i]:\n", + " # keep peaks with the same height if kpsh is True\n", + " idel = idel | (ind >= ind[i] - mpd) & (ind <= ind[i] + mpd) \\\n", + " & (x[ind[i]] > x[ind] if kpsh else True)\n", + " idel[i] = 0 # Keep current peak\n", + " # remove the small peaks and sort back the indices by their occurrence\n", + " ind = np.sort(ind[~idel])\n", + "\n", + " if show:\n", + " if indnan.size:\n", + " x[indnan] = np.nan\n", + " if valley:\n", + " x = -x\n", + " _plot(x, mph, mpd, threshold, edge, valley, ax, ind)\n", + "\n", + " return ind" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "gu1Oav0mWT3x" + }, + "outputs": [], + "source": [ + "def get_values(y_values, T, N, f_s):\n", + " y_values = y_values\n", + " x_values = [(1/f_s) * kk for kk in range(0,len(y_values))]\n", + " return x_values, y_values\n", + "\n", + "def get_fft_values(y_values, T, N, f_s):\n", + " f_values = np.linspace(0.0, 1.0/(2.0*T), N//2)\n", + " fft_values_ = fft(y_values)\n", + " fft_values = 2.0/N * np.abs(fft_values_[0:N//2])\n", + " return f_values, fft_values\n", + "\n", + "def get_psd_values(y_values, T, N, f_s):\n", + " f_values, psd_values = welch(y_values, fs=f_s)\n", + " return f_values, psd_values\n", + "\n", + "def autocorr(x):\n", + " result = np.correlate(x, x, mode='full')\n", + " return result[len(result)//2:]\n", + "\n", + "def get_autocorr_values(y_values, T, N, f_s):\n", + " autocorr_values = autocorr(y_values)\n", + " x_values = np.array([T * jj for jj in range(0, N)])\n", + " return x_values, autocorr_values\n", + "\n", + "def get_first_n_peaks(x,y,no_peaks=5):\n", + " x_, y_ = list(x), list(y)\n", + " if len(x_) >= no_peaks:\n", + " return x_[:no_peaks], y_[:no_peaks]\n", + " else:\n", + " missing_no_peaks = no_peaks-len(x_)\n", + " return x_ + [0]*missing_no_peaks, y_ + [0]*missing_no_peaks\n", + "\n", + "def get_features(x_values, y_values, mph):\n", + " indices_peaks = detect_peaks(y_values, mph=mph)\n", + " peaks_x, peaks_y = get_first_n_peaks(x_values[indices_peaks], y_values[indices_peaks])\n", + " return peaks_x + peaks_y\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4tUOn5cTs_xi" + }, + "outputs": [], + "source": [ + "def extract_features(dataset, T, N, f_s, denominator):\n", + " percentile = 5\n", + " list_of_features = []\n", + " for signal_no in range(0, len(dataset)):\n", + " if signal_no % 10000 == 0.0:\n", + " print(signal_no)\n", + " features = []\n", + " id = dataset[signal_no, 0]\n", + " label_1 = dataset[signal_no,1]\n", + " label_2 = dataset[signal_no,2]\n", + " label_3 = dataset[signal_no,3]\n", + " label_4 = dataset[signal_no,4]\n", + " label_5 = dataset[signal_no,5]\n", + " label_6 = dataset[signal_no,6]\n", + " label_7 = dataset[signal_no,7]\n", + " signal = dataset[signal_no,8]\n", + " signal_min = np.nanpercentile(signal, percentile)\n", + " signal_max = np.nanpercentile(signal, 100-percentile)\n", + " mph = 0\n", + " #create features\n", + " features += get_features(*get_psd_values(signal, T, N, f_s), mph)\n", + " features += get_features(*get_fft_values(signal, T, N, f_s), mph)\n", + " features += get_features(*get_autocorr_values(signal, T, N, f_s), mph)\n", + " list_of_features.append((label_1, label_2, label_3, label_4, label_5, label_6, label_7, id, features))\n", + " return np.vstack(list_of_features)" + ] + }, + { + "cell_type": "code", + "source": [ + " N = WIN_SIZE #samples\n", + " f_s = 2 #frequency\n", + " t_n = 0.5*N\n", + " T = t_n / N\n", + " sample_rate = 1 / f_s\n", + " denominator = 100" + ], + "metadata": { + "id": "HnTeu7H3Ks-a" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "signal_features_1= extract_features(result_np_1, T, N, f_s, denominator)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XuK3mUzAKw0_", + "outputId": "38daff06-7229-48c6-82e3-d1e961b028ad" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "0\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.7/dist-packages/scipy/signal/spectral.py:1966: UserWarning: nperseg = 256 is greater than input length = 239, using nperseg = 239\n", + " .format(nperseg, input_length))\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "10000\n", + "20000\n", + "30000\n", + "40000\n", + "50000\n", + "60000\n", + "70000\n", + "80000\n", + "90000\n", + "100000\n", + "110000\n", + "120000\n", + "130000\n", + "140000\n", + "150000\n", + "160000\n", + "170000\n", + "180000\n", + "190000\n", + "200000\n", + "210000\n", + "220000\n", + "230000\n", + "240000\n", + "250000\n", + "260000\n", + "270000\n", + "280000\n", + "290000\n", + "300000\n", + "310000\n", + "320000\n", + "330000\n", + "340000\n", + "350000\n", + "360000\n", + "370000\n", + "380000\n", + "390000\n", + "400000\n", + "410000\n", + "420000\n", + "430000\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.7/dist-packages/numpy/core/shape_base.py:121: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n", + " ary = asanyarray(ary)\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xdYju3T0U3zs" + }, + "source": [ + "# RandomForestAlgorithm Rumination" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GKVyOQwnw_0I" + }, + "outputs": [], + "source": [ + "BEHAVIOUR= 'rumination_video'" + ] + }, + { + "cell_type": "code", + "source": [ + "X_final = np.stack(signal_features_1[:,8], axis =0)" + ], + "metadata": { + "id": "F-sx9EwN3woU" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "m-WUxDbIt15t" + }, + "outputs": [], + "source": [ + "y_final = np.stack(signal_features_1[:,0], axis =0) # BEHAVIOUR_1= 'rumination_video'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "lCalRNXaFTEc" + }, + "outputs": [], + "source": [ + "# Split dataset into trainingsset (70%) and testset (30%)\n", + "X_train, X_test, y_train, y_test = train_test_split(X_final, y_final, test_size=0.3, random_state=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AJxQpu8vWp8X" + }, + "source": [ + "## Test settings Random Forest Algorithm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uyYDnrCqBXwe" + }, + "source": [ + "\n", + "### Test number of trees\n", + "Adopted from https://medium.com/all-things-ai/in-depth-parameter-tuning-for-random-forest-d67bb7e920d" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "8cnMf9BfBage", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "9b92aea3-acb1-4a79-c2e5-ad0ec8c96def" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1\n", + "2\n", + "4\n", + "8\n", + "16\n", + "32\n", + "64\n", + "100\n", + "200\n" + ] + } + ], + "source": [ + "n_estimators = [1, 2, 4, 8, 16, 32, 64, 100, 200]\n", + "train_results = []\n", + "test_results = []\n", + "for estimator in n_estimators:\n", + " print(estimator)\n", + " rf = RandomForestClassifier(n_estimators=estimator, max_features=\"sqrt\")\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(n_estimators, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(n_estimators, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"n_estimators\")\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 280 + }, + "id": "lMOw039ijsdD", + "outputId": "604dd3e2-26d1-4989-ac54-fe0efffb4e9f" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wY-eagU2DICj" + }, + "source": [ + "### Test max depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "etmoBtlTDJqq", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "fcada31a-3506-4531-a86e-8e1b2b6bde4c" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.0\n", + "2.0\n", + "3.0\n", + "4.0\n", + "5.0\n", + "6.0\n", + "7.0\n", + "8.0\n", + "9.0\n", + "10.0\n", + "11.0\n", + "12.0\n", + "13.0\n", + "14.0\n", + "15.0\n", + "16.0\n", + "17.0\n", + "18.0\n", + "19.0\n", + "20.0\n", + "21.0\n", + "22.0\n", + "23.0\n", + "24.0\n", + "25.0\n", + "26.0\n", + "27.0\n", + "28.0\n", + "29.0\n", + "30.0\n" + ] + } + ], + "source": [ + "max_depths = np.linspace(1, 30, 30, endpoint=True)\n", + "train_results = []\n", + "test_results = []\n", + "for max_depth in max_depths:\n", + " print(max_depth)\n", + " rf = RandomForestClassifier(max_depth=max_depth, max_features=\"sqrt\", n_estimators = 20)\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "VJbzCX1jDy6r", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "outputId": "f1f7a25f-7e99-4556-a202-0e4a67a07d52" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(max_depths, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(max_depths, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"Tree depth\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5Fuu1C-sH3ox" + }, + "source": [ + "## Selected RF\n", + "From the previous we select settings for our selected RF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "SsOXxGkMIHDK" + }, + "outputs": [], + "source": [ + "# Random Forest\n", + "rf = RandomForestClassifier(n_estimators=30, max_depth=30, max_features=\"sqrt\")\n", + "# Train Decision Tree Classifer\n", + "rf.fit(X_train,y_train)\n", + "\n", + "#Predict the response for test dataset\n", + "y_pred = rf.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fbJp0T8quEle" + }, + "source": [ + "## Confusion matrix and classification report" + ] + }, + { + "cell_type": "code", + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "3f4c83b5-d862-48d9-91a7-ec675174fd31", + "id": "NmXcEpqfhsDU" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: rumination_video\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[104822 77]\n", + " [ 927 23452]]\n", + "Accuracy Score : 0.9922337907455252\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 1.00 104899\n", + " 1 1.00 0.96 0.98 24379\n", + "\n", + " accuracy 0.99 129278\n", + " macro avg 0.99 0.98 0.99 129278\n", + "weighted avg 0.99 0.99 0.99 129278\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rgyuCsX-5K6r" + }, + "source": [ + "##Feature Importances" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "o75UISZPJfOu", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "b1e251b1-e676-44ea-d28b-d7846041ba8a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Feature: 0, Score: 0.02060\n", + "Feature: 1, Score: 0.03040\n", + "Feature: 2, Score: 0.03202\n", + "Feature: 3, Score: 0.03409\n", + "Feature: 4, Score: 0.04025\n", + "Feature: 5, Score: 0.08351\n", + "Feature: 6, Score: 0.07227\n", + "Feature: 7, Score: 0.06754\n", + "Feature: 8, Score: 0.06528\n", + "Feature: 9, Score: 0.06539\n", + "Feature: 10, Score: 0.02346\n", + "Feature: 11, Score: 0.02872\n", + "Feature: 12, Score: 0.02925\n", + "Feature: 13, Score: 0.02895\n", + "Feature: 14, Score: 0.03403\n", + "Feature: 15, Score: 0.08225\n", + "Feature: 16, Score: 0.06921\n", + "Feature: 17, Score: 0.06450\n", + "Feature: 18, Score: 0.06520\n", + "Feature: 19, Score: 0.06307\n", + "Feature: 20, Score: 0.00000\n", + "Feature: 21, Score: 0.00000\n", + "Feature: 22, Score: 0.00000\n", + "Feature: 23, Score: 0.00000\n", + "Feature: 24, Score: 0.00000\n", + "Feature: 25, Score: 0.00000\n", + "Feature: 26, Score: 0.00000\n", + "Feature: 27, Score: 0.00000\n", + "Feature: 28, Score: 0.00000\n", + "Feature: 29, Score: 0.00000\n" + ] + } + ], + "source": [ + "# feature importance\n", + "model = rf\n", + "importance = model.feature_importances_\n", + "# summarize feature importance\n", + "for i,v in enumerate(importance):\n", + "\tprint('Feature: %0d, Score: %.5f' % (i,v))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "u98YWPj95v3o" + }, + "source": [ + "# Stratified cross validation rumination" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "T8ilE754VkTq", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "ac1d63a7-d3b0-4c69-f906-68aed97100b5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Windows size is 120.0 seconds with overlap 0.5 seconds\n", + "[[69873 49]\n", + " [ 789 15474]]\n", + "Accuracy for the fold no. 1 on the test set: 0.9902767302894935\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 0.99 69922\n", + " 1 1.00 0.95 0.97 16263\n", + "\n", + " accuracy 0.99 86185\n", + " macro avg 0.99 0.98 0.98 86185\n", + "weighted avg 0.99 0.99 0.99 86185\n", + "\n", + "Windows size is 120.0 seconds with overlap 0.5 seconds\n", + "[[69859 63]\n", + " [ 770 15493]]\n", + "Accuracy for the fold no. 2 on the test set: 0.9903347450252364\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 0.99 69922\n", + " 1 1.00 0.95 0.97 16263\n", + "\n", + " accuracy 0.99 86185\n", + " macro avg 0.99 0.98 0.98 86185\n", + "weighted avg 0.99 0.99 0.99 86185\n", + "\n", + "Windows size is 120.0 seconds with overlap 0.5 seconds\n", + "[[69868 54]\n", + " [ 791 15472]]\n", + "Accuracy for the fold no. 3 on the test set: 0.9901955096594535\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 0.99 69922\n", + " 1 1.00 0.95 0.97 16263\n", + "\n", + " accuracy 0.99 86185\n", + " macro avg 0.99 0.98 0.98 86185\n", + "weighted avg 0.99 0.99 0.99 86185\n", + "\n", + "Windows size is 120.0 seconds with overlap 0.5 seconds\n", + "[[69880 41]\n", + " [ 848 15416]]\n", + "Accuracy for the fold no. 4 on the test set: 0.9896849799849161\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 0.99 69921\n", + " 1 1.00 0.95 0.97 16264\n", + "\n", + " accuracy 0.99 86185\n", + " macro avg 0.99 0.97 0.98 86185\n", + "weighted avg 0.99 0.99 0.99 86185\n", + "\n", + "Windows size is 120.0 seconds with overlap 0.5 seconds\n", + "[[69860 61]\n", + " [ 797 15466]]\n", + "Accuracy for the fold no. 5 on the test set: 0.9900445558340295\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 0.99 69921\n", + " 1 1.00 0.95 0.97 16263\n", + "\n", + " accuracy 0.99 86184\n", + " macro avg 0.99 0.98 0.98 86184\n", + "weighted avg 0.99 0.99 0.99 86184\n", + "\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import StratifiedKFold\n", + "rf = RandomForestClassifier(n_estimators=25, max_depth=25, max_features=\"sqrt\")\n", + "skf = StratifiedKFold(n_splits=5, random_state=None, shuffle=True)\n", + "i=1\n", + "\n", + "for train_index, test_index in skf.split(X_final, y_final):\n", + " X_train, X_test = X_final[train_index], X_final[test_index]\n", + " y_train, y_test = y_final[train_index], y_final[test_index]\n", + " rf.fit(X_train,y_train)\n", + "# cross_validate also allows to specify metrics which you want to see\n", + " print (\"Windows size is \"+ str(WIN_SIZE/2)+\" seconds with overlap \"+ str(WIN_OVERLAP/2)+ \" seconds\")\n", + " print(confusion_matrix(y_test,rf.predict(X_test)))\n", + " print(f\"Accuracy for the fold no. {i} on the test set: {accuracy_score(y_test, rf.predict(X_test))}\")\n", + " print('Report : ')\n", + " print(classification_report(y_test, rf.predict(X_test)))\n", + " i += 1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nNJvh0c25_1p" + }, + "source": [ + "# Leave-out-one-animal rumination" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "8TrSfLzaWRI2" + }, + "outputs": [], + "source": [ + "# Choose cow to leave out 7; 8; 21; 84.0\n", + "COW_NUMBER= 21" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ylXCsfbD_QIW" + }, + "outputs": [], + "source": [ + "# Choose cow to leave out 7; 8; 21; 84.0\n", + "COW_NUMBER= 7" + ] + }, + { + "cell_type": "code", + "source": [ + "# Choose cow to leave out 7; 8; 21; 84.0\n", + "COW_NUMBER= 8" + ], + "metadata": { + "id": "3i-q64WnBEFG" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Choose cow to leave out 7; 8; 21; 84.0\n", + "COW_NUMBER= 25" + ], + "metadata": { + "id": "TL3nm6AbBXKt" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tHYXhRqQMC6n" + }, + "outputs": [], + "source": [ + "def choose_cow_to_leave_out(COW_NUMBER):\n", + " result_train = np.stack(signal_features_1[signal_features_1[:,6] != COW_NUMBER], axis =0)\n", + " result_test = np.stack(signal_features_1[signal_features_1[:,6] == COW_NUMBER], axis =0)\n", + " return result_test, result_train" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "5qsidGLzPXRA" + }, + "outputs": [], + "source": [ + "result_test, result_train = choose_cow_to_leave_out(COW_NUMBER)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "d_DKAeBgIomV" + }, + "outputs": [], + "source": [ + "#leave one cow out\n", + "y_train = np.stack(result_train[:,0], axis =0)\n", + "y_test = np.stack(result_test[:,0], axis =0)\n", + "X_train = np.stack(result_train[:,8], axis =0)\n", + "X_test = np.stack(result_test[:,8], axis =0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dV5cO0Pj7wnd" + }, + "source": [ + "##Selected RF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "SxTSkv7ldN0G" + }, + "outputs": [], + "source": [ + "rf = RandomForestClassifier(n_estimators=30, max_depth=30, max_features=\"sqrt\")\n", + "rf.fit(X_train,y_train)\n", + "\n", + "#Predict the response for test dataset\n", + "y_pred = rf.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5oeCXkcK7dc1" + }, + "source": [ + "##Confusion matrix and classification report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d7ad2066-4852-4856-8831-8bcadb74bb35", + "id": "Vm1rn9LKBKQX" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Evaluation RF validation with leave out cow_number 25\n", + "\n", + "Behaviour: rumination_video\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[70204 8985]\n", + " [10862 4704]]\n", + "Accuracy Score : 0.7905440346155875\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.87 0.89 0.88 79189\n", + " 1 0.34 0.30 0.32 15566\n", + "\n", + " accuracy 0.79 94755\n", + " macro avg 0.60 0.59 0.60 94755\n", + "weighted avg 0.78 0.79 0.79 94755\n", + "\n" + ] + } + ], + "source": [ + "# Evaluation\n", + "print (\"Evaluation RF validation with leave out cow_number \"+ str(COW_NUMBER))\n", + "print(\"\")\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "26d8fdbc-d2cf-4e08-eb14-98c80844acf3", + "id": "bihkuNAPBJ0_" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Evaluation RF validation with leave out cow_number 25\n", + "\n", + "Behaviour: rumination_video\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[69576 9613]\n", + " [10574 4992]]\n", + "Accuracy Score : 0.7869558334652524\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.87 0.88 0.87 79189\n", + " 1 0.34 0.32 0.33 15566\n", + "\n", + " accuracy 0.79 94755\n", + " macro avg 0.60 0.60 0.60 94755\n", + "weighted avg 0.78 0.79 0.78 94755\n", + "\n" + ] + } + ], + "source": [ + "# Evaluation\n", + "print (\"Evaluation RF validation with leave out cow_number \"+ str(COW_NUMBER))\n", + "print(\"\")\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "q_R19kwDdiqf", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "4c51b8f9-c887-46be-c555-846bd47c6ee4" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Evaluation RF validation with leave out cow_number 21\n", + "\n", + "Behaviour: rumination_video\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[78838 7236]\n", + " [ 7335 1156]]\n", + "Accuracy Score : 0.8459155078517422\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.91 0.92 0.92 86074\n", + " 1 0.14 0.14 0.14 8491\n", + "\n", + " accuracy 0.85 94565\n", + " macro avg 0.53 0.53 0.53 94565\n", + "weighted avg 0.85 0.85 0.85 94565\n", + "\n" + ] + } + ], + "source": [ + "# Evaluation\n", + "print (\"Evaluation RF validation with leave out cow_number \"+ str(COW_NUMBER))\n", + "print(\"\")\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "code", + "source": [ + "# Evaluation\n", + "print (\"Evaluation RF validation with leave out cow_number \"+ str(COW_NUMBER))\n", + "print(\"\")\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3l7VQNj7Aw_V", + "outputId": "d95c63e8-896a-492d-8adf-2f42054c65fe" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Evaluation RF validation with leave out cow_number 7\n", + "\n", + "Behaviour: rumination_video\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[97183 2704]\n", + " [29441 5462]]\n", + "Accuracy Score : 0.7615179167594035\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.77 0.97 0.86 99887\n", + " 1 0.67 0.16 0.25 34903\n", + "\n", + " accuracy 0.76 134790\n", + " macro avg 0.72 0.56 0.56 134790\n", + "weighted avg 0.74 0.76 0.70 134790\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FNy2Wygkvbyl" + }, + "source": [ + "# RandomForestAlgorithm Eating" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tKdiPiZSw2pY" + }, + "outputs": [], + "source": [ + "BEHAVIOUR='eating'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "iKa6UjZtPiYg" + }, + "outputs": [], + "source": [ + "y_final = np.stack(signal_features_1[:,1], axis =0) # BEHAVIOUR_2= 'eating_video'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "aXSfq-llvbyw" + }, + "outputs": [], + "source": [ + "# Split dataset into trainingsset (70%) and testset (30%)\n", + "X_train, X_test, y_train, y_test = train_test_split(X_final, y_final, test_size=0.3, random_state=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "k3jKi-NVvbyx" + }, + "source": [ + "## Test settings RandomForestAlgorithm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "MNeMy-6uvbyy", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "51c20332-435b-440e-a8d4-5336105386b0" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1\n", + "2\n", + "4\n", + "8\n", + "16\n", + "32\n", + "64\n", + "100\n", + "200\n" + ] + } + ], + "source": [ + "n_estimators = [1, 2, 4, 8, 16, 32, 64, 100, 200]\n", + "train_results = []\n", + "test_results = []\n", + "for estimator in n_estimators:\n", + " print(estimator)\n", + " rf = RandomForestClassifier(n_estimators=estimator, max_features=\"sqrt\")\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "_VpPWzWIvby0", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 280 + }, + "outputId": "e9578a9d-130f-4e4b-c7a8-995285218516" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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MrPNli5dyqBBgxg0aBC77747e+yxx+bldevWNbjvjBkzuPjii7f5mLNmzUISDz300OayhQsXcuCBB2613TXXXMOoUaM2L48aNYpPfOITDBo0iMMPP5yxY8du87ELZdrEtMPIJYh165wgzGyzHj16MGvWLCC5INfU1HDZZZdtXr9hwwbati1+GR08eDCDBw/e5mOOGzeOIUOGMG7cOI47rrT3g2+77TYmT57M3/72N7p06cLKlSuZOHHiNh+7kBMEbN2s5CYmsxbv0kshvW5vs0GD4L//u+nHHjlyJB07duSFF17gM5/5DCNGjOCSSy5h7dq1dOrUiTvuuIP99tuPadOmMWrUKP7yl79wzTXX8Oabb7JgwQLefPNNLr300qK1i4jg3nvvZfLkyQwdOpS1a9fSsYR/Wn/84x8zbdo0unTpAkCXLl0477zt78LOCQK2TgquQZhZIxYtWsT06dNp06YNK1eu5Mknn6Rt27Y8+uij/OAHP+C+++6rs8+rr77K1KlTWbVqFfvttx/f/va367yTMH36dPr378++++7LsGHDePDBBxk+fHiDsaxcuZJVq1axzz77NOv3CE4QCScIsx3K9tQAmsMZZ5xBmzZtAFixYgXnnXce8+bNQxLr168vus+JJ55Ihw4d6NChA7vtthtLliyhb9++W20zbtw4RowYAcCIESMYO3Ysw4cPr/cJpKyf8HKCADcxmdk22WWXXTbP/+hHP+KYY45h4sSJLFy4kGHDhhXdp0PeMAJt2rRhw4YNW63fuHEj9913H/fffz/XX3/95pfbVq1aRY8ePXj//fe32n7ZsmX079+fLl26UFNTw4IFC5q9FuGnmGDLi3LgGoSZbZMVK1awxx5JX6Jjxoxp8udMmTKFgw8+mLfeeouFCxfyxhtvMHz4cCZOnEhNTQ19+vThsceSzq+XLVvGQw89xJAhQwC44ooruPDCC1m5ciUAq1evbpanmJwgwE1MZtZk3/ve97jiiis45JBD6tQKtsW4ceM47bTTtiobPnw448aNA2Ds2LFcd911DBo0iGOPPZarr76afffdF4Bvf/vbHHPMMRx++OEceOCBDB06lJ122v7LuyKa3sddSzJ48OCYMWNG03Zetgx69Ejmb7kFLryw+QIzsyZ75ZVX2H///SsdRqtR7HxKmhkRRZ/HdQ0CfA/CzKwIJwjYulnJTUxmZoATRELakhicIMzMACeILXJNS25iMjMDnCC2yCUG1yDMzAAniC2cIMzMtuIEkeMmJjMrsD3dfQNMmzaN6dOnN7jNqaeeylFHHbVV2ciRI5kwYeux1GpqajbPv/baa5xwwgkMGDCAQw89lDPPPJMlS5Zsw3dWGne1kZN7m9o1CDNLNdbdd2OmTZtGTU0Nn/70p4uuX758OTNnztymrjLWrl3LiSeeyC9+8QtOOumkzcepra2ld+/eJcdWCieIHDcxmbVs29PHd32a0Pf3zJkz+e53v8vq1avp2bMnY8aMoU+fPtx0003cdttttG3bloEDB3LDDTdw22230aZNG373u99x8803M3To0K0+649//CMnnXQSvXv3Zvz48fzgBz9o9Ph/+MMf+NSnPrU5OQD19v+0vZwgctzEZGaNiAi+853vcP/999OrVy/uvvturrzySkaPHs0NN9zA66+/TocOHVi+fDndunXjggsuaLDWMW7cOK666ip69+7N8OHDS0oQs2fP5rDDDmvub60oJ4gc1yDMWrZK9/ENfPTRR8yePZvPf/7zQNIDa58+fQA4+OCDOeecczj11FM59dRTG/2sJUuWMG/ePIYMGYIk2rVrx+zZsznwwAOLduOdddfexfgmdY4ThJk1IiI44IADmDVrFrNmzeLll1/mkUceAeDBBx/kwgsv5Pnnn+fwww9vtOO+e+65h/fff5/+/fvTr18/Fi5cuLljvsLuvZctW0bPnj0BOOCAA5g5c2ZG3+HWnCByOnVK3qhu377SkZhZC9WhQwdqa2t5+umnAVi/fj1z5sxh06ZNvPXWWxxzzDHceOONrFixgtWrV9O5c2dWrVpV9LPGjRvHQw89xMKFC1m4cCEzZ85k/PjxQHJP4e677978pNSYMWM45phjADj77LOZPn06Dz744ObPeuKJJ5g9e3azf79OEDmdOiW1hwpU48xsx7DTTjsxYcIEvv/97/PJT36SQYMGMX36dDZu3Mi5557LQQcdxCGHHMLFF19Mt27dOOmkk5g4cSKDBg3iySef3Pw5ufEe8h9v7d+/P127duXZZ5/lS1/6EkOHDuWwww5j0KBBPPXUU9x4440AdOrUib/85S/cfPPNDBgwgIEDB/KrX/2KXr16Nfv36+6+cx5/HB59FK67rvmCMrPt4u6+m1eL6u5b0nGS5kqaL+nyIuv3kjRV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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(n_estimators, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(n_estimators, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"n_estimators\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "g3I6meg_vby1" + }, + "source": [ + "### Test max depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "zVLnZTC-vby2", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "fb2d928f-0d07-41a4-b4be-1ac862ed1ea7" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.0\n", + "2.0\n", + "3.0\n", + "4.0\n", + "5.0\n", + "6.0\n", + "7.0\n", + "8.0\n", + "9.0\n", + "10.0\n", + "11.0\n", + "12.0\n", + "13.0\n", + "14.0\n", + "15.0\n", + "16.0\n", + "17.0\n", + "18.0\n", + "19.0\n", + "20.0\n", + "21.0\n", + "22.0\n", + "23.0\n", + "24.0\n", + "25.0\n", + "26.0\n", + "27.0\n", + "28.0\n", + "29.0\n", + "30.0\n", + "31.0\n", + "32.0\n" + ] + } + ], + "source": [ + "max_depths = np.linspace(1, 32, 32, endpoint=True)\n", + "train_results = []\n", + "test_results = []\n", + "for max_depth in max_depths:\n", + " print(max_depth)\n", + " rf = RandomForestClassifier(max_depth=max_depth, max_features=\"sqrt\", n_estimators = 50)\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "sN-ePEulvby2", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "outputId": "1c35c213-55a2-4447-8c19-974abbe48a7d" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de5zM9f7A8dfbWtZdIYmKpIsch9p0U+muQkp1VgnVL12kdDulUlK6SpTiIMkp6y6i0AkhJSsql4pcshRyWRbLXt6/Pz6Dac3uzq6d/c7l/Xw85jEz3+93vvOeHb7v+dxFVTHGGBO7SnkdgDHGGG9ZIjDGmBhnicAYY2KcJQJjjIlxlgiMMSbGlfY6gMKqXr261q1b1+swjDEmoixevPgvVa0RaF/EJYK6deuSkpLidRjGGBNRRGR9XvusasgYY2KcJQJjjIlxlgiMMSbGRVwbQSCZmZmkpqaSkZHhdSgRLyEhgTp16hAfH+91KMaYEhIViSA1NZVKlSpRt25dRMTrcCKWqrJt2zZSU1OpV6+e1+EYY0pIyKqGRGS4iGwRkWV57BcReVtEVovIjyJydlHfKyMjg2rVqlkSOEoiQrVq1axkZUyMCWUbwQigZT77rwUa+G5dgEFH82aWBIqH/R2NiT0hqxpS1bkiUjefQ24ARqqbB/tbEakqIrVU9Y9QxWSMiU6qsG8fpKe72+7dhx+np8OePZCdDTk57ljVw49z3+d1O/g++W3zf37wsX+MBT3O/Zlya90azj23aH+j/HjZRlAb2OD3PNW37YhEICJdcKUGTjrppBIJrjC2bdvGFVdcAcCff/5JXFwcNWq4AXzfffcdZcqUyfO1KSkpjBw5krfffrtQ77l06VKaNm3K559/TsuWruC1bt06WrVqxbJlh2vjevXqRcWKFXn88ccB6Nu3L8OGDSMhIYH4+Hi6detGx44dC/XexhSHjAz4/XdYv/7wbd26w4/T091xBwuped0fTADRuLRK7gL6CSdEXyIImqoOAYYAJCYmht3XXa1aNZYuXQoceeEFyMrKonTpwH/qxMREEhMTC/2eycnJNG/enOTk5EOJoCCDBw/miy++4LvvvqNy5crs2rWLSZMmFfq9jSmsrVth9mx3W7LEXej//PPvx8TFQZ06cPLJcOmlUKXKkb+sA92XKwcVK0KlSu4+0K1CBShd2l1YRaBUqcD3Bd2g4G3+zw8+Piivx17zMhFsBE70e17Hty0qdO7cmYSEBJYsWcJFF11EUlISDz/8MBkZGZQrV44PPviA008/nTlz5tC3b1+mTp1Kr169+P3331mzZg2///473bt356GHHjri3KrKuHHj+OKLL7j44ovJyMggISGhwJhefvll5syZQ+XKlQGoXLkynTp1KvbPbszOnTB3Lsya5W4//eS2V6rkftFedx3Uresu+gfva9d2F2tT8rz8s08BHhSR0cB5QFpxtw907w6+H+qF1qQJ9O9/dO+fmprKggULiIuLY9euXcybN4/SpUvzv//9j6effpoJEyYc8Zqff/6Z2bNns3v3bk4//XTuv//+I/r0L1iwgHr16lG/fn1atGjBtGnTaNeuXb6x7Nq1i927d3PKKacc3YcyJoD9++Grrw5f+BcvdnXuCQnQvDm0bw+XXw7nnGMX+3AUsq9ERJKBFkB1EUkFngfiAVR1MPAZcB2wGtgL3BmqWLxyyy23EBcXB0BaWhqdOnVi1apViAiZmZkBX3P99ddTtmxZypYty3HHHcfmzZupU6fO345JTk4mKSkJgKSkJEaOHEm7du3y7PFjPYFMKGRnu4v/qFEwfjykpbmL/Pnnw7PPugv/+edD2bJeR2oKEspeQ+0L2K9A11C9Pxz9L/qjVaFChUOPe/bsyWWXXcakSZNYt24dLVq0CPiasn7/a+Li4sjKyvrb/uzsbCZMmMDkyZPp06fPoUFgu3fvplq1auzYseNvx2/fvp169epRuXJlKlasyJo1a6xUYIpMFb7/3l38R4+GTZtcHfyNN8K//uXq9itW9DpKU1hWSCshaWlp1K5dG4ARI0YU+TxffvkljRs3ZsaMGYe2derUiUmTJtGxY0dq1arFrFmzuPzyy9m+fTvTp0/n4YcfBqBHjx507dqVMWPGULlyZdLT05k4caL1GjIFWrUKkpNdAvjlF4iPd/X8t90GrVpB+fJeRxjmcnJg796/92f179+ak+Nay/O6lSrl7uvXh+OPL/bwLBGUkH//+9906tSJl156ieuvv77I50lOTubGG2/827Z27doxaNAgOnbsyMiRI+natSuPPvooAM8//zz169cH4P777yc9PZ1zzz2X+Ph44uPjeeyxx4r+oUxUW7sWJkyAsWNh0SLXy6VFC3j8cWjX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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(max_depths, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(max_depths, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"Tree depth\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1M4I9DMPvby3" + }, + "source": [ + "## Selected RF\n", + "From the previous we select settings for our selected RF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ZoqVh_F_vby3" + }, + "outputs": [], + "source": [ + "# Random Forest\n", + "rf = RandomForestClassifier(n_estimators=40, max_depth=25, max_features=\"sqrt\")\n", + "# Train Decision Tree Classifer\n", + "rf.fit(X_train,y_train)\n", + "\n", + "#Predict the response for test dataset\n", + "y_pred = rf.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-KCF7N0Ivby4" + }, + "source": [ + "## Confusion matrix and classification report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "VwXVge1nvby4", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1ba5c388-91c7-4297-81bc-20051bf8f2d1" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: eating\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[94810 197]\n", + " [ 1872 32399]]\n", + "Accuracy Score : 0.9839957301319637\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.98 1.00 0.99 95007\n", + " 1 0.99 0.95 0.97 34271\n", + "\n", + " accuracy 0.98 129278\n", + " macro avg 0.99 0.97 0.98 129278\n", + "weighted avg 0.98 0.98 0.98 129278\n", + "\n" + ] + } + ], + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nzu-L5Ta5YNy" + }, + "source": [ + "##Feature importances" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QP2iuIoJvby5", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "444088dc-7d8e-4cbf-e616-d10553d90198" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Feature: 0, Score: 0.02046\n", + "Feature: 1, Score: 0.03013\n", + "Feature: 2, Score: 0.03189\n", + "Feature: 3, Score: 0.03386\n", + "Feature: 4, Score: 0.04063\n", + "Feature: 5, Score: 0.08446\n", + "Feature: 6, Score: 0.07268\n", + "Feature: 7, Score: 0.06740\n", + "Feature: 8, Score: 0.06580\n", + "Feature: 9, Score: 0.06534\n", + "Feature: 10, Score: 0.02449\n", + "Feature: 11, Score: 0.02755\n", + "Feature: 12, Score: 0.02978\n", + "Feature: 13, Score: 0.02947\n", + "Feature: 14, Score: 0.03364\n", + "Feature: 15, Score: 0.08171\n", + "Feature: 16, Score: 0.06800\n", + "Feature: 17, Score: 0.06569\n", + "Feature: 18, Score: 0.06516\n", + "Feature: 19, Score: 0.06185\n", + "Feature: 20, Score: 0.00000\n", + "Feature: 21, Score: 0.00000\n", + "Feature: 22, Score: 0.00000\n", + "Feature: 23, Score: 0.00000\n", + "Feature: 24, Score: 0.00000\n", + "Feature: 25, Score: 0.00000\n", + "Feature: 26, Score: 0.00000\n", + "Feature: 27, Score: 0.00000\n", + "Feature: 28, Score: 0.00000\n", + "Feature: 29, Score: 0.00000\n" + ] + } + ], + "source": [ + "# feature importance\n", + "model = rf\n", + "importance = model.feature_importances_\n", + "# summarize feature importance\n", + "for i,v in enumerate(importance):\n", + "\tprint('Feature: %0d, Score: %.5f' % (i,v))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qpozfboOB5Rj" + }, + "source": [ + "# RandomForestAlgorithm Resting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "t7NJuxFoB5Rj" + }, + "outputs": [], + "source": [ + "BEHAVIOUR='resting'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "01BPbs5zB5Rj" + }, + "outputs": [], + "source": [ + "y_final = np.stack(signal_features_1[:,6], axis =0) # BEHAVIOUR_7= 'resting_video'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "-x3N1cLKB5Rj" + }, + "outputs": [], + "source": [ + "# Split dataset into trainingsset (70%) and testset (30%)\n", + "X_train, X_test, y_train, y_test = train_test_split(X_final, y_final, test_size=0.3, random_state=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "o6qGxacCB5Rj" + }, + "source": [ + "## Test settings RandomForestAlgorithm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "89aaf4c2-9fc5-42a4-ab18-affc8d18e90b", + "id": "v4wVTyCQB5Rj" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1\n", + "2\n", + "4\n", + "8\n", + "16\n", + "32\n", + "64\n", + "100\n", + "200\n" + ] + } + ], + "source": [ + "n_estimators = [1, 2, 4, 8, 16, 32, 64, 100, 200]\n", + "train_results = []\n", + "test_results = []\n", + "for estimator in n_estimators:\n", + " print(estimator)\n", + " rf = RandomForestClassifier(n_estimators=estimator, max_features=\"sqrt\")\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 280 + }, + "outputId": "d915b7c5-c04a-44a6-e195-1be39c208940", + "id": "IphlpOBCB5Rk" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(n_estimators, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(n_estimators, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"n_estimators\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7Ey57_AoB5Rk" + }, + "source": [ + "### Test max depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "e2873673-4d80-4737-d2a3-81ab5a2fc395", + "id": "frtdWgtPB5Rk" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.0\n", + "2.0\n", + "3.0\n", + "4.0\n", + "5.0\n", + "6.0\n", + "7.0\n", + "8.0\n", + "9.0\n", + "10.0\n", + "11.0\n", + "12.0\n", + "13.0\n", + "14.0\n", + "15.0\n", + "16.0\n", + "17.0\n", + "18.0\n", + "19.0\n", + "20.0\n", + "21.0\n", + "22.0\n", + "23.0\n", + "24.0\n", + "25.0\n", + "26.0\n", + "27.0\n", + "28.0\n", + "29.0\n", + "30.0\n", + "31.0\n", + "32.0\n" + ] + } + ], + "source": [ + "max_depths = np.linspace(1, 32, 32, endpoint=True)\n", + "train_results = []\n", + "test_results = []\n", + "for max_depth in max_depths:\n", + " print(max_depth)\n", + " rf = RandomForestClassifier(max_depth=max_depth, max_features=\"sqrt\", n_estimators = 50)\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "outputId": "208ff3d0-f168-495d-9e41-55581c7aa067", + "id": "meSI9NYlB5Rk" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(max_depths, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(max_depths, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"Tree depth\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hCbNJylaB5Rk" + }, + "source": [ + "## Selected RF\n", + "From the previous we select settings for our selected RF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "BtzglhO8B5Rk" + }, + "outputs": [], + "source": [ + "# Random Forest\n", + "rf = RandomForestClassifier(n_estimators=50, max_depth=25, max_features=\"sqrt\")\n", + "# Train Decision Tree Classifer\n", + "rf.fit(X_train,y_train)\n", + "\n", + "#Predict the response for test dataset\n", + "y_pred = rf.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RrQrGCzRB5Rk" + }, + "source": [ + "## Confusion matrix and classification report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "3d62e702-2ce4-4a3a-d429-bf4adf3db446", + "id": "eOr6K2_EB5Rl" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: rumination_video\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[64154 1393]\n", + " [ 1178 62553]]\n", + "Accuracy Score : 0.9801126255047262\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.98 0.98 0.98 65547\n", + " 1 0.98 0.98 0.98 63731\n", + "\n", + " accuracy 0.98 129278\n", + " macro avg 0.98 0.98 0.98 129278\n", + "weighted avg 0.98 0.98 0.98 129278\n", + "\n" + ] + } + ], + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b-J7V_EyB5Rl" + }, + "source": [ + "##Feature importances" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "444088dc-7d8e-4cbf-e616-d10553d90198", + "id": "E14e-rkyB5Rl" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Feature: 0, Score: 0.02046\n", + "Feature: 1, Score: 0.03013\n", + "Feature: 2, Score: 0.03189\n", + "Feature: 3, Score: 0.03386\n", + "Feature: 4, Score: 0.04063\n", + "Feature: 5, Score: 0.08446\n", + "Feature: 6, Score: 0.07268\n", + "Feature: 7, Score: 0.06740\n", + "Feature: 8, Score: 0.06580\n", + "Feature: 9, Score: 0.06534\n", + "Feature: 10, Score: 0.02449\n", + "Feature: 11, Score: 0.02755\n", + "Feature: 12, Score: 0.02978\n", + "Feature: 13, Score: 0.02947\n", + "Feature: 14, Score: 0.03364\n", + "Feature: 15, Score: 0.08171\n", + "Feature: 16, Score: 0.06800\n", + "Feature: 17, Score: 0.06569\n", + "Feature: 18, Score: 0.06516\n", + "Feature: 19, Score: 0.06185\n", + "Feature: 20, Score: 0.00000\n", + "Feature: 21, Score: 0.00000\n", + "Feature: 22, Score: 0.00000\n", + "Feature: 23, Score: 0.00000\n", + "Feature: 24, Score: 0.00000\n", + "Feature: 25, Score: 0.00000\n", + "Feature: 26, Score: 0.00000\n", + "Feature: 27, Score: 0.00000\n", + "Feature: 28, Score: 0.00000\n", + "Feature: 29, Score: 0.00000\n" + ] + } + ], + "source": [ + "# feature importance\n", + "model = rf\n", + "importance = model.feature_importances_\n", + "# summarize feature importance\n", + "for i,v in enumerate(importance):\n", + "\tprint('Feature: %0d, Score: %.5f' % (i,v))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kgoiE-PcuE7Q" + }, + "source": [ + "# RandomForestAlgorithm Mooing" + ] + }, + { + "cell_type": "code", + "source": [ + "BEHAVIOUR_1= 'rumination_video'\n", + "BEHAVIOUR_2= 'eating_video'\n", + "BEHAVIOUR_3= 'drinking_video'\n", + "BEHAVIOUR_4= 'sleeping_video'\n", + "BEHAVIOUR_5= 'urinating_video'\n", + "BEHAVIOUR_6= 'mooing_video'\n", + "BEHAVIOUR_7= 'resting_video'" + ], + "metadata": { + "id": "GyV1zTcSuhsq" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "v2Ny9xXvuE7Q" + }, + "outputs": [], + "source": [ + "BEHAVIOUR='mooing'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wQ1OzNkMuE7Q" + }, + "outputs": [], + "source": [ + "y_final = np.stack(signal_features_1[:,5], axis =0) # BEHAVIOUR_5= 'mooing_video'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "CBuKdCoG9OHu" + }, + "outputs": [], + "source": [ + "# Split dataset into trainingsset (70%) and testset (30%)\n", + "X_train, X_test, y_train, y_test = train_test_split(X_final, y_final, test_size=0.3, random_state=1)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "#Up and downsampling" + ], + "metadata": { + "id": "vEFxVd2O9U-N" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "zHa5cLkWtNlT" + }, + "outputs": [], + "source": [ + "bool_minority_labels = y_final != 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "6y1WDHvdgJ_m" + }, + "outputs": [], + "source": [ + "min_features = X_final[bool_minority_labels]\n", + "maj_features = X_final[~bool_minority_labels]\n", + "\n", + "min_labels = y_final[bool_minority_labels]\n", + "maj_labels = y_final[~bool_minority_labels]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "werDvCiBqkUe" + }, + "source": [ + "Split the minority class in 70 30 to have more in train set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "q_BAylPThKC4" + }, + "outputs": [], + "source": [ + "# Split minority dataset into training set and test set\n", + "X_min_train, X_min_test, y_min_train, y_min_test = train_test_split(min_features, min_labels, test_size=0.3, random_state=1) # 70% training and 30% test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ivrXT7qZqeDf" + }, + "source": [ + "Split the majority class in 50 50 so we can sample from independant sets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "zKSNgT5dlbIj" + }, + "outputs": [], + "source": [ + "# Split minority dataset into training set and test set\n", + "X_maj_train, X_maj_test, y_maj_train, y_maj_test = train_test_split(maj_features, maj_labels, test_size=0.5, random_state=1) # 50% training and 50% test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mE0TKvl9pOp1" + }, + "source": [ + "## Create train set" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "37WUaiaQqrCY" + }, + "source": [ + "Upsample the amount of minority features and labels 3 times (why 3, no idea, feels that this will create enough labels)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wTj2Qm65hdjf" + }, + "outputs": [], + "source": [ + "upsampled_X_min_train = np.concatenate([X_min_train, X_min_train, X_min_train], axis=0)\n", + "upsampled_y_min_train = np.concatenate([y_min_train, y_min_train, y_min_train], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tM6-s1RKq4ud" + }, + "source": [ + "Downsample from 50% of the majority class to have same amount of samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jGJqS34NVyHu", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "cba49b0a-f05c-4667-8338-6967165f9c68" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(6648, 30)" + ] + }, + "metadata": {}, + "execution_count": 48 + } + ], + "source": [ + "ids = np.arange(len(X_maj_train))\n", + "choices = np.random.choice(ids, len(upsampled_X_min_train))\n", + "\n", + "res_maj_train_features = X_maj_train[choices]\n", + "res_maj_train_labels = y_maj_train[choices]\n", + "\n", + "res_maj_train_features.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iuBy9-Phq-zG" + }, + "source": [ + "Concat together" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GcCAIqLyjawS" + }, + "outputs": [], + "source": [ + "resampled_train_features = np.concatenate([upsampled_X_min_train, res_maj_train_features], axis=0)\n", + "resampled_train_labels = np.concatenate([upsampled_y_min_train, res_maj_train_labels], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CmjdRO7drARg" + }, + "source": [ + "Shuffle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QxcQJzutpCVw" + }, + "outputs": [], + "source": [ + "order = np.arange(len(resampled_train_labels))\n", + "np.random.shuffle(order)\n", + "resampled_train_features = resampled_train_features[order]\n", + "resampled_train_labels = resampled_train_labels[order]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sClNWtnVpReY" + }, + "source": [ + "## Create test set" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5MNzyY8SrCSd" + }, + "source": [ + "We start from the X_min_test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vqxhKTzgrGZG" + }, + "source": [ + "And downsample the remaining part of the majority class which we didn't use so far" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vhBQR5fEpUB3" + }, + "outputs": [], + "source": [ + "ids = np.arange(len(X_maj_test))\n", + "choices = np.random.choice(ids, len(X_min_test))\n", + "\n", + "res_maj_test_features = X_maj_test[choices]\n", + "res_maj_test_labels = y_maj_test[choices]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pNfZ_OiyrMrA" + }, + "source": [ + "Concat" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vHLqu9Ysp-Hw" + }, + "outputs": [], + "source": [ + "resampled_test_features = np.concatenate([X_min_test, res_maj_test_features], axis=0)\n", + "resampled_test_labels = np.concatenate([y_min_test, res_maj_test_labels], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gi7AxlElrNfX" + }, + "source": [ + "Shuffle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "BYtInbNmp_U3" + }, + "outputs": [], + "source": [ + "order = np.arange(len(resampled_test_labels))\n", + "np.random.shuffle(order)\n", + "resampled_test_features = resampled_test_features[order]\n", + "resampled_test_labels = resampled_test_labels[order]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "-ZHJ_d8-01wM" + }, + "outputs": [], + "source": [ + "X_train= resampled_train_features\n", + "y_train= resampled_train_labels\n", + "X_test= resampled_test_features\n", + "y_test= resampled_test_labels" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9_yfIsBRu54S" + }, + "source": [ + "## Test settings RandomForestAlgorithm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "BgiPMipCu54T", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "a9e63ac6-56eb-45ec-e238-f9d53e7f9ab0" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1\n", + "2\n", + "4\n", + "8\n", + "16\n", + "32\n", + "64\n", + "100\n", + "200\n" + ] + } + ], + "source": [ + "n_estimators = [1, 2, 4, 8, 16, 32, 64, 100, 200]\n", + "train_results = []\n", + "test_results = []\n", + "for estimator in n_estimators:\n", + " print(estimator)\n", + " rf = RandomForestClassifier(n_estimators=estimator, max_features=\"sqrt\")\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "A1ZAev21u54U", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 280 + }, + "outputId": "c64e1c5d-2e19-4af9-a2be-12754091c535" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEHCAYAAAC0pdErAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deZgV5Zn38e+PZo2AGGiRARU0JIobaLtFGLeZBDWuJA6YzEjeXGHMaMwyvkZiooZcxpAQk4njEjMxjDGBGBNHR41LEKKvaGKj0EJwYRBZdLBlX4Js9/tHVcPp06eb7qarz2nO73Nd5zpVT1Wdurv6dN39PE9VPYoIzMzM8nUqdgBmZlaanCDMzKwgJwgzMyvICcLMzApygjAzs4I6FzuAttKvX78YPHhwscMwM+tQ5syZ815EVBZats8kiMGDB1NdXV3sMMzMOhRJbzW2zE1MZmZWkBOEmZkV5ARhZmYFOUGYmVlBThBmZlZQZglC0j2S3pU0v5HlkvRjSYsk1Ug6PmfZ5ZLeSF+XZxWjmZk1LssaxFRgdBPLzwGGpq8JwJ0Akj4I3AicDJwE3CjpgAzjNDOzAjK7DyIinpE0uIlVLgTujeR54y9I6iNpAHAG8FRErAaQ9BRJopmWVaytFQE7d8L27btfO3bUn88t37kzed/bV/7n+IntZuWtf38YM6btP7eYN8oNBJblzC9Pyxorb0DSBJLaB4ccckibB7hmDcybV/+1aBFs3br7xG9mVmwnn7zvJYi9FhF3A3cDVFVVtdn/0U88ARMmwNKlu8sOPBCOOw5OOw169IDOnZNXRcXu6UKvuuUVFcmrU6fd06195X9GJ19qYFbWOmd0Ji9mglgBHJwzPygtW0HSzJRbPqvdogJ+9jPYvBkmT06SwnHHwUEHtWcEZmbFV8wE8TBwlaTpJB3S6yLiHUlPAN/J6Zj+GDCxvYLauRNmzoRzz4Vrr22vvZqZlZ7MEoSkaSQ1gX6SlpNcmdQFICLuAh4DzgUWAZuBz6bLVkv6NvBi+lGT6jqs28OCBfDee3DWWe21RzOz0pTlVUzj9rA8gCsbWXYPcE8Wce3J008n72eeWYy9m5mVDndv5pk5Ew4/HDK4KMrMrENxgsixYwf88Y+uPZiZgRNEPXPnwtq1ThBmZuAEUc/Mmcm7E4SZmRNEPU8/DUccAQMGFDsSM7Pic4JIbdsGzz7r2oOZWR0niNScObBxo+9/MDOr4wSRqut/OOOMooZhZlYynCBSS5YkD+Tr16/YkZiZlQYniNSaNXCAhyUyM9vFCSK1Zg188IPFjsLMrHQ4QaRcgzAzq88JIrV6tROEmVkuJ4iUaxBmZvU5QZAMErRunROEmVkuJwiS5BDhBGFmlivTBCFptKTXJC2SdF2B5YdKmiGpRtIsSYNyln1P0gJJCyX9WJKyinPNmuTdVzGZme2WWYKQVAHcDpwDDAPGSRqWt9oU4N6IOBaYBNySbvtR4DTgWOBo4ETg9KxirUsQrkGYme2WZQ3iJGBRRCyOiK3AdODCvHWGAekgn8zMWR5Ad6Ar0I1kLOuVWQXqBGFm1lCWCWIgsCxnfnlalmsecEk6fTHQS1LfiHieJGG8k76eiIiF+TuQNEFStaTq2traVge6enXy7gRhZrZbsTuprwFOl/QySRPSCmCHpA8BRwKDSJLKWZJG5W8cEXdHRFVEVFVWVrY6CNcgzMwa6pzhZ68ADs6ZH5SW7RIRb5PWICT1BMZExFpJnwdeiIiN6bLfA6cCz2YRqBOEmVlDWdYgXgSGShoiqSswFng4dwVJ/STVxTARuCedXkpSs+gsqQtJ7aJBE1NbWbMGunaFHj2y2oOZWceTWYKIiO3AVcATJCf3+yNigaRJki5IVzsDeE3S60B/4Oa0/AHgf4BXSPop5kXEf2cVa92D+rK7kNbMrOPJsomJiHgMeCyv7Iac6QdIkkH+djuAf84ytlx+zIaZWUPF7qQuCU4QZmYNOUHgJ7mamRXiBIFrEGZmhThB4ARhZlZI2SeIHTv8qG8zs0LKPkGsW5e8+0muZmb1lX2C6NIFJk+GUQ0e5GFmVt4yvQ+iI+jVC669tthRmJmVnrKvQZiZWWFOEGZmVpAThJmZFeQEYWZmBTlBmJlZQU4QZmZWkBOEmZkV5ARhZmYFZZogJI2W9JqkRZKuK7D8UEkzJNVImiVpUM6yQyQ9KWmhpL9IGpxlrGZmVl9mCUJSBXA7cA4wDBgnaVjealOAeyPiWGAScEvOsnuB70fEkcBJwLtZxWpmZg1lWYM4CVgUEYsjYiswHbgwb51hwNPp9My65Wki6RwRTwFExMaI2JxhrGZmlifLBDEQWJYzvzwtyzUPuCSdvhjoJakv8GFgraTfSXpZ0vfTGkk9kiZIqpZUXVtbm8GPYGZWvordSX0NcLqkl4HTgRXADpKHCI5Kl58IHAaMz984Iu6OiKqIqKqsrGy3oM3MykGWCWIFcHDO/KC0bJeIeDsiLomIEcD1adlaktrG3LR5ajvwX8DxGcZqZmZ5skwQLwJDJQ2R1BUYCzycu4KkfpLqYpgI3JOzbR9JddWCs4C/ZBirmZnlySxBpP/5XwU8ASwE7o+IBZImSbogXe0M4DVJrwP9gZvTbXeQNC/NkPQKIOCnWcVqZmYNKSKKHUObqKqqiurq6mKHYWbWoUiaExFVhZYVu5PazMxKVNkPOWqtEAHvvw+bNsHmzbtfufNNLSu0bvfucMghcOihDd979Sr2T2xWOiJg69bkb+evf03eO3WCww5r8105Qexr6r48rT15N/fE3tKmyU6dYL/94AMf2P2qm+/fP/nMF16A3/wGtm+vv22fPrsTRqEkctBByeebFVMEbNtW/++l7lV3Im+rZTt31t/3KafA88+3+Y/kBNGRvfMOXH89zJpV/0Se/+XZE6n+CTv3BF5Z2XBZYyf6ppZ17ZrsZ0927ICVK+Gtt2Dp0vrvb70Fzz4La9fW36ZLFzj44MaTyMEHQ48eLTsmtu/IP3G39mTdnG137Gh5fF267P576dGj/t/PgQc2viz3ddBBbX/ccILomLZuhR//GCZNSpp6LroIDjig9Sfwbt2ad/JuDxUV8Dd/k7xOPbXwOuvXN0wede8zZsDbbzdMkgce2HgN5NBDoW/f0jkG5aSx/7jb+j/v1p64GzspH3hg0yfs5i7r0SPZT4lyguhonngCvvQleO01OO88+OEPYejQYkfVvnr3hqOPTl6FbNsGK1YUTiILF8LjjycnjVw9ejSePA45BAYOTGpB5aLQibutm0lae+KuqGj4j07dybauxtvaE3YHOXG3FyeIjmLxYvjqV+Ghh+BDH4JHHkkShDXUpQsMHpy8ComA1asL10CWLoV585JmrlxSUqsplDzqpvffP+ufbPeJO8tmks2bG/YDNUf+iTv3xNuv396dsH3iLgoniFK3eTPccgt8//vQuXMy/ZWvJM1C1jpS0qTUty8c38gTXP76V1i+vGHyWLoUXnwRfve7pKkvV+/ehWsgvXs3flJu6Yl+b07chU68dSfutmgu8Yl7n+MEUaoikit6rrkGli2Dyy6D730vaeqw7PXokTTdNdZ8t3NnUsvITx5107Nnw5o1Te+joqLxE2/fvnt/wvaJ2/aSE0Qpmj8frr4aZs6E4cPhV7+CkSOLHZXl6tQJBgxIXiefXHidDRuSZLFxY+GTuU/cVuKcIErJmjVw441wxx1Je/Ydd8CECcl/mtbx9OoFRx1V7CjMWs0JohTs2AE//zlMnJh0nv7zP8O3v500M5iZFYlvPy22F15Imig+/3k44giYMyepOTg5mFmROUEUy//+L4wfn9wM9s478MtfwjPPJH0OZmYlwAmivW3dCj/4AXz4w0nn83XXJTe9XXaZ7+Q1s5LiPoj29OSTyV3Qr74K554LP/pR+d0FbWYdRqY1CEmjJb0maZGk6wosP1TSDEk1kmZJGpS3vLek5ZL+Pcs4M/fmm3DxxfDxjyc3Oj3yCDz6qJODmZW0zBKEpArgduAcYBgwTtKwvNWmAPdGxLHAJOCWvOXfBp7JKsbM7dwJN90ERx4JTz2V3AU9f74fkWFmHUKWNYiTgEURsTgitgLTgQvz1hkGPJ1Oz8xdLukEknGqn8wwxmzdcgt861tJ7eHVV5P+Bj8iw8w6iGYlCEkjJX02na6UNKQZmw0EluXML0/Lcs0DLkmnLwZ6SeorqRPwA+CaPcQ1QVK1pOra2trm/Cjt55ln4IYbYNy4pDN60KA9b2NmVkL2mCAk3Qh8DZiYFnUB7muj/V8DnC7pZeB0YAWwA/gX4LGIWN7UxhFxd0RURURVZWVlG4XUBmprk8Rw+OHwk5/46iQz65CacxXTxcAI4CWAiHhbUnMGCV4BHJwzPygt2yUi3iatQUjqCYyJiLWSTgVGSfoXoCfQVdLGiGjQ0V1ydu6Ef/xHWLUq6Yj2eMpm1kE1J0FsjYiQFACS9mvmZ78IDE2bo1YAY4HLcleQ1A9YHRE7SWoo9wBExKdz1hkPVHWI5AAweXIyqM+dd/qmNzPr0JrTB3G/pJ8AfSR9HvgD8NM9bRQR24GrgCeAhcD9EbFA0iRJF6SrnQG8Jul1kg7pm1vxM5SO//f/4JvfhEsvTZ6nZGbWgSkiGl8oiaRp6AjgY4CAJyLiqfYJr/mqqqqiurq6eAG8915SY+jeHV56KRkkxsysxEmaExFVhZY12cSUNi09FhHHACWXFErGzp3wT/+UdE6/8IKTg5ntE5rTxPSSpBMzj6QjmzIFfv97uPVWGDGi2NGYmbWJ5nRSnwx8WtJbwCaSZqZI7362556Dr38dPvlJ+Jd/KXY0ZmZtpjkJ4uOZR9FRrVoFY8cmA9P/x3/4fgcz26fsMUFExFuSjgNGpUXPRsS8bMPqAHbuhMsvh3ffTQao33//YkdkZtammnMn9ZeAXwIHpq/7JH0x68BK3q23JjfCTZkCJ5xQ7GjMzNpcc5qYPgecHBGbACRNBp4HbssysJL2/PPJ+NGXXAJXXVXsaMzMMtGcq5hE8nykOjvSsvK0enXS73DwwfCzn7nfwcz2Wc2pQfwc+JOkB9P5i4CfZRdSCYuAz342GUP6ueegT59iR2RmlpnmdFLfKmkWMDIt+mxEvJxpVKXqv/4LHn4YfvhDONG3hpjZvm2PCULSKcCCiHgpne8t6eSI+FPm0ZWa55+Hrl3d72BmZaE5fRB3Ahtz5jemZeWnpgaOOgo6N6dlzsysY2tWJ3XkPNEvfTR3eZ4ha2rgWN9AbmbloTkJYrGkqyV1SV9fAhZnHVjJqa1NOqedIMysTDQnQVwBfJRk0J/lJM9mmpBlUCXplVeSdycIMysTzbmK6V2S0eDKW01N8u4EYWZlojmP2vheeuVSF0kzJNVK+kxzPlzSaEmvSVokqcGQoZIOTT+zRtIsSYPS8uGSnpe0IF32Dy3/0dpYTQ307w8HHljsSMzM2kVzmpg+FhHrgU8AS4APAf93TxtJqgBuB84BhgHjJA3LW20KcG/66PBJwC1p+WbgnyLiKGA08CNJxb0rzR3UZlZmmpMg6pqhzgN+ExHrmvnZJwGLImJxRGwFpgMX5q0zDHg6nZ5ZtzwiXo+IN9Lpt4F3gcpm7rftbd8OCxY4QZhZWWlOgnhE0qvACcAMSZXAlmZsNxBYljO/PC3LNQ+4JJ2+GOglqW/uCpJOAroC/5O/A0kTJFVLqq6trW1GSK20aBFs2eIEYWZlZY8JIiKuI7mKqSoitpE0/+TXBFrrGuB0SS8Dp5NcKbXrwYCSBgC/IHm8x84Csd0dEVURUVVZmWEFwx3UZlaGmnXDW0SszpneRDL06J6sAA7OmR+UluV+7tukNQhJPYExEbE2ne8NPApcHxEvNCfOzNTUQEUFHHlkUcMwM2tPzWliaq0XgaGShkjqSnKp7MO5K0jqJ6kuhonAPWl5V+BBkg7sBzKMsXlqauCII6Bbt2JHYmbWbjJLEBGxHbgKeAJYCNwfEQskTZJ0QbraGcBrkl4H+gM3p+WXAn8LjJc0N30NzyrWPfIVTGZWhhptYpL0caBX/n/wkj4JrIuIp/b04RHxGPBYXtkNOdMPAA1qCBFxH3DfHqNvD+vWwVtvwRVXFDsSM7N21VQN4gbgjwXKZ5Hcs1Ae/IgNMytTTSWIbhHR4NrRiHgP2C+7kEqMr2AyszLVVILoLalBE5SkLkCP7EIqMTU1cMABMDD/Fg4zs31bUwnid8BPJe2qLaSXot6VLisPdR3UUrEjMTNrV00liG8AK4G3JM2R9BLwJlCbLtv37dyZ9EG4ecnMylCjVzGll6leJ+lbJA/og+TZSn9tl8hKwZIlsHGjE4SZlaWmLnO9JK8ogD6S5kbEhmzDKhHuoDazMtbUozbOL1D2QeBYSZ+LiKcLLN+31NQkfQ9HHVXsSMzM2l1TTUyfLVQu6VDgfpKhR/dtNTXwoQ/BfuVzVa+ZWZ0WP2ojIt4CumQQS+nxIzbMrIy1OEFI+gjwfgaxlJZNm5JxIJwgzKxMNdVJ/d8kHdO5PggMAP4xy6BKwoIFEOEEYWZlq6lO6il58wGsAt5IhxDdt/kKJjMrc011Uhd6UB+SRkoaFxFXZhdWCaipgZ49YfDgYkdiZlYUzRpRTtII4DLgUyR3U+/7j9qoqYFjjoFOWY6pZGZWuho9+0n6sKQbJb0K3AYsBRQRZ0bEbc35cEmjJb0maZGk6wosP1TSDEk1kmZJGpSz7HJJb6Svy1vxs7VehK9gMrOy19S/x68CZwGfiIiRaVLY0dwPllQB3A6cAwwDxkkalrfaFJJhRY8lGWPilnTbDwI3ktxrcRJwo6QDmrvvvbZiBaxZ4wRhZmWtqQRxCfAOMFPSTyWdDbTkkaYnkTy7aXHaqT0duDBvnWFA3R3ZM3OWfxx4KiJWR8Qa4ClgdAv2vXfcQW1m1niCiIj/ioixwBEkJ+8vAwdKulPSx5rx2QOBZTnzy9OyXPNIEhHAxUAvSX2buW125s9P3o85pt12aWZWavbYAxsRmyLiVxFxPjAIeBn4Whvt/xrgdEkvA6cDK2hZM9YESdWSqmtrGwx+13qrV0PXrrD//m33mWZmHUyLLtGJiDURcXdEnN2M1VcAB+fMD0rLcj/v7Yi4JCJGANenZWubs2267t0RURURVZWVlS35UZq2eTN84ANt93lmZh1QltdwvggMlTREUldgLPBw7gqS+kmqi2EicE86/QTwMUkHpJ3TH0vL2semTX5An5mVvcwSRDrg0FUkJ/aFwP0RsUDSJEkXpKudAbwm6XWgP3Bzuu1q4NskSeZFYFJa1j6cIMzMmnejXGtFxGPAY3llN+RMPwA80Mi297C7RtG+Nm92gjCzsufbhAvZtMl9EGZW9pwgCnETk5mZE0RBbmIyM3OCKMhNTGZmThAFuYnJzMwJoiAnCDMzJ4gGInwntZkZThANvf8+7NzpGoSZlT0niHybNiXvThBmVuacIPJt3py8u4nJzMqcE0Q+1yDMzAAniIacIMzMACeIhtzEZGYGOEE05BqEmRngBNGQE4SZGeAE0VBdE5MThJmVuUwThKTRkl6TtEjSdQWWHyJppqSXJdVIOjct7yLpPyW9ImmhpIlZxllPXQ3CfRBmVuYySxCSKoDbgXOAYcA4ScPyVvsGyVCkI0jGrL4jLf8U0C0ijgFOAP5Z0uCsYq3HTUxmZkC2NYiTgEURsTgitgLTgQvz1gmgdzq9P/B2Tvl+kjoDPYCtwPoMY93NVzGZmQHZJoiBwLKc+eVpWa6bgM9IWk4ydvUX0/IHgE3AO8BSYEpErM4w1t02bYKuXaFzpsN1m5mVvGJ3Uo8DpkbEIOBc4BeSOpHUPnYAfwMMAf5V0mH5G0uaIKlaUnVtbW3bRORHfZuZAdkmiBXAwTnzg9KyXJ8D7geIiOeB7kA/4DLg8YjYFhHvAs8BVfk7iIi7I6IqIqoqKyvbJmoPN2pmBmSbIF4EhkoaIqkrSSf0w3nrLAXOBpB0JEmCqE3Lz0rL9wNOAV7NMNbdPNyomRmQYYKIiO3AVcATwEKSq5UWSJok6YJ0tX8FPi9pHjANGB8RQXL1U09JC0gSzc8joiarWOtxE5OZGQCZ9sRGxGMknc+5ZTfkTP8FOK3AdhtJLnVtf25iMjMDit9JXXrcxGRmBjhBNOQmJjMzwAmiIScIMzPACaIh90GYmQFOEA25D8LMDHCCqC/CTUxmZikniFzvv58kCScIMzMniHo8FoSZ2S5OELk8FoSZ2S5OELk83KiZ2S5OELncxGRmtosTRC43MZmZ7eIEkctNTGZmuzhB5HITk5nZLk4QudzEZGa2S6bjQXQ4bmIyKynbtm1j+fLlbNmypdihdHjdu3dn0KBBdOnSpdnbZJogJI0G/g2oAP4jIr6bt/wQ4D+BPuk616WDDCHpWOAnQG9gJ3BiRGT7LXETk1lJWb58Ob169WLw4MFIKnY4HVZEsGrVKpYvX86QIUOavV1mTUySKkiGDj0HGAaMkzQsb7VvkAxFOoJkzOo70m07A/cBV0TEUcAZwLasYt3FTUxmJWXLli307dvXyWEvSaJv374troll2QdxErAoIhZHxFZgOnBh3jpBUkMA2B94O53+GFATEfMAImJVROzIMNbE5s3QrRtUVGS+KzNrHieHttGa45hlghgILMuZX56W5boJ+Iyk5SRjV38xLf8wEJKekPSSpGsL7UDSBEnVkqpra2v3PmI/ydXMbJdiX8U0DpgaEYOAc4FfSOpE0jcyEvh0+n6xpLPzN46IuyOiKiKqKisr9z4ajwVhZjlWrVrF8OHDGT58OAcddBADBw7cNb9169Ymt62urubqq69u8T7nzp2LJB5//PFdZUuWLOHoo4+ut95NN93ElClTds1PmTKFI444guHDh3PiiSdy7733tnjf+bLspF4BHJwzPygty/U5YDRARDwvqTvQj6S28UxEvAcg6THgeGBGhvF6NDkzq6dv377MnTsXSE7IPXv25Jprrtm1fPv27XTuXPg0WlVVRVVVVYv3OW3aNEaOHMm0adMYPXp0s7a56667eOqpp/jzn/9M7969Wb9+PQ8++GCL950vywTxIjBU0hCSxDAWuCxvnaXA2cBUSUcC3YFa4AngWkkfALYCpwM/zDDWhJuYzDqEL38Z0vN2iw0fDj/6Uev3PX78eLp3787LL7/MaaedxtixY/nSl77Eli1b6NGjBz//+c/5yEc+wqxZs5gyZQqPPPIIN910E0uXLmXx4sUsXbqUL3/5ywVrFxHBb37zG5566ilGjRrFli1b6N69+x5j+s53vsOsWbPo3Tvp0u3duzeXX35563/IVGYJIiK2S7qK5GRfAdwTEQskTQKqI+Jh4F+Bn0r6CkmH9fiICGCNpFtJkkwAj0XEo1nFuoubmMysGZYvX87s2bOpqKhg/fr1PPvss3Tu3Jk//OEPfP3rX+e3v/1tg21effVVZs6cyYYNG/jIRz7CF77whQb3JMyePZshQ4Zw+OGHc8YZZ/Doo48yZsyYJmNZv349GzZs4LDDDmvTnxEyvg8ivafhsbyyG3Km/wKc1si295Fc6tp+Nm2CAw5o112aWcvtTQ2gLXzqU5+iIr3acd26dVx++eW88cYbSGLbtsJX5J933nl069aNbt26ceCBB7Jy5UoGDRpUb51p06YxduxYAMaOHcu9997LmDFjGr0CKesrvHwnda7NmyHvF2Zmlm+/nKbob37zm5x55pk8+OCDLFmyhDPOOKPgNt26dds1XVFRwfbt2+st37FjB7/97W956KGHuPnmm3fd3LZhwwb69u3LmjVr6q2/evVqhgwZQu/evenZsyeLFy9u81pEsa9iKi1uYjKzFlq3bh0DByZX8E+dOrXVnzNjxgyOPfZYli1bxpIlS3jrrbcYM2YMDz74ID179mTAgAE8/fTTQJIcHn/8cUaOHAnAxIkTufLKK1m/fj0AGzdubJOrmJwgcrmT2sxa6Nprr2XixImMGDGiQa2gJaZNm8bFF19cr2zMmDFMmzYNgHvvvZdvf/vbDB8+nLPOOosbb7yRww8/HIAvfOELnHnmmZx44okcffTRjBo1ik6d9v70rqRPuOOrqqqK6urqvfuQXr1gwgT4wQ/aJigz2ysLFy7kyCOPLHYY+4xCx1PSnIgoeD2uaxB1ItzEZGaWwwmizpYtSZJwE5OZGeAEsZvHgjAzq8cJoo7HgjAzq8cJoo7HgjAzq8c3ytXWwre+BUOHJvNOEGZmgGsQSZPSHXfAww8n804QZpbam8d9A8yaNYvZs2c3uc5FF13EKaecUq9s/PjxPPDAA/XKevbsuWv69ddf59xzz2Xo0KEcf/zxXHrppaxcubIFP1nzuAax335wxBHwwgvJvPsgzCy1p8d978msWbPo2bMnH/3oRwsuX7t2LXPmzGnRozK2bNnCeeedx6233sr555+/az+1tbX079+/2bE1hxMEwPHHw8KFybRrEGalaW+e8d2YVjz7e86cOXz1q19l48aN9OvXj6lTpzJgwAB+/OMfc9ddd9G5c2eGDRvGd7/7Xe666y4qKiq47777uO222xg1alS9z/rd737H+eefT//+/Zk+fTpf//rX97j/X/3qV5x66qm7kgPQ6POf9pYTBCQJ4pe/TKadIMysERHBF7/4RR566CEqKyv59a9/zfXXX88999zDd7/7Xd588026devG2rVr6dOnD1dccUWTtY5p06Zxww030L9/f8aMGdOsBDF//nxOOOGEtv7RCnKCABgxYve0m5jMSlOxn/ENvP/++8yfP5+/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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(n_estimators, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(n_estimators, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"n_estimators\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rmBGF-zRu54U" + }, + "source": [ + "### Test max depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jSC3S0t3u54V", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "17c9b88f-2079-4b35-9492-3e609871b5df" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.0\n", + "2.0\n", + "3.0\n", + "4.0\n", + "5.0\n", + "6.0\n", + "7.0\n", + "8.0\n", + "9.0\n", + "10.0\n", + "11.0\n", + "12.0\n", + "13.0\n", + "14.0\n", + "15.0\n", + "16.0\n", + "17.0\n", + "18.0\n", + "19.0\n", + "20.0\n", + "21.0\n", + "22.0\n", + "23.0\n", + "24.0\n", + "25.0\n", + "26.0\n", + "27.0\n", + "28.0\n", + "29.0\n", + "30.0\n", + "31.0\n", + "32.0\n" + ] + } + ], + "source": [ + "max_depths = np.linspace(1, 32, 32, endpoint=True)\n", + "train_results = []\n", + "test_results = []\n", + "for max_depth in max_depths:\n", + " print(max_depth)\n", + " rf = RandomForestClassifier(max_depth=max_depth, max_features=\"sqrt\", n_estimators = 50)\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4ie_VEPKu54V", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "outputId": "8caa096d-0e58-4feb-f78d-4ca6b8e2e48e" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(max_depths, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(max_depths, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"Tree depth\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8kouoCd3u54V" + }, + "source": [ + "## Selected RF\n", + "From the previous we select settings for our selected RF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "pEI4JKIBu54V" + }, + "outputs": [], + "source": [ + "# Random Forest\n", + "rf = RandomForestClassifier(n_estimators=25, max_depth=20, max_features=\"sqrt\")\n", + "# Train Decision Tree Classifer\n", + "rf.fit(X_train,y_train)\n", + "\n", + "#Predict the response for test dataset\n", + "y_pred = rf.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4yXXuuZUu54V" + }, + "source": [ + "## Confusion matrix and classification report" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## without resampling" + ], + "metadata": { + "id": "shpeA4Qg9jQf" + } + }, + { + "cell_type": "markdown", + "metadata": { + "id": "x79LUgYS-Enl" + }, + "source": [ + "## Test settings RandomForestAlgorithm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "fe5df753-f49d-438f-f6fe-3ee7cb055dc0", + "id": "CtqGerXL-Enl" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1\n", + "2\n", + "4\n", + "8\n", + "16\n", + "32\n", + "64\n", + "100\n", + "200\n" + ] + } + ], + "source": [ + "n_estimators = [1, 2, 4, 8, 16, 32, 64, 100, 200]\n", + "train_results = []\n", + "test_results = []\n", + "for estimator in n_estimators:\n", + " print(estimator)\n", + " rf = RandomForestClassifier(n_estimators=estimator, max_features=\"sqrt\")\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 280 + }, + "outputId": "4f12538a-d009-42b0-bd49-e04675df0aaa", + "id": "eOU5jGo6-Enm" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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H//4x+nTp8+G+Q+3MMBnfX09F154YYv3OWvWLCRx//33byibP38+++677ybrXXXVVVx33XUb5q+77jr22msvBg0axMEHH8zYsWNbvO/GPJorbEwQjb/wO+6AxYuTS1vNrN3p3r07s2bNApITcufOnbn44os3LF+7di0dOxY+jdbV1VHXiufBjBs3jsGDBzNu3DiGDStuhKGbb76ZBx98kCeffJKuXbuyYsUKJkyY0OJ9N+YEAYVrEBHw85/D/vvD0KHlicvMCrroIkjP2y02aFDyp91aZ511FjU1NTz99NMcfvjhjBw5km984xusXr2aj3zkI/zud79jzz33ZNq0aVx33XXce++9XHXVVbzxxhvMmzePN954g4suuqhg7SIi+NOf/sSDDz7IEUccwerVq6mpqdliTD/84Q+ZNm0aXbt2BaBr166MGrX1g2A7QUDhBPHww/Dcc/C73/nGODPbRENDA9OnT6eqqooVK1bw6KOP0rFjRx566CEuu+wy7rnnns22eemll5g6dSorV65kzz335Nxzz93snoTp06dTW1vLHnvswZAhQ7jvvvsYMWJEs7GsWLGClStXsvvuu7fpzwhOEIncSKz5CeL666FXLw/GZ1aBtqYG0BZOP/10qqqqAHjnnXcYNWoUc+bMQRJr1qwpuM2JJ55IdXU11dXVfOxjH2PRokX07dt3k3XGjRvHyJEjARg5ciRjx45lxIgRTV6BlPUVXk4QsHkN4qWXkqE1vv/9jcvMzFI77rjjhunvfe97DB06lAkTJjB//nyGDBlScJvqvHNJVVUVa9eu3WT5unXruOeee/jrX//K1VdfveHmtpUrV9K9e3eWLdv0cThLly6ltraWrl270rlzZ+bNm9fmtQhfxQSb1yBuvx2qquCcc8oXk5ltE9555x369EmeRjBmzJhWf87DDz/M/vvvz4IFC5g/fz6vv/46I0aMYMKECXTu3JnevXszZUryRISlS5dy//33M3jwYAAuvfRSzjvvPFasWAHAqlWr2uQqJicIgA4dkiE0cgni6adh773hYx8rb1xmVvG+/e1vc+mll3LAAQdsVitoiXHjxvH5z39+k7IRI0Ywblwy0PXYsWP5wQ9+wKBBgzjqqKO48sor2WOPPQA499xzGTp0KAcffDD77rsvRxxxBB06bP3pXXlj5G3T6urqor6+vvUf0KULfP3r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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(n_estimators, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(n_estimators, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"n_estimators\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vAMnQXIy-Enm" + }, + "source": [ + "### Test max depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "a4a7c998-984c-4233-dc94-29781d71e4a6", + "id": "D5k-zr_3-Enm" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.0\n", + "2.0\n", + "3.0\n", + "4.0\n", + "5.0\n", + "6.0\n", + "7.0\n", + "8.0\n", + "9.0\n", + "10.0\n", + "11.0\n", + "12.0\n", + "13.0\n", + "14.0\n", + "15.0\n", + "16.0\n", + "17.0\n", + "18.0\n", + "19.0\n", + "20.0\n", + "21.0\n", + "22.0\n", + "23.0\n", + "24.0\n", + "25.0\n", + "26.0\n", + "27.0\n", + "28.0\n", + "29.0\n", + "30.0\n", + "31.0\n", + "32.0\n" + ] + } + ], + "source": [ + "max_depths = np.linspace(1, 32, 32, endpoint=True)\n", + "train_results = []\n", + "test_results = []\n", + "for max_depth in max_depths:\n", + " print(max_depth)\n", + " rf = RandomForestClassifier(max_depth=max_depth, max_features=\"sqrt\", n_estimators = 50)\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "outputId": "5f1e7165-f595-4b2f-88c7-5bae36cf559f", + "id": "RJQxwK3a-Enm" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deZzN9f7A8de7MSGSQupSqGtJpYmppBTd9pJEhbppuZUi6rar2060R6koSWWQUuJe0uIikhlK1vhZatS1r1NjmXn//nif4RhjzDBnvmd5Px+P85hzvufMOe/vHL7v7/ezvD+iqjjnnEtcBwUdgHPOuWB5InDOuQTnicA55xKcJwLnnEtwngiccy7BlQk6gOKqWrWq1q5dO+gwnHMupmRkZKxR1WoFPRdziaB27dqkp6cHHYZzzsUUEVm+t+e8acg55xJcxBKBiAwSkVUiMmcvz4uI9BWRxSIyW0QaRyoW55xzexfJK4LBwMWFPH8JUDd0uw14I4KxOOec24uI9RGo6iQRqV3IS1oDQ9RqXHwnIpVF5GhV/b24n7V9+3YyMzPJzs7ez2hdnnLlylGzZk2Sk5ODDsU5V0qC7CyuAfwa9jgztG2PRCAit2FXDRx77LF7vFFmZiaHHnootWvXRkQiE20CUFXWrl1LZmYmderUCToc51wpiYnOYlUdoKqpqppardqeo5+ys7OpUqWKJ4EDJCJUqVLFr6ycSzBBJoIVwDFhj2uGtu0XTwIlw/+OziWeIBPBaOCG0OihpsDG/ekfcM65eKYKs2bBU0/B7NmR+YxIDh9NA6YB9UUkU0RuEZHOItI59JJ/A0uAxcBA4M5IxRJpa9euJSUlhZSUFI466ihq1Kix8/G2bdsK/d309HS6detW7M/84YcfEBHGjRu3c9uyZcs46aSTdnvdE088wQsvvLDz8QsvvECDBg1ISUnhtNNOY8iQIcX+bOdcZG3dCuPHQ5cuUKsWNG4MTzwB334bmc+L5KihDvt4XoEukfr80lSlShV++OEHwA68FStW5L777tv5/I4dOyhTpuA/dWpqKqmpqcX+zLS0NM4++2zS0tK4+OLCRunu8uabbzJhwgS+//57KlWqxKZNmxg1alSxP9s5V/LWroV//xtGj4Zx42DLFjjkELjwQnjySbjsMjjyyMh8dsyVmIgVN954I+XKlWPWrFmcddZZtG/fnu7du5OdnU358uV59913qV+/PhMnTuSFF15gzJgxPPHEE/zyyy8sWbKEX375hbvvvrvAqwVV5aOPPmLChAk0b96c7OxsypUrt8+YevXqxcSJE6lUqRIAlSpVolOnTiW+7865olGFd9+F996DKVMgNxeOPho6doQrroDzzoPy5SMfR1wngrvvhtCJerGlpMArrxzY52dmZjJ16lSSkpLYtGkTkydPpkyZMnz55Zf06NGDjz/+eI/fWbBgAd988w2bN2+mfv363HHHHXuM6Z86dSp16tTh+OOPp0WLFowdO5a2bdsWGsumTZvYvHkzxx133IHtlHOuROTkwF13wRtvwIknQo8edvBv0gQOKuXe27hOBEG7+uqrSUpKAmDjxo106tSJRYsWISJs3769wN+57LLLKFu2LGXLluXII49k5cqV1KxZc7fXpKWl0b59ewDat2/PkCFDaNu27V5H/PhIIOeiyx9/QIcO1gz0wAPw7LOlf/APF9eJ4EDP6A9UhQoVdt7/17/+RcuWLRk1ahTLli2jRYsWBf5O2bJld95PSkpix44duz2fk5PDxx9/zGeffUbPnj13TgLbvHkzVapUYf369bu9ft26ddSpU4dKlSpRsWJFlixZ4lcFzgVozRpo1QqmT4e+fe2qIGgxMaEsHmzcuJEaNWoAMHjw4P1+n6+++opGjRrx66+/smzZMpYvX07btm0ZNWoUFStW5Oijj+brr78GLAmMGzeOs88+G4CHH36YLl26sGnTJgC2bNnio4acK0VLlkCzZjYc9KOPoiMJgCeCUvPAAw/w8MMPc+qpp+5xll8caWlptGnTZrdtbdu2JS0tDYAhQ4bw9NNPk5KSwnnnncfjjz/O8ccfD8Add9xBy5YtOe200zjppJNo3rw5BwV5PepcAklPhzPPtCuCr76CfXTrlSqxUZyxIzU1VfMvTDN//nxOOOGEgCKKP/73dK5k/ec/cPXVULWqDQ1t0KD0YxCRDFUtcKy6nw4651wEDRpkfQL16sG0acEkgX3xROCccxGgahPBbrkF/vY3+O9/bY5ANIrrUUPOOVeaVGHePJgwAT7/HL7+Gjp1goEDIZqX+PBE4JxzB+C33+DLL3fdfg+VzqxbF/r0gfvvh2ifyuOJwDnnimH7disI9+WXduY/b55tr1oVzj9/161WrWDj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6AFLlthVgVcYLRl+ReCcixlTpti8gS5d4Nxzg44mfngicM7FhD/+sFpCtWpZuWlXcrxpyDkXEx57DBYtgq++gooVg44mvvgVgXMu6n33Hbz8Mtx+O5x3XtDRxB9PBM65qJadDTfdBDVq2JoDruR505BzLqo9+SQsWADjxtkylK7k+RWBcy5qzZhhVwE33wwXXRR0NPHLE4FzLipt3WpNQkcdZTWFXOR405BzLio98wzMnQtjxkDlykFHE9/8isA5F3VmzYJnn4UbboDLLgs6mvjnicA5F1XWrIGOHaFaNRsy6iLPm4acc1Fj40brFF62zEYJHXFE0BElBk8EzrmokJVlzUA//QSffuq1hEqTJwLnXOCys6FNG5g2DYYPh0svDTqixOKJwDkXqO3b4dprYcIEGDwY2rULOqLE453FzrnA5ORAp04wejS8/rrdd6XPE4FzLhCq0LkzpKVZWek77ww6osTlicA5V+pU4Z//hLffhkcegQcfDDqixOaJwDlX6h5/HF55Bbp3h6efDjoa54nAOVeqnn/eDv633GITxkSCjsh5InDOlZq334YHHoD27eGttzwJRAtPBM65UvHjj9C1K1x4IQwZAklJQUfk8ngicM5FXFaWXQUcfjh88AEkJwcdkQvnE8qccxF3zz2wcKFNGqtWLehoXH5+ReCci6iPPoKBA+Ghh+Bvfws6GlcQTwTOuYhZvhxuvRXOOMPWHnbRyROBcy4iduywdQVUbfaw9wtEL+8jcM5FxJNPwtSpMHQo1KkTdDSuMH5F4JwrcRMnQs+etvh8hw5BR+P2JaKJQEQuFpGFIrJYRB4q4PljReQbEZklIrNFxKuQOxfj1qyB666DunWhb9+go3FFEbFEICJJwOvAJUBDoIOINMz3skeBEap6KtAe6B+peJxzkadqpSPWrIFhw6BixaAjckVRpEQgImeLyE2h+9VEpCgtfqcDi1V1iapuA4YBrfO9RoFKofuHAb8VLWznXDTq39/WFujTB049NehoXFHts7NYRB4HUoH6wLtAMvABcNY+frUG8GvY40zgjHyveQL4QkTuAioA5xcpaudc1Jk9G+6915aZ7N496GhccRTliqANcAWQBaCqvwGHltDndwAGq2pN4FLgfRHZIyYRuU1E0kUkffXq1SX00c65kvLHH7tKSLz7rheTizVFSQTbVFWxZhxEpEIR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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(max_depths, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(max_depths, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"Tree depth\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "r2BFqioH9g7m", + "outputId": "14bc05c9-9ffa-4488-a00c-319ac9672def" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: mooing\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[128327 15]\n", + " [ 778 158]]\n", + "Accuracy Score : 0.9938659323318739\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 1.00 128342\n", + " 1 0.91 0.17 0.28 936\n", + "\n", + " accuracy 0.99 129278\n", + " macro avg 0.95 0.58 0.64 129278\n", + "weighted avg 0.99 0.99 0.99 129278\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## with resaampling" + ], + "metadata": { + "id": "uHRZyGAV9v6F" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yIS1sqfJu54W", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "8c6c0b38-1280-47f5-c324-397295580d1c" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: mooing\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[909 41]\n", + " [ 73 877]]\n", + "Accuracy Score : 0.94\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.93 0.96 0.94 950\n", + " 1 0.96 0.92 0.94 950\n", + "\n", + " accuracy 0.94 1900\n", + " macro avg 0.94 0.94 0.94 1900\n", + "weighted avg 0.94 0.94 0.94 1900\n", + "\n" + ] + } + ], + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Z5IVVh1pu54W", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "9c885051-7f9a-4e66-9960-01075e9ed535" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Feature: 0, Score: 0.01592\n", + "Feature: 1, Score: 0.02538\n", + "Feature: 2, Score: 0.02926\n", + "Feature: 3, Score: 0.03384\n", + "Feature: 4, Score: 0.03788\n", + "Feature: 5, Score: 0.08007\n", + "Feature: 6, Score: 0.06814\n", + "Feature: 7, Score: 0.06643\n", + "Feature: 8, Score: 0.06666\n", + "Feature: 9, Score: 0.06630\n", + "Feature: 10, Score: 0.01729\n", + "Feature: 11, Score: 0.02487\n", + "Feature: 12, Score: 0.02559\n", + "Feature: 13, Score: 0.03034\n", + "Feature: 14, Score: 0.03188\n", + "Feature: 15, Score: 0.07919\n", + "Feature: 16, Score: 0.06715\n", + "Feature: 17, Score: 0.06396\n", + "Feature: 18, Score: 0.07723\n", + "Feature: 19, Score: 0.09262\n", + "Feature: 20, Score: 0.00000\n", + "Feature: 21, Score: 0.00000\n", + "Feature: 22, Score: 0.00000\n", + "Feature: 23, Score: 0.00000\n", + "Feature: 24, Score: 0.00000\n", + "Feature: 25, Score: 0.00000\n", + "Feature: 26, Score: 0.00000\n", + "Feature: 27, Score: 0.00000\n", + "Feature: 28, Score: 0.00000\n", + "Feature: 29, Score: 0.00000\n" + ] + } + ], + "source": [ + "# feature importance\n", + "model = rf\n", + "importance = model.feature_importances_\n", + "# summarize feature importance\n", + "for i,v in enumerate(importance):\n", + "\tprint('Feature: %0d, Score: %.5f' % (i,v))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SCMaUgSUvKlX" + }, + "source": [ + "# RandomForestAlgorithm Urinating" + ] + }, + { + "cell_type": "code", + "source": [ + "BEHAVIOUR_1= 'rumination_video'\n", + "BEHAVIOUR_2= 'eating_video'\n", + "BEHAVIOUR_3= 'drinking_video'\n", + "BEHAVIOUR_4= 'sleeping_video'\n", + "BEHAVIOUR_5= 'urinating_video'\n", + "BEHAVIOUR_6= 'mooing_video'\n", + "BEHAVIOUR_7= 'resting_video'" + ], + "metadata": { + "id": "tflHZ5fbvKlX" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "mNYoZP1JvKlY" + }, + "outputs": [], + "source": [ + "BEHAVIOUR='urinating'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nlQ3ksqVvKlY" + }, + "outputs": [], + "source": [ + "y_final = np.stack(signal_features_1[:,4], axis =0) # BEHAVIOUR_5= 'urinating_video'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "URQyVflE2GbI" + }, + "outputs": [], + "source": [ + "bool_minority_labels = y_final != 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "VAI35WN82GbK" + }, + "outputs": [], + "source": [ + "min_features = X_final[bool_minority_labels]\n", + "maj_features = X_final[~bool_minority_labels]\n", + "\n", + "min_labels = y_final[bool_minority_labels]\n", + "maj_labels = y_final[~bool_minority_labels]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MVy_-x6W2GbL" + }, + "source": [ + "Split the minority class in 70 30 to have more in train set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "V3oyvRyL2GbL" + }, + "outputs": [], + "source": [ + "# Split minority dataset into training set and test set\n", + "X_min_train, X_min_test, y_min_train, y_min_test = train_test_split(min_features, min_labels, test_size=0.3, random_state=1) # 70% training and 30% test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "goqZyjnl2GbM" + }, + "source": [ + "Split the majority class in 50 50 so we can sample from independant sets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tsz2Q9cX2GbM" + }, + "outputs": [], + "source": [ + "# Split minority dataset into training set and test set\n", + "X_maj_train, X_maj_test, y_maj_train, y_maj_test = train_test_split(maj_features, maj_labels, test_size=0.5, random_state=1) # 50% training and 50% test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uoE1Sm6D2GbM" + }, + "source": [ + "## Create train set" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LMOZu9Gd2GbN" + }, + "source": [ + "Upsample the amount of minority features and labels 3 times (why 3, no idea, feels that this will create enough labels)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "KVXBHLmb2GbN" + }, + "outputs": [], + "source": [ + "upsampled_X_min_train = np.concatenate([X_min_train, X_min_train, X_min_train], axis=0)\n", + "upsampled_y_min_train = np.concatenate([y_min_train, y_min_train, y_min_train], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mDuG8HSl2GbN" + }, + "source": [ + "Downsample from 50% of the majority class to have same amount of samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "32f1c0d5-2d34-4634-fcfb-b284bbda9982", + "id": "x4YtP7Am2GbN" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(2322, 30)" + ] + }, + "metadata": {}, + "execution_count": 69 + } + ], + "source": [ + "ids = np.arange(len(X_maj_train))\n", + "choices = np.random.choice(ids, len(upsampled_X_min_train))\n", + "\n", + "res_maj_train_features = X_maj_train[choices]\n", + "res_maj_train_labels = y_maj_train[choices]\n", + "\n", + "res_maj_train_features.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nrKRCDIG2GbO" + }, + "source": [ + "Concat together" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "uRtKN0jQ2GbO" + }, + "outputs": [], + "source": [ + "resampled_train_features = np.concatenate([upsampled_X_min_train, res_maj_train_features], axis=0)\n", + "resampled_train_labels = np.concatenate([upsampled_y_min_train, res_maj_train_labels], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2lEtyoxZ2GbO" + }, + "source": [ + "Shuffle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hqpuUUN-2GbP" + }, + "outputs": [], + "source": [ + "order = np.arange(len(resampled_train_labels))\n", + "np.random.shuffle(order)\n", + "resampled_train_features = resampled_train_features[order]\n", + "resampled_train_labels = resampled_train_labels[order]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pvVlPMJO2GbP" + }, + "source": [ + "## Create test set" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fEh4v9A-2GbP" + }, + "source": [ + "We start from the X_min_test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5CzpA55W2GbP" + }, + "source": [ + "And downsample the remaining part of the majority class which we didn't use so far" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "4LogLMlC2GbQ" + }, + "outputs": [], + "source": [ + "ids = np.arange(len(X_maj_test))\n", + "choices = np.random.choice(ids, len(X_min_test))\n", + "\n", + "res_maj_test_features = X_maj_test[choices]\n", + "res_maj_test_labels = y_maj_test[choices]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_i24ByfF2GbQ" + }, + "source": [ + "Concat" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "aSdbMMCF2GbQ" + }, + "outputs": [], + "source": [ + "resampled_test_features = np.concatenate([X_min_test, res_maj_test_features], axis=0)\n", + "resampled_test_labels = np.concatenate([y_min_test, res_maj_test_labels], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K2MIdTOu2GbQ" + }, + "source": [ + "Shuffle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Iavr8fGG2GbQ" + }, + "outputs": [], + "source": [ + "order = np.arange(len(resampled_test_labels))\n", + "np.random.shuffle(order)\n", + "resampled_test_features = resampled_test_features[order]\n", + "resampled_test_labels = resampled_test_labels[order]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "LFL3K6Zb2GbR" + }, + "outputs": [], + "source": [ + "X_train= resampled_train_features\n", + "y_train= resampled_train_labels\n", + "X_test= resampled_test_features\n", + "y_test= resampled_test_labels" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K3VPRg_4vKlY" + }, + "source": [ + "## Test settings RandomForestAlgorithm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "ec607b26-2308-43ce-9851-ce0c6547a066", + "id": "oNyVrhn_vKlY" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1\n", + "2\n", + "4\n", + "8\n", + "16\n", + "32\n", + "64\n", + "100\n", + "200\n" + ] + } + ], + "source": [ + "n_estimators = [1, 2, 4, 8, 16, 32, 64, 100, 200]\n", + "train_results = []\n", + "test_results = []\n", + "for estimator in n_estimators:\n", + " print(estimator)\n", + " rf = RandomForestClassifier(n_estimators=estimator, max_features=\"sqrt\")\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 280 + }, + "id": "V19IJ6tgvKlY", + "outputId": "73d3e7ef-5c5e-4d48-b106-260955d4901b" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(n_estimators, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(n_estimators, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"n_estimators\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b0pxjgsHvKlY" + }, + "source": [ + "### Test max depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qRTzxBMUvKlY", + "outputId": "d79c4081-756c-4851-80b0-8e361d7a8926" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.0\n", + "2.0\n", + "3.0\n", + "4.0\n", + "5.0\n", + "6.0\n", + "7.0\n", + "8.0\n", + "9.0\n", + "10.0\n", + "11.0\n", + "12.0\n", + "13.0\n", + "14.0\n", + "15.0\n", + "16.0\n", + "17.0\n", + "18.0\n", + "19.0\n", + "20.0\n", + "21.0\n", + "22.0\n", + "23.0\n", + "24.0\n", + "25.0\n", + "26.0\n", + "27.0\n", + "28.0\n", + "29.0\n", + "30.0\n", + "31.0\n", + "32.0\n" + ] + } + ], + "source": [ + "max_depths = np.linspace(1, 32, 32, endpoint=True)\n", + "train_results = []\n", + "test_results = []\n", + "for max_depth in max_depths:\n", + " print(max_depth)\n", + " rf = RandomForestClassifier(max_depth=max_depth, max_features=\"sqrt\", n_estimators = 50)\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "id": "FYgFS1_TvKlY", + "outputId": "b248708b-bf1f-4063-d995-22b1347b62e7" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(max_depths, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(max_depths, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"Tree depth\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "x-dEOvK3vKlY" + }, + "source": [ + "## Selected RF\n", + "From the previous we select settings for our selected RF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "DVB_q8aYvKlZ" + }, + "outputs": [], + "source": [ + "# Random Forest\n", + "rf = RandomForestClassifier(n_estimators=50, max_depth=15, max_features=\"sqrt\")\n", + "# Train Decision Tree Classifer\n", + "rf.fit(X_train,y_train)\n", + "\n", + "#Predict the response for test dataset\n", + "y_pred = rf.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uqdyWymOvKlZ" + }, + "source": [ + "## Confusion matrix and classification report" + ] + }, + { + "cell_type": "markdown", + "source": [ + "without resampling" + ], + "metadata": { + "id": "FhyVsSTXFK0h" + } + }, + { + "cell_type": "code", + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7p7P1j2fFM9c", + "outputId": "da5a9a90-aee8-4cd4-ce27-f23c9fcb150d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: urinating\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[128334 8]\n", + " [ 855 81]]\n", + "Accuracy Score : 0.9933244635591516\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 1.00 128342\n", + " 1 0.91 0.09 0.16 936\n", + "\n", + " accuracy 0.99 129278\n", + " macro avg 0.95 0.54 0.58 129278\n", + "weighted avg 0.99 0.99 0.99 129278\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "with resampling" + ], + "metadata": { + "id": "1eT7eoiuFON5" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "b56cd904-7afc-422b-974b-22ed45aa0bd2", + "id": "T6kHN-4qvKlZ" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: urinating\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[330 3]\n", + " [ 10 323]]\n", + "Accuracy Score : 0.9804804804804805\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.97 0.99 0.98 333\n", + " 1 0.99 0.97 0.98 333\n", + "\n", + " accuracy 0.98 666\n", + " macro avg 0.98 0.98 0.98 666\n", + "weighted avg 0.98 0.98 0.98 666\n", + "\n" + ] + } + ], + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "md2_QB9OvKlZ" + }, + "source": [ + "##Feature importances" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "7bb77931-f809-42cf-d610-eda9e5beef46", + "id": "9XaiZrZnvKlZ" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Feature: 0, Score: 0.03025\n", + "Feature: 1, Score: 0.04197\n", + "Feature: 2, Score: 0.03687\n", + "Feature: 3, Score: 0.03050\n", + "Feature: 4, Score: 0.05664\n", + "Feature: 5, Score: 0.08549\n", + "Feature: 6, Score: 0.09199\n", + "Feature: 7, Score: 0.07974\n", + "Feature: 8, Score: 0.06275\n", + "Feature: 9, Score: 0.05362\n", + "Feature: 10, Score: 0.02258\n", + "Feature: 11, Score: 0.02659\n", + "Feature: 12, Score: 0.02583\n", + "Feature: 13, Score: 0.02239\n", + "Feature: 14, Score: 0.02241\n", + "Feature: 15, Score: 0.06408\n", + "Feature: 16, Score: 0.10550\n", + "Feature: 17, Score: 0.05459\n", + "Feature: 18, Score: 0.04518\n", + "Feature: 19, Score: 0.04102\n", + "Feature: 20, Score: 0.00000\n", + "Feature: 21, Score: 0.00000\n", + "Feature: 22, Score: 0.00000\n", + "Feature: 23, Score: 0.00000\n", + "Feature: 24, Score: 0.00000\n", + "Feature: 25, Score: 0.00000\n", + "Feature: 26, Score: 0.00000\n", + "Feature: 27, Score: 0.00000\n", + "Feature: 28, Score: 0.00000\n", + "Feature: 29, Score: 0.00000\n" + ] + } + ], + "source": [ + "# feature importance\n", + "model = rf\n", + "importance = model.feature_importances_\n", + "# summarize feature importance\n", + "for i,v in enumerate(importance):\n", + "\tprint('Feature: %0d, Score: %.5f' % (i,v))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UKfQ0sQNuyCu" + }, + "source": [ + "# RandomForestAlgorithm Drinking" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "I5ReXUBFwc_s" + }, + "outputs": [], + "source": [ + "BEHAVIOUR='drinking'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Xd3VcSpRu54R" + }, + "outputs": [], + "source": [ + "y_final = np.stack(signal_features_1[:,2], axis =0) # BEHAVIOUR_3= 'drinking_video'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3l1yQk4x3bZf" + }, + "outputs": [], + "source": [ + "bool_minority_labels = y_final != 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wwlZmpB53bZf" + }, + "outputs": [], + "source": [ + "min_features = X_final[bool_minority_labels]\n", + "maj_features = X_final[~bool_minority_labels]\n", + "\n", + "min_labels = y_final[bool_minority_labels]\n", + "maj_labels = y_final[~bool_minority_labels]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iT8xfEZJ3bZf" + }, + "source": [ + "Split the minority class in 70 30 to have more in train set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vZkPmnWa3bZf" + }, + "outputs": [], + "source": [ + "# Split minority dataset into training set and test set\n", + "X_min_train, X_min_test, y_min_train, y_min_test = train_test_split(min_features, min_labels, test_size=0.3, random_state=1) # 70% training and 30% test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ah9x9ENT3bZf" + }, + "source": [ + "Split the majority class in 50 50 so we can sample from independant sets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "qFZrwQ__3bZf" + }, + "outputs": [], + "source": [ + "# Split minority dataset into training set and test set\n", + "X_maj_train, X_maj_test, y_maj_train, y_maj_test = train_test_split(maj_features, maj_labels, test_size=0.5, random_state=1) # 50% training and 50% test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KSlpyP1q3bZf" + }, + "source": [ + "## Create train set" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "O4owWQRk3bZf" + }, + "source": [ + "Upsample the amount of minority features and labels 3 times (why 3, no idea, feels that this will create enough labels)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EXf42TdN3bZf" + }, + "outputs": [], + "source": [ + "upsampled_X_min_train = np.concatenate([X_min_train, X_min_train, X_min_train], axis=0)\n", + "upsampled_y_min_train = np.concatenate([y_min_train, y_min_train, y_min_train], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iknpy8I13bZg" + }, + "source": [ + "Downsample from 50% of the majority class to have same amount of samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "66b8c1d5-1294-41bd-db76-47b886fca2d1", + "id": "1vdAC-yZ3bZg" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(9630, 30)" + ] + }, + "metadata": {}, + "execution_count": 89 + } + ], + "source": [ + "ids = np.arange(len(X_maj_train))\n", + "choices = np.random.choice(ids, len(upsampled_X_min_train))\n", + "\n", + "res_maj_train_features = X_maj_train[choices]\n", + "res_maj_train_labels = y_maj_train[choices]\n", + "\n", + "res_maj_train_features.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nkaHMdJ83bZg" + }, + "source": [ + "Concat together" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "pDd6j6Rk3bZg" + }, + "outputs": [], + "source": [ + "resampled_train_features = np.concatenate([upsampled_X_min_train, res_maj_train_features], axis=0)\n", + "resampled_train_labels = np.concatenate([upsampled_y_min_train, res_maj_train_labels], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "P1mKCAC63bZg" + }, + "source": [ + "Shuffle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "R2MgX8A_3bZg" + }, + "outputs": [], + "source": [ + "order = np.arange(len(resampled_train_labels))\n", + "np.random.shuffle(order)\n", + "resampled_train_features = resampled_train_features[order]\n", + "resampled_train_labels = resampled_train_labels[order]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "C2IC3TFz3bZg" + }, + "source": [ + "## Create test set" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5O0lyU253bZg" + }, + "source": [ + "We start from the X_min_test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Uvfmf-413bZg" + }, + "source": [ + "And downsample the remaining part of the majority class which we didn't use so far" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GGG_IsWr3bZg" + }, + "outputs": [], + "source": [ + "ids = np.arange(len(X_maj_test))\n", + "choices = np.random.choice(ids, len(X_min_test))\n", + "\n", + "res_maj_test_features = X_maj_test[choices]\n", + "res_maj_test_labels = y_maj_test[choices]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YP1DJjEc3bZh" + }, + "source": [ + "Concat" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Q49p8NE53bZh" + }, + "outputs": [], + "source": [ + "resampled_test_features = np.concatenate([X_min_test, res_maj_test_features], axis=0)\n", + "resampled_test_labels = np.concatenate([y_min_test, res_maj_test_labels], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ptpIZyYP3bZh" + }, + "source": [ + "Shuffle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "B54HxSnM3bZh" + }, + "outputs": [], + "source": [ + "order = np.arange(len(resampled_test_labels))\n", + "np.random.shuffle(order)\n", + "resampled_test_features = resampled_test_features[order]\n", + "resampled_test_labels = resampled_test_labels[order]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "T-QdKCWM3bZh" + }, + "outputs": [], + "source": [ + "X_train= resampled_train_features\n", + "y_train= resampled_train_labels\n", + "X_test= resampled_test_features\n", + "y_test= resampled_test_labels" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yP4nHQt0c-JK" + }, + "source": [ + "## Test settings RandomForestAlgorithm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "0c10d4de-d7bc-45a1-95b0-c48f297723c9", + "id": "GLY0ux3ac-JK" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1\n", + "2\n", + "4\n", + "8\n", + "16\n", + "32\n", + "64\n", + "100\n", + "200\n" + ] + } + ], + "source": [ + "n_estimators = [1, 2, 4, 8, 16, 32, 64, 100, 200]\n", + "train_results = []\n", + "test_results = []\n", + "for estimator in n_estimators:\n", + " print(estimator)\n", + " rf = RandomForestClassifier(n_estimators=estimator, max_features=\"sqrt\")\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 280 + }, + "outputId": "70e2de90-e69b-4353-8a0c-498fb1fa5e22", + "id": "a907J5sQc-JK" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(n_estimators, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(n_estimators, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"n_estimators\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4eJWv-_Sc-JK" + }, + "source": [ + "### Test max depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "66981005-158b-4663-b0de-bb5a58aeb130", + "id": "JeGF1xm9c-JK" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.0\n", + "2.0\n", + "3.0\n", + "4.0\n", + "5.0\n", + "6.0\n", + "7.0\n", + "8.0\n", + "9.0\n", + "10.0\n", + "11.0\n", + "12.0\n", + "13.0\n", + "14.0\n", + "15.0\n", + "16.0\n", + "17.0\n", + "18.0\n", + "19.0\n", + "20.0\n", + "21.0\n", + "22.0\n", + "23.0\n", + "24.0\n", + "25.0\n", + "26.0\n", + "27.0\n", + "28.0\n", + "29.0\n", + "30.0\n", + "31.0\n", + "32.0\n" + ] + } + ], + "source": [ + "max_depths = np.linspace(1, 32, 32, endpoint=True)\n", + "train_results = []\n", + "test_results = []\n", + "for max_depth in max_depths:\n", + " print(max_depth)\n", + " rf = RandomForestClassifier(max_depth=max_depth, max_features=\"sqrt\", n_estimators = 50)\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "outputId": "a2ac141d-d763-4cc5-a0ba-0dbe5157c93f", + "id": "Op91IzY9c-JK" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(max_depths, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(max_depths, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"Tree depth\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VWM4TxNOc-JK" + }, + "source": [ + "## Selected RF\n", + "From the previous we select settings for our selected RF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "3luTaYHWc-JL" + }, + "outputs": [], + "source": [ + "# Random Forest\n", + "rf = RandomForestClassifier(n_estimators=50, max_depth=20, max_features=\"sqrt\")\n", + "# Train Decision Tree Classifer\n", + "rf.fit(X_train,y_train)\n", + "\n", + "#Predict the response for test dataset\n", + "y_pred = rf.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "D_O07pdlc-JL" + }, + "source": [ + "## Confusion matrix and classification report" + ] + }, + { + "cell_type": "markdown", + "source": [ + "without resampling" + ], + "metadata": { + "id": "qHp6c3c-JRVs" + } + }, + { + "cell_type": "code", + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "S3-6-TzIJL5S", + "outputId": "322475ec-b9f7-494b-ebb4-a4d98f1170e6" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: drinking\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[128321 21]\n", + " [ 767 169]]\n", + "Accuracy Score : 0.9939046086727826\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 1.00 128342\n", + " 1 0.89 0.18 0.30 936\n", + "\n", + " accuracy 0.99 129278\n", + " macro avg 0.94 0.59 0.65 129278\n", + "weighted avg 0.99 0.99 0.99 129278\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "with resampling" + ], + "metadata": { + "id": "EGXGc4eiJOzS" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "04e534cb-3f76-4cb7-f5c6-85d12fa4e695", + "id": "L00kVPX7c-JL" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: urinating\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[1345 32]\n", + " [ 22 1355]]\n", + "Accuracy Score : 0.9803921568627451\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.98 0.98 0.98 1377\n", + " 1 0.98 0.98 0.98 1377\n", + "\n", + " accuracy 0.98 2754\n", + " macro avg 0.98 0.98 0.98 2754\n", + "weighted avg 0.98 0.98 0.98 2754\n", + "\n" + ] + } + ], + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0-Uch99Sc-JL" + }, + "source": [ + "##Feature importances" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "e381d2db-4954-47d5-d2f8-ffd606342900", + "id": "E4B0Src6c-JL" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Feature: 0, Score: 0.02776\n", + "Feature: 1, Score: 0.03776\n", + "Feature: 2, Score: 0.03499\n", + "Feature: 3, Score: 0.03949\n", + "Feature: 4, Score: 0.04147\n", + "Feature: 5, Score: 0.07690\n", + "Feature: 6, Score: 0.07953\n", + "Feature: 7, Score: 0.07173\n", + "Feature: 8, Score: 0.06008\n", + "Feature: 9, Score: 0.06335\n", + "Feature: 10, Score: 0.02206\n", + "Feature: 11, Score: 0.02496\n", + "Feature: 12, Score: 0.02930\n", + "Feature: 13, Score: 0.03450\n", + "Feature: 14, Score: 0.03014\n", + "Feature: 15, Score: 0.08406\n", + "Feature: 16, Score: 0.06953\n", + "Feature: 17, Score: 0.05956\n", + "Feature: 18, Score: 0.05674\n", + "Feature: 19, Score: 0.05608\n", + "Feature: 20, Score: 0.00000\n", + "Feature: 21, Score: 0.00000\n", + "Feature: 22, Score: 0.00000\n", + "Feature: 23, Score: 0.00000\n", + "Feature: 24, Score: 0.00000\n", + "Feature: 25, Score: 0.00000\n", + "Feature: 26, Score: 0.00000\n", + "Feature: 27, Score: 0.00000\n", + "Feature: 28, Score: 0.00000\n", + "Feature: 29, Score: 0.00000\n" + ] + } + ], + "source": [ + "# feature importance\n", + "model = rf\n", + "importance = model.feature_importances_\n", + "# summarize feature importance\n", + "for i,v in enumerate(importance):\n", + "\tprint('Feature: %0d, Score: %.5f' % (i,v))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ceO4oz_N2EIH" + }, + "source": [ + "# RandomForestAlgorithm Sleeping" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EFdJJ2AE3ow9" + }, + "outputs": [], + "source": [ + "BEHAVIOUR='sleeping'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "YOpIOHrSsvHE" + }, + "outputs": [], + "source": [ + "y_final = np.stack(signal_features_1[:,3], axis =0) # BEHAVIOUR_1= 'rumination_video'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "_seuvyTZ_mUj" + }, + "outputs": [], + "source": [ + "bool_minority_labels = y_final != 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "_EppsuEr_mUj" + }, + "outputs": [], + "source": [ + "min_features = X_final[bool_minority_labels]\n", + "maj_features = X_final[~bool_minority_labels]\n", + "\n", + "min_labels = y_final[bool_minority_labels]\n", + "maj_labels = y_final[~bool_minority_labels]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ap6aEYW-_mUj" + }, + "source": [ + "Split the minority class in 70 30 to have more in train set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Skh0o7kg_mUj" + }, + "outputs": [], + "source": [ + "# Split minority dataset into training set and test set\n", + "X_min_train, X_min_test, y_min_train, y_min_test = train_test_split(min_features, min_labels, test_size=0.3, random_state=1) # 70% training and 30% test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zKNbr9Nu_mUj" + }, + "source": [ + "Split the majority class in 50 50 so we can sample from independant sets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "5yi3qXT1_mUj" + }, + "outputs": [], + "source": [ + "# Split minority dataset into training set and test set\n", + "X_maj_train, X_maj_test, y_maj_train, y_maj_test = train_test_split(maj_features, maj_labels, test_size=0.5, random_state=1) # 50% training and 50% test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fmCTZNzg_mUk" + }, + "source": [ + "## Create train set" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ltPgTmcT_mUk" + }, + "source": [ + "Upsample the amount of minority features and labels 3 times (why 3, no idea, feels that this will create enough labels)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "i7Jwg8rr_mUk" + }, + "outputs": [], + "source": [ + "upsampled_X_min_train = np.concatenate([X_min_train, X_min_train, X_min_train], axis=0)\n", + "upsampled_y_min_train = np.concatenate([y_min_train, y_min_train, y_min_train], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "69yarUqk_mUk" + }, + "source": [ + "Downsample from 50% of the majority class to have same amount of samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "6ae7b416-b858-48a2-8282-253238368883", + "id": "YI-Vrft3_mUk" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(7125, 30)" + ] + }, + "metadata": {}, + "execution_count": 144 + } + ], + "source": [ + "ids = np.arange(len(X_maj_train))\n", + "choices = np.random.choice(ids, len(upsampled_X_min_train))\n", + "\n", + "res_maj_train_features = X_maj_train[choices]\n", + "res_maj_train_labels = y_maj_train[choices]\n", + "\n", + "res_maj_train_features.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-KNamBHi_mUk" + }, + "source": [ + "Concat together" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cY9CMFRT_mUl" + }, + "outputs": [], + "source": [ + "resampled_train_features = np.concatenate([upsampled_X_min_train, res_maj_train_features], axis=0)\n", + "resampled_train_labels = np.concatenate([upsampled_y_min_train, res_maj_train_labels], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tZw7mUAV_mUl" + }, + "source": [ + "Shuffle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "KNBBU1kM_mUl" + }, + "outputs": [], + "source": [ + "order = np.arange(len(resampled_train_labels))\n", + "np.random.shuffle(order)\n", + "resampled_train_features = resampled_train_features[order]\n", + "resampled_train_labels = resampled_train_labels[order]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0GSO5mdj_mUl" + }, + "source": [ + "## Create test set" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HqGBMIvn_mUl" + }, + "source": [ + "We start from the X_min_test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tmbNhkPH_mUl" + }, + "source": [ + "And downsample the remaining part of the majority class which we didn't use so far" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "_qQ2LHYk_mUl" + }, + "outputs": [], + "source": [ + "ids = np.arange(len(X_maj_test))\n", + "choices = np.random.choice(ids, len(X_min_test))\n", + "\n", + "res_maj_test_features = X_maj_test[choices]\n", + "res_maj_test_labels = y_maj_test[choices]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Wu5KaKub_mUl" + }, + "source": [ + "Concat" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "aEIQMSkb_mUm" + }, + "outputs": [], + "source": [ + "resampled_test_features = np.concatenate([X_min_test, res_maj_test_features], axis=0)\n", + "resampled_test_labels = np.concatenate([y_min_test, res_maj_test_labels], axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s5byMjMF_mUm" + }, + "source": [ + "Shuffle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "L1uXJCCV_mUm" + }, + "outputs": [], + "source": [ + "order = np.arange(len(resampled_test_labels))\n", + "np.random.shuffle(order)\n", + "resampled_test_features = resampled_test_features[order]\n", + "resampled_test_labels = resampled_test_labels[order]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "w8udUQsV_mUm" + }, + "outputs": [], + "source": [ + "X_train= resampled_train_features\n", + "y_train= resampled_train_labels\n", + "X_test= resampled_test_features\n", + "y_test= resampled_test_labels" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e3NwABt4svHF" + }, + "source": [ + "## Test settings RandomForestAlgorithm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PEnU2Mn4svHF" + }, + "source": [ + "\n", + "### Test number of trees\n", + "Adopted from https://medium.com/all-things-ai/in-depth-parameter-tuning-for-random-forest-d67bb7e920d" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "9af7257e-0fab-4875-e275-7c3b052d48cb", + "id": "R5dMXFqnsvHF" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1\n", + "2\n", + "4\n", + "8\n", + "16\n", + "32\n", + "64\n", + "100\n", + "200\n" + ] + } + ], + "source": [ + "n_estimators = [1, 2, 4, 8, 16, 32, 64, 100, 200]\n", + "train_results = []\n", + "test_results = []\n", + "for estimator in n_estimators:\n", + " print(estimator)\n", + " rf = RandomForestClassifier(n_estimators=estimator, max_features=\"sqrt\")\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(n_estimators, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(n_estimators, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"n_estimators\")\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 280 + }, + "outputId": "49a47e41-0336-4575-e5a0-01d6824d4010", + "id": "hZcAI-kesvHF" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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vXt3rrvuutr5O3bsoGPHwqfR6upqqqurm73PyZMnM2zYMCZPnszo0aObtM69997LE088wR//+Ed69uzJpk2bmDZtWrP3XV+mCWKvkXsetds6zfYK11wD6Xm72aqq4L//u+X7vuyyy+jatSsLFizgtNNOY+zYsVx99dVs3bqVbt268aMf/YgjjzySOXPmMGHCBB599FFuueUWXn/9dVasWMHrr7/ONddcU7B2ERH84he/4IknnmD48OFs3bqVrl277jGm//zP/2TOnDn07NkTgJ49e3LppZe2/IdMOUHABwnCzKwJVq9ezdy5c6moqGDTpk0888wzdOzYkd/85jfceOONPPzww7ut88orrzB79mw2b97MkUceyZe//OXd7kmYO3culZWVHHHEEYwcOZLHHnuMMWPGNBrLpk2b2Lx5M4cffnib/ozgBJFwgjDbq7SmBtAWPv3pT1NRUQHAO++8w6WXXsqyZcuQxPbt2wuuc84559ClSxe6dOnChz/8YdauXcuAAQPqLDN58mTGjh0LwNixY5k0aRJjxoxp8AqkrK/wcoKA5D4IJwgza6L999+/dvrf//3fGTVqFNOmTWPlypWMHDmy4Dpd8s4xFRUV7Nixo878nTt38vDDD/PII49w22231d7ctnnzZnr16sXbb79dZ/kNGzZQWVlJz5496d69OytWrGjzWkSpb5QrD9u2+RJXM2uRd955h/79+wMwceLEFm/nySefZMiQIaxatYqVK1fy2muvMWbMGKZNm0b37t3p168fTz31FJAkh5kzZzJs2DAAbrjhBq644go2bdoEQE1NTZtcxeQEAW5iMrMW+/rXv84NN9zA8ccfv1utoDkmT57MhRdeWKdszJgxTJ48GYBJkybxrW99i6qqKk4//XRuvvlmjjgiGWDiy1/+MqNGjWLo0KEcc8wxDB8+nA4dWn96V0S0eiPloLq6OubNm9eylc87D1atggUL2jYoM2uVl19+mY985COlDmOfUeh4SpqfDmu0G9cgwDUIM7MCnCDACcLMrAAnCHCCMDMrwAkCnCDMzApwggAnCDOzApwgILlRzvdBmJnV4QQBrkGYWUGtGe4bYM6cOcydO7fRZS644AJOOeWUOmWXXXYZU6fWHei6e/futdOvvvoqn/jEJxg0aBAnnHACF198MWvXrm3GT9Y0HmoDnCDMrKA9Dfe9J3PmzKF79+6ceuqpBedv3LiR+fPnN2uojK1bt3LOOedw1113ce6559buZ926dfTt27fJsTWFEwQ4QZjtDVozxndDWjD29/z587n22mupqamhd+/eTJw4kX79+vHd736Xe++9l44dOzJ48GDuuOMO7r33XioqKvjpT3/K9773PYYPH15nW7/85S8599xz6du3L1OmTOHGG2/c4/5//vOf89GPfrQ2OQANjv/UWk4Q4ARhZk0SEXz1q1/lkUceoU+fPjz44IPcdNNNPPDAA9xxxx385S9/oUuXLmzcuJEDDzyQyy+/vNFax+TJkxk/fjx9+/ZlzJgxTUoQixcv5sQTT2zrH60gJ4gIJwizvUGpx/gGtm3bxuLFiznzzDOBZATWfv36ATBkyBA++9nPcsEFF3DBBRfscVtr165l2bJlDBs2DEl06tSJxYsXc8wxxxQcxjvrob0LcSf1jh1JknCCMLM9iAiOPvpoFi5cyMKFC3nppZeYNWsWAI899hhXXHEFL7zwAkOHDt3jwH0PPfQQb7/9NpWVlQwcOJCVK1fWDsxXf3jvDRs20Lt3bwCOPvpo5s+fn9FPWJcTRO551L7M1cz2oEuXLqxbt45nn30WgO3bt7NkyRJ27drFqlWrGDVqFHfeeSfvvPMONTU19OjRg82bNxfc1uTJk5k5cyYrV65k5cqVzJ8/nylTpgBJn8KDDz5Ye6XUxIkTGTVqFACf+cxnmDt3Lo899ljttp5++mkWL17c5j+vE0TuUjXXIMxsDzp06MDUqVP5xje+wXHHHUdVVRVz585l586dfO5zn+PYY4/l+OOP56qrruLAAw/k3HPPZdq0aVRVVfHMM8/Ubif3vIf8y1srKys54IADeO655/jkJz/J8OHDOfHEE6mqquL3v/89d955JwDdunXj0Ucf5Xvf+x6DBg1i8ODB/O///i99+vRp85/Xw31v2AAXXghXXw0XXdT2gZlZi3m477bV3OG+3Ul90EHw29+WOgozs7LjJiYzMyvICcLMytq+0gxeai05jpkmCEmjJS2VtFzS9QXmHybpSUkvSpojaUC9+T0lrZb0/SzjNLPy1LVrV9avX+8k0UoRwfr16+natWuz1susD0JSBXA3cCawGnhe0vSI+FPeYhOASRHxY0mnA7cDn8+b/y3g6axiNLPyNmDAAFavXs26detKHcper2vXrgwYMGDP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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ymQ-Mg_CsvHG" + }, + "source": [ + "### Test max depth" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "b20d60cd-eb27-49cc-b143-b52206087767", + "id": "a88e3feGsvHG" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.0\n", + "2.0\n", + "3.0\n", + "4.0\n", + "5.0\n", + "6.0\n", + "7.0\n", + "8.0\n", + "9.0\n", + "10.0\n", + "11.0\n", + "12.0\n", + "13.0\n", + "14.0\n", + "15.0\n", + "16.0\n", + "17.0\n", + "18.0\n", + "19.0\n", + "20.0\n", + "21.0\n", + "22.0\n", + "23.0\n", + "24.0\n", + "25.0\n", + "26.0\n", + "27.0\n", + "28.0\n", + "29.0\n", + "30.0\n" + ] + } + ], + "source": [ + "max_depths = np.linspace(1, 30, 30, endpoint=True)\n", + "train_results = []\n", + "test_results = []\n", + "for max_depth in max_depths:\n", + " print(max_depth)\n", + " rf = RandomForestClassifier(max_depth=max_depth, max_features=\"sqrt\", n_estimators = 20)\n", + " rf.fit(X_train, y_train)\n", + " train_pred = rf.predict(X_train)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " train_results.append(roc_auc)\n", + " y_pred = rf.predict(X_test)\n", + " false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)\n", + " roc_auc = auc(false_positive_rate, true_positive_rate)\n", + " test_results.append(roc_auc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "outputId": "3521d570-5190-4c47-9b4a-6f90cc2d0e14", + "id": "7HxFog3osvHG" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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2BYTJri73Eq6K8XGur//zTe7pGB3BBtT5WpPgqgBDhw4wLJly7jkkksANwJrs2bNAOjcuTPXX389AwYMYMCAAUd9r61bt7JmzRp69OiBiBATE8OyZcvo1KmT32G8a8rQ3uPGwe9/727snTvX3SdWhip8/TW88w5MnOguN1JS3L0H3bu75cwzj34PgjHmuNSeBBHqMb5xVxAdO3ZkwYIFZdZNnz6defPm8cknn/D000/z3XffVfhekyZNYseOHbTxGl13795Neno6Tz/9dJnhvbdv304j70aAjh078sUXX1ThUQXmwAF3ETdqlKtGmjDBDTh6hE2b4N13XWJYvdqNmz9woGuQ6N3brg6MqWb2P64axcXFkZOTcyhBFBQUsHz5coqLi9m0aRO9e/fmueeeY9euXezZs4cGDRqQl5fn973S09OZMWMGGzZsYMOGDSxatIgJEyYArk1h4sSJHPTGABo7diy9e/cGYMiQIcyfP5/p06cfeq958+axbNmyoB33jz+6u5dHjYI//9nNmXAoOezbB//6l7sJrVUreOgh1691zBh3F/O4cW7OS0sOxlS7oP6vE5E+IrJKRNaKyIN+1rcSkc9FZKmIzBWRFJ91RSKS5S1TgxlndYmKiuKDDz7gL3/5C126dCE1NZX58+dTVFTEDTfcwJlnnknXrl255557SExMpH///kyZMoXU1FS+/PLLQ++zYcMGNm7cyDnnnHOorE2bNpx44ol888039OvXj549e9KtWzdSU1P56quveO655wCoW7cu06ZN49VXX6Vt27Z06NCB119//VD326r273/Dr37lOhpNngzPPed1KPrlFzcYUtOmcMMN7uaHRx91j1984VqwGzQISkzGmACpalAWIBr4ATgFiAWWAB1KbfM+MNR7fiHwrs+6PZX5vG7dumlpK1asKFNmjk+gf9OiItUnn1QVUe3USXXVKm9FXp7qyJGqDRqoRkWp3nCD6ty5bgdjTLUDMrSc82ow2yC6A2tVdR2AiEwArgJW+GzTAbjfez4H+CiI8ZhqsmMH3Hiju4l5yBAYPRrqxRbA62/CyJGuJ9LVV7sbHiJkbgljIlEwq5iaA5t8Xmd7Zb6WANd4z68GGohISYfHeBHJEJGvRcRvtx4RGeZtk5GTk1OVsZtjtHixG99u5kx49VV4b1wx9T6Z4BLBnXfCGWe47qqTJ1ty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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "from matplotlib.legend_handler import HandlerLine2D\n", + "line1, = plt.plot(max_depths, train_results, \"b\", label=\"Train AUC\")\n", + "line2, = plt.plot(max_depths, test_results, \"r\", label=\"Test AUC\")\n", + "plt.legend(handler_map={line1: HandlerLine2D(numpoints=2)})\n", + "plt.ylabel(\"AUC score\")\n", + "plt.xlabel(\"Tree depth\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Es_farEcsvHG" + }, + "source": [ + "## Selected RF\n", + "From the previous we select settings for our selected RF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vNtCYve2svHH" + }, + "outputs": [], + "source": [ + "# Random Forest\n", + "rf = RandomForestClassifier(n_estimators=30, max_depth=25, max_features=\"sqrt\")\n", + "# Train Decision Tree Classifer\n", + "rf.fit(X_train,y_train)\n", + "\n", + "#Predict the response for test dataset\n", + "y_pred = rf.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GVJF1M-6svHH" + }, + "source": [ + "## Confusion matrix and classification report" + ] + }, + { + "cell_type": "markdown", + "source": [ + "without resampling" + ], + "metadata": { + "id": "WwJGmg-vJmTV" + } + }, + { + "cell_type": "code", + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FLVvZUORJc5b", + "outputId": "123d9295-236d-4dd5-b60c-7838a40d1540" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: sleeping\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[128317 25]\n", + " [ 635 301]]\n", + "Accuracy Score : 0.9948947230000464\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 1.00 1.00 1.00 128342\n", + " 1 0.92 0.32 0.48 936\n", + "\n", + " accuracy 0.99 129278\n", + " macro avg 0.96 0.66 0.74 129278\n", + "weighted avg 0.99 0.99 0.99 129278\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "with resampling" + ], + "metadata": { + "id": "K5FCBO0iJbNy" + } + }, + { + "cell_type": "code", + "source": [ + "### Evaluation\n", + "print(\"Behaviour: \"+ str(BEHAVIOUR))\n", + "print (\"Windows_size: \" + str(WIN_SIZE/2) +\" sec \" \"(with overlap: \"+ str(WIN_OVERLAP/2)+ \" sec)\")\n", + "\n", + "results = confusion_matrix(y_test,y_pred)\n", + "\n", + "print('Confusion Matrix Validation:')\n", + "print(results)\n", + "print('Accuracy Score : ', accuracy_score(y_test, y_pred))\n", + "print('Report : ')\n", + "print(classification_report(y_test, y_pred))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "8b41438a-36dc-453b-d6c7-f2497865b62f", + "id": "KNGGVZ5BsvHH" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Behaviour: sleeping\n", + "Windows_size: 120.0 sec (with overlap: 0.5 sec)\n", + "Confusion Matrix Validation:\n", + "[[1014 5]\n", + " [ 9 1010]]\n", + "Accuracy Score : 0.9931305201177625\n", + "Report : \n", + " precision recall f1-score support\n", + "\n", + " 0 0.99 1.00 0.99 1019\n", + " 1 1.00 0.99 0.99 1019\n", + "\n", + " accuracy 0.99 2038\n", + " macro avg 0.99 0.99 0.99 2038\n", + "weighted avg 0.99 0.99 0.99 2038\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "5999e508-a35d-41e5-ad0c-b31412741b49", + "id": "yLASMtoVBzU7" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Feature: 0, Score: 0.02129\n", + "Feature: 1, Score: 0.04114\n", + "Feature: 2, Score: 0.02506\n", + "Feature: 3, Score: 0.03261\n", + "Feature: 4, Score: 0.05568\n", + "Feature: 5, Score: 0.07470\n", + "Feature: 6, Score: 0.10356\n", + "Feature: 7, Score: 0.06482\n", + "Feature: 8, Score: 0.05784\n", + "Feature: 9, Score: 0.05600\n", + "Feature: 10, Score: 0.01779\n", + "Feature: 11, Score: 0.02446\n", + "Feature: 12, Score: 0.02423\n", + "Feature: 13, Score: 0.03230\n", + "Feature: 14, Score: 0.03214\n", + "Feature: 15, Score: 0.06984\n", + "Feature: 16, Score: 0.07154\n", + "Feature: 17, Score: 0.06244\n", + "Feature: 18, Score: 0.06634\n", + "Feature: 19, Score: 0.06623\n", + "Feature: 20, Score: 0.00000\n", + "Feature: 21, Score: 0.00000\n", + "Feature: 22, Score: 0.00000\n", + "Feature: 23, Score: 0.00000\n", + "Feature: 24, Score: 0.00000\n", + "Feature: 25, Score: 0.00000\n", + "Feature: 26, Score: 0.00000\n", + "Feature: 27, Score: 0.00000\n", + "Feature: 28, Score: 0.00000\n", + "Feature: 29, Score: 0.00000\n" + ] + } + ], + "source": [ + "# feature importance\n", + "model = rf\n", + "importance = model.feature_importances_\n", + "# summarize feature importance\n", + "for i,v in enumerate(importance):\n", + "\tprint('Feature: %0d, Score: %.5f' % (i,v))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TDTHlLika75i" + }, + "source": [ + "# Descriptives" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c0bPYEvp2inT" + }, + "source": [ + "## Counting data PeakDetectionAlgorithm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "OpEh0QcVa1s1" + }, + "outputs": [], + "source": [ + "final_data_peak_detection.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "i-LVt3vzox2L" + }, + "source": [ + "##Counting data RandomForestAlgorithm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "v6pTcov0o82N" + }, + "outputs": [], + "source": [ + "final_data_rf.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A66gTdkKdilR" + }, + "source": [ + "## Number of observations video per behavior" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yPBhYGSvqCzk" + }, + "outputs": [], + "source": [ + "np.unique(final_data_peak_detection['behaviour'], return_counts=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8cX6v6jKeMMN" + }, + "source": [ + "## Number of observations video per animal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nipbuDNyeQyy" + }, + "outputs": [], + "source": [ + "np.unique(final_data_peak_detection['cow_number'], return_counts=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5_lyl4Jee5kd" + }, + "source": [ + "## Time between two contraction cycles" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "V9hyOD4iKyd3" + }, + "outputs": [], + "source": [ + "final_data_rum= final_data_peak_detection[final_data_peak_detection.behaviour==1]\n", + "final_data_eat= final_data_peak_detection[final_data_peak_detection.behaviour==2]\n", + "final_data_drink= final_data_peak_detection[final_data_peak_detection.behaviour==3]\n", + "final_data_sleep= final_data_peak_detection[final_data_peak_detection.behaviour==4]\n", + "final_data_other= final_data_peak_detection[final_data_peak_detection.behaviour==5]\n", + "\n", + "print(\"Time between contraction cycles during rumination:\")\n", + "print(\"mean:\"+str(final_data_rum['low_time'].mean()))\n", + "print(\"std:\"+str(final_data_rum['low_time'].std()))\n", + "print(\"median:\"+str(final_data_rum['low_time'].median()))\n", + "print(\"iqr:\"+ str(iqr(final_data_rum['low_time']))+\"\\n\")\n", + "\n", + "print(\"Time between contraction cycles during eating:\")\n", + "print(\"mean:\"+str(final_data_eat['low_time'].mean()))\n", + "print(\"std:\"+str(final_data_eat['low_time'].std()))\n", + "print(\"median:\"+str(final_data_eat['low_time'].median()))\n", + "print(\"iqr:\"+ str(iqr(final_data_eat['low_time']))+\"\\n\")\n", + "\n", + "print(\"Time between contraction cycles during drinking:\")\n", + "print(\"mean:\"+str(final_data_drink['low_time'].mean()))\n", + "print(\"std:\"+str(final_data_drink['low_time'].std()))\n", + "print(\"median:\"+str(final_data_drink['low_time'].median()))\n", + "print(\"iqr:\"+ str(iqr(final_data_drink['low_time']))+\"\\n\")\n", + "\n", + "print(\"Time between contraction cycles during sleeping:\")\n", + "print(\"mean:\"+str(final_data_sleep['low_time'].mean()))\n", + "print(\"std:\"+str(final_data_sleep['low_time'].std()))\n", + "print(\"median:\"+str(final_data_sleep['low_time'].median()))\n", + "print(\"iqr:\"+ str(iqr(final_data_sleep['low_time']))+\"\\n\")\n", + "\n", + "print(\"Time between contraction cycles during other behaviour:\")\n", + "print(\"mean:\"+str(final_data_other['low_time'].mean()))\n", + "print(\"std:\"+str(final_data_other['low_time'].std()))\n", + "print(\"median:\"+str(final_data_other['low_time'].median()))\n", + "print(\"iqr:\"+ str(iqr(final_data_other['low_time']))+\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rwhIalEF3upw" + }, + "source": [ + "## Boxplots of time between two contraction cycles" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "DuLtGgqCrH-8" + }, + "outputs": [], + "source": [ + "sns.boxplot(x=\"behaviour\", y=\"low_time\",orient='v', data=final_data_peak_detection_corrected, showfliers=False)\n", + "plt.xlabel('Behaviour')\n", + "plt.ylabel('Time interval between contractions (s)')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KfUcr61726oD" + }, + "source": [ + "## GLM model eating and rumination" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "FHg0fxq5lxiI" + }, + "outputs": [], + "source": [ + "#create csv for GLM model\n", + "final_data_HK_EAT_REST = final_data_peak_detection_corrected[final_data_peak_detection_corrected.behaviour<3.0]\n", + "final_data_HK_EAT= final_data_HK_EAT_REST[final_data_peak_detection_corrected.behaviour>=1.0]\n", + "result_file='/content/gdrive/Shared drives/Bovi-Analytics/Projects/JosjeScheurwater/ProjectPicoLog/data/out/final_data_HK_EAT.csv'\n", + "final_data_HK_EAT.to_csv(result_file)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "h5Qs49vTEoHh" + }, + "outputs": [], + "source": [ + "%load_ext rpy2.ipython" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "685HmbZfzN7H" + }, + "outputs": [], + "source": [ + "%%R\n", + "url = ('/content/gdrive/Shareddrives/Bovi-Analytics/Projects/JosjeScheurwater/ProjectPicoLog/data/out/final_data_HK_EAT.csv')\n", + "dataset = read.csv(url)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "xlT1I1MCvjNd" + }, + "outputs": [], + "source": [ + "%%R\n", + "package_list <- c(\"dplyr\",\n", + " \"lme4\"\n", + " )\n", + "\n", + "for (pkg in package_list) {\n", + " if (pkg %in% rownames(installed.packages()) == FALSE)\n", + " {install.packages(pkg, dependencies = TRUE)}\n", + " if (pkg %in% rownames(.packages()) == FALSE)\n", + " {library(pkg, character.only = TRUE)}\n", + " print(citation(pkg))\n", + "\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1yRAR2qOvjNk" + }, + "outputs": [], + "source": [ + "%%R\n", + "install.packages(\"lmerTest\", dependencies = TRUE)\n", + "library (\"lmerTest\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "fNQlFbR9vjNl" + }, + "outputs": [], + "source": [ + "%%R\n", + "gl<- glm('low_time ~ factor(behaviour)+factor(cow_number)', data = dataset, family = gaussian)\n", + "summary(gl)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [], + "toc_visible": true, + "include_colab_link": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file