diff --git a/PartB_xgb_with_hyperparameter_tuning.ipynb b/PartB_xgb_with_hyperparameter_tuning.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..0c41a2b6c8d0e9d3addca120c9e93cdad6046fb1 --- /dev/null +++ b/PartB_xgb_with_hyperparameter_tuning.ipynb @@ -0,0 +1,1841 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<h1>1. Loading Datasets</h1>" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "[ TrainingDataMulti.csv info ]\n", + "<class 'pandas.core.frame.DataFrame'>\n", + "RangeIndex: 6000 entries, 0 to 5999\n", + "Columns: 129 entries, R1-PA1:VH to marker\n", + "dtypes: float64(112), int64(17)\n", + "memory usage: 5.9 MB\n", + "\n", + "[ TestingDataMulti.csv info ]\n", + "<class 'pandas.core.frame.DataFrame'>\n", + "RangeIndex: 100 entries, 0 to 99\n", + "Columns: 128 entries, R1-PA1:VH to snort_log4\n", + "dtypes: float64(104), int64(24)\n", + "memory usage: 100.1 KB\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "mTrain = pd.read_csv(\"TrainingDataMulti.csv\")\n", + "mTest = pd.read_csv(\"TestingDataMulti.csv\")\n", + "\n", + "\n", + "print(\"\\n[ TrainingDataMulti.csv info ]\")\n", + "mTrain.info()\n", + "\n", + "print(\"\\n[ TestingDataMulti.csv info ]\")\n", + "mTest.info()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<h1>1.1 Analysing the Data</h1>" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "R1-PA1:VH float64\n", + "R1-PM1:V float64\n", + "R1-PA2:VH float64\n", + "R1-PM2:V float64\n", + "R1-PA3:VH float64\n", + " ... \n", + "snort_log1 int64\n", + "snort_log2 int64\n", + "snort_log3 int64\n", + "snort_log4 int64\n", + "marker int64\n", + "Length: 129, dtype: object" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mTrain.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "marker\n", + "0 3000\n", + "2 1500\n", + "1 1500\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mTrain['marker'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>R1-PA1:VH</th>\n", + " <th>R1-PM1:V</th>\n", + " <th>R1-PA2:VH</th>\n", + " <th>R1-PM2:V</th>\n", + " <th>R1-PA3:VH</th>\n", + " <th>R1-PM3:V</th>\n", + " <th>R1-PA4:IH</th>\n", + " <th>R1-PM4:I</th>\n", + " <th>R1-PA5:IH</th>\n", + " <th>R1-PM5:I</th>\n", + " <th>...</th>\n", + " <th>control_panel_log4</th>\n", + " <th>relay1_log</th>\n", + " <th>relay2_log</th>\n", + " <th>relay3_log</th>\n", + " <th>relay4_log</th>\n", + " <th>snort_log1</th>\n", + " <th>snort_log2</th>\n", + " <th>snort_log3</th>\n", + " <th>snort_log4</th>\n", + " <th>marker</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>70.399324</td>\n", + " <td>127673.0908</td>\n", + " <td>-49.572308</td>\n", + " <td>127648.0176</td>\n", + " <td>-169.578319</td>\n", + " <td>127723.2374</td>\n", + " <td>65.689611</td>\n", + " <td>605.91099</td>\n", + " <td>-57.003571</td>\n", + " <td>626.78553</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>73.688102</td>\n", + " <td>130280.7109</td>\n", + " <td>-46.300719</td>\n", + " <td>130255.6377</td>\n", + " <td>-166.278082</td>\n", + " <td>130355.9307</td>\n", + " <td>71.831719</td>\n", + " <td>483.59351</td>\n", + " <td>-50.947407</td>\n", + " <td>500.98896</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>73.733939</td>\n", + " <td>130305.7842</td>\n", + " <td>-46.254883</td>\n", + " <td>130280.7109</td>\n", + " <td>-166.232245</td>\n", + " <td>130381.0040</td>\n", + " <td>71.808800</td>\n", + " <td>483.59351</td>\n", + " <td>-50.913030</td>\n", + " <td>500.98896</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>74.083443</td>\n", + " <td>130581.5902</td>\n", + " <td>-45.899649</td>\n", + " <td>130556.5169</td>\n", + " <td>-165.882741</td>\n", + " <td>130656.8100</td>\n", + " <td>72.152575</td>\n", + " <td>482.86107</td>\n", + " <td>-50.437475</td>\n", + " <td>499.15786</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>74.553268</td>\n", + " <td>131083.0556</td>\n", + " <td>-45.424094</td>\n", + " <td>131057.9823</td>\n", + " <td>-165.424375</td>\n", + " <td>131158.2754</td>\n", + " <td>72.118198</td>\n", + " <td>484.50906</td>\n", + " <td>-50.013486</td>\n", + " <td>497.69298</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5995</th>\n", + " <td>116.889120</td>\n", + " <td>131860.3269</td>\n", + " <td>-3.076783</td>\n", + " <td>131810.1804</td>\n", + " <td>-123.094253</td>\n", + " <td>131910.4735</td>\n", + " <td>114.780635</td>\n", + " <td>376.10794</td>\n", + " <td>-5.254023</td>\n", + " <td>374.82617</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5996</th>\n", + " <td>116.849013</td>\n", + " <td>131810.1804</td>\n", + " <td>-3.116890</td>\n", + " <td>131760.0339</td>\n", + " <td>-123.128630</td>\n", + " <td>131885.4002</td>\n", + " <td>114.769176</td>\n", + " <td>376.29105</td>\n", + " <td>-5.322778</td>\n", + " <td>374.82617</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5997</th>\n", + " <td>116.384917</td>\n", + " <td>131734.9606</td>\n", + " <td>-3.586716</td>\n", + " <td>131684.8140</td>\n", + " <td>-123.586996</td>\n", + " <td>131785.1071</td>\n", + " <td>114.299351</td>\n", + " <td>376.47416</td>\n", + " <td>-5.849899</td>\n", + " <td>374.82617</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5998</th>\n", + " <td>111.125164</td>\n", + " <td>130506.3704</td>\n", + " <td>-8.846468</td>\n", + " <td>130456.2238</td>\n", + " <td>-128.858208</td>\n", + " <td>130556.5169</td>\n", + " <td>106.667553</td>\n", + " <td>478.83265</td>\n", + " <td>-13.464508</td>\n", + " <td>477.73399</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5999</th>\n", + " <td>110.878793</td>\n", + " <td>130481.2971</td>\n", + " <td>-9.092840</td>\n", + " <td>130456.2238</td>\n", + " <td>-129.104580</td>\n", + " <td>130556.5169</td>\n", + " <td>106.392533</td>\n", + " <td>478.83265</td>\n", + " <td>-13.750987</td>\n", + " <td>477.91710</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>6000 rows × 129 columns</p>\n", + "</div>" + ], + "text/plain": [ + " R1-PA1:VH R1-PM1:V R1-PA2:VH R1-PM2:V R1-PA3:VH \n", + "0 70.399324 127673.0908 -49.572308 127648.0176 -169.578319 \\\n", + "1 73.688102 130280.7109 -46.300719 130255.6377 -166.278082 \n", + "2 73.733939 130305.7842 -46.254883 130280.7109 -166.232245 \n", + "3 74.083443 130581.5902 -45.899649 130556.5169 -165.882741 \n", + "4 74.553268 131083.0556 -45.424094 131057.9823 -165.424375 \n", + "... ... ... ... ... ... \n", + "5995 116.889120 131860.3269 -3.076783 131810.1804 -123.094253 \n", + "5996 116.849013 131810.1804 -3.116890 131760.0339 -123.128630 \n", + "5997 116.384917 131734.9606 -3.586716 131684.8140 -123.586996 \n", + "5998 111.125164 130506.3704 -8.846468 130456.2238 -128.858208 \n", + "5999 110.878793 130481.2971 -9.092840 130456.2238 -129.104580 \n", + "\n", + " R1-PM3:V R1-PA4:IH R1-PM4:I R1-PA5:IH R1-PM5:I ... \n", + "0 127723.2374 65.689611 605.91099 -57.003571 626.78553 ... \\\n", + "1 130355.9307 71.831719 483.59351 -50.947407 500.98896 ... \n", + "2 130381.0040 71.808800 483.59351 -50.913030 500.98896 ... \n", + "3 130656.8100 72.152575 482.86107 -50.437475 499.15786 ... \n", + "4 131158.2754 72.118198 484.50906 -50.013486 497.69298 ... \n", + "... ... ... ... ... ... ... \n", + "5995 131910.4735 114.780635 376.10794 -5.254023 374.82617 ... \n", + "5996 131885.4002 114.769176 376.29105 -5.322778 374.82617 ... \n", + "5997 131785.1071 114.299351 376.47416 -5.849899 374.82617 ... \n", + "5998 130556.5169 106.667553 478.83265 -13.464508 477.73399 ... \n", + "5999 130556.5169 106.392533 478.83265 -13.750987 477.91710 ... \n", + "\n", + " control_panel_log4 relay1_log relay2_log relay3_log relay4_log \n", + "0 0 0 0 0 0 \\\n", + "1 0 0 0 0 0 \n", + "2 0 0 0 0 0 \n", + "3 0 0 0 0 0 \n", + "4 0 0 0 0 0 \n", + "... ... ... ... ... ... \n", + "5995 0 0 0 0 0 \n", + "5996 0 0 0 0 0 \n", + "5997 0 0 0 0 0 \n", + "5998 0 0 0 0 0 \n", + "5999 0 0 0 0 0 \n", + "\n", + " snort_log1 snort_log2 snort_log3 snort_log4 marker \n", + "0 0 0 0 0 0 \n", + "1 0 0 0 0 0 \n", + "2 0 0 0 0 0 \n", + "3 0 0 0 0 0 \n", + "4 0 0 0 0 0 \n", + "... ... ... ... ... ... \n", + "5995 0 0 0 0 0 \n", + "5996 0 0 0 0 0 \n", + "5997 0 0 0 0 0 \n", + "5998 0 0 0 0 0 \n", + "5999 0 0 0 0 0 \n", + "\n", + "[6000 rows x 129 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mTrain" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>R1-PA1:VH</th>\n", + " <th>R1-PM1:V</th>\n", + " <th>R1-PA2:VH</th>\n", + " <th>R1-PM2:V</th>\n", + " <th>R1-PA3:VH</th>\n", + " <th>R1-PM3:V</th>\n", + " <th>R1-PA4:IH</th>\n", + " <th>R1-PM4:I</th>\n", + " <th>R1-PA5:IH</th>\n", + " <th>R1-PM5:I</th>\n", + " <th>...</th>\n", + " <th>control_panel_log4</th>\n", + " <th>relay1_log</th>\n", + " <th>relay2_log</th>\n", + " <th>relay3_log</th>\n", + " <th>relay4_log</th>\n", + " <th>snort_log1</th>\n", + " <th>snort_log2</th>\n", + " <th>snort_log3</th>\n", + " <th>snort_log4</th>\n", + " <th>marker</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>70.399324</td>\n", + " <td>127673.0908</td>\n", + " <td>-49.572308</td>\n", + " <td>127648.0176</td>\n", + " <td>-169.578319</td>\n", + " <td>127723.2374</td>\n", + " <td>65.689611</td>\n", + " <td>605.91099</td>\n", + " <td>-57.003571</td>\n", + " <td>626.78553</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>73.688102</td>\n", + " <td>130280.7109</td>\n", + " <td>-46.300719</td>\n", + " <td>130255.6377</td>\n", + " <td>-166.278082</td>\n", + " <td>130355.9307</td>\n", + " <td>71.831719</td>\n", + " <td>483.59351</td>\n", + " <td>-50.947407</td>\n", + " <td>500.98896</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>73.733939</td>\n", + " <td>130305.7842</td>\n", + " <td>-46.254883</td>\n", + " <td>130280.7109</td>\n", + " <td>-166.232245</td>\n", + " <td>130381.0040</td>\n", + " <td>71.808800</td>\n", + " <td>483.59351</td>\n", + " <td>-50.913030</td>\n", + " <td>500.98896</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>74.083443</td>\n", + " <td>130581.5902</td>\n", + " <td>-45.899649</td>\n", + " <td>130556.5169</td>\n", + " <td>-165.882741</td>\n", + " <td>130656.8100</td>\n", + " <td>72.152575</td>\n", + " <td>482.86107</td>\n", + " <td>-50.437475</td>\n", + " <td>499.15786</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>74.553268</td>\n", + " <td>131083.0556</td>\n", + " <td>-45.424094</td>\n", + " <td>131057.9823</td>\n", + " <td>-165.424375</td>\n", + " <td>131158.2754</td>\n", + " <td>72.118198</td>\n", + " <td>484.50906</td>\n", + " <td>-50.013486</td>\n", + " <td>497.69298</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5995</th>\n", + " <td>116.889120</td>\n", + " <td>131860.3269</td>\n", + " <td>-3.076783</td>\n", + " <td>131810.1804</td>\n", + " <td>-123.094253</td>\n", + " <td>131910.4735</td>\n", + " <td>114.780635</td>\n", + " <td>376.10794</td>\n", + " <td>-5.254023</td>\n", + " <td>374.82617</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5996</th>\n", + " <td>116.849013</td>\n", + " <td>131810.1804</td>\n", + " <td>-3.116890</td>\n", + " <td>131760.0339</td>\n", + " <td>-123.128630</td>\n", + " <td>131885.4002</td>\n", + " <td>114.769176</td>\n", + " <td>376.29105</td>\n", + " <td>-5.322778</td>\n", + " <td>374.82617</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5997</th>\n", + " <td>116.384917</td>\n", + " <td>131734.9606</td>\n", + " <td>-3.586716</td>\n", + " <td>131684.8140</td>\n", + " <td>-123.586996</td>\n", + " <td>131785.1071</td>\n", + " <td>114.299351</td>\n", + " <td>376.47416</td>\n", + " <td>-5.849899</td>\n", + " <td>374.82617</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5998</th>\n", + " <td>111.125164</td>\n", + " <td>130506.3704</td>\n", + " <td>-8.846468</td>\n", + " <td>130456.2238</td>\n", + " <td>-128.858208</td>\n", + " <td>130556.5169</td>\n", + " <td>106.667553</td>\n", + " <td>478.83265</td>\n", + " <td>-13.464508</td>\n", + " <td>477.73399</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5999</th>\n", + " <td>110.878793</td>\n", + " <td>130481.2971</td>\n", + " <td>-9.092840</td>\n", + " <td>130456.2238</td>\n", + " <td>-129.104580</td>\n", + " <td>130556.5169</td>\n", + " <td>106.392533</td>\n", + " <td>478.83265</td>\n", + " <td>-13.750987</td>\n", + " <td>477.91710</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>6000 rows × 129 columns</p>\n", + "</div>" + ], + "text/plain": [ + " R1-PA1:VH R1-PM1:V R1-PA2:VH R1-PM2:V R1-PA3:VH \n", + "0 70.399324 127673.0908 -49.572308 127648.0176 -169.578319 \\\n", + "1 73.688102 130280.7109 -46.300719 130255.6377 -166.278082 \n", + "2 73.733939 130305.7842 -46.254883 130280.7109 -166.232245 \n", + "3 74.083443 130581.5902 -45.899649 130556.5169 -165.882741 \n", + "4 74.553268 131083.0556 -45.424094 131057.9823 -165.424375 \n", + "... ... ... ... ... ... \n", + "5995 116.889120 131860.3269 -3.076783 131810.1804 -123.094253 \n", + "5996 116.849013 131810.1804 -3.116890 131760.0339 -123.128630 \n", + "5997 116.384917 131734.9606 -3.586716 131684.8140 -123.586996 \n", + "5998 111.125164 130506.3704 -8.846468 130456.2238 -128.858208 \n", + "5999 110.878793 130481.2971 -9.092840 130456.2238 -129.104580 \n", + "\n", + " R1-PM3:V R1-PA4:IH R1-PM4:I R1-PA5:IH R1-PM5:I ... \n", + "0 127723.2374 65.689611 605.91099 -57.003571 626.78553 ... \\\n", + "1 130355.9307 71.831719 483.59351 -50.947407 500.98896 ... \n", + "2 130381.0040 71.808800 483.59351 -50.913030 500.98896 ... \n", + "3 130656.8100 72.152575 482.86107 -50.437475 499.15786 ... \n", + "4 131158.2754 72.118198 484.50906 -50.013486 497.69298 ... \n", + "... ... ... ... ... ... ... \n", + "5995 131910.4735 114.780635 376.10794 -5.254023 374.82617 ... \n", + "5996 131885.4002 114.769176 376.29105 -5.322778 374.82617 ... \n", + "5997 131785.1071 114.299351 376.47416 -5.849899 374.82617 ... \n", + "5998 130556.5169 106.667553 478.83265 -13.464508 477.73399 ... \n", + "5999 130556.5169 106.392533 478.83265 -13.750987 477.91710 ... \n", + "\n", + " control_panel_log4 relay1_log relay2_log relay3_log relay4_log \n", + "0 0 0 0 0 0 \\\n", + "1 0 0 0 0 0 \n", + "2 0 0 0 0 0 \n", + "3 0 0 0 0 0 \n", + "4 0 0 0 0 0 \n", + "... ... ... ... ... ... \n", + "5995 0 0 0 0 0 \n", + "5996 0 0 0 0 0 \n", + "5997 0 0 0 0 0 \n", + "5998 0 0 0 0 0 \n", + "5999 0 0 0 0 0 \n", + "\n", + " snort_log1 snort_log2 snort_log3 snort_log4 marker \n", + "0 0 0 0 0 0 \n", + "1 0 0 0 0 0 \n", + "2 0 0 0 0 0 \n", + "3 0 0 0 0 0 \n", + "4 0 0 0 0 0 \n", + "... ... ... ... ... ... \n", + "5995 0 0 0 0 0 \n", + "5996 0 0 0 0 0 \n", + "5997 0 0 0 0 0 \n", + "5998 0 0 0 0 0 \n", + "5999 0 0 0 0 0 \n", + "\n", + "[6000 rows x 129 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mTrain.isnull().sum()\n", + "mTrain = mTrain.dropna()\n", + "mTrain\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>R1-PA1:VH</th>\n", + " <th>R1-PM1:V</th>\n", + " <th>R1-PA2:VH</th>\n", + " <th>R1-PM2:V</th>\n", + " <th>R1-PA3:VH</th>\n", + " <th>R1-PM3:V</th>\n", + " <th>R1-PA4:IH</th>\n", + " <th>R1-PM4:I</th>\n", + " <th>R1-PA5:IH</th>\n", + " <th>R1-PM5:I</th>\n", + " <th>...</th>\n", + " <th>control_panel_log3</th>\n", + " <th>control_panel_log4</th>\n", + " <th>relay1_log</th>\n", + " <th>relay2_log</th>\n", + " <th>relay3_log</th>\n", + " <th>relay4_log</th>\n", + " <th>snort_log1</th>\n", + " <th>snort_log2</th>\n", + " <th>snort_log3</th>\n", + " <th>snort_log4</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>70.399324</td>\n", + " <td>127673.0908</td>\n", + " <td>-49.572308</td>\n", + " <td>127648.0176</td>\n", + " <td>-169.578319</td>\n", + " <td>127723.2374</td>\n", + " <td>65.689611</td>\n", + " <td>605.91099</td>\n", + " <td>-57.003571</td>\n", + " <td>626.78553</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>73.688102</td>\n", + " <td>130280.7109</td>\n", + " <td>-46.300719</td>\n", + " <td>130255.6377</td>\n", + " <td>-166.278082</td>\n", + " <td>130355.9307</td>\n", + " <td>71.831719</td>\n", + " <td>483.59351</td>\n", + " <td>-50.947407</td>\n", + " <td>500.98896</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>73.733939</td>\n", + " <td>130305.7842</td>\n", + " <td>-46.254883</td>\n", + " <td>130280.7109</td>\n", + " <td>-166.232245</td>\n", + " <td>130381.0040</td>\n", + " <td>71.808800</td>\n", + " <td>483.59351</td>\n", + " <td>-50.913030</td>\n", + " <td>500.98896</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>74.083443</td>\n", + " <td>130581.5902</td>\n", + " <td>-45.899649</td>\n", + " <td>130556.5169</td>\n", + " <td>-165.882741</td>\n", + " <td>130656.8100</td>\n", + " <td>72.152575</td>\n", + " <td>482.86107</td>\n", + " <td>-50.437475</td>\n", + " <td>499.15786</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>74.553268</td>\n", + " <td>131083.0556</td>\n", + " <td>-45.424094</td>\n", + " <td>131057.9823</td>\n", + " <td>-165.424375</td>\n", + " <td>131158.2754</td>\n", + " <td>72.118198</td>\n", + " <td>484.50906</td>\n", + " <td>-50.013486</td>\n", + " <td>497.69298</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5995</th>\n", + " <td>116.889120</td>\n", + " <td>131860.3269</td>\n", + " <td>-3.076783</td>\n", + " <td>131810.1804</td>\n", + " <td>-123.094253</td>\n", + " <td>131910.4735</td>\n", + " <td>114.780635</td>\n", + " <td>376.10794</td>\n", + " <td>-5.254023</td>\n", + " <td>374.82617</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5996</th>\n", + " <td>116.849013</td>\n", + " <td>131810.1804</td>\n", + " <td>-3.116890</td>\n", + " <td>131760.0339</td>\n", + " <td>-123.128630</td>\n", + " <td>131885.4002</td>\n", + " <td>114.769176</td>\n", + " <td>376.29105</td>\n", + " <td>-5.322778</td>\n", + " <td>374.82617</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5997</th>\n", + " <td>116.384917</td>\n", + " <td>131734.9606</td>\n", + " <td>-3.586716</td>\n", + " <td>131684.8140</td>\n", + " <td>-123.586996</td>\n", + " <td>131785.1071</td>\n", + " <td>114.299351</td>\n", + " <td>376.47416</td>\n", + " <td>-5.849899</td>\n", + " <td>374.82617</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5998</th>\n", + " <td>111.125164</td>\n", + " <td>130506.3704</td>\n", + " <td>-8.846468</td>\n", + " <td>130456.2238</td>\n", + " <td>-128.858208</td>\n", + " <td>130556.5169</td>\n", + " <td>106.667553</td>\n", + " <td>478.83265</td>\n", + " <td>-13.464508</td>\n", + " <td>477.73399</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5999</th>\n", + " <td>110.878793</td>\n", + " <td>130481.2971</td>\n", + " <td>-9.092840</td>\n", + " <td>130456.2238</td>\n", + " <td>-129.104580</td>\n", + " <td>130556.5169</td>\n", + " <td>106.392533</td>\n", + " <td>478.83265</td>\n", + " <td>-13.750987</td>\n", + " <td>477.91710</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>6000 rows × 128 columns</p>\n", + "</div>" + ], + "text/plain": [ + " R1-PA1:VH R1-PM1:V R1-PA2:VH R1-PM2:V R1-PA3:VH \n", + "0 70.399324 127673.0908 -49.572308 127648.0176 -169.578319 \\\n", + "1 73.688102 130280.7109 -46.300719 130255.6377 -166.278082 \n", + "2 73.733939 130305.7842 -46.254883 130280.7109 -166.232245 \n", + "3 74.083443 130581.5902 -45.899649 130556.5169 -165.882741 \n", + "4 74.553268 131083.0556 -45.424094 131057.9823 -165.424375 \n", + "... ... ... ... ... ... \n", + "5995 116.889120 131860.3269 -3.076783 131810.1804 -123.094253 \n", + "5996 116.849013 131810.1804 -3.116890 131760.0339 -123.128630 \n", + "5997 116.384917 131734.9606 -3.586716 131684.8140 -123.586996 \n", + "5998 111.125164 130506.3704 -8.846468 130456.2238 -128.858208 \n", + "5999 110.878793 130481.2971 -9.092840 130456.2238 -129.104580 \n", + "\n", + " R1-PM3:V R1-PA4:IH R1-PM4:I R1-PA5:IH R1-PM5:I ... \n", + "0 127723.2374 65.689611 605.91099 -57.003571 626.78553 ... \\\n", + "1 130355.9307 71.831719 483.59351 -50.947407 500.98896 ... \n", + "2 130381.0040 71.808800 483.59351 -50.913030 500.98896 ... \n", + "3 130656.8100 72.152575 482.86107 -50.437475 499.15786 ... \n", + "4 131158.2754 72.118198 484.50906 -50.013486 497.69298 ... \n", + "... ... ... ... ... ... ... \n", + "5995 131910.4735 114.780635 376.10794 -5.254023 374.82617 ... \n", + "5996 131885.4002 114.769176 376.29105 -5.322778 374.82617 ... \n", + "5997 131785.1071 114.299351 376.47416 -5.849899 374.82617 ... \n", + "5998 130556.5169 106.667553 478.83265 -13.464508 477.73399 ... \n", + "5999 130556.5169 106.392533 478.83265 -13.750987 477.91710 ... \n", + "\n", + " control_panel_log3 control_panel_log4 relay1_log relay2_log \n", + "0 0 0 0 0 \\\n", + "1 0 0 0 0 \n", + "2 0 0 0 0 \n", + "3 0 0 0 0 \n", + "4 0 0 0 0 \n", + "... ... ... ... ... \n", + "5995 0 0 0 0 \n", + "5996 0 0 0 0 \n", + "5997 0 0 0 0 \n", + "5998 0 0 0 0 \n", + "5999 0 0 0 0 \n", + "\n", + " relay3_log relay4_log snort_log1 snort_log2 snort_log3 snort_log4 \n", + "0 0 0 0 0 0 0 \n", + "1 0 0 0 0 0 0 \n", + "2 0 0 0 0 0 0 \n", + "3 0 0 0 0 0 0 \n", + "4 0 0 0 0 0 0 \n", + "... ... ... ... ... ... ... \n", + "5995 0 0 0 0 0 0 \n", + "5996 0 0 0 0 0 0 \n", + "5997 0 0 0 0 0 0 \n", + "5998 0 0 0 0 0 0 \n", + "5999 0 0 0 0 0 0 \n", + "\n", + "[6000 rows x 128 columns]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = mTrain.drop(columns = 'marker')\n", + "X" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "y = mTrain['marker']" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Stratified Train-Test Split\n", + "The train-test split is stratified to ensure that the train and test samples from each class are almost the same percentage. This may be desirable for imbalanced number of samples as in this case. \n", + "\n", + "In such imbalanced datasets, the stratified K fold cross validation is used instead of the K-fold cross validation" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(X,y, random_state=1, test_size=0.15, stratify=y)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "marker\n", + "0 2550\n", + "2 1275\n", + "1 1275\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "marker\n", + "0 450\n", + "2 225\n", + "1 225\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_test.value_counts()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<h1>3. Choosing a Model: XGBoost , training, and evaluation</h1>" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.96\n" + ] + } + ], + "source": [ + "from xgboost import XGBClassifier\n", + "xgb_clf = XGBClassifier()\n", + "xgb_clf.fit(X_train, y_train)\n", + "score = xgb_clf.score(X_test, y_test)\n", + "print(score)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<h1>4. Improving</h1>" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A grid search will be performed to find the optimal hyperparameters. Each point in the grid uses the K fold cross validation\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<h1> 4.1 Evaluation before tuning</h1>" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([2, 0, 0, 0, 2, 2, 1, 1, 0, 0, 0, 0, 1, 2, 1, 0, 0, 2, 1, 0, 1, 0,\n", + " 0, 0, 0, 2, 0, 2, 0, 2, 1, 1, 1, 1, 1, 1, 0, 2, 1, 0, 1, 0, 1, 0,\n", + " 0, 0, 0, 1, 0, 2, 0, 2, 2, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 1,\n", + " 0, 2, 0, 1, 0, 0, 2, 0, 0, 2, 1, 1, 1, 2, 2, 2, 0, 0, 1, 1, 0, 1,\n", + " 1, 0, 2, 0, 0, 0, 0, 2, 2, 2, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0,\n", + " 2, 1, 1, 2, 0, 0, 2, 1, 0, 1, 2, 0, 0, 2, 1, 0, 0, 2, 2, 2, 1, 1,\n", + " 1, 1, 2, 2, 0, 0, 1, 1, 2, 1, 0, 2, 1, 2, 0, 0, 0, 1, 0, 2, 1, 0,\n", + " 0, 0, 1, 2, 1, 1, 0, 0, 1, 0, 0, 2, 1, 1, 0, 0, 2, 0, 1, 0, 0, 0,\n", + " 0, 0, 2, 0, 0, 0, 1, 1, 0, 2, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 2, 0,\n", + " 0, 2, 1, 2, 0, 0, 1, 2, 0, 2, 1, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1,\n", + " 0, 1, 1, 0, 0, 2, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1,\n", + " 0, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 1, 2, 0, 0, 1, 0, 2, 0,\n", + " 0, 0, 0, 0, 1, 0, 2, 2, 0, 0, 1, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2,\n", + " 2, 2, 2, 1, 1, 1, 0, 2, 2, 0, 0, 2, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0,\n", + " 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 2, 0, 2, 0, 1, 0, 1, 1, 0, 2, 1,\n", + " 0, 1, 1, 2, 0, 1, 0, 2, 2, 0, 0, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0,\n", + " 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 2, 1, 1, 1, 1, 0,\n", + " 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 1, 0, 0, 1, 2, 0, 0, 0, 2,\n", + " 0, 1, 2, 0, 2, 0, 0, 0, 1, 1, 2, 0, 2, 0, 2, 1, 0, 2, 0, 0, 2, 0,\n", + " 2, 0, 2, 1, 2, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 0, 1, 2, 1, 0, 2, 0,\n", + " 0, 2, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 0, 2, 0, 1,\n", + " 2, 1, 0, 0, 0, 1, 0, 2, 2, 1, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2,\n", + " 1, 1, 0, 0, 0, 0, 0, 2, 1, 2, 1, 0, 0, 0, 0, 1, 0, 1, 0, 2, 2, 0,\n", + " 2, 0, 1, 0, 1, 0, 0, 1, 2, 1, 2, 0, 0, 0, 0, 2, 2, 0, 2, 0, 1, 0,\n", + " 0, 1, 0, 0, 1, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 2, 1, 1,\n", + " 1, 2, 0, 0, 2, 0, 0, 1, 2, 1, 0, 0, 1, 0, 2, 2, 1, 0, 0, 1, 0, 2,\n", + " 1, 0, 0, 2, 0, 2, 0, 1, 1, 1, 0, 0, 2, 2, 1, 0, 0, 1, 0, 0, 1, 2,\n", + " 0, 2, 0, 2, 0, 2, 1, 0, 0, 0, 0, 2, 1, 1, 2, 0, 2, 1, 0, 0, 0, 1,\n", + " 0, 0, 2, 1, 0, 0, 2, 2, 1, 1, 2, 1, 1, 0, 0, 1, 0, 0, 2, 1, 2, 0,\n", + " 2, 1, 0, 0, 1, 2, 1, 0, 0, 0, 0, 1, 2, 1, 1, 1, 0, 2, 2, 2, 2, 0,\n", + " 1, 2, 2, 2, 0, 0, 2, 0, 0, 2, 1, 2, 2, 1, 1, 1, 0, 0, 1, 2, 2, 0,\n", + " 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 2, 2, 0, 1, 0, 0, 0, 2,\n", + " 1, 2, 0, 2, 0, 0, 2, 0, 0, 0, 1, 0, 0, 1, 0, 2, 0, 2, 0, 0, 0, 2,\n", + " 0, 1, 0, 0, 1, 2, 0, 0, 2, 1, 0, 1, 1, 0, 0, 1, 2, 2, 2, 0, 1, 0,\n", + " 0, 2, 0, 2, 0, 0, 1, 1, 1, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0,\n", + " 0, 2, 0, 0, 2, 0, 2, 1, 1, 2, 0, 1, 0, 2, 2, 0, 0, 1, 0, 2, 0, 2,\n", + " 0, 2, 2, 0, 0, 0, 2, 0, 0, 2, 0, 1, 1, 0, 2, 0, 0, 0, 0, 1, 0, 0,\n", + " 2, 0, 2, 1, 0, 0, 1, 2, 0, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 0, 1, 1,\n", + " 1, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 1, 2, 0, 1, 1, 0, 1, 1, 0, 0, 1,\n", + " 0, 0, 1, 0, 0, 2, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0,\n", + " 0, 1, 2, 2, 0, 1, 2, 0, 0, 0, 1, 0, 2, 0, 1, 1, 1, 1, 1, 0],\n", + " dtype=int64)" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_pred = xgb_clf.predict(X_test)\n", + "my_pred" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.96" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "score = xgb_clf.score(X_test, y_test)\n", + "score" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Confusion Matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[450, 0, 0],\n", + " [ 0, 212, 13],\n", + " [ 13, 10, 202]], dtype=int64)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.metrics import classification_report\n", + "from sklearn.metrics import ConfusionMatrixDisplay\n", + "confusion_matrix(y_test, my_pred)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.97 1.00 0.99 450\n", + " 1 0.95 0.94 0.95 225\n", + " 2 0.94 0.90 0.92 225\n", + "\n", + " accuracy 0.96 900\n", + " macro avg 0.96 0.95 0.95 900\n", + "weighted avg 0.96 0.96 0.96 900\n", + "\n" + ] + } + ], + "source": [ + "print(classification_report(y_test, my_pred))" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfsAAAG2CAYAAAB4TS9gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGf0lEQVR4nO3deVxU5f4H8M+wDeuwqDCQgPtC4Jrh3Mo0CVQyTbtlkZLX9JeBpd7MLBXUjK7dm6aRdlvEbnK1RS3JNNRETTRFUXMhQQoUBjQEBGObOb8/uJyaQGWYjZnzeb9e5xXnOc9zznca9cuznHNkgiAIICIiIptlZ+kAiIiIyLSY7ImIiGwckz0REZGNY7InIiKycUz2RERENo7JnoiIyMYx2RMREdk4JnsiIiIbx2RPRERk45jsiYiIbByTPRERkYm98cYbkMlkmD17tlg2fPhwyGQyne3ZZ5/VaVdQUIDo6Gi4urrC19cX8+bNQ0NDg97XdzD0AxAREdHNHT16FO+99x769evX7Nj06dOxdOlScd/V1VX8WaPRIDo6GkqlEocOHUJxcTGmTJkCR0dHvP7663rFwJ49ERGRiVRVVSEmJgbvv/8+vL29mx13dXWFUqkUN4VCIR779ttvcfbsWXzyyScYMGAARo8ejWXLliE5ORl1dXV6xWHVPXutVouioiJ4eHhAJpNZOhwiItKTIAi4fv06AgICYGdnuv5nTU2N3gmyJYIgNMs3crkccrm8xfpxcXGIjo5GREQEXnvttWbHN27ciE8++QRKpRJjx47FokWLxN59ZmYmwsLC4OfnJ9aPiorCzJkzcebMGQwcOLDVcVt1si8qKkJgYKClwyAiIgMVFhaic+fOJjl3TU0Nuga7Q12qMfhc7u7uqKqq0ilLSEhAYmJis7qbNm3C8ePHcfTo0RbP9eSTTyI4OBgBAQE4deoU5s+fj5ycHGzZsgUAoFardRI9AHFfrVbrFbdVJ3sPDw8AwC/Hu0DhzhkJW/dIrzBLh0BERtaAehzEDvHfc1Ooq6uDulSDX7K6QOHR9lxReV2L4ME/o7CwUGe4vaVefWFhIV544QWkp6fD2dm5xfPNmDFD/DksLAz+/v4YOXIk8vLy0L179zbH2RKrTvZNQykKdzuDvkCyDg4yR0uHQETGJjT+xxxTse4eMrh7tP06Wvwv5ygUOsm+JVlZWSgtLcWgQYPEMo1Gg/379+Odd95BbW0t7O3tddqEh4cDAHJzc9G9e3colUr88MMPOnVKSkoAAEqlUq/YrTrZExERtZZG0EIjGNa+tUaOHInTp0/rlE2dOhV9+vTB/PnzmyV6AMjOzgYA+Pv7AwBUKhWWL1+O0tJS+Pr6AgDS09OhUCgQEhKiV+xM9kREJAlaCNCi7dlen7YeHh4IDQ3VKXNzc0OHDh0QGhqKvLw8pKamYsyYMejQoQNOnTqFOXPmYNiwYeItepGRkQgJCcHkyZOxYsUKqNVqLFy4EHFxcTddEHgzTPZERERm5uTkhN27d2PVqlWorq5GYGAgJk6ciIULF4p17O3tkZaWhpkzZ0KlUsHNzQ2xsbE69+W3FpM9ERFJghZatH4gvuX2hti3b5/4c2BgIDIyMm7bJjg4GDt27DDougCTPRERSYRGEKAR2j6Mb0hbS+MSdiIiIhvHnj0REUmCORfotTdM9kREJAlaCNBINNlzGJ+IiMjGsWdPRESSwGF8IiIiG8fV+ERERGSz2LMnIiJJ0P5vM6S9tWKyJyIiSdAYuBrfkLaWxmRPRESSoBFg4FvvjBeLuXHOnoiIyMaxZ09ERJLAOXsiIiIbp4UMGsgMam+tOIxPRERk49izJyIiSdAKjZsh7a0Vkz0REUmCxsBhfEPaWhqH8YmIiGwce/ZERCQJUu7ZM9kTEZEkaAUZtIIBq/ENaGtpHMYnIiKycezZExGRJHAYn4iIyMZpYAeNAQPaGiPGYm5M9kREJAmCgXP2AufsiYiIqL1iz56IiCSBc/ZEREQ2TiPYQSMYMGdvxY/L5TA+ERGRjWPPnoiIJEELGbQG9HG1sN6uPZM9ERFJgpTn7DmMT0REZGJvvPEGZDIZZs+eLZbV1NQgLi4OHTp0gLu7OyZOnIiSkhKddgUFBYiOjoarqyt8fX0xb948NDQ06H19JnsiIpKEpgV6hmxtcfToUbz33nvo16+fTvmcOXOwfft2fPbZZ8jIyEBRUREmTJjwe7waDaKjo1FXV4dDhw5hw4YNSElJweLFi/WOgcmeiIgkoXHO3rBNX1VVVYiJicH7778Pb29vsbyiogIffvgh3nrrLTzwwAMYPHgw1q9fj0OHDuHw4cMAgG+//RZnz57FJ598ggEDBmD06NFYtmwZkpOTUVdXp1ccTPZERER6qKys1Nlqa2tvWjcuLg7R0dGIiIjQKc/KykJ9fb1OeZ8+fRAUFITMzEwAQGZmJsLCwuDn5yfWiYqKQmVlJc6cOaNXzFygR0REkqA18Nn4TavxAwMDdcoTEhKQmJjYrP6mTZtw/PhxHD16tNkxtVoNJycneHl56ZT7+flBrVaLdf6Y6JuONx3TB5M9ERFJguEP1WlM9oWFhVAoFGK5XC5vVrewsBAvvPAC0tPT4ezs3OZrGguH8YmISBK0sDN4AwCFQqGztZTss7KyUFpaikGDBsHBwQEODg7IyMjA6tWr4eDgAD8/P9TV1aG8vFynXUlJCZRKJQBAqVQ2W53ftN9Up7WY7ImIiIxs5MiROH36NLKzs8XtrrvuQkxMjPizo6Mj9uzZI7bJyclBQUEBVCoVAEClUuH06dMoLS0V66Snp0OhUCAkJESveDiMT0REkqARZNAY8Jpafdp6eHggNDRUp8zNzQ0dOnQQy6dNm4a5c+fCx8cHCoUCs2bNgkqlwtChQwEAkZGRCAkJweTJk7FixQqo1WosXLgQcXFxLY4m3AqTPRERSYLGwAV6GiM/LnflypWws7PDxIkTUVtbi6ioKLz77rvicXt7e6SlpWHmzJlQqVRwc3NDbGwsli5dqve1mOyJiIjMYN++fTr7zs7OSE5ORnJy8k3bBAcHY8eOHQZfm8meiIgkQSvYQWvAanytwBfhEBERtWvtbRjfnLgan4iIyMaxZ09ERJKghX4r6ltqb62Y7ImISBL++GCctra3VtYbOREREbUKe/ZERCQJhj8b33r7x0z2REQkCW19J/0f21srJvt2aPMaX3yUFIDxz1zBzKWXAQDzJvbAqUx3nXpjJl/FC/+4JO6XXnLEmgWdcfJ7Dzi7afDgX6/hb68UwZ7fslUa+/RVPDqzFD6dGnDxrAveXXgHcrJdLR0WmQi/b9Njz57ajZxsF3z9SQd0Dfmt2bHRMVcxZd7v7zCWu/y+NlSjARZN6QbvTg1Y+dUFlJU64M3ng2HvKOBvC4rNEjsZz/0PX8OMhCKsebkzzh93xSPTr2B56kVMu683Kn51tHR4ZGT8vsnU2sWvKcnJyejSpQucnZ0RHh6OH374wdIhWcRv1Xb4R3wwZr9ZCA9PTbPjchcBPr4N4ubm8XuyP57hgYKfnDH/nV/QPfQ3DHngOqa8VIztKR1RX2e9Q09SNWHGVexM9cG3m31QcMEZq+d3Ru1vMkQ9UWbp0MgE+H2bR9NDdQzZrJXFI9+8eTPmzp2LhIQEHD9+HP3790dUVJTOK/2k4p1XOuPukZUYNKyqxePfbfHGX+8MxYwRvfHR6/6oufF7Ej97zA1d+tTAu1ODWHbX8Ou4cd0ev+Q4mzx2Mh4HRy169ruB4wc8xDJBkOHEAQ+EDL5hwcjIFPh9m49WkBm8WSuLJ/u33noL06dPx9SpUxESEoJ169bB1dUVH330kaVDM6t927yQe9rlpkPuIx65hpfe+QUrPs/FpFml2POFN1bMChaPX7viAO9O9TptvDrWi8fIeih8NLB3AMr/9L1du+qg88sc2QZ+32QOFs0CdXV1yMrKwoIFC8QyOzs7REREIDMzs1n92tpa1NbWivuVlZVmidPUSi87Yu3iO5C0KQ9Ozi0/e3nMU7+KP3ftWwMf33rMf6wHin52QkCXOnOFSkRktbQGDsVb80N1LJrsr169Co1GAz8/P51yPz8/nD9/vln9pKQkLFmyxFzhmU3uKVeUX3VEXFRvsUyrkeH0YTd8tb4j0n4+CXt73TZ9BjUO7xX9LEdAlzp4d2pAzgk3nTrlVxsX9rB3YF0qy+yhaQC8/vS9eXds4CiNDeL3bT6Gv/XOepO9VUW+YMECVFRUiFthYaGlQzKKAfddx3t7z2Nteo649ep/Aw9MuIa16TnNEj0A5P3oAgDw8W0cqg+5qxo/n3dG+dXf/3E4vt8Drh4aBPWqMcvnIONoqLfDhVOuGHjvdbFMJhMw4N4qnM3irVi2ht83mYNFf23s2LEj7O3tUVJSolNeUlICpVLZrL5cLodcLjdXeGbj6q5Flz66CdnZVQsPbw269KlB0c9O+G6rN+4eWQkPbw3yzzrjvcQ7EDa0Ct1CGtsNuv86gnrVYMWsIExbWIRrVxyR8g8lxj59FU5y630to1Rt+XdHvLiqED+ddEXOicZbsZxdtfh2k4+lQyMT4PdtHhrIoDHgwTiGtLU0iyZ7JycnDB48GHv27MH48eMBAFqtFnv27EF8fLwlQ2tXHBwFnDjgga0fdELNDTt0CqjHvWPK8cTs339JsrcHln58EWteDsScsb3g7KpFxF/LEDuP99hbo4yvvOHZQYMp89Tw7tSAi2dc8GpMV3FqhmwLv2/zkPIwvkwQBIt2+zZv3ozY2Fi89957uPvuu7Fq1Sp8+umnOH/+fLO5/D+rrKyEp6cnrv3UDQoP6/0SqHWiAgZYOgQiMrIGoR778CUqKiqgUChMco2mXLHkSASc3dvex62pakBC+G6TxmoqFl/98fjjj+PKlStYvHgx1Go1BgwYgJ07d9420RMREelDA8OG4ps/6sx6WDzZA0B8fDyH7YmIyKSkPIzfLpI9ERGRqUn5RTjWGzkRERG1Cnv2REQkCYKB77MXeOsdERFR+8ZhfCIiIrJZ7NkTEZEkGPqaWmt+xS2TPRERSYLGwLfeGdLW0qw3ciIiImoV9uyJiEgSpDyMz549ERFJghZ2Bm/6WLt2Lfr16weFQgGFQgGVSoVvvvlGPD58+HDIZDKd7dlnn9U5R0FBAaKjo+Hq6gpfX1/MmzcPDQ0Nen929uyJiIhMoHPnznjjjTfQs2dPCIKADRs2YNy4cThx4gTuvPNOAMD06dOxdOlSsY2rq6v4s0ajQXR0NJRKJQ4dOoTi4mJMmTIFjo6OeP311/WKhcmeiIgkQSPIoDFgKF7ftmPHjtXZX758OdauXYvDhw+Lyd7V1RVKpbLF9t9++y3Onj2L3bt3w8/PDwMGDMCyZcswf/58JCYmwsnJqdWxcBifiIgkoWnO3pANaHxl7h+32tra215bo9Fg06ZNqK6uhkqlEss3btyIjh07IjQ0FAsWLMCNGzfEY5mZmQgLC9N5C2xUVBQqKytx5swZvT47e/ZERCQJgoFvvRP+1zYwMFCnPCEhAYmJiS22OX36NFQqFWpqauDu7o6tW7ciJCQEAPDkk08iODgYAQEBOHXqFObPn4+cnBxs2bIFAKBWq5u97r1pX61W6xU7kz0REZEeCgsLoVAoxH25XH7Tur1790Z2djYqKirw+eefIzY2FhkZGQgJCcGMGTPEemFhYfD398fIkSORl5eH7t27GzVmDuMTEZEkaCAzeAMgrq5v2m6V7J2cnNCjRw8MHjwYSUlJ6N+/P95+++0W64aHhwMAcnNzAQBKpRIlJSU6dZr2bzbPfzNM9kREJAlawdB5eyPEoNXedI4/OzsbAODv7w8AUKlUOH36NEpLS8U66enpUCgU4lRAa3EYn4iIyAQWLFiA0aNHIygoCNevX0dqair27duHXbt2IS8vD6mpqRgzZgw6dOiAU6dOYc6cORg2bBj69esHAIiMjERISAgmT56MFStWQK1WY+HChYiLi7vlaEJLmOyJiEgStAYu0NO3bWlpKaZMmYLi4mJ4enqiX79+2LVrFx588EEUFhZi9+7dWLVqFaqrqxEYGIiJEydi4cKFYnt7e3ukpaVh5syZUKlUcHNzQ2xsrM59+a3FZE9ERJKghQxaGPC4XD3bfvjhhzc9FhgYiIyMjNueIzg4GDt27NDrui3hnD0REZGNY8+eiIgkwdxP0GtPmOyJiEgSzD1n355Yb+RERETUKuzZExGRJGhh4PvsDVjcZ2lM9kREJAmCgavxBSZ7IiKi9u2Pb65ra3trxTl7IiIiG8eePRERSYKUV+Mz2RMRkSRwGJ+IiIhsFnv2REQkCeZ+Nn57wmRPRESSwGF8IiIislns2RMRkSRIuWfPZE9ERJIg5WTPYXwiIiIbx549ERFJgpR79kz2REQkCQIMu31OMF4oZsdkT0REkiDlnj3n7ImIiGwce/ZERCQJUu7ZM9kTEZEkSDnZcxifiIjIxrFnT0REkiDlnj2TPRERSYIgyCAYkLANaWtpHMYnIiKycezZExGRJPB99kRERDZOynP2HMYnIiKycUz2REQkCU0L9AzZ9LF27Vr069cPCoUCCoUCKpUK33zzjXi8pqYGcXFx6NChA9zd3TFx4kSUlJTonKOgoADR0dFwdXWFr68v5s2bh4aGBr0/O5M9ERFJQtMwviGbPjp37ow33ngDWVlZOHbsGB544AGMGzcOZ86cAQDMmTMH27dvx2effYaMjAwUFRVhwoQJYnuNRoPo6GjU1dXh0KFD2LBhA1JSUrB48WK9P7tMEASrfZFPZWUlPD09ce2nblB48PcWWxcVMMDSIRCRkTUI9diHL1FRUQGFQmGSazTlisFfzIGDm7zN52morkXWxJUGxerj44M333wTjz76KDp16oTU1FQ8+uijAIDz58+jb9++yMzMxNChQ/HNN9/goYceQlFREfz8/AAA69atw/z583HlyhU4OTm1+rrMkERERHqorKzU2Wpra2/bRqPRYNOmTaiuroZKpUJWVhbq6+sREREh1unTpw+CgoKQmZkJAMjMzERYWJiY6AEgKioKlZWV4uhAa9nEavxHeoXBQeZo6TDIxPLfUFk6BDKj7ktPWjoEMgM7oQ64YZ5rCQauxm+asw8MDNQpT0hIQGJiYottTp8+DZVKhZqaGri7u2Pr1q0ICQlBdnY2nJyc4OXlpVPfz88ParUaAKBWq3USfdPxpmP6sIlkT0REdDsCAEMmrpuaFhYW6gzjy+U3nxro3bs3srOzUVFRgc8//xyxsbHIyMhoexBtxGRPRESkh6bV9a3h5OSEHj16AAAGDx6Mo0eP4u2338bjjz+Ouro6lJeX6/TuS0pKoFQqAQBKpRI//PCDzvmaVus31WktztkTEZEkND1Bz5DN4Bi0WtTW1mLw4MFwdHTEnj17xGM5OTkoKCiAStU4ZalSqXD69GmUlpaKddLT06FQKBASEqLXddmzJyIiSTD3i3AWLFiA0aNHIygoCNevX0dqair27duHXbt2wdPTE9OmTcPcuXPh4+MDhUKBWbNmQaVSYejQoQCAyMhIhISEYPLkyVixYgXUajUWLlyIuLi4W04dtITJnoiIyARKS0sxZcoUFBcXw9PTE/369cOuXbvw4IMPAgBWrlwJOzs7TJw4EbW1tYiKisK7774rtre3t0daWhpmzpwJlUoFNzc3xMbGYunSpXrHwmRPRESSoBVkkJnx2fgffvjhLY87OzsjOTkZycnJN60THByMHTt26HXdljDZExGRJAiCgavxrfYRdFygR0REZPPYsyciIkkw9wK99oTJnoiIJIHJnoiIyMaZe4Fee8I5eyIiIhvHnj0REUmClFfjM9kTEZEkNCZ7Q+bsjRiMmXEYn4iIyMaxZ09ERJLA1fhEREQ2TsDv76Rva3trxWF8IiIiG8eePRERSQKH8YmIiGydhMfxmeyJiEgaDOzZw4p79pyzJyIisnHs2RMRkSTwCXpEREQ2TsoL9DiMT0REZOPYsyciImkQZIYtsrPinj2TPRERSYKU5+w5jE9ERGTj2LMnIiJp4EN1bu2rr75q9QkffvjhNgdDRERkKlJejd+qZD9+/PhWnUwmk0Gj0RgSDxERERlZq5K9Vqs1dRxERESmZ8VD8YYwaM6+pqYGzs7OxoqFiIjIZKQ8jK/3anyNRoNly5bhjjvugLu7Oy5evAgAWLRoET788EOjB0hERGQUghE2K6V3sl++fDlSUlKwYsUKODk5ieWhoaH44IMPjBocERERGU7vZP/xxx/j3//+N2JiYmBvby+W9+/fH+fPnzdqcERERMYjM8JmnfRO9pcvX0aPHj2alWu1WtTX1xslKCIiIqMz8zB+UlIShgwZAg8PD/j6+mL8+PHIycnRqTN8+HDIZDKd7dlnn9WpU1BQgOjoaLi6usLX1xfz5s1DQ0ODXrHonexDQkJw4MCBZuWff/45Bg4cqO/piIiIbFJGRgbi4uJw+PBhpKeno76+HpGRkaiurtapN336dBQXF4vbihUrxGMajQbR0dGoq6vDoUOHsGHDBqSkpGDx4sV6xaL3avzFixcjNjYWly9fhlarxZYtW5CTk4OPP/4YaWlp+p6OiIjIPMz8BL2dO3fq7KekpMDX1xdZWVkYNmyYWO7q6gqlUtniOb799lucPXsWu3fvhp+fHwYMGIBly5Zh/vz5SExM1Fk7dyt69+zHjRuH7du3Y/fu3XBzc8PixYtx7tw5bN++HQ8++KC+pyMiIjKPprfeGbIBqKys1Nlqa2tbdfmKigoAgI+Pj075xo0b0bFjR4SGhmLBggW4ceOGeCwzMxNhYWHw8/MTy6KiolBZWYkzZ860+qO36T77++67D+np6W1pSkREZNUCAwN19hMSEpCYmHjLNlqtFrNnz8Y999yD0NBQsfzJJ59EcHAwAgICcOrUKcyfPx85OTnYsmULAECtVuskegDivlqtbnXMbX6ozrFjx3Du3DkAjfP4gwcPbuupiIiITM5Yr7gtLCyEQqEQy+Vy+W3bxsXF4ccff8TBgwd1ymfMmCH+HBYWBn9/f4wcORJ5eXno3r1724P9E72T/aVLl/DEE0/g+++/h5eXFwCgvLwcf/nLX7Bp0yZ07tzZaMEREREZjZHm7BUKhU6yv534+HikpaVh//79t82R4eHhAIDc3Fx0794dSqUSP/zwg06dkpISALjpPH9L9J6zf+aZZ1BfX49z586hrKwMZWVlOHfuHLRaLZ555hl9T0dERGSTBEFAfHw8tm7dir1796Jr1663bZOdnQ0A8Pf3BwCoVCqcPn0apaWlYp309HQoFAqEhIS0Oha9e/YZGRk4dOgQevfuLZb17t0ba9aswX333afv6YiIiMzjD4vs2txeD3FxcUhNTcWXX34JDw8PcY7d09MTLi4uyMvLQ2pqKsaMGYMOHTrg1KlTmDNnDoYNG4Z+/foBACIjIxESEoLJkydjxYoVUKvVWLhwIeLi4lo1fdBE7559YGBgiw/P0Wg0CAgI0Pd0REREZiETDN/0sXbtWlRUVGD48OHw9/cXt82bNwMAnJycsHv3bkRGRqJPnz74+9//jokTJ2L79u3iOezt7ZGWlgZ7e3uoVCo89dRTmDJlCpYuXapXLHr37N98803MmjULycnJuOuuuwA0LtZ74YUX8M9//lPf0xEREZmHme+zF26zGjAwMBAZGRm3PU9wcDB27Nih38X/pFXJ3tvbGzLZ78MX1dXVCA8Ph4NDY/OGhgY4ODjgb3/7G8aPH29QQERERGRcrUr2q1atMnEYREREJmbmOfv2pFXJPjY21tRxEBERmZaZh/HbkzY/VAcAampqUFdXp1Omz72HREREZHp6r8avrq5GfHw8fH194ebmBm9vb52NiIioXTLzK27bE72T/UsvvYS9e/di7dq1kMvl+OCDD7BkyRIEBATg448/NkWMREREhpNwstd7GH/79u34+OOPMXz4cEydOhX33XcfevTogeDgYGzcuBExMTGmiJOIiIjaSO+efVlZGbp16wagcX6+rKwMAHDvvfdi//79xo2OiIjIWIz0iltrpHfPvlu3bsjPz0dQUBD69OmDTz/9FHfffTe2b98uvhiHTGfs01fx6MxS+HRqwMWzLnh34R3IyXa1dFikh/8LPY7IoHx09SxHbYM9TlxR4s3jQ5Ff6SXWebznWTzU9QLu9LkKd6d6DP7vVFyv//3RmHe4VeK5fscxVHkZnVxuoPQ3N3x1sSfWnh6Eeq29BT4VtVbokEo8Or0IPe6sQge/eix9tjcyd//+fvOY5wtxf/RVdPKvQ329DLk/umPDW4HIOelhwahtQ1uegvfn9tZK75791KlTcfLkSQDAyy+/jOTkZDg7O2POnDmYN2+e0QOk393/8DXMSCjCxreUiIvqhYtnnbE89SI8OzR/fDG1X0P8ivFJzp14bMcjmLr7ITjYafFRRBpcHH7/Hp0dGnCgKAjrfhzU4jm6eZbDTiZg8eFhiP7qcbx+9C+Y1Oss5g78ocX61H44u2hw8Zwr3k1s+aUol/Od8e6SrpgZ3R8vTgpFyWU5lqecg6cP/55T2+nds58zZ474c0REBM6fP4+srCz06NFDfHB/a+3fvx9vvvkmsrKyUFxcjK1bt/IJfLcwYcZV7Ez1wbebG3sBq+d3xt0jKxH1RBk+fcfPwtFRaz2zJ1pnf/73I3Dk8Q240+cKjpU2vl9iw7nGv0t3+11u8RwHioJwoChI3C+sUuDDs+V4stcZ/CNLZaLIyRiO7ffGsf03v3Np3/ZOOvvvvx6MUY+VomvvG8jO9DR1eLZNwvfZ692z/7Pg4GBMmDBB70QPNN7G179/fyQnJxsahs1zcNSiZ78bOH7g96E8QZDhxAEPhAy+YcHIyFAeTo3PqqioczbsPI51KK817BzUvjg4ajH68VJUVdrj4nlO11Hbtapnv3r16laf8Pnnn2913dGjR2P06NGtri9lCh8N7B2A8iu6X9m1qw4I7FFroajIUDIIeHXI98gqVeJCuc/tG9xEkEcFJvf5Ef/IGmrE6MhS7h5xDS+v+glyFy3KSh3xamwIKq85WjosqyeDgXP2RovE/FqV7FeuXNmqk8lkMr2Svb5qa2tRW/t7YqusrDTZtYjMISH8AHp6leGJnePbfA4/lyp8OPJr7PylGz69EGK84MhiTh5WIO7hfvD0bsCox0uwYPVPmD0xDBVlTPjUNq1K9vn5+aaOo1WSkpKwZMkSS4dhEZVl9tA0AF6dGnTKvTs24NoVg556TBay+O4DGNH5F8TsGoeSG+5tOoevSzU+jtqOE1eUWJh5v5EjJEup/c0exb+4oPgX4Hy2Bz7YfQJRj5Xi03V3WDo06ybhF+EYPGdvTgsWLEBFRYW4FRYWWjoks2mot8OFU64YeO91sUwmEzDg3iqczeJcnnURsPjuA3gwKB9Tvh2LS1Vte5+En0sV/hP1Fc782gkvHxoOwaoHGelW7OwEODppLR2G9eMT9KyDXC6HXC6/fUUbteXfHfHiqkL8dNIVOSdc8cj0K3B21eLbTW2f6yXzSwg/gLFdczHzu1GorndCR+fGBZbX651Qq2n8K9nR+QY6udxAsEfjVFVv7zJU1zuiqNodFXXOYqIvqvbAP44NhY+8Rjz/1Rr+8teeObtqEBD8+/flF1iDbn2rcb3cAZXlDpj03GUc2eONslInKLzrMfYpNTr41eHANx0sGDVZO6tK9lKX8ZU3PDtoMGWeGt6dGnDxjAtejemK8qucx7MmMb3PAgA2Rn2lUz7/++HYmtcHAPBE7zOY1T9LPJY66kudOn8JuIQuikp0UVTiwF8/0TlPr4+fNWX4ZKCeYVVYsfGsuP9/r/4CAEj/ohPWLOqGwG6/IeKRUnj6NKDymgN+Ou2OeZNCUXCBv8QZTMK33lk02VdVVSE3N1fcz8/PR3Z2Nnx8fBAUFHSLltL11fqO+Gp9R0uHQQZoTTJec3II1pwcctPjW/P6iL8YkHU5fcQTo3vc/FkIr8X1NmM00iLlJ+hZNNkfO3YMI0aMEPfnzp0LAIiNjUVKSoqFoiIiIrItbVqgd+DAATz11FNQqVS4fLnxCV//+c9/cPDgQb3OM3z4cAiC0GxjoiciIqOT8AI9vZP9F198gaioKLi4uODEiRPife8VFRV4/fXXjR4gERGRUTDZt95rr72GdevW4f3334ej4+8Lw+655x4cP37cqMERERGR4fSes8/JycGwYcOalXt6eqK8vNwYMRERERmdlBfo6d2zVyqVOivomxw8eBDdunUzSlBERERG1/QEPUM2K6V3sp8+fTpeeOEFHDlyBDKZDEVFRdi4cSNefPFFzJw50xQxEhERGU7Cc/Z6D+O//PLL0Gq1GDlyJG7cuIFhw4ZBLpfjxRdfxKxZs0wRIxERERlA72Qvk8nw6quvYt68ecjNzUVVVRVCQkLg7t62F3kQERGZg5Tn7Nv8UB0nJyeEhPB1mkREZCX4uNzWGzFiBGSymy9S2Lt3r0EBERERkXHpvUBvwIAB6N+/v7iFhISgrq4Ox48fR1hYmCliJCIiMpzw+1B+WzZ9e/ZJSUkYMmQIPDw84Ovri/HjxyMnJ0enTk1NDeLi4tChQwe4u7tj4sSJKCkp0alTUFCA6OhouLq6wtfXF/PmzUNDQ4Nesejds1+5cmWL5YmJiaiqqtL3dEREROZh5mH8jIwMxMXFYciQIWhoaMArr7yCyMhInD17Fm5ubgCAOXPm4Ouvv8Znn30GT09PxMfHY8KECfj+++8BABqNBtHR0VAqlTh06BCKi4sxZcoUODo66vXUWpkgCEaZhcjNzcXdd9+NsrIyY5yuVSorK+Hp6YnhGAcHGV/zauvy37j5m8LI9nRfetLSIZAZNAh12HtjEyoqKqBQKExyjaZc0W3h67B3dm7zeTQ1Nbj42ittjvXKlSvw9fVFRkYGhg0bhoqKCnTq1Ampqal49NFHAQDnz59H3759kZmZiaFDh+Kbb77BQw89hKKiIvj5+QEA1q1bh/nz5+PKlStwcnJq1bXb9CKclmRmZsLZgP+JREREJmWk++wrKyt1tqZ3xNxORUUFAMDHxwcAkJWVhfr6ekRERIh1+vTpg6CgIGRmZgJozK1hYWFiogeAqKgoVFZW4syZM63+6HoP40+YMEFnXxAEFBcX49ixY1i0aJG+pyMiIjILY916FxgYqFOekJCAxMTEW7bVarWYPXs27rnnHoSGhgIA1Go1nJyc4OXlpVPXz88ParVarPPHRN90vOlYa+md7D09PXX27ezs0Lt3byxduhSRkZH6no6IiMiqFBYW6gzjy+Xy27aJi4vDjz/+qPer4I1Fr2Sv0WgwdepUhIWFwdvb21QxERERtVsKhUKvOfv4+HikpaVh//796Ny5s1iuVCpRV1eH8vJynd59SUkJlEqlWOeHH37QOV/Tav2mOq2h15y9vb09IiMj+XY7IiKyPmZ+Nr4gCIiPj8fWrVuxd+9edO3aVef44MGD4ejoiD179ohlOTk5KCgogErVuCBZpVLh9OnTKC0tFeukp6dDoVDo9WA7vYfxQ0NDcfHixWZBExERtWfmflxuXFwcUlNT8eWXX8LDw0OcY/f09ISLiws8PT0xbdo0zJ07Fz4+PlAoFJg1axZUKhWGDh0KAIiMjERISAgmT56MFStWQK1WY+HChYiLi2vV9EETvVfjv/baa3jxxReRlpaG4uLiZqsSiYiICFi7di0qKiowfPhw+Pv7i9vmzZvFOitXrsRDDz2EiRMnYtiwYVAqldiyZYt43N7eHmlpabC3t4dKpcJTTz2FKVOmYOnSpXrF0uqe/dKlS/H3v/8dY8aMAQA8/PDDOo/NFQQBMpkMGo1GrwCIiIjMxozPt2/NY2ycnZ2RnJyM5OTkm9YJDg7Gjh07DIql1cl+yZIlePbZZ/Hdd98ZdEEiIiKL4Itwbq/pN5T777/fZMEQERGR8em1QO9Wb7sjIiJqz/g++1bq1avXbRO+OZ+NT0RE1Gocxm+dJUuWNHuCHhEREbVveiX7SZMmwdfX11SxEBERmQyH8VuB8/VERGTVJDyM3+qH6hjptfdERERkZq3u2Wu1WlPGQUREZFoS7tnr/Wx8IiIia8Q5eyIiIlsn4Z693i/CISIiIuvCnj0REUmDhHv2TPZERCQJUp6z5zA+ERGRjWPPnoiIpIHD+ERERLaNw/hERERks9izJyIiaeAwPhERkY2TcLLnMD4REZGNY8+eiIgkQfa/zZD21orJnoiIpEHCw/hM9kREJAm89Y6IiIhsFnv2REQkDRzGJyIikgArTtiG4DA+ERGRjWPPnoiIJEHKC/SY7ImISBokPGfPYXwiIiIT2L9/P8aOHYuAgADIZDJs27ZN5/jTTz8NmUyms40aNUqnTllZGWJiYqBQKODl5YVp06ahqqpK71iY7ImISBKahvEN2fRRXV2N/v37Izk5+aZ1Ro0aheLiYnH773//q3M8JiYGZ86cQXp6OtLS0rB//37MmDFD78/OYXwiIpIGMw/jjx49GqNHj75lHblcDqVS2eKxc+fOYefOnTh69CjuuusuAMCaNWswZswY/POf/0RAQECrY2HPnoiIyEL27dsHX19f9O7dGzNnzsSvv/4qHsvMzISXl5eY6AEgIiICdnZ2OHLkiF7XsYmevZ2rC+xkTpYOg0ysW8JxS4dAZpT/6iBLh0BmoKmpAZZvMsu1jLUav7KyUqdcLpdDLpfrfb5Ro0ZhwoQJ6Nq1K/Ly8vDKK69g9OjRyMzMhL29PdRqNXx9fXXaODg4wMfHB2q1Wq9r2USyJyIiui0jDeMHBgbqFCckJCAxMVHv002aNEn8OSwsDP369UP37t2xb98+jBw50oBAm2OyJyIiaTBSsi8sLIRCoRCL29Krb0m3bt3QsWNH5ObmYuTIkVAqlSgtLdWp09DQgLKyspvO898M5+yJiIj0oFAodDZjJftLly7h119/hb+/PwBApVKhvLwcWVlZYp29e/dCq9UiPDxcr3OzZ09ERJJg7ifoVVVVITc3V9zPz89HdnY2fHx84OPjgyVLlmDixIlQKpXIy8vDSy+9hB49eiAqKgoA0LdvX4waNQrTp0/HunXrUF9fj/j4eEyaNEmvlfgAe/ZERCQVghE2PRw7dgwDBw7EwIEDAQBz587FwIEDsXjxYtjb2+PUqVN4+OGH0atXL0ybNg2DBw/GgQMHdEYKNm7ciD59+mDkyJEYM2YM7r33Xvz73//W+6OzZ09ERGQCw4cPhyDc/DeEXbt23fYcPj4+SE1NNTgWJnsiIpIEmSBAdovk25r21orJnoiIpIEvwiEiIiJbxZ49ERFJAt9nT0REZOs4jE9ERES2ij17IiKSBA7jExER2ToJD+Mz2RMRkSRIuWfPOXsiIiIbx549ERFJA4fxiYiIbJ81D8UbgsP4RERENo49eyIikgZBaNwMaW+lmOyJiEgSuBqfiIiIbBZ79kREJA1cjU9ERGTbZNrGzZD21orD+ERERDaOPXsiIpIGDuMTERHZNimvxmeyJyIiaZDwffacsyciIrJx7NkTEZEkcBifiIjI1kl4gR6H8YmIiGwce/ZERCQJHMYnIiKydVyNT0RERLaKPXsiIpIEKQ/js2dPRETSIBhh08P+/fsxduxYBAQEQCaTYdu2bbrhCAIWL14Mf39/uLi4ICIiAhcuXNCpU1ZWhpiYGCgUCnh5eWHatGmoqqrS84Mz2RMREZlEdXU1+vfvj+Tk5BaPr1ixAqtXr8a6detw5MgRuLm5ISoqCjU1NWKdmJgYnDlzBunp6UhLS8P+/fsxY8YMvWPhMD4REUmCuYfxR48ejdGjR7d4TBAErFq1CgsXLsS4ceMAAB9//DH8/Pywbds2TJo0CefOncPOnTtx9OhR3HXXXQCANWvWYMyYMfjnP/+JgICAVsfCnj0REUmDVjB8M5L8/Hyo1WpERESIZZ6enggPD0dmZiYAIDMzE15eXmKiB4CIiAjY2dnhyJEjel2PPXsiIpIGIz1Br7KyUqdYLpdDLpfrdSq1Wg0A8PPz0yn38/MTj6nVavj6+uocd3BwgI+Pj1intdizJyIi0kNgYCA8PT3FLSkpydIh3RZ79kREJAkyGDhn/7//FhYWQqFQiOX69uoBQKlUAgBKSkrg7+8vlpeUlGDAgAFindLSUp12DQ0NKCsrE9u3Fnv2REQkDU1P0DNkA6BQKHS2tiT7rl27QqlUYs+ePWJZZWUljhw5ApVKBQBQqVQoLy9HVlaWWGfv3r3QarUIDw/X63rs2RMREZlAVVUVcnNzxf38/HxkZ2fDx8cHQUFBmD17Nl577TX07NkTXbt2xaJFixAQEIDx48cDAPr27YtRo0Zh+vTpWLduHerr6xEfH49JkybptRIfYLInIiKJMPetd8eOHcOIESPE/blz5wIAYmNjkZKSgpdeegnV1dWYMWMGysvLce+992Lnzp1wdnYW22zcuBHx8fEYOXIk7OzsMHHiRKxevVrv2JnsiYhIGsz8Pvvhw4dDuMXLc2QyGZYuXYqlS5fetI6Pjw9SU1P1u3ALOGdPRERk49izJyIiSZAJAmQGvKbWkLaWxmRPRETSoP3fZkh7K8VhfCIiIhvHnj0REUkCh/GJiIhsnZlX47cnTPZERCQNf3gKXpvbWynO2RMREdk49uyJiEgSzP0EvfaEyb4dCx1SiUenF6HHnVXo4FePpc/2RuZuH/F4zPOFuD/6Kjr516G+XobcH92x4a1A5Jz0sGDU1Bahd1fi0Rlq9AytRge/eiyZ0ROZ6d5/qCFg8pzLGD3pCtwUDTh7zANrFnVB0c/ONz0nWd6M/sfxYJd8dPMsR43GHidKlPjX0aHIr/AS6zjZN2B+eCaiu+XC0V6D7y8FYsmh+/Drb64AgN4+VzGjfzYG+RXD27kGl6s8sOlcCP5zpp+FPpUV4zC+ZSQlJWHIkCHw8PCAr68vxo8fj5ycHEuG1K44u2hw8Zwr3k3s2uLxy/nOeHdJV8yM7o8XJ4Wi5LIcy1POwdOn3syRkqGcXbTIP+eK5MXBLR7/6/8VY9zTJVi9sAtmP3Inan6zw/INOXB0suIbfyVgiLIYqWfvxONfPYK/ffMQHOy0+GBUGlwcfv87umDoIYwI+gUv7InElLRx8HW9gTURu8Tjd3a8il9/c8ZL+0bioS8ex7rsQZg75AfEhPxoiY9EVsqiPfuMjAzExcVhyJAhaGhowCuvvILIyEicPXsWbm5ulgytXTi23xvH9nvf9Pi+7Z109t9/PRijHitF1943kJ3paerwyIiOZXjhWIbXTY4KeORvJfjvOwE4/L/e/pt/74ZNR0/gL5HXkJHWwWxxkn6m74rW2V+wfwQyn9qAOztewTF1ANwdazGx13nM+24kjhTf8b86w/HNXzejf6cSnLzihy0/9dE5x6XrCgzwLcGDXS5i49lQs30WWyDTNm6GtLdWFk32O3fu1NlPSUmBr68vsrKyMGzYMAtFZZ0cHLUY/XgpqirtcfG8q6XDISNSBtbCx7ceJw4qxLIb1x1wPtsdfQdVMdlbEQ+nOgBARW3j9MudHa/CyV6LQ0WdxTr5Fd64fN0dA/zUOHnF76bnaToH6UHCw/jtas6+oqICQONbflpSW1uL2tpacb+ystIscbVnd4+4hpdX/QS5ixZlpY54NTYEldccLR0WGZF3p8Yh3/Krut9r+VVH8Ri1fzIIeGXo98hSK3HhWuO/cZ1cb6BOY4frdXKdur/+5oKOLr+1eJ6BvmqM7paHZ3eNNnnMZDvaza13Wq0Ws2fPxj333IPQ0JaHppKSkuDp6SlugYGBZo6y/Tl5WIG4h/vh74+FIuuAFxas/olz9kTt0OJ7DqCndxnm7o1o8zl6epch+cGdSD4+GN9f5r9/ehOMsFmpdpPs4+Li8OOPP2LTpk03rbNgwQJUVFSIW2FhoRkjbJ9qf7NH8S8uOJ/tgVULekCjkSHqsVJLh0VGdO1KY4/eq6PuL3FeHevFY9S+LVIdwPDAXzDl64dRcsNdLL9ywxVO9lp4ONXq1O/g8huu/uaiU9bdqwzrx2zHpzl9sS57sFnitjVNj8s1ZLNW7SLZx8fHIy0tDd999x06d+5803pyuRwKhUJnI112dgJXaNsYdaEcZaWOGHDP79NWru4a9BlQhXPH3W/RkixPwCLVAUR0ycfTO8bicpXuv1lnrnZEncYOqoDLYllXz3Lc4VGF7BKlWNbDqwwbordj24VeWHUs3GzRk+2w6Jy9IAiYNWsWtm7din379qFr15ZvMZMqZ1cNAoJrxH2/wBp061uN6+UOqCx3wKTnLuPIHm+UlTpB4V2PsU+p0cGvDge+4YIta/Pn71oZWNv4XVc44EqRHFs/8sMT8UUo+tkZ6kI5psy9hF9LnHDo25vfrUGWt/gvB/BQ91zEpY9Cdb0TOrrcAABcr3NCrcYBVfVyfPFTH8wPP4SKWjmq6pyw8C8HcaLET1yc19O7DCljvsLBS4FIOd1fPIdGkOFajctNr00t4AI9y4iLi0Nqaiq+/PJLeHh4QK1WAwA8PT3h4sI/xD3DqrBi41lx//9e/QUAkP5FJ6xZ1A2B3X5DxCOl8PRpQOU1B/x02h3zJoWi4AJX41ubXmHVWLHpvLj/f4sKAADpn3fEv+Z1w2fv+cPZVYvnX/8Z7ooGnDnqgYVP90J9XbsYnKObeDKk8e/vfx76Sqd8QcZwbL3QeEtd0uG/QBsuw9sjv4WTvQYHLwdi6ff3iXWjuuahg0sNxvW8gHE9L4jll6+7Y+Tmp0z/IWyJAMPeSW+9uR4yQbDcryoymazF8vXr1+Ppp5++bfvKykp4enriAddJcJA5GTk6am8EjcbSIZAZ/fzqIEuHQGagqanBxeWvoqKiwmRTs2KuGPgyHOzbfstig6YGe0+8YdJYTcXiw/hERERkWu3qPnsiIiKTEWDgnL3RIjE7JnsiIpIGCS/Q4+oeIiIiG8eePRERSYMWQMvrwlvf3kox2RMRkSQY+hQ8PkGPiIiI2i327ImISBokvECPyZ6IiKRBwsmew/hEREQ2jj17IiKSBvbsiYiIbJzWCJseEhMTIZPJdLY+ffqIx2tqahAXF4cOHTrA3d0dEydORElJiYEfsmVM9kREJAlNt94ZsunrzjvvRHFxsbgdPHhQPDZnzhxs374dn332GTIyMlBUVIQJEyYY8yOLOIxPRERkIg4ODlAqlc3KKyoq8OGHHyI1NRUPPPAAgMY3vvbt2xeHDx/G0KFDjRoHe/ZERCQNTXP2hmxofGXuH7fa2tqbXvLChQsICAhAt27dEBMTg4KCAgBAVlYW6uvrERERIdbt06cPgoKCkJmZafSPzmRPRETSoBUM3wAEBgbC09NT3JKSklq8XHh4OFJSUrBz506sXbsW+fn5uO+++3D9+nWo1Wo4OTnBy8tLp42fnx/UarXRPzqH8YmIiPRQWFgIhUIh7svl8hbrjR49Wvy5X79+CA8PR3BwMD799FO4uLiYPM4/Ys+eiIikwUjD+AqFQme7WbL/My8vL/Tq1Qu5ublQKpWoq6tDeXm5Tp2SkpIW5/gNxWRPREQSYWiiN+w++6qqKuTl5cHf3x+DBw+Go6Mj9uzZIx7PyclBQUEBVCqVgZ+zOQ7jExERmcCLL76IsWPHIjg4GEVFRUhISIC9vT2eeOIJeHp6Ytq0aZg7dy58fHygUCgwa9YsqFQqo6/EB5jsiYhIKsz8BL1Lly7hiSeewK+//opOnTrh3nvvxeHDh9GpUycAwMqVK2FnZ4eJEyeitrYWUVFRePfdd9se3y0w2RMRkTRoDRyK1+rXdtOmTbc87uzsjOTkZCQnJ7c9plbinD0REZGNY8+eiIikQdA2boa0t1JM9kREJA0Sfusdkz0REUmDmefs2xPO2RMREdk49uyJiEgaOIxPRERk4wQYmOyNFonZcRifiIjIxrFnT0RE0sBhfCIiIhun1QIw4F55rfXeZ89hfCIiIhvHnj0REUkDh/GJiIhsnISTPYfxiYiIbBx79kREJA0Sflwukz0REUmCIGghGPDmOkPaWhqTPRERSYMgGNY755w9ERERtVfs2RMRkTQIBs7ZW3HPnsmeiIikQasFZAbMu1vxnD2H8YmIiGwce/ZERCQNHMYnIiKybYJWC8GAYXxrvvWOw/hEREQ2jj17IiKSBg7jExER2TitAMikmew5jE9ERGTj2LMnIiJpEAQAhtxnb709eyZ7IiKSBEErQDBgGF9gsiciImrnBC0M69nz1jsiIiJqQXJyMrp06QJnZ2eEh4fjhx9+MHsMTPZERCQJglYweNPX5s2bMXfuXCQkJOD48ePo378/oqKiUFpaaoJPeHNM9kREJA2C1vBNT2+99RamT5+OqVOnIiQkBOvWrYOrqys++ugjE3zAm7PqOfumxRINQr2FIyFzsOZHVZL+NDU1lg6BzEBb2/g9m2PxWwPqDXqmTgMac01lZaVOuVwuh1wub1a/rq4OWVlZWLBggVhmZ2eHiIgIZGZmtj2QNrDqZH/9+nUAwP7fvrBwJERkdMs/tXQEZEbXr1+Hp6enSc7t5OQEpVKJg+odBp/L3d0dgYGBOmUJCQlITExsVvfq1avQaDTw8/PTKffz88P58+cNjkUfVp3sAwICUFhYCA8PD8hkMkuHYzaVlZUIDAxEYWEhFAqFpcMhE+J3LR1S/a4FQcD169cREBBgsms4OzsjPz8fdXV1Bp9LEIRm+aalXn17Y9XJ3s7ODp07d7Z0GBajUCgk9Y+ClPG7lg4pftem6tH/kbOzM5ydnU1+nT/q2LEj7O3tUVJSolNeUlICpVJp1li4QI+IiMgEnJycMHjwYOzZs0cs02q12LNnD1QqlVljseqePRERUXs2d+5cxMbG4q677sLdd9+NVatWobq6GlOnTjVrHEz2VkgulyMhIcEq5onIMPyupYPftW16/PHHceXKFSxevBhqtRoDBgzAzp07my3aMzWZYM0P+yUiIqLb4pw9ERGRjWOyJyIisnFM9kRERDaOyZ6IiMjGMdlbmfbwqkQyvf3792Ps2LEICAiATCbDtm3bLB0SmUhSUhKGDBkCDw8P+Pr6Yvz48cjJybF0WGRjmOytSHt5VSKZXnV1Nfr374/k5GRLh0ImlpGRgbi4OBw+fBjp6emor69HZGQkqqurLR0a2RDeemdFwsPDMWTIELzzzjsAGp/EFBgYiFmzZuHll1+2cHRkKjKZDFu3bsX48eMtHQqZwZUrV+Dr64uMjAwMGzbM0uGQjWDP3ko0vSoxIiJCLLPUqxKJyHQqKioAAD4+PhaOhGwJk72VuNWrEtVqtYWiIiJj0mq1mD17Nu655x6EhoZaOhyyIXxcLhFROxEXF4cff/wRBw8etHQoZGOY7K1Ee3pVIhEZX3x8PNLS0rB//35Jv7qbTIPD+FaiPb0qkYiMRxAExMfHY+vWrdi7dy+6du1q6ZDIBrFnb0Xay6sSyfSqqqqQm5sr7ufn5yM7Oxs+Pj4ICgqyYGRkbHFxcUhNTcWXX34JDw8PcQ2Op6cnXFxcLBwd2Qreemdl3nnnHbz55pviqxJXr16N8PBwS4dFRrZv3z6MGDGiWXlsbCxSUlLMHxCZjEwma7F8/fr1ePrpp80bDNksJnsiIiIbxzl7IiIiG8dkT0REZOOY7ImIiGwckz0REZGNY7InIiKycUz2RERENo7JnoiIyMYx2RMZ6Omnn9Z51/zw4cMxe/Zss8exb98+yGQylJeX37SOTCbDtm3bWn3OxMREDBgwwKC4fv75Z8hkMmRnZxt0HiJqOyZ7sklPP/00ZDIZZDIZnJyc0KNHDyxduhQNDQ0mv/aWLVuwbNmyVtVtTYImIjIUn41PNmvUqFFYv349amtrsWPHDsTFxcHR0RELFixoVreurg5OTk5Gua6Pj49RzkNEZCzs2ZPNksvlUCqVCA4OxsyZMxEREYGvvvoKwO9D78uXL0dAQAB69+4NACgsLMRjjz0GLy8v+Pj4YNy4cfj555/Fc2o0GsydOxdeXl7o0KEDXnrpJfz5idN/Hsavra3F/PnzERgYCLlcjh49euDDDz/Ezz//LD7/3tvbGzKZTHwWularRVJSErp27QoXFxf0798fn3/+uc51duzYgV69esHFxQUjRozQibO15s+fj169esHV1RXdunXDokWLUF9f36zee++9h8DAQLi6uuKxxx5DRUWFzvEPPvgAffv2hbOzM/r06YN3331X71iIyHSY7EkyXFxcUFdXJ+7v2bMHOTk5SE9PR1paGurr6xEVFQUPDw8cOHAA33//Pdzd3TFq1Cix3b/+9S+kpKTgo48+wsGDB1FWVoatW7fe8rpTpkzBf//7X6xevRrnzp3De++9B3d3dwQGBuKLL74AAOTk5KC4uBhvv/02ACApKQkff/wx1q1bhzNnzmDOnDl46qmnkJGRAaDxl5IJEyZg7NixyM7OxjPPPIOXX35Z7/8nHh4eSElJwdmzZ/H222/j/fffx8qVK3Xq5Obm4tNPP8X27duxc+dOnDhxAs8995x4fOPGjVi8eDGWL1+Oc+fO4fXXX8eiRYuwYcMGveMhIhMRiGxQbGysMG7cOEEQBEGr1Qrp6emCXC4XXnzxRfG4n5+fUFtbK7b5z3/+I/Tu3VvQarViWW1treDi4iLs2rVLEARB8Pf3F1asWCEer6+vFzp37ixeSxAE4f777xdeeOEFQRAEIScnRwAgpKentxjnd999JwAQrl27JpbV1NQIrq6uwqFDh3TqTps2TXjiiScEQRCEBQsWCCEhITrH58+f3+xcfwZA2Lp1602Pv/nmm8LgwYPF/YSEBMHe3l64dOmSWPbNN98IdnZ2QnFxsSAIgtC9e3chNTVV5zzLli0TVCqVIAiCkJ+fLwAQTpw4cdPrEpFpcc6ebFZaWhrc3d1RX18PrVaLJ598EomJieLxsLAwnXn6kydPIjc3Fx4eHjrnqampQV5eHioqKlBcXKzzSmEHBwfcddddzYbym2RnZ8Pe3h73339/q+POzc3FjRs38OCDD+qU19XVYeDAgQCAc+fONXu1sUqlavU1mmzevBmrV69GXl4eqqqq0NDQAIVCoVMnKCgId9xxh851tFotcnJy4OHhgby8PEybNg3Tp08X6zQ0NMDT01PveIjINJjsyWaNGDECa9euhZOTEwICAuDgoPvH3c3NTWe/qqoKgwcPxsaNG5udq1OnTm2KwcXFRe82VVVVAICvv/5aJ8kCjesQjCUzMxMxMTFYsmQJoqKi4OnpiU2bNuFf//qX3rG+//77zX75sLe3N1qsRGQYJnuyWW5ubujRo0er6w8aNAibN2+Gr69vs95tE39/fxw5cgTDhg0D0NiDzcrKwqBBg1qsHxYWBq1Wi4yMDERERDQ73jSyoNFoxLKQkBDI5XIUFBTcdESgb9++4mLDJocPH779h/yDQ4cOITg4GK+++qpY9ssvvzSrV1BQgKKiIgQEBIjXsbOzQ+/eveHn54eAgABcvHgRMTExel2fiMyHC/SI/icmJgYdO3bEuHHjcODAAeTn52Pfvn14/vnncenSJQDACy+8gDfeeAPbtm3D+fPn8dxzz93yHvkuXbogNjYWf/vb37Bt2zbxnJ9++ikAIDg4GDKZDGlpabhy5Qqqqqrg4eGBF198EXPmzMGGDRuQl5eH48ePY82aNeKit2effRYXLlzAvHnzkJOTg9TUVKSkpOj1eXv27ImCggJs2rQJeXl5WL16dYuLDZ2dnREbG4uTJ0/iwIEDeP755/HYY49BqVQCAJYsWYKkpCSsXr0aP/30E06fPo3169fjrbfe0iseIjIdJnui/3F1dcX+/fsRFBSECRMmoG/fvpg2bRpqamrEnv7f//53TJ48GbGxsVCpVPDw8MAjjzxyy/OuXbsWjz76KJ577jn06dMH06dPR3V1NQDgjjvuwJIlS/Dyyy/Dz88P8fHxAIBly5Zh0aJFSEpKQt++fTFq1Ch8/fXX6Nq1K4DGefQvvvgC27ZtQ//+/bFu3Tq8/vrren3ehx9+GHPmzEF8fDwGDBiAQ4cOYdGiRc3q9ejRAxMmTMCYMWMQGRmJfv366dxa98wzz+CDDz7A+vXrERYWhvvvvx8pKSlirERkeTLhZiuLiIiIyCawZ09ERGTjmOyJiIhsHJM9ERGRjWOyJyIisnFM9kRERDaOyZ6IiMjGMdkTERHZOCZ7IiIiG8dkT0REZOOY7ImIiGwckz0REZGNY7InIiKycf8PFFTlFdF1YX0AAAAASUVORK5CYII=", + "text/plain": [ + "<Figure size 640x480 with 2 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cm =confusion_matrix(y_test, my_pred)\n", + "disp = ConfusionMatrixDisplay(confusion_matrix=cm,)\n", + "disp.plot()\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<h1> 4.1 Grid Search</h1>" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fitting 5 folds for each of 54 candidates, totalling 270 fits\n", + "Best parameters: {'colsample_bytree': 0.3, 'learning_rate': 0.05, 'max_depth': 10, 'n_estimators': 1000}\n", + "Lowest RMSE: 0.23763541031440186\n" + ] + } + ], + "source": [ + "params = { 'max_depth': [3,6,10],\n", + " 'learning_rate': [0.01, 0.05, 0.1],\n", + " 'n_estimators': [100, 500, 1000],\n", + " 'colsample_bytree': [0.3, 0.7]}\n", + "\n", + "from sklearn.model_selection import GridSearchCV\n", + "im_xgb = GridSearchCV(estimator=xgb_clf, \n", + " param_grid=params,\n", + " scoring='neg_mean_squared_error', \n", + " verbose=1)\n", + "im_xgb.fit(X_train, y_train)\n", + "print(\"Best parameters:\", im_xgb.best_params_)\n", + "print(\"Lowest RMSE: \", (-im_xgb.best_score_)**(1/2.0))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Evaluation after optimal hyperparameter is found" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Confusion Matrix followed by cross validation" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " normal 0.98 1.00 0.99 450\n", + " data injection attack 0.96 0.96 0.96 225\n", + "command injection attack 0.96 0.93 0.95 225\n", + "\n", + " accuracy 0.97 900\n", + " macro avg 0.97 0.96 0.97 900\n", + " weighted avg 0.97 0.97 0.97 900\n", + "\n" + ] + } + ], + "source": [ + "pred = im_xgb.predict(X_test)\n", + "labels = ['normal', 'data injection attack', 'command injection attack' ]\n", + "print(classification_report(y_test, pred, target_names = labels))" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "XGBoost model accuracy score: 0.9722\n" + ] + } + ], + "source": [ + "from sklearn.metrics import accuracy_score\n", + "print('XGBoost model accuracy score: {0:0.4f}'. format(accuracy_score(y_test, pred)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 640x480 with 2 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cma =confusion_matrix(y_test, pred)\n", + "disp = ConfusionMatrixDisplay(confusion_matrix=cma,)\n", + "disp.plot()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fitting 5 folds for each of 54 candidates, totalling 270 fits\n", + "Fitting 5 folds for each of 54 candidates, totalling 270 fits\n", + "Fitting 5 folds for each of 54 candidates, totalling 270 fits\n", + "Fitting 5 folds for each of 54 candidates, totalling 270 fits\n", + "Fitting 5 folds for each of 54 candidates, totalling 270 fits\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[41], line 5\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39msklearn\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mmodel_selection\u001b[39;00m \u001b[39mimport\u001b[39;00m cross_val_score\n\u001b[0;32m 2\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39msklearn\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mmodel_selection\u001b[39;00m \u001b[39mimport\u001b[39;00m StratifiedKFold\n\u001b[1;32m----> 5\u001b[0m cvScore \u001b[39m=\u001b[39m cross_val_score(im_xgb, X, y, cv\u001b[39m=\u001b[39;49mStratifiedKFold(n_splits\u001b[39m=\u001b[39;49m\u001b[39m5\u001b[39;49m, shuffle\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m, random_state\u001b[39m=\u001b[39;49m\u001b[39m1\u001b[39;49m), scoring\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39mf1_macro\u001b[39;49m\u001b[39m'\u001b[39;49m)\n\u001b[0;32m 6\u001b[0m \u001b[39mprint\u001b[39m (cvScore)\n\u001b[0;32m 7\u001b[0m \u001b[39mprint\u001b[39m (\u001b[39m\"\u001b[39m\u001b[39m StratifiedKFold Cross-Validation Accuracy: \u001b[39m\u001b[39m%0.2f\u001b[39;00m\u001b[39m%%\u001b[39;00m\u001b[39m | Standard Deviation: \u001b[39m\u001b[39m%0.2f\u001b[39;00m\u001b[39m%%\u001b[39;00m\u001b[39m\"\u001b[39m \u001b[39m%\u001b[39m (\u001b[39m100\u001b[39m\u001b[39m*\u001b[39mcvScore\u001b[39m.\u001b[39mmean(), \u001b[39m100\u001b[39m\u001b[39m*\u001b[39mcvScore\u001b[39m.\u001b[39mstd()))\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\model_selection\\_validation.py:515\u001b[0m, in \u001b[0;36mcross_val_score\u001b[1;34m(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, error_score)\u001b[0m\n\u001b[0;32m 512\u001b[0m \u001b[39m# To ensure multimetric format is not supported\u001b[39;00m\n\u001b[0;32m 513\u001b[0m scorer \u001b[39m=\u001b[39m check_scoring(estimator, scoring\u001b[39m=\u001b[39mscoring)\n\u001b[1;32m--> 515\u001b[0m cv_results \u001b[39m=\u001b[39m cross_validate(\n\u001b[0;32m 516\u001b[0m estimator\u001b[39m=\u001b[39;49mestimator,\n\u001b[0;32m 517\u001b[0m X\u001b[39m=\u001b[39;49mX,\n\u001b[0;32m 518\u001b[0m y\u001b[39m=\u001b[39;49my,\n\u001b[0;32m 519\u001b[0m groups\u001b[39m=\u001b[39;49mgroups,\n\u001b[0;32m 520\u001b[0m scoring\u001b[39m=\u001b[39;49m{\u001b[39m\"\u001b[39;49m\u001b[39mscore\u001b[39;49m\u001b[39m\"\u001b[39;49m: scorer},\n\u001b[0;32m 521\u001b[0m cv\u001b[39m=\u001b[39;49mcv,\n\u001b[0;32m 522\u001b[0m n_jobs\u001b[39m=\u001b[39;49mn_jobs,\n\u001b[0;32m 523\u001b[0m verbose\u001b[39m=\u001b[39;49mverbose,\n\u001b[0;32m 524\u001b[0m fit_params\u001b[39m=\u001b[39;49mfit_params,\n\u001b[0;32m 525\u001b[0m pre_dispatch\u001b[39m=\u001b[39;49mpre_dispatch,\n\u001b[0;32m 526\u001b[0m error_score\u001b[39m=\u001b[39;49merror_score,\n\u001b[0;32m 527\u001b[0m )\n\u001b[0;32m 528\u001b[0m \u001b[39mreturn\u001b[39;00m cv_results[\u001b[39m\"\u001b[39m\u001b[39mtest_score\u001b[39m\u001b[39m\"\u001b[39m]\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\model_selection\\_validation.py:266\u001b[0m, in \u001b[0;36mcross_validate\u001b[1;34m(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, return_train_score, return_estimator, error_score)\u001b[0m\n\u001b[0;32m 263\u001b[0m \u001b[39m# We clone the estimator to make sure that all the folds are\u001b[39;00m\n\u001b[0;32m 264\u001b[0m \u001b[39m# independent, and that it is pickle-able.\u001b[39;00m\n\u001b[0;32m 265\u001b[0m parallel \u001b[39m=\u001b[39m Parallel(n_jobs\u001b[39m=\u001b[39mn_jobs, verbose\u001b[39m=\u001b[39mverbose, pre_dispatch\u001b[39m=\u001b[39mpre_dispatch)\n\u001b[1;32m--> 266\u001b[0m results \u001b[39m=\u001b[39m parallel(\n\u001b[0;32m 267\u001b[0m delayed(_fit_and_score)(\n\u001b[0;32m 268\u001b[0m clone(estimator),\n\u001b[0;32m 269\u001b[0m X,\n\u001b[0;32m 270\u001b[0m y,\n\u001b[0;32m 271\u001b[0m scorers,\n\u001b[0;32m 272\u001b[0m train,\n\u001b[0;32m 273\u001b[0m test,\n\u001b[0;32m 274\u001b[0m verbose,\n\u001b[0;32m 275\u001b[0m \u001b[39mNone\u001b[39;49;00m,\n\u001b[0;32m 276\u001b[0m fit_params,\n\u001b[0;32m 277\u001b[0m return_train_score\u001b[39m=\u001b[39;49mreturn_train_score,\n\u001b[0;32m 278\u001b[0m return_times\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m,\n\u001b[0;32m 279\u001b[0m return_estimator\u001b[39m=\u001b[39;49mreturn_estimator,\n\u001b[0;32m 280\u001b[0m error_score\u001b[39m=\u001b[39;49merror_score,\n\u001b[0;32m 281\u001b[0m )\n\u001b[0;32m 282\u001b[0m \u001b[39mfor\u001b[39;49;00m train, test \u001b[39min\u001b[39;49;00m cv\u001b[39m.\u001b[39;49msplit(X, y, groups)\n\u001b[0;32m 283\u001b[0m )\n\u001b[0;32m 285\u001b[0m _warn_or_raise_about_fit_failures(results, error_score)\n\u001b[0;32m 287\u001b[0m \u001b[39m# For callabe scoring, the return type is only know after calling. If the\u001b[39;00m\n\u001b[0;32m 288\u001b[0m \u001b[39m# return type is a dictionary, the error scores can now be inserted with\u001b[39;00m\n\u001b[0;32m 289\u001b[0m \u001b[39m# the correct key.\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\utils\\parallel.py:63\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 58\u001b[0m config \u001b[39m=\u001b[39m get_config()\n\u001b[0;32m 59\u001b[0m iterable_with_config \u001b[39m=\u001b[39m (\n\u001b[0;32m 60\u001b[0m (_with_config(delayed_func, config), args, kwargs)\n\u001b[0;32m 61\u001b[0m \u001b[39mfor\u001b[39;00m delayed_func, args, kwargs \u001b[39min\u001b[39;00m iterable\n\u001b[0;32m 62\u001b[0m )\n\u001b[1;32m---> 63\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39msuper\u001b[39;49m()\u001b[39m.\u001b[39;49m\u001b[39m__call__\u001b[39;49m(iterable_with_config)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:1088\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 1085\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdispatch_one_batch(iterator):\n\u001b[0;32m 1086\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_iterating \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_original_iterator \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m-> 1088\u001b[0m \u001b[39mwhile\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdispatch_one_batch(iterator):\n\u001b[0;32m 1089\u001b[0m \u001b[39mpass\u001b[39;00m\n\u001b[0;32m 1091\u001b[0m \u001b[39mif\u001b[39;00m pre_dispatch \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mall\u001b[39m\u001b[39m\"\u001b[39m \u001b[39mor\u001b[39;00m n_jobs \u001b[39m==\u001b[39m \u001b[39m1\u001b[39m:\n\u001b[0;32m 1092\u001b[0m \u001b[39m# The iterable was consumed all at once by the above for loop.\u001b[39;00m\n\u001b[0;32m 1093\u001b[0m \u001b[39m# No need to wait for async callbacks to trigger to\u001b[39;00m\n\u001b[0;32m 1094\u001b[0m \u001b[39m# consumption.\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:901\u001b[0m, in \u001b[0;36mParallel.dispatch_one_batch\u001b[1;34m(self, iterator)\u001b[0m\n\u001b[0;32m 899\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mFalse\u001b[39;00m\n\u001b[0;32m 900\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m--> 901\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_dispatch(tasks)\n\u001b[0;32m 902\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mTrue\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:819\u001b[0m, in \u001b[0;36mParallel._dispatch\u001b[1;34m(self, batch)\u001b[0m\n\u001b[0;32m 817\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_lock:\n\u001b[0;32m 818\u001b[0m job_idx \u001b[39m=\u001b[39m \u001b[39mlen\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_jobs)\n\u001b[1;32m--> 819\u001b[0m job \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_backend\u001b[39m.\u001b[39;49mapply_async(batch, callback\u001b[39m=\u001b[39;49mcb)\n\u001b[0;32m 820\u001b[0m \u001b[39m# A job can complete so quickly than its callback is\u001b[39;00m\n\u001b[0;32m 821\u001b[0m \u001b[39m# called before we get here, causing self._jobs to\u001b[39;00m\n\u001b[0;32m 822\u001b[0m \u001b[39m# grow. To ensure correct results ordering, .insert is\u001b[39;00m\n\u001b[0;32m 823\u001b[0m \u001b[39m# used (rather than .append) in the following line\u001b[39;00m\n\u001b[0;32m 824\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_jobs\u001b[39m.\u001b[39minsert(job_idx, job)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\_parallel_backends.py:208\u001b[0m, in \u001b[0;36mSequentialBackend.apply_async\u001b[1;34m(self, func, callback)\u001b[0m\n\u001b[0;32m 206\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mapply_async\u001b[39m(\u001b[39mself\u001b[39m, func, callback\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m):\n\u001b[0;32m 207\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Schedule a func to be run\"\"\"\u001b[39;00m\n\u001b[1;32m--> 208\u001b[0m result \u001b[39m=\u001b[39m ImmediateResult(func)\n\u001b[0;32m 209\u001b[0m \u001b[39mif\u001b[39;00m callback:\n\u001b[0;32m 210\u001b[0m callback(result)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\_parallel_backends.py:597\u001b[0m, in \u001b[0;36mImmediateResult.__init__\u001b[1;34m(self, batch)\u001b[0m\n\u001b[0;32m 594\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__init__\u001b[39m(\u001b[39mself\u001b[39m, batch):\n\u001b[0;32m 595\u001b[0m \u001b[39m# Don't delay the application, to avoid keeping the input\u001b[39;00m\n\u001b[0;32m 596\u001b[0m \u001b[39m# arguments in memory\u001b[39;00m\n\u001b[1;32m--> 597\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mresults \u001b[39m=\u001b[39m batch()\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:288\u001b[0m, in \u001b[0;36mBatchedCalls.__call__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 284\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 285\u001b[0m \u001b[39m# Set the default nested backend to self._backend but do not set the\u001b[39;00m\n\u001b[0;32m 286\u001b[0m \u001b[39m# change the default number of processes to -1\u001b[39;00m\n\u001b[0;32m 287\u001b[0m \u001b[39mwith\u001b[39;00m parallel_backend(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backend, n_jobs\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_n_jobs):\n\u001b[1;32m--> 288\u001b[0m \u001b[39mreturn\u001b[39;00m [func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[0;32m 289\u001b[0m \u001b[39mfor\u001b[39;49;00m func, args, kwargs \u001b[39min\u001b[39;49;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mitems]\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:288\u001b[0m, in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 284\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 285\u001b[0m \u001b[39m# Set the default nested backend to self._backend but do not set the\u001b[39;00m\n\u001b[0;32m 286\u001b[0m \u001b[39m# change the default number of processes to -1\u001b[39;00m\n\u001b[0;32m 287\u001b[0m \u001b[39mwith\u001b[39;00m parallel_backend(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backend, n_jobs\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_n_jobs):\n\u001b[1;32m--> 288\u001b[0m \u001b[39mreturn\u001b[39;00m [func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[0;32m 289\u001b[0m \u001b[39mfor\u001b[39;00m func, args, kwargs \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mitems]\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\utils\\parallel.py:123\u001b[0m, in \u001b[0;36m_FuncWrapper.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 121\u001b[0m config \u001b[39m=\u001b[39m {}\n\u001b[0;32m 122\u001b[0m \u001b[39mwith\u001b[39;00m config_context(\u001b[39m*\u001b[39m\u001b[39m*\u001b[39mconfig):\n\u001b[1;32m--> 123\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mfunction(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\model_selection\\_validation.py:686\u001b[0m, in \u001b[0;36m_fit_and_score\u001b[1;34m(estimator, X, y, scorer, train, test, verbose, parameters, fit_params, return_train_score, return_parameters, return_n_test_samples, return_times, return_estimator, split_progress, candidate_progress, error_score)\u001b[0m\n\u001b[0;32m 684\u001b[0m estimator\u001b[39m.\u001b[39mfit(X_train, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mfit_params)\n\u001b[0;32m 685\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m--> 686\u001b[0m estimator\u001b[39m.\u001b[39;49mfit(X_train, y_train, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mfit_params)\n\u001b[0;32m 688\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m:\n\u001b[0;32m 689\u001b[0m \u001b[39m# Note fit time as time until error\u001b[39;00m\n\u001b[0;32m 690\u001b[0m fit_time \u001b[39m=\u001b[39m time\u001b[39m.\u001b[39mtime() \u001b[39m-\u001b[39m start_time\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\model_selection\\_search.py:874\u001b[0m, in \u001b[0;36mBaseSearchCV.fit\u001b[1;34m(self, X, y, groups, **fit_params)\u001b[0m\n\u001b[0;32m 868\u001b[0m results \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_format_results(\n\u001b[0;32m 869\u001b[0m all_candidate_params, n_splits, all_out, all_more_results\n\u001b[0;32m 870\u001b[0m )\n\u001b[0;32m 872\u001b[0m \u001b[39mreturn\u001b[39;00m results\n\u001b[1;32m--> 874\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_run_search(evaluate_candidates)\n\u001b[0;32m 876\u001b[0m \u001b[39m# multimetric is determined here because in the case of a callable\u001b[39;00m\n\u001b[0;32m 877\u001b[0m \u001b[39m# self.scoring the return type is only known after calling\u001b[39;00m\n\u001b[0;32m 878\u001b[0m first_test_score \u001b[39m=\u001b[39m all_out[\u001b[39m0\u001b[39m][\u001b[39m\"\u001b[39m\u001b[39mtest_scores\u001b[39m\u001b[39m\"\u001b[39m]\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\model_selection\\_search.py:1388\u001b[0m, in \u001b[0;36mGridSearchCV._run_search\u001b[1;34m(self, evaluate_candidates)\u001b[0m\n\u001b[0;32m 1386\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_run_search\u001b[39m(\u001b[39mself\u001b[39m, evaluate_candidates):\n\u001b[0;32m 1387\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Search all candidates in param_grid\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1388\u001b[0m evaluate_candidates(ParameterGrid(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mparam_grid))\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\model_selection\\_search.py:821\u001b[0m, in \u001b[0;36mBaseSearchCV.fit.<locals>.evaluate_candidates\u001b[1;34m(candidate_params, cv, more_results)\u001b[0m\n\u001b[0;32m 813\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mverbose \u001b[39m>\u001b[39m \u001b[39m0\u001b[39m:\n\u001b[0;32m 814\u001b[0m \u001b[39mprint\u001b[39m(\n\u001b[0;32m 815\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mFitting \u001b[39m\u001b[39m{0}\u001b[39;00m\u001b[39m folds for each of \u001b[39m\u001b[39m{1}\u001b[39;00m\u001b[39m candidates,\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 816\u001b[0m \u001b[39m\"\u001b[39m\u001b[39m totalling \u001b[39m\u001b[39m{2}\u001b[39;00m\u001b[39m fits\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mformat(\n\u001b[0;32m 817\u001b[0m n_splits, n_candidates, n_candidates \u001b[39m*\u001b[39m n_splits\n\u001b[0;32m 818\u001b[0m )\n\u001b[0;32m 819\u001b[0m )\n\u001b[1;32m--> 821\u001b[0m out \u001b[39m=\u001b[39m parallel(\n\u001b[0;32m 822\u001b[0m delayed(_fit_and_score)(\n\u001b[0;32m 823\u001b[0m clone(base_estimator),\n\u001b[0;32m 824\u001b[0m X,\n\u001b[0;32m 825\u001b[0m y,\n\u001b[0;32m 826\u001b[0m train\u001b[39m=\u001b[39;49mtrain,\n\u001b[0;32m 827\u001b[0m test\u001b[39m=\u001b[39;49mtest,\n\u001b[0;32m 828\u001b[0m parameters\u001b[39m=\u001b[39;49mparameters,\n\u001b[0;32m 829\u001b[0m split_progress\u001b[39m=\u001b[39;49m(split_idx, n_splits),\n\u001b[0;32m 830\u001b[0m candidate_progress\u001b[39m=\u001b[39;49m(cand_idx, n_candidates),\n\u001b[0;32m 831\u001b[0m \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mfit_and_score_kwargs,\n\u001b[0;32m 832\u001b[0m )\n\u001b[0;32m 833\u001b[0m \u001b[39mfor\u001b[39;49;00m (cand_idx, parameters), (split_idx, (train, test)) \u001b[39min\u001b[39;49;00m product(\n\u001b[0;32m 834\u001b[0m \u001b[39menumerate\u001b[39;49m(candidate_params), \u001b[39menumerate\u001b[39;49m(cv\u001b[39m.\u001b[39;49msplit(X, y, groups))\n\u001b[0;32m 835\u001b[0m )\n\u001b[0;32m 836\u001b[0m )\n\u001b[0;32m 838\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mlen\u001b[39m(out) \u001b[39m<\u001b[39m \u001b[39m1\u001b[39m:\n\u001b[0;32m 839\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[0;32m 840\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mNo fits were performed. \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 841\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mWas the CV iterator empty? \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 842\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mWere there no candidates?\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 843\u001b[0m )\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\utils\\parallel.py:63\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 58\u001b[0m config \u001b[39m=\u001b[39m get_config()\n\u001b[0;32m 59\u001b[0m iterable_with_config \u001b[39m=\u001b[39m (\n\u001b[0;32m 60\u001b[0m (_with_config(delayed_func, config), args, kwargs)\n\u001b[0;32m 61\u001b[0m \u001b[39mfor\u001b[39;00m delayed_func, args, kwargs \u001b[39min\u001b[39;00m iterable\n\u001b[0;32m 62\u001b[0m )\n\u001b[1;32m---> 63\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39msuper\u001b[39;49m()\u001b[39m.\u001b[39;49m\u001b[39m__call__\u001b[39;49m(iterable_with_config)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:1088\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 1085\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdispatch_one_batch(iterator):\n\u001b[0;32m 1086\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_iterating \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_original_iterator \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m-> 1088\u001b[0m \u001b[39mwhile\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdispatch_one_batch(iterator):\n\u001b[0;32m 1089\u001b[0m \u001b[39mpass\u001b[39;00m\n\u001b[0;32m 1091\u001b[0m \u001b[39mif\u001b[39;00m pre_dispatch \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mall\u001b[39m\u001b[39m\"\u001b[39m \u001b[39mor\u001b[39;00m n_jobs \u001b[39m==\u001b[39m \u001b[39m1\u001b[39m:\n\u001b[0;32m 1092\u001b[0m \u001b[39m# The iterable was consumed all at once by the above for loop.\u001b[39;00m\n\u001b[0;32m 1093\u001b[0m \u001b[39m# No need to wait for async callbacks to trigger to\u001b[39;00m\n\u001b[0;32m 1094\u001b[0m \u001b[39m# consumption.\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:901\u001b[0m, in \u001b[0;36mParallel.dispatch_one_batch\u001b[1;34m(self, iterator)\u001b[0m\n\u001b[0;32m 899\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mFalse\u001b[39;00m\n\u001b[0;32m 900\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m--> 901\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_dispatch(tasks)\n\u001b[0;32m 902\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mTrue\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:819\u001b[0m, in \u001b[0;36mParallel._dispatch\u001b[1;34m(self, batch)\u001b[0m\n\u001b[0;32m 817\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_lock:\n\u001b[0;32m 818\u001b[0m job_idx \u001b[39m=\u001b[39m \u001b[39mlen\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_jobs)\n\u001b[1;32m--> 819\u001b[0m job \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_backend\u001b[39m.\u001b[39;49mapply_async(batch, callback\u001b[39m=\u001b[39;49mcb)\n\u001b[0;32m 820\u001b[0m \u001b[39m# A job can complete so quickly than its callback is\u001b[39;00m\n\u001b[0;32m 821\u001b[0m \u001b[39m# called before we get here, causing self._jobs to\u001b[39;00m\n\u001b[0;32m 822\u001b[0m \u001b[39m# grow. To ensure correct results ordering, .insert is\u001b[39;00m\n\u001b[0;32m 823\u001b[0m \u001b[39m# used (rather than .append) in the following line\u001b[39;00m\n\u001b[0;32m 824\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_jobs\u001b[39m.\u001b[39minsert(job_idx, job)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\_parallel_backends.py:208\u001b[0m, in \u001b[0;36mSequentialBackend.apply_async\u001b[1;34m(self, func, callback)\u001b[0m\n\u001b[0;32m 206\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mapply_async\u001b[39m(\u001b[39mself\u001b[39m, func, callback\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m):\n\u001b[0;32m 207\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Schedule a func to be run\"\"\"\u001b[39;00m\n\u001b[1;32m--> 208\u001b[0m result \u001b[39m=\u001b[39m ImmediateResult(func)\n\u001b[0;32m 209\u001b[0m \u001b[39mif\u001b[39;00m callback:\n\u001b[0;32m 210\u001b[0m callback(result)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\_parallel_backends.py:597\u001b[0m, in \u001b[0;36mImmediateResult.__init__\u001b[1;34m(self, batch)\u001b[0m\n\u001b[0;32m 594\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__init__\u001b[39m(\u001b[39mself\u001b[39m, batch):\n\u001b[0;32m 595\u001b[0m \u001b[39m# Don't delay the application, to avoid keeping the input\u001b[39;00m\n\u001b[0;32m 596\u001b[0m \u001b[39m# arguments in memory\u001b[39;00m\n\u001b[1;32m--> 597\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mresults \u001b[39m=\u001b[39m batch()\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:288\u001b[0m, in \u001b[0;36mBatchedCalls.__call__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 284\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 285\u001b[0m \u001b[39m# Set the default nested backend to self._backend but do not set the\u001b[39;00m\n\u001b[0;32m 286\u001b[0m \u001b[39m# change the default number of processes to -1\u001b[39;00m\n\u001b[0;32m 287\u001b[0m \u001b[39mwith\u001b[39;00m parallel_backend(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backend, n_jobs\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_n_jobs):\n\u001b[1;32m--> 288\u001b[0m \u001b[39mreturn\u001b[39;00m [func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[0;32m 289\u001b[0m \u001b[39mfor\u001b[39;49;00m func, args, kwargs \u001b[39min\u001b[39;49;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mitems]\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\joblib\\parallel.py:288\u001b[0m, in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 284\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 285\u001b[0m \u001b[39m# Set the default nested backend to self._backend but do not set the\u001b[39;00m\n\u001b[0;32m 286\u001b[0m \u001b[39m# change the default number of processes to -1\u001b[39;00m\n\u001b[0;32m 287\u001b[0m \u001b[39mwith\u001b[39;00m parallel_backend(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backend, n_jobs\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_n_jobs):\n\u001b[1;32m--> 288\u001b[0m \u001b[39mreturn\u001b[39;00m [func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[0;32m 289\u001b[0m \u001b[39mfor\u001b[39;00m func, args, kwargs \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mitems]\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\utils\\parallel.py:123\u001b[0m, in \u001b[0;36m_FuncWrapper.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 121\u001b[0m config \u001b[39m=\u001b[39m {}\n\u001b[0;32m 122\u001b[0m \u001b[39mwith\u001b[39;00m config_context(\u001b[39m*\u001b[39m\u001b[39m*\u001b[39mconfig):\n\u001b[1;32m--> 123\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mfunction(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\sklearn\\model_selection\\_validation.py:686\u001b[0m, in \u001b[0;36m_fit_and_score\u001b[1;34m(estimator, X, y, scorer, train, test, verbose, parameters, fit_params, return_train_score, return_parameters, return_n_test_samples, return_times, return_estimator, split_progress, candidate_progress, error_score)\u001b[0m\n\u001b[0;32m 684\u001b[0m estimator\u001b[39m.\u001b[39mfit(X_train, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mfit_params)\n\u001b[0;32m 685\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m--> 686\u001b[0m estimator\u001b[39m.\u001b[39;49mfit(X_train, y_train, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mfit_params)\n\u001b[0;32m 688\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m:\n\u001b[0;32m 689\u001b[0m \u001b[39m# Note fit time as time until error\u001b[39;00m\n\u001b[0;32m 690\u001b[0m fit_time \u001b[39m=\u001b[39m time\u001b[39m.\u001b[39mtime() \u001b[39m-\u001b[39m start_time\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\xgboost\\core.py:620\u001b[0m, in \u001b[0;36mrequire_keyword_args.<locals>.throw_if.<locals>.inner_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 618\u001b[0m \u001b[39mfor\u001b[39;00m k, arg \u001b[39min\u001b[39;00m \u001b[39mzip\u001b[39m(sig\u001b[39m.\u001b[39mparameters, args):\n\u001b[0;32m 619\u001b[0m kwargs[k] \u001b[39m=\u001b[39m arg\n\u001b[1;32m--> 620\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\xgboost\\sklearn.py:1490\u001b[0m, in \u001b[0;36mXGBClassifier.fit\u001b[1;34m(self, X, y, sample_weight, base_margin, eval_set, eval_metric, early_stopping_rounds, verbose, xgb_model, sample_weight_eval_set, base_margin_eval_set, feature_weights, callbacks)\u001b[0m\n\u001b[0;32m 1462\u001b[0m (\n\u001b[0;32m 1463\u001b[0m model,\n\u001b[0;32m 1464\u001b[0m metric,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1469\u001b[0m xgb_model, eval_metric, params, early_stopping_rounds, callbacks\n\u001b[0;32m 1470\u001b[0m )\n\u001b[0;32m 1471\u001b[0m train_dmatrix, evals \u001b[39m=\u001b[39m _wrap_evaluation_matrices(\n\u001b[0;32m 1472\u001b[0m missing\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmissing,\n\u001b[0;32m 1473\u001b[0m X\u001b[39m=\u001b[39mX,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1487\u001b[0m feature_types\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mfeature_types,\n\u001b[0;32m 1488\u001b[0m )\n\u001b[1;32m-> 1490\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_Booster \u001b[39m=\u001b[39m train(\n\u001b[0;32m 1491\u001b[0m params,\n\u001b[0;32m 1492\u001b[0m train_dmatrix,\n\u001b[0;32m 1493\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mget_num_boosting_rounds(),\n\u001b[0;32m 1494\u001b[0m evals\u001b[39m=\u001b[39;49mevals,\n\u001b[0;32m 1495\u001b[0m early_stopping_rounds\u001b[39m=\u001b[39;49mearly_stopping_rounds,\n\u001b[0;32m 1496\u001b[0m evals_result\u001b[39m=\u001b[39;49mevals_result,\n\u001b[0;32m 1497\u001b[0m obj\u001b[39m=\u001b[39;49mobj,\n\u001b[0;32m 1498\u001b[0m custom_metric\u001b[39m=\u001b[39;49mmetric,\n\u001b[0;32m 1499\u001b[0m verbose_eval\u001b[39m=\u001b[39;49mverbose,\n\u001b[0;32m 1500\u001b[0m xgb_model\u001b[39m=\u001b[39;49mmodel,\n\u001b[0;32m 1501\u001b[0m callbacks\u001b[39m=\u001b[39;49mcallbacks,\n\u001b[0;32m 1502\u001b[0m )\n\u001b[0;32m 1504\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mcallable\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mobjective):\n\u001b[0;32m 1505\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mobjective \u001b[39m=\u001b[39m params[\u001b[39m\"\u001b[39m\u001b[39mobjective\u001b[39m\u001b[39m\"\u001b[39m]\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\xgboost\\core.py:620\u001b[0m, in \u001b[0;36mrequire_keyword_args.<locals>.throw_if.<locals>.inner_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 618\u001b[0m \u001b[39mfor\u001b[39;00m k, arg \u001b[39min\u001b[39;00m \u001b[39mzip\u001b[39m(sig\u001b[39m.\u001b[39mparameters, args):\n\u001b[0;32m 619\u001b[0m kwargs[k] \u001b[39m=\u001b[39m arg\n\u001b[1;32m--> 620\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\xgboost\\training.py:185\u001b[0m, in \u001b[0;36mtrain\u001b[1;34m(params, dtrain, num_boost_round, evals, obj, feval, maximize, early_stopping_rounds, evals_result, verbose_eval, xgb_model, callbacks, custom_metric)\u001b[0m\n\u001b[0;32m 183\u001b[0m \u001b[39mif\u001b[39;00m cb_container\u001b[39m.\u001b[39mbefore_iteration(bst, i, dtrain, evals):\n\u001b[0;32m 184\u001b[0m \u001b[39mbreak\u001b[39;00m\n\u001b[1;32m--> 185\u001b[0m bst\u001b[39m.\u001b[39;49mupdate(dtrain, i, obj)\n\u001b[0;32m 186\u001b[0m \u001b[39mif\u001b[39;00m cb_container\u001b[39m.\u001b[39mafter_iteration(bst, i, dtrain, evals):\n\u001b[0;32m 187\u001b[0m \u001b[39mbreak\u001b[39;00m\n", + "File \u001b[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\xgboost\\core.py:1918\u001b[0m, in \u001b[0;36mBooster.update\u001b[1;34m(self, dtrain, iteration, fobj)\u001b[0m\n\u001b[0;32m 1915\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_validate_dmatrix_features(dtrain)\n\u001b[0;32m 1917\u001b[0m \u001b[39mif\u001b[39;00m fobj \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m-> 1918\u001b[0m _check_call(_LIB\u001b[39m.\u001b[39;49mXGBoosterUpdateOneIter(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mhandle,\n\u001b[0;32m 1919\u001b[0m ctypes\u001b[39m.\u001b[39;49mc_int(iteration),\n\u001b[0;32m 1920\u001b[0m dtrain\u001b[39m.\u001b[39;49mhandle))\n\u001b[0;32m 1921\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 1922\u001b[0m pred \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpredict(dtrain, output_margin\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m, training\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m)\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "from sklearn.model_selection import cross_val_score\n", + "from sklearn.model_selection import StratifiedKFold\n", + "\n", + "\n", + "cvScore = cross_val_score(im_xgb, X, y, cv=StratifiedKFold(n_splits=5, shuffle=True, random_state=1), scoring='f1_macro')\n", + "print (cvScore)\n", + "print (\" StratifiedKFold Cross-Validation Accuracy: %0.2f%% | Standard Deviation: %0.2f%%\" % (100*cvScore.mean(), 100*cvScore.std()))\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<h1> 6. Testing Data</h1>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "predicted marker\n", + "1 36\n", + "0 32\n", + "2 32\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_testpred = im_xgb.predict(mTest.values)\n", + "y_testpred = pd.DataFrame(y_testpred, columns=['predicted marker'])\n", + "y_testpred.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y_testpred.to_csv('xgbPredictedlabels.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mTest[\"marker\"] = y_testpred\n", + "mTest.to_csv('TestingResultsMulti.csv')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.3" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +}