[0f681c]: / scripts / Multi-Lead-DataFrame-Update-Copy1_0528.ipynb

Download this file

2131 lines (2130 with data), 88.9 kB

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f5a54e19",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import cv2\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sn\n",
    "import os.path, sys, re\n",
    "import time\n",
    "from PIL import Image\n",
    "\n",
    "from sktime.utils.data_processing import (\n",
    "    from_3d_numpy_to_nested,\n",
    "    from_multi_index_to_3d_numpy,\n",
    "    from_nested_to_3d_numpy,\n",
    "    from_multi_index_to_nested,\n",
    "    from_nested_to_multi_index,\n",
    ")\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.pipeline import Pipeline\n",
    "import sklearn.metrics as metrics\n",
    "from sklearn.model_selection import StratifiedShuffleSplit\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "from sktime.classification.compose import ColumnEnsembleClassifier\n",
    "from sktime.classification.dictionary_based import BOSSEnsemble\n",
    "from sktime.classification.interval_based import TimeSeriesForestClassifier\n",
    "from sktime.classification.shapelet_based import MrSEQLClassifier\n",
    "from sktime.datasets import load_basic_motions\n",
    "from sktime.transformations.panel.compose import ColumnConcatenator\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "70e3cc1c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/moise/Desktop/Data_Science/Erdos_Institute/ecg-proj/ecg-copy\n"
     ]
    }
   ],
   "source": [
    "cd ~/Desktop/Data_Science/Erdos_Institute/ecg-proj/ecg-copy/"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7bc7c3c",
   "metadata": {},
   "source": [
    "### Data Preprocessing task"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "96b63a75",
   "metadata": {},
   "outputs": [],
   "source": [
    "pathroot = \"CSV_data_v2/\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "952c9fcc",
   "metadata": {},
   "outputs": [],
   "source": [
    "LeadDict={'Lead1':np.array([[]]),'Lead2':np.array([[]]),'Lead3':np.array([[]]),'Lead4':np.array([[]]),\n",
    "          'Lead5':np.array([[]]),'Lead6':np.array([[]]),'Lead7':np.array([[]]),'Lead8':np.array([[]]),\n",
    "         'Lead9':np.array([[]]),'Lead10':np.array([[]]),'Lead11':np.array([[]]),'Lead12':np.array([[]])}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b25f602e",
   "metadata": {},
   "outputs": [],
   "source": [
    "leadMinLen = {'Lead1':0,'Lead2':0,'Lead3':0,'Lead4':0,'Lead5':0,'Lead6':0,\n",
    "           'Lead7':0,'Lead8':0,'Lead9':0,'Lead10':0,'Lead11':0,'Lead12':0}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "34d659e8",
   "metadata": {},
   "outputs": [],
   "source": [
    "ClassLabels={'ECGImagesofPatientthathaveHistoryofMI':0,'ECGImagesofPatientthathaveabnormalheartbeat':1,\n",
    "            'ECGImagesofCOVID-19Patients':2,'NormalPersonECGImages':3,'ECGImagesofMyocardialInfarctionPatients':4}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4bfdbe9c",
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "For every \"x\" value of the signal, average the \"y\" values over duplicates.\n",
    "\n",
    "Inputs:\n",
    "-------\n",
    "df  data frame of two columns containing the signal \"x\" and \"y\" coordinates corresponding to \"active\" pixels\n",
    "\n",
    "Outputs:\n",
    "--------\n",
    "signal numpy array of unique values (\"y\") of the signal\n",
    "\"\"\"\n",
    "def uniqValsSignal(df):\n",
    "    xdf=df[0].to_numpy()\n",
    "    ydf=df[1].to_numpy()\n",
    "    unikVals = pd.unique(xdf)\n",
    "    signal = np.zeros(len(unikVals))\n",
    "    for i in range(len(unikVals)):\n",
    "        mask = (xdf==unikVals[i])\n",
    "        signal[i] = np.mean(ydf[mask])\n",
    "    return signal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3a10f67e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Processing ECGImagesofPatientthathaveHistoryofMI folder ...\n",
      "2064 files processed in this folder in 19 sec...\n",
      "\n",
      "Processing ECGImagesofPatientthathaveabnormalheartbeat folder ...\n",
      "2796 files processed in this folder in 29 sec...\n",
      "\n",
      "Processing ECGImagesofCOVID-19Patients folder ...\n",
      "3000 files processed in this folder in 14 sec...\n",
      "\n",
      "Processing NormalPersonECGImages folder ...\n",
      "3408 files processed in this folder in 33 sec...\n",
      "\n",
      "Processing ECGImagesofMyocardialInfarctionPatients folder ...\n",
      "2868 files processed in this folder in 28 sec...\n",
      "\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "Note:\n",
    "-----\n",
    "\n",
    "1) For the \"time series\", only the second column of every lead is extracted as signal.\n",
    "2) Because of non-uniformity in signal lenght across both observations and Leads, the code\n",
    "uses the minimum signal length across observation and leads, in order to make the date \"proper\n",
    "for multivariate time series classification.\n",
    "\"\"\"\n",
    "\n",
    "labelArr = np.array([])\n",
    "for dirs in os.listdir(pathroot):\n",
    "#     if dirs == 'ECGImagesofCOVID-19Patients':\n",
    "#         continue\n",
    "    t = time.time()\n",
    "    count = 0\n",
    "    print('Processing {0} folder ...'.format(dirs))\n",
    "    if not os.path.isfile(dirs):\n",
    "        for item in os.listdir(os.path.join(pathroot,dirs)):\n",
    "            #print('Processing {0} file ...'.format(item))\n",
    "            of, oe = os.path.splitext(item)\n",
    "            if of[0]=='.':\n",
    "                continue\n",
    "            else:\n",
    "                signal = pd.read_csv(os.path.join(pathroot,os.path.join(dirs,item)),header=None,sep=' ')#[1].to_numpy()\n",
    "                signal = uniqValsSignal(signal)\n",
    "            try:\n",
    "                leadNum = int(of[-2:])\n",
    "            except ValueError:\n",
    "                leadNum = int(of[-1:])\n",
    "            finally:\n",
    "                leadKey = 'Lead'+str(leadNum)\n",
    "            if leadNum == 13:\n",
    "                continue\n",
    "            if LeadDict[leadKey].shape[1] > 0:\n",
    "                if len(signal)> leadMinLen[leadKey]:\n",
    "                    signal = np.reshape(signal[:leadMinLen[leadKey]],(1,leadMinLen[leadKey]))\n",
    "                    LeadDict[leadKey] = np.concatenate( (LeadDict[leadKey],signal) )\n",
    "                else:\n",
    "                    LeadDict[leadKey] = LeadDict[leadKey][:,:len(signal)]\n",
    "                    LeadDict[leadKey] = np.concatenate( (LeadDict[leadKey],np.reshape(signal,(1,len(signal)))) )\n",
    "                    leadMinLen[leadKey] = len(signal) \n",
    "            else:\n",
    "                LeadDict[leadKey] = np.reshape(signal,(1,len(signal)))\n",
    "                leadMinLen[leadKey] = len(signal)         \n",
    "            count = count+1\n",
    "        labelArr = np.append(labelArr,np.repeat(ClassLabels[dirs],len(LeadDict[leadKey])-len(labelArr))) ##Add labels\n",
    "        t = time.time()-t\n",
    "        print('{0} files processed in this folder in {1} sec...\\n'.format(count,round(t)))    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e2823e5f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "Post Processing:\n",
    "---------------\n",
    "\n",
    "1) Put all the leads on the same \"time\" scale/Length\n",
    "2) Pull all the leads(2D) into a 3D array of shape (n_obs,n_col,n_timepoints)\n",
    "3) Convert result from step 2 into a nested data frame.\n",
    "\"\"\"\n",
    "\n",
    "minLen = min(leadMinLen.values())\n",
    "for key in LeadDict.keys():\n",
    "    LeadDict[key] = LeadDict[key][:,:minLen]\n",
    "\n",
    "dim1 = LeadDict['Lead1'].shape[0]\n",
    "dim2 = len(LeadDict.keys())\n",
    "dim3 = LeadDict['Lead1'].shape[1]\n",
    "X3d = np.zeros((dim1,dim2,dim3))\n",
    "for j in range(dim2):\n",
    "    X3d[:,j,:] = list(LeadDict.values())[j]\n",
    "    \n",
    "X3d_nested=from_3d_numpy_to_nested(X3d)\n",
    "X3d_nested.columns = list(LeadDict.keys())\n",
    "X3d_nested['Label'] = labelArr\n",
    "X3d_nested.to_csv('muti-lead-dataFrame.csv',index=False,float_format='%d')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "fdfd5abc",
   "metadata": {
    "scrolled": true
   },
   "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>Lead1</th>\n",
       "      <th>Lead2</th>\n",
       "      <th>Lead3</th>\n",
       "      <th>Lead4</th>\n",
       "      <th>Lead5</th>\n",
       "      <th>Lead6</th>\n",
       "      <th>Lead7</th>\n",
       "      <th>Lead8</th>\n",
       "      <th>Lead9</th>\n",
       "      <th>Lead10</th>\n",
       "      <th>Lead11</th>\n",
       "      <th>Lead12</th>\n",
       "      <th>Label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0      126.0\n",
       "1      119.5\n",
       "2      134.0\n",
       "3      ...</td>\n",
       "      <td>0      105.0\n",
       "1      104.5\n",
       "2      104.5\n",
       "3      ...</td>\n",
       "      <td>0      104.714286\n",
       "1      117.250000\n",
       "2      101...</td>\n",
       "      <td>0       35.957447\n",
       "1       35.500000\n",
       "2       46...</td>\n",
       "      <td>0      158.000000\n",
       "1      157.333333\n",
       "2      149...</td>\n",
       "      <td>0      119.5\n",
       "1      116.5\n",
       "2      125.5\n",
       "3      ...</td>\n",
       "      <td>0      137.5\n",
       "1      137.0\n",
       "2      136.5\n",
       "3      ...</td>\n",
       "      <td>0      156.0\n",
       "1      154.0\n",
       "2      153.5\n",
       "3      ...</td>\n",
       "      <td>0      162.000000\n",
       "1      162.000000\n",
       "2      151...</td>\n",
       "      <td>0      155.0\n",
       "1      154.5\n",
       "2      155.5\n",
       "3      ...</td>\n",
       "      <td>0      193.545455\n",
       "1        3.500000\n",
       "2        3...</td>\n",
       "      <td>0       89.000000\n",
       "1      109.500000\n",
       "2       91...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0      139.0\n",
       "1      129.0\n",
       "2      127.0\n",
       "3      ...</td>\n",
       "      <td>0      103.0\n",
       "1      103.0\n",
       "2      102.0\n",
       "3      ...</td>\n",
       "      <td>0      80.5\n",
       "1      80.0\n",
       "2      79.0\n",
       "3      79....</td>\n",
       "      <td>0       67.5\n",
       "1       72.0\n",
       "2       77.0\n",
       "3      ...</td>\n",
       "      <td>0      127.5\n",
       "1      126.0\n",
       "2      131.5\n",
       "3      ...</td>\n",
       "      <td>0      130.0\n",
       "1      139.0\n",
       "2      130.5\n",
       "3      ...</td>\n",
       "      <td>0      129.5\n",
       "1      129.5\n",
       "2      129.5\n",
       "3      ...</td>\n",
       "      <td>0      155.5\n",
       "1      155.5\n",
       "2      155.5\n",
       "3      ...</td>\n",
       "      <td>0      139.0\n",
       "1      131.5\n",
       "2      128.5\n",
       "3      ...</td>\n",
       "      <td>0      153.5\n",
       "1      149.0\n",
       "2      151.0\n",
       "3      ...</td>\n",
       "      <td>0       80.166667\n",
       "1       77.071429\n",
       "2       82...</td>\n",
       "      <td>0      109.000000\n",
       "1      100.000000\n",
       "2      111...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0      158.333333\n",
       "1      158.333333\n",
       "2      149...</td>\n",
       "      <td>0      103.5\n",
       "1      106.5\n",
       "2      110.5\n",
       "3      ...</td>\n",
       "      <td>0      103.5\n",
       "1      103.5\n",
       "2      103.5\n",
       "3      ...</td>\n",
       "      <td>0       97.5\n",
       "1       97.5\n",
       "2       97.0\n",
       "3      ...</td>\n",
       "      <td>0      118.363636\n",
       "1       97.000000\n",
       "2       94...</td>\n",
       "      <td>0      116.666667\n",
       "1      155.500000\n",
       "2      156...</td>\n",
       "      <td>0      131.200000\n",
       "1      136.166667\n",
       "2      104...</td>\n",
       "      <td>0      108.5\n",
       "1      100.0\n",
       "2      112.5\n",
       "3      ...</td>\n",
       "      <td>0      169.500000\n",
       "1      153.000000\n",
       "2      145...</td>\n",
       "      <td>0      156.0\n",
       "1      156.0\n",
       "2      157.5\n",
       "3      ...</td>\n",
       "      <td>0      145.5\n",
       "1      145.5\n",
       "2      145.5\n",
       "3      ...</td>\n",
       "      <td>0      107.170732\n",
       "1      104.000000\n",
       "2      121...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0      116.5\n",
       "1      117.5\n",
       "2      126.0\n",
       "3      ...</td>\n",
       "      <td>0      100.5\n",
       "1      100.5\n",
       "2      101.5\n",
       "3      ...</td>\n",
       "      <td>0      104.5\n",
       "1      104.5\n",
       "2      104.0\n",
       "3      ...</td>\n",
       "      <td>0       63.0\n",
       "1       60.0\n",
       "2       67.5\n",
       "3      ...</td>\n",
       "      <td>0      130.0\n",
       "1      123.5\n",
       "2      129.5\n",
       "3      ...</td>\n",
       "      <td>0      131.5\n",
       "1      130.0\n",
       "2      131.5\n",
       "3      ...</td>\n",
       "      <td>0      140.5\n",
       "1      150.0\n",
       "2      144.5\n",
       "3      ...</td>\n",
       "      <td>0      155.0\n",
       "1      155.0\n",
       "2      155.0\n",
       "3      ...</td>\n",
       "      <td>0      169.500000\n",
       "1      153.000000\n",
       "2      145...</td>\n",
       "      <td>0      119.5\n",
       "1      122.0\n",
       "2      129.5\n",
       "3      ...</td>\n",
       "      <td>0      154.055944\n",
       "1      136.396396\n",
       "2       44...</td>\n",
       "      <td>0      121.714286\n",
       "1      144.000000\n",
       "2      133...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0      157.000000\n",
       "1      157.000000\n",
       "2      148...</td>\n",
       "      <td>0      106.5\n",
       "1      106.5\n",
       "2      106.0\n",
       "3      ...</td>\n",
       "      <td>0      107.0\n",
       "1      106.0\n",
       "2      106.0\n",
       "3      ...</td>\n",
       "      <td>0       58.5\n",
       "1       70.0\n",
       "2       86.0\n",
       "3      ...</td>\n",
       "      <td>0      141.0\n",
       "1      136.5\n",
       "2      138.0\n",
       "3      ...</td>\n",
       "      <td>0      155.5\n",
       "1      158.5\n",
       "2      156.5\n",
       "3      ...</td>\n",
       "      <td>0      131.0\n",
       "1      130.5\n",
       "2      130.0\n",
       "3      ...</td>\n",
       "      <td>0      133.5\n",
       "1      133.0\n",
       "2      146.5\n",
       "3      ...</td>\n",
       "      <td>0      139.333333\n",
       "1      159.357143\n",
       "2      156...</td>\n",
       "      <td>0      137.0\n",
       "1      138.5\n",
       "2      145.5\n",
       "3      ...</td>\n",
       "      <td>0      137.5\n",
       "1      138.0\n",
       "2      146.5\n",
       "3      ...</td>\n",
       "      <td>0      140.0\n",
       "1      135.0\n",
       "2      142.0\n",
       "3      ...</td>\n",
       "      <td>0.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",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1173</th>\n",
       "      <td>0      130.5\n",
       "1      127.5\n",
       "2      127.0\n",
       "3      ...</td>\n",
       "      <td>0      100.5\n",
       "1      100.0\n",
       "2       99.5\n",
       "3      ...</td>\n",
       "      <td>0      107.0\n",
       "1      107.0\n",
       "2      109.0\n",
       "3      ...</td>\n",
       "      <td>0       57.0\n",
       "1       67.5\n",
       "2       82.5\n",
       "3      ...</td>\n",
       "      <td>0      110.5\n",
       "1      107.5\n",
       "2      123.5\n",
       "3      ...</td>\n",
       "      <td>0      142.5\n",
       "1      145.0\n",
       "2      156.5\n",
       "3      ...</td>\n",
       "      <td>0       97.0\n",
       "1      124.5\n",
       "2      105.5\n",
       "3      ...</td>\n",
       "      <td>0      127.5\n",
       "1      126.0\n",
       "2      127.5\n",
       "3      ...</td>\n",
       "      <td>0      142.5\n",
       "1      137.5\n",
       "2      137.5\n",
       "3      ...</td>\n",
       "      <td>0      133.0\n",
       "1      132.5\n",
       "2      132.5\n",
       "3      ...</td>\n",
       "      <td>0        4.0\n",
       "1       12.5\n",
       "2       19.0\n",
       "3      ...</td>\n",
       "      <td>0      138.5\n",
       "1      143.0\n",
       "2      143.5\n",
       "3      ...</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1174</th>\n",
       "      <td>0       92.5\n",
       "1       78.5\n",
       "2       92.0\n",
       "3      ...</td>\n",
       "      <td>0      102.5\n",
       "1      103.0\n",
       "2      103.0\n",
       "3      ...</td>\n",
       "      <td>0       87.5\n",
       "1       87.5\n",
       "2       87.5\n",
       "3      ...</td>\n",
       "      <td>0       74.0\n",
       "1       72.5\n",
       "2       74.5\n",
       "3      ...</td>\n",
       "      <td>0       71.5\n",
       "1       74.5\n",
       "2       83.0\n",
       "3      ...</td>\n",
       "      <td>0      113.0\n",
       "1      111.0\n",
       "2      119.0\n",
       "3      ...</td>\n",
       "      <td>0      141.600000\n",
       "1      133.250000\n",
       "2      122...</td>\n",
       "      <td>0      121.0\n",
       "1      120.5\n",
       "2      120.0\n",
       "3      ...</td>\n",
       "      <td>0       87.0\n",
       "1       86.5\n",
       "2       86.0\n",
       "3      ...</td>\n",
       "      <td>0      140.0\n",
       "1      148.5\n",
       "2      142.0\n",
       "3      ...</td>\n",
       "      <td>0      137.909091\n",
       "1      140.000000\n",
       "2      137...</td>\n",
       "      <td>0      117.5\n",
       "1      125.0\n",
       "2      127.0\n",
       "3      ...</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1175</th>\n",
       "      <td>0      130.0\n",
       "1      131.5\n",
       "2      138.0\n",
       "3      ...</td>\n",
       "      <td>0      103.0\n",
       "1      103.5\n",
       "2      103.5\n",
       "3      ...</td>\n",
       "      <td>0       97.0\n",
       "1       96.5\n",
       "2       96.0\n",
       "3      ...</td>\n",
       "      <td>0       54.5\n",
       "1       40.0\n",
       "2       70.0\n",
       "3      ...</td>\n",
       "      <td>0      142.000\n",
       "1      147.000\n",
       "2      142.000\n",
       "3...</td>\n",
       "      <td>0      135.0\n",
       "1      145.0\n",
       "2      138.5\n",
       "3      ...</td>\n",
       "      <td>0       97.0\n",
       "1      124.5\n",
       "2      105.5\n",
       "3      ...</td>\n",
       "      <td>0      137.5\n",
       "1      144.5\n",
       "2      153.5\n",
       "3      ...</td>\n",
       "      <td>0       87.0\n",
       "1       86.5\n",
       "2       86.0\n",
       "3      ...</td>\n",
       "      <td>0      156.5\n",
       "1      156.5\n",
       "2      155.5\n",
       "3      ...</td>\n",
       "      <td>0      135.0\n",
       "1      135.0\n",
       "2      135.5\n",
       "3      ...</td>\n",
       "      <td>0      128.0\n",
       "1      124.5\n",
       "2      136.5\n",
       "3      ...</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1176</th>\n",
       "      <td>0      127.0\n",
       "1      133.5\n",
       "2      137.5\n",
       "3      ...</td>\n",
       "      <td>0      100.5\n",
       "1      100.0\n",
       "2      102.5\n",
       "3      ...</td>\n",
       "      <td>0       91.5\n",
       "1       94.5\n",
       "2       96.0\n",
       "3      ...</td>\n",
       "      <td>0       74.0\n",
       "1       72.5\n",
       "2       74.5\n",
       "3      ...</td>\n",
       "      <td>0      113.875000\n",
       "1      144.000000\n",
       "2      152...</td>\n",
       "      <td>0      132.5\n",
       "1      134.0\n",
       "2      143.5\n",
       "3      ...</td>\n",
       "      <td>0      119.0\n",
       "1      118.5\n",
       "2      118.0\n",
       "3      ...</td>\n",
       "      <td>0      125.5\n",
       "1      121.5\n",
       "2      129.0\n",
       "3      ...</td>\n",
       "      <td>0      137.0\n",
       "1      136.5\n",
       "2      138.5\n",
       "3      ...</td>\n",
       "      <td>0       55.5\n",
       "1       52.0\n",
       "2       77.5\n",
       "3      ...</td>\n",
       "      <td>0      116.5\n",
       "1      116.5\n",
       "2      117.0\n",
       "3      ...</td>\n",
       "      <td>0      114.0\n",
       "1      110.5\n",
       "2      123.5\n",
       "3      ...</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1177</th>\n",
       "      <td>0      158.857143\n",
       "1      158.857143\n",
       "2      150...</td>\n",
       "      <td>0      103.0\n",
       "1      103.5\n",
       "2      107.0\n",
       "3      ...</td>\n",
       "      <td>0      103.5\n",
       "1      105.0\n",
       "2      114.0\n",
       "3      ...</td>\n",
       "      <td>0       74.5\n",
       "1       74.5\n",
       "2       75.0\n",
       "3      ...</td>\n",
       "      <td>0      142.0\n",
       "1      136.5\n",
       "2      133.0\n",
       "3      ...</td>\n",
       "      <td>0      150.0\n",
       "1      144.5\n",
       "2      154.5\n",
       "3      ...</td>\n",
       "      <td>0      103.0\n",
       "1       95.5\n",
       "2      103.5\n",
       "3      ...</td>\n",
       "      <td>0      111.5\n",
       "1      100.0\n",
       "2      104.5\n",
       "3      ...</td>\n",
       "      <td>0      165.428571\n",
       "1      165.875000\n",
       "2      154...</td>\n",
       "      <td>0      146.5\n",
       "1      145.0\n",
       "2      144.0\n",
       "3      ...</td>\n",
       "      <td>0       96.5\n",
       "1       96.5\n",
       "2       96.5\n",
       "3      ...</td>\n",
       "      <td>0      137.0\n",
       "1      134.0\n",
       "2      129.5\n",
       "3      ...</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1178 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                  Lead1  \\\n",
       "0     0      126.0\n",
       "1      119.5\n",
       "2      134.0\n",
       "3      ...   \n",
       "1     0      139.0\n",
       "1      129.0\n",
       "2      127.0\n",
       "3      ...   \n",
       "2     0      158.333333\n",
       "1      158.333333\n",
       "2      149...   \n",
       "3     0      116.5\n",
       "1      117.5\n",
       "2      126.0\n",
       "3      ...   \n",
       "4     0      157.000000\n",
       "1      157.000000\n",
       "2      148...   \n",
       "...                                                 ...   \n",
       "1173  0      130.5\n",
       "1      127.5\n",
       "2      127.0\n",
       "3      ...   \n",
       "1174  0       92.5\n",
       "1       78.5\n",
       "2       92.0\n",
       "3      ...   \n",
       "1175  0      130.0\n",
       "1      131.5\n",
       "2      138.0\n",
       "3      ...   \n",
       "1176  0      127.0\n",
       "1      133.5\n",
       "2      137.5\n",
       "3      ...   \n",
       "1177  0      158.857143\n",
       "1      158.857143\n",
       "2      150...   \n",
       "\n",
       "                                                  Lead2  \\\n",
       "0     0      105.0\n",
       "1      104.5\n",
       "2      104.5\n",
       "3      ...   \n",
       "1     0      103.0\n",
       "1      103.0\n",
       "2      102.0\n",
       "3      ...   \n",
       "2     0      103.5\n",
       "1      106.5\n",
       "2      110.5\n",
       "3      ...   \n",
       "3     0      100.5\n",
       "1      100.5\n",
       "2      101.5\n",
       "3      ...   \n",
       "4     0      106.5\n",
       "1      106.5\n",
       "2      106.0\n",
       "3      ...   \n",
       "...                                                 ...   \n",
       "1173  0      100.5\n",
       "1      100.0\n",
       "2       99.5\n",
       "3      ...   \n",
       "1174  0      102.5\n",
       "1      103.0\n",
       "2      103.0\n",
       "3      ...   \n",
       "1175  0      103.0\n",
       "1      103.5\n",
       "2      103.5\n",
       "3      ...   \n",
       "1176  0      100.5\n",
       "1      100.0\n",
       "2      102.5\n",
       "3      ...   \n",
       "1177  0      103.0\n",
       "1      103.5\n",
       "2      107.0\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead3  \\\n",
       "0     0      104.714286\n",
       "1      117.250000\n",
       "2      101...   \n",
       "1     0      80.5\n",
       "1      80.0\n",
       "2      79.0\n",
       "3      79....   \n",
       "2     0      103.5\n",
       "1      103.5\n",
       "2      103.5\n",
       "3      ...   \n",
       "3     0      104.5\n",
       "1      104.5\n",
       "2      104.0\n",
       "3      ...   \n",
       "4     0      107.0\n",
       "1      106.0\n",
       "2      106.0\n",
       "3      ...   \n",
       "...                                                 ...   \n",
       "1173  0      107.0\n",
       "1      107.0\n",
       "2      109.0\n",
       "3      ...   \n",
       "1174  0       87.5\n",
       "1       87.5\n",
       "2       87.5\n",
       "3      ...   \n",
       "1175  0       97.0\n",
       "1       96.5\n",
       "2       96.0\n",
       "3      ...   \n",
       "1176  0       91.5\n",
       "1       94.5\n",
       "2       96.0\n",
       "3      ...   \n",
       "1177  0      103.5\n",
       "1      105.0\n",
       "2      114.0\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead4  \\\n",
       "0     0       35.957447\n",
       "1       35.500000\n",
       "2       46...   \n",
       "1     0       67.5\n",
       "1       72.0\n",
       "2       77.0\n",
       "3      ...   \n",
       "2     0       97.5\n",
       "1       97.5\n",
       "2       97.0\n",
       "3      ...   \n",
       "3     0       63.0\n",
       "1       60.0\n",
       "2       67.5\n",
       "3      ...   \n",
       "4     0       58.5\n",
       "1       70.0\n",
       "2       86.0\n",
       "3      ...   \n",
       "...                                                 ...   \n",
       "1173  0       57.0\n",
       "1       67.5\n",
       "2       82.5\n",
       "3      ...   \n",
       "1174  0       74.0\n",
       "1       72.5\n",
       "2       74.5\n",
       "3      ...   \n",
       "1175  0       54.5\n",
       "1       40.0\n",
       "2       70.0\n",
       "3      ...   \n",
       "1176  0       74.0\n",
       "1       72.5\n",
       "2       74.5\n",
       "3      ...   \n",
       "1177  0       74.5\n",
       "1       74.5\n",
       "2       75.0\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead5  \\\n",
       "0     0      158.000000\n",
       "1      157.333333\n",
       "2      149...   \n",
       "1     0      127.5\n",
       "1      126.0\n",
       "2      131.5\n",
       "3      ...   \n",
       "2     0      118.363636\n",
       "1       97.000000\n",
       "2       94...   \n",
       "3     0      130.0\n",
       "1      123.5\n",
       "2      129.5\n",
       "3      ...   \n",
       "4     0      141.0\n",
       "1      136.5\n",
       "2      138.0\n",
       "3      ...   \n",
       "...                                                 ...   \n",
       "1173  0      110.5\n",
       "1      107.5\n",
       "2      123.5\n",
       "3      ...   \n",
       "1174  0       71.5\n",
       "1       74.5\n",
       "2       83.0\n",
       "3      ...   \n",
       "1175  0      142.000\n",
       "1      147.000\n",
       "2      142.000\n",
       "3...   \n",
       "1176  0      113.875000\n",
       "1      144.000000\n",
       "2      152...   \n",
       "1177  0      142.0\n",
       "1      136.5\n",
       "2      133.0\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead6  \\\n",
       "0     0      119.5\n",
       "1      116.5\n",
       "2      125.5\n",
       "3      ...   \n",
       "1     0      130.0\n",
       "1      139.0\n",
       "2      130.5\n",
       "3      ...   \n",
       "2     0      116.666667\n",
       "1      155.500000\n",
       "2      156...   \n",
       "3     0      131.5\n",
       "1      130.0\n",
       "2      131.5\n",
       "3      ...   \n",
       "4     0      155.5\n",
       "1      158.5\n",
       "2      156.5\n",
       "3      ...   \n",
       "...                                                 ...   \n",
       "1173  0      142.5\n",
       "1      145.0\n",
       "2      156.5\n",
       "3      ...   \n",
       "1174  0      113.0\n",
       "1      111.0\n",
       "2      119.0\n",
       "3      ...   \n",
       "1175  0      135.0\n",
       "1      145.0\n",
       "2      138.5\n",
       "3      ...   \n",
       "1176  0      132.5\n",
       "1      134.0\n",
       "2      143.5\n",
       "3      ...   \n",
       "1177  0      150.0\n",
       "1      144.5\n",
       "2      154.5\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead7  \\\n",
       "0     0      137.5\n",
       "1      137.0\n",
       "2      136.5\n",
       "3      ...   \n",
       "1     0      129.5\n",
       "1      129.5\n",
       "2      129.5\n",
       "3      ...   \n",
       "2     0      131.200000\n",
       "1      136.166667\n",
       "2      104...   \n",
       "3     0      140.5\n",
       "1      150.0\n",
       "2      144.5\n",
       "3      ...   \n",
       "4     0      131.0\n",
       "1      130.5\n",
       "2      130.0\n",
       "3      ...   \n",
       "...                                                 ...   \n",
       "1173  0       97.0\n",
       "1      124.5\n",
       "2      105.5\n",
       "3      ...   \n",
       "1174  0      141.600000\n",
       "1      133.250000\n",
       "2      122...   \n",
       "1175  0       97.0\n",
       "1      124.5\n",
       "2      105.5\n",
       "3      ...   \n",
       "1176  0      119.0\n",
       "1      118.5\n",
       "2      118.0\n",
       "3      ...   \n",
       "1177  0      103.0\n",
       "1       95.5\n",
       "2      103.5\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead8  \\\n",
       "0     0      156.0\n",
       "1      154.0\n",
       "2      153.5\n",
       "3      ...   \n",
       "1     0      155.5\n",
       "1      155.5\n",
       "2      155.5\n",
       "3      ...   \n",
       "2     0      108.5\n",
       "1      100.0\n",
       "2      112.5\n",
       "3      ...   \n",
       "3     0      155.0\n",
       "1      155.0\n",
       "2      155.0\n",
       "3      ...   \n",
       "4     0      133.5\n",
       "1      133.0\n",
       "2      146.5\n",
       "3      ...   \n",
       "...                                                 ...   \n",
       "1173  0      127.5\n",
       "1      126.0\n",
       "2      127.5\n",
       "3      ...   \n",
       "1174  0      121.0\n",
       "1      120.5\n",
       "2      120.0\n",
       "3      ...   \n",
       "1175  0      137.5\n",
       "1      144.5\n",
       "2      153.5\n",
       "3      ...   \n",
       "1176  0      125.5\n",
       "1      121.5\n",
       "2      129.0\n",
       "3      ...   \n",
       "1177  0      111.5\n",
       "1      100.0\n",
       "2      104.5\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead9  \\\n",
       "0     0      162.000000\n",
       "1      162.000000\n",
       "2      151...   \n",
       "1     0      139.0\n",
       "1      131.5\n",
       "2      128.5\n",
       "3      ...   \n",
       "2     0      169.500000\n",
       "1      153.000000\n",
       "2      145...   \n",
       "3     0      169.500000\n",
       "1      153.000000\n",
       "2      145...   \n",
       "4     0      139.333333\n",
       "1      159.357143\n",
       "2      156...   \n",
       "...                                                 ...   \n",
       "1173  0      142.5\n",
       "1      137.5\n",
       "2      137.5\n",
       "3      ...   \n",
       "1174  0       87.0\n",
       "1       86.5\n",
       "2       86.0\n",
       "3      ...   \n",
       "1175  0       87.0\n",
       "1       86.5\n",
       "2       86.0\n",
       "3      ...   \n",
       "1176  0      137.0\n",
       "1      136.5\n",
       "2      138.5\n",
       "3      ...   \n",
       "1177  0      165.428571\n",
       "1      165.875000\n",
       "2      154...   \n",
       "\n",
       "                                                 Lead10  \\\n",
       "0     0      155.0\n",
       "1      154.5\n",
       "2      155.5\n",
       "3      ...   \n",
       "1     0      153.5\n",
       "1      149.0\n",
       "2      151.0\n",
       "3      ...   \n",
       "2     0      156.0\n",
       "1      156.0\n",
       "2      157.5\n",
       "3      ...   \n",
       "3     0      119.5\n",
       "1      122.0\n",
       "2      129.5\n",
       "3      ...   \n",
       "4     0      137.0\n",
       "1      138.5\n",
       "2      145.5\n",
       "3      ...   \n",
       "...                                                 ...   \n",
       "1173  0      133.0\n",
       "1      132.5\n",
       "2      132.5\n",
       "3      ...   \n",
       "1174  0      140.0\n",
       "1      148.5\n",
       "2      142.0\n",
       "3      ...   \n",
       "1175  0      156.5\n",
       "1      156.5\n",
       "2      155.5\n",
       "3      ...   \n",
       "1176  0       55.5\n",
       "1       52.0\n",
       "2       77.5\n",
       "3      ...   \n",
       "1177  0      146.5\n",
       "1      145.0\n",
       "2      144.0\n",
       "3      ...   \n",
       "\n",
       "                                                 Lead11  \\\n",
       "0     0      193.545455\n",
       "1        3.500000\n",
       "2        3...   \n",
       "1     0       80.166667\n",
       "1       77.071429\n",
       "2       82...   \n",
       "2     0      145.5\n",
       "1      145.5\n",
       "2      145.5\n",
       "3      ...   \n",
       "3     0      154.055944\n",
       "1      136.396396\n",
       "2       44...   \n",
       "4     0      137.5\n",
       "1      138.0\n",
       "2      146.5\n",
       "3      ...   \n",
       "...                                                 ...   \n",
       "1173  0        4.0\n",
       "1       12.5\n",
       "2       19.0\n",
       "3      ...   \n",
       "1174  0      137.909091\n",
       "1      140.000000\n",
       "2      137...   \n",
       "1175  0      135.0\n",
       "1      135.0\n",
       "2      135.5\n",
       "3      ...   \n",
       "1176  0      116.5\n",
       "1      116.5\n",
       "2      117.0\n",
       "3      ...   \n",
       "1177  0       96.5\n",
       "1       96.5\n",
       "2       96.5\n",
       "3      ...   \n",
       "\n",
       "                                                 Lead12  Label  \n",
       "0     0       89.000000\n",
       "1      109.500000\n",
       "2       91...    0.0  \n",
       "1     0      109.000000\n",
       "1      100.000000\n",
       "2      111...    0.0  \n",
       "2     0      107.170732\n",
       "1      104.000000\n",
       "2      121...    0.0  \n",
       "3     0      121.714286\n",
       "1      144.000000\n",
       "2      133...    0.0  \n",
       "4     0      140.0\n",
       "1      135.0\n",
       "2      142.0\n",
       "3      ...    0.0  \n",
       "...                                                 ...    ...  \n",
       "1173  0      138.5\n",
       "1      143.0\n",
       "2      143.5\n",
       "3      ...    4.0  \n",
       "1174  0      117.5\n",
       "1      125.0\n",
       "2      127.0\n",
       "3      ...    4.0  \n",
       "1175  0      128.0\n",
       "1      124.5\n",
       "2      136.5\n",
       "3      ...    4.0  \n",
       "1176  0      114.0\n",
       "1      110.5\n",
       "2      123.5\n",
       "3      ...    4.0  \n",
       "1177  0      137.0\n",
       "1      134.0\n",
       "2      129.5\n",
       "3      ...    4.0  \n",
       "\n",
       "[1178 rows x 13 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X3d_nested"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e3b5fedb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "5de9ce41",
   "metadata": {},
   "source": [
    "### Classification Task"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1e302a86",
   "metadata": {},
   "outputs": [],
   "source": [
    "split = StratifiedShuffleSplit(n_splits=1, test_size=0.25, random_state=42)\n",
    "for train_index, test_index in split.split(X3d_nested, X3d_nested['Label']):\n",
    "    X_train = X3d_nested.loc[train_index]\n",
    "    X_test = X3d_nested.loc[test_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "0df5b1b4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data set proportions:\n",
      "3.0    0.241087\n",
      "2.0    0.212224\n",
      "4.0    0.202886\n",
      "1.0    0.197793\n",
      "0.0    0.146010\n",
      "Name: Label, dtype: float64\n",
      "\n",
      "Test set proportions:\n",
      "3.0    0.240678\n",
      "2.0    0.213559\n",
      "4.0    0.203390\n",
      "1.0    0.196610\n",
      "0.0    0.145763\n",
      "Name: Label, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "#Ascertain the spits are balanced\n",
    "dataSetProp = X3d_nested['Label'].value_counts()/len(X3d_nested)\n",
    "testSetProp = X_test['Label'].value_counts() / len(X_test)\n",
    "print('Data set proportions:')\n",
    "print(dataSetProp)\n",
    "print('\\nTest set proportions:')\n",
    "print(testSetProp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "f8feb458",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "y_train = X_train['Label']\n",
    "X_train.drop('Label',axis=1,inplace=True)\n",
    "y_test = X_test['Label']\n",
    "X_test.drop('Label',axis=1,inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "5315d99b",
   "metadata": {
    "scrolled": true
   },
   "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>Lead1</th>\n",
       "      <th>Lead2</th>\n",
       "      <th>Lead3</th>\n",
       "      <th>Lead4</th>\n",
       "      <th>Lead5</th>\n",
       "      <th>Lead6</th>\n",
       "      <th>Lead7</th>\n",
       "      <th>Lead8</th>\n",
       "      <th>Lead9</th>\n",
       "      <th>Lead10</th>\n",
       "      <th>Lead11</th>\n",
       "      <th>Lead12</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>309</th>\n",
       "      <td>0      138.0\n",
       "1      140.5\n",
       "2      143.5\n",
       "3      ...</td>\n",
       "      <td>0      100.0\n",
       "1       89.5\n",
       "2       88.5\n",
       "3      ...</td>\n",
       "      <td>0       96.5\n",
       "1       96.0\n",
       "2      101.0\n",
       "3      ...</td>\n",
       "      <td>0       40.0\n",
       "1       33.0\n",
       "2       66.5\n",
       "3      ...</td>\n",
       "      <td>0      108.50\n",
       "1       98.00\n",
       "2      113.00\n",
       "3   ...</td>\n",
       "      <td>0      156.0\n",
       "1      155.0\n",
       "2      156.5\n",
       "3      ...</td>\n",
       "      <td>0      125.535714\n",
       "1      147.666667\n",
       "2      139...</td>\n",
       "      <td>0      133.0\n",
       "1      135.5\n",
       "2      131.5\n",
       "3      ...</td>\n",
       "      <td>0      107.5\n",
       "1       97.5\n",
       "2      123.0\n",
       "3      ...</td>\n",
       "      <td>0      140.5\n",
       "1      139.5\n",
       "2      146.0\n",
       "3      ...</td>\n",
       "      <td>0      153.0\n",
       "1      150.5\n",
       "2      162.5\n",
       "3      ...</td>\n",
       "      <td>0      101.0\n",
       "1      100.5\n",
       "2      110.0\n",
       "3      ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1108</th>\n",
       "      <td>0      124.5\n",
       "1      115.0\n",
       "2      116.5\n",
       "3      ...</td>\n",
       "      <td>0      101.0\n",
       "1      101.5\n",
       "2      102.5\n",
       "3      ...</td>\n",
       "      <td>0      107.0\n",
       "1      107.0\n",
       "2      109.0\n",
       "3      ...</td>\n",
       "      <td>0       25.5\n",
       "1       22.5\n",
       "2       40.5\n",
       "3      ...</td>\n",
       "      <td>0      106.5\n",
       "1      112.5\n",
       "2      117.5\n",
       "3      ...</td>\n",
       "      <td>0      135.0\n",
       "1      145.0\n",
       "2      138.5\n",
       "3      ...</td>\n",
       "      <td>0      145.148148\n",
       "1        6.000000\n",
       "2        6...</td>\n",
       "      <td>0      123.5\n",
       "1      111.0\n",
       "2      114.0\n",
       "3      ...</td>\n",
       "      <td>0      165.428571\n",
       "1      165.875000\n",
       "2      154...</td>\n",
       "      <td>0      130.0\n",
       "1      132.0\n",
       "2      133.0\n",
       "3      ...</td>\n",
       "      <td>0       89.5\n",
       "1       92.5\n",
       "2      102.5\n",
       "3      ...</td>\n",
       "      <td>0      135.0\n",
       "1      128.5\n",
       "2      125.0\n",
       "3      ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>647</th>\n",
       "      <td>0      65.000000\n",
       "1      56.000000\n",
       "2      58.85...</td>\n",
       "      <td>0      80.0\n",
       "1      80.0\n",
       "2      80.0\n",
       "3      81....</td>\n",
       "      <td>0      45.000000\n",
       "1      44.500000\n",
       "2      46.00...</td>\n",
       "      <td>0      40.500000\n",
       "1      51.914286\n",
       "2      45.92...</td>\n",
       "      <td>0       77.000000\n",
       "1       78.555556\n",
       "2       78...</td>\n",
       "      <td>0      45.500000\n",
       "1      50.200000\n",
       "2      46.00...</td>\n",
       "      <td>0       78.000000\n",
       "1       82.000000\n",
       "2       76...</td>\n",
       "      <td>0      54.636364\n",
       "1      58.500000\n",
       "2      62.12...</td>\n",
       "      <td>0      133.500000\n",
       "1      133.500000\n",
       "2      133...</td>\n",
       "      <td>0       73.000000\n",
       "1       75.000000\n",
       "2       75...</td>\n",
       "      <td>0      68.333333\n",
       "1      57.500000\n",
       "2      59.09...</td>\n",
       "      <td>0       74.631579\n",
       "1       76.466667\n",
       "2       79...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>863</th>\n",
       "      <td>0      157.666667\n",
       "1      157.666667\n",
       "2      149...</td>\n",
       "      <td>0      105.0\n",
       "1      109.5\n",
       "2      102.5\n",
       "3      ...</td>\n",
       "      <td>0      104.0\n",
       "1      112.5\n",
       "2      104.5\n",
       "3      ...</td>\n",
       "      <td>0       52.0\n",
       "1       76.0\n",
       "2       58.0\n",
       "3      ...</td>\n",
       "      <td>0      124.5\n",
       "1      120.5\n",
       "2      128.5\n",
       "3      ...</td>\n",
       "      <td>0      118.333333\n",
       "1      125.500000\n",
       "2      128...</td>\n",
       "      <td>0      113.5\n",
       "1      120.0\n",
       "2      151.0\n",
       "3      ...</td>\n",
       "      <td>0       92.5\n",
       "1       94.0\n",
       "2      109.5\n",
       "3      ...</td>\n",
       "      <td>0      120.0\n",
       "1      120.0\n",
       "2      126.5\n",
       "3      ...</td>\n",
       "      <td>0      150.0\n",
       "1      153.5\n",
       "2      145.5\n",
       "3      ...</td>\n",
       "      <td>0      144.0\n",
       "1      137.5\n",
       "2      145.5\n",
       "3      ...</td>\n",
       "      <td>0      127.888889\n",
       "1      126.962963\n",
       "2      133...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>207</th>\n",
       "      <td>0      122.0\n",
       "1      130.0\n",
       "2      130.0\n",
       "3      ...</td>\n",
       "      <td>0       97.5\n",
       "1       92.0\n",
       "2       93.0\n",
       "3      ...</td>\n",
       "      <td>0       85.000000\n",
       "1       80.500000\n",
       "2       86...</td>\n",
       "      <td>0       34.0\n",
       "1       33.0\n",
       "2       63.0\n",
       "3      ...</td>\n",
       "      <td>0       83.50\n",
       "1       85.00\n",
       "2       94.04\n",
       "3   ...</td>\n",
       "      <td>0      117.5\n",
       "1      113.5\n",
       "2      122.5\n",
       "3      ...</td>\n",
       "      <td>0      157.818182\n",
       "1      144.714286\n",
       "2      122...</td>\n",
       "      <td>0      104.5\n",
       "1       93.0\n",
       "2      113.5\n",
       "3      ...</td>\n",
       "      <td>0      116.5\n",
       "1      106.5\n",
       "2      128.5\n",
       "3      ...</td>\n",
       "      <td>0      147.0\n",
       "1      145.0\n",
       "2      149.0\n",
       "3      ...</td>\n",
       "      <td>0      153.781022\n",
       "1      141.024793\n",
       "2       22...</td>\n",
       "      <td>0      106.0\n",
       "1      101.5\n",
       "2      113.5\n",
       "3      ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                  Lead1  \\\n",
       "309   0      138.0\n",
       "1      140.5\n",
       "2      143.5\n",
       "3      ...   \n",
       "1108  0      124.5\n",
       "1      115.0\n",
       "2      116.5\n",
       "3      ...   \n",
       "647   0      65.000000\n",
       "1      56.000000\n",
       "2      58.85...   \n",
       "863   0      157.666667\n",
       "1      157.666667\n",
       "2      149...   \n",
       "207   0      122.0\n",
       "1      130.0\n",
       "2      130.0\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead2  \\\n",
       "309   0      100.0\n",
       "1       89.5\n",
       "2       88.5\n",
       "3      ...   \n",
       "1108  0      101.0\n",
       "1      101.5\n",
       "2      102.5\n",
       "3      ...   \n",
       "647   0      80.0\n",
       "1      80.0\n",
       "2      80.0\n",
       "3      81....   \n",
       "863   0      105.0\n",
       "1      109.5\n",
       "2      102.5\n",
       "3      ...   \n",
       "207   0       97.5\n",
       "1       92.0\n",
       "2       93.0\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead3  \\\n",
       "309   0       96.5\n",
       "1       96.0\n",
       "2      101.0\n",
       "3      ...   \n",
       "1108  0      107.0\n",
       "1      107.0\n",
       "2      109.0\n",
       "3      ...   \n",
       "647   0      45.000000\n",
       "1      44.500000\n",
       "2      46.00...   \n",
       "863   0      104.0\n",
       "1      112.5\n",
       "2      104.5\n",
       "3      ...   \n",
       "207   0       85.000000\n",
       "1       80.500000\n",
       "2       86...   \n",
       "\n",
       "                                                  Lead4  \\\n",
       "309   0       40.0\n",
       "1       33.0\n",
       "2       66.5\n",
       "3      ...   \n",
       "1108  0       25.5\n",
       "1       22.5\n",
       "2       40.5\n",
       "3      ...   \n",
       "647   0      40.500000\n",
       "1      51.914286\n",
       "2      45.92...   \n",
       "863   0       52.0\n",
       "1       76.0\n",
       "2       58.0\n",
       "3      ...   \n",
       "207   0       34.0\n",
       "1       33.0\n",
       "2       63.0\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead5  \\\n",
       "309   0      108.50\n",
       "1       98.00\n",
       "2      113.00\n",
       "3   ...   \n",
       "1108  0      106.5\n",
       "1      112.5\n",
       "2      117.5\n",
       "3      ...   \n",
       "647   0       77.000000\n",
       "1       78.555556\n",
       "2       78...   \n",
       "863   0      124.5\n",
       "1      120.5\n",
       "2      128.5\n",
       "3      ...   \n",
       "207   0       83.50\n",
       "1       85.00\n",
       "2       94.04\n",
       "3   ...   \n",
       "\n",
       "                                                  Lead6  \\\n",
       "309   0      156.0\n",
       "1      155.0\n",
       "2      156.5\n",
       "3      ...   \n",
       "1108  0      135.0\n",
       "1      145.0\n",
       "2      138.5\n",
       "3      ...   \n",
       "647   0      45.500000\n",
       "1      50.200000\n",
       "2      46.00...   \n",
       "863   0      118.333333\n",
       "1      125.500000\n",
       "2      128...   \n",
       "207   0      117.5\n",
       "1      113.5\n",
       "2      122.5\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead7  \\\n",
       "309   0      125.535714\n",
       "1      147.666667\n",
       "2      139...   \n",
       "1108  0      145.148148\n",
       "1        6.000000\n",
       "2        6...   \n",
       "647   0       78.000000\n",
       "1       82.000000\n",
       "2       76...   \n",
       "863   0      113.5\n",
       "1      120.0\n",
       "2      151.0\n",
       "3      ...   \n",
       "207   0      157.818182\n",
       "1      144.714286\n",
       "2      122...   \n",
       "\n",
       "                                                  Lead8  \\\n",
       "309   0      133.0\n",
       "1      135.5\n",
       "2      131.5\n",
       "3      ...   \n",
       "1108  0      123.5\n",
       "1      111.0\n",
       "2      114.0\n",
       "3      ...   \n",
       "647   0      54.636364\n",
       "1      58.500000\n",
       "2      62.12...   \n",
       "863   0       92.5\n",
       "1       94.0\n",
       "2      109.5\n",
       "3      ...   \n",
       "207   0      104.5\n",
       "1       93.0\n",
       "2      113.5\n",
       "3      ...   \n",
       "\n",
       "                                                  Lead9  \\\n",
       "309   0      107.5\n",
       "1       97.5\n",
       "2      123.0\n",
       "3      ...   \n",
       "1108  0      165.428571\n",
       "1      165.875000\n",
       "2      154...   \n",
       "647   0      133.500000\n",
       "1      133.500000\n",
       "2      133...   \n",
       "863   0      120.0\n",
       "1      120.0\n",
       "2      126.5\n",
       "3      ...   \n",
       "207   0      116.5\n",
       "1      106.5\n",
       "2      128.5\n",
       "3      ...   \n",
       "\n",
       "                                                 Lead10  \\\n",
       "309   0      140.5\n",
       "1      139.5\n",
       "2      146.0\n",
       "3      ...   \n",
       "1108  0      130.0\n",
       "1      132.0\n",
       "2      133.0\n",
       "3      ...   \n",
       "647   0       73.000000\n",
       "1       75.000000\n",
       "2       75...   \n",
       "863   0      150.0\n",
       "1      153.5\n",
       "2      145.5\n",
       "3      ...   \n",
       "207   0      147.0\n",
       "1      145.0\n",
       "2      149.0\n",
       "3      ...   \n",
       "\n",
       "                                                 Lead11  \\\n",
       "309   0      153.0\n",
       "1      150.5\n",
       "2      162.5\n",
       "3      ...   \n",
       "1108  0       89.5\n",
       "1       92.5\n",
       "2      102.5\n",
       "3      ...   \n",
       "647   0      68.333333\n",
       "1      57.500000\n",
       "2      59.09...   \n",
       "863   0      144.0\n",
       "1      137.5\n",
       "2      145.5\n",
       "3      ...   \n",
       "207   0      153.781022\n",
       "1      141.024793\n",
       "2       22...   \n",
       "\n",
       "                                                 Lead12  \n",
       "309   0      101.0\n",
       "1      100.5\n",
       "2      110.0\n",
       "3      ...  \n",
       "1108  0      135.0\n",
       "1      128.5\n",
       "2      125.0\n",
       "3      ...  \n",
       "647   0       74.631579\n",
       "1       76.466667\n",
       "2       79...  \n",
       "863   0      127.888889\n",
       "1      126.962963\n",
       "2      133...  \n",
       "207   0      106.0\n",
       "1      101.5\n",
       "2      113.5\n",
       "3      ...  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0f5b6a08",
   "metadata": {},
   "source": [
    "#### Column concatenator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "d52417bb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "training time: 9 sec\n"
     ]
    }
   ],
   "source": [
    "pipItems = [\n",
    "    (\"concatenate\", ColumnConcatenator()),\n",
    "    (\"classify\", TimeSeriesForestClassifier(n_estimators=100,n_jobs=-1))]\n",
    "concClf = Pipeline(pipItems)\n",
    "t = time.time()\n",
    "concClf.fit(X_train, y_train)\n",
    "print('training time: {} sec'.format(round(time.time()-t)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "9727295e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Column-Concatenator classifier score: 0.9254237288135593\n"
     ]
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(concClf, X_train, y_train, cv=10)\n",
    "confmat = metrics.confusion_matrix(y_train,y_train_pred)\n",
    "plt.matshow(confmat)\n",
    "sn.heatmap(confmat,annot=True, annot_kws={\"size\":10}, fmt='d')\n",
    "plt.xlabel(\"Actual\")\n",
    "plt.ylabel(\"Predicted\")\n",
    "plt.show()\n",
    "print('Column-Concatenator classifier score: {}'.format(concClf.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3a3ffb6e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "1e8277bd",
   "metadata": {},
   "source": [
    "####  Column-wise ensembling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "9d13cbe1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "training time: 1417 sec\n"
     ]
    }
   ],
   "source": [
    "ensClf = ColumnEnsembleClassifier(\n",
    "    estimators=[\n",
    "        (\"TSF0\", TimeSeriesForestClassifier(n_estimators=100), [0]),\n",
    "        (\"BOSSEnsemble\", BOSSEnsemble(max_ensemble_size=5,n_jobs=-1), [6])])\n",
    "t = time.time()\n",
    "ensClf.fit(X_train, y_train)\n",
    "print('training time: {} sec'.format(round(time.time()-t)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "8fef98ba",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Column-wise ensembling classifier score: 0.9084745762711864\n"
     ]
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(ensClf, X_train, y_train, cv=3)\n",
    "confmat = metrics.confusion_matrix(y_train,y_train_pred)\n",
    "plt.matshow(confmat)\n",
    "sn.heatmap(confmat,annot=True, annot_kws={\"size\":10}, fmt='d')\n",
    "plt.xlabel(\"Actual\")\n",
    "plt.ylabel(\"Predicted\")\n",
    "plt.show()\n",
    "print('Column-wise ensembling classifier score: {}'.format(ensClf.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b8126671",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8ade7946",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}