{ "cells": [ { "cell_type": "markdown", "id": "2375b3e2", "metadata": {}, "source": [ "# Time Series Clustering using TSFresh + KMeans" ] }, { "cell_type": "markdown", "id": "500c3c91", "metadata": {}, "source": [ "In this notebook, we will train a KMeans Clustering algorithm with default settings from [sklearn.cluster](https://scikit-learn.org/stable/modules/clustering.html) module of Python package [scikit-learn](https://github.com/scikit-learn/scikit-learn)\n", "\n", "To transform Time Series data into usual tablar data we are using [TSFresh](https://tsfresh.readthedocs.io/en/latest/) python package. It automatically calculates a large number of time series characteristics, the so called features. \n", "\n", "The data used in this analysis is publicly available via UCI Archive under Online Retail II Data Set.\n", "\n", "We have cleaned and preprocessed this dataset in the optional notebook: 01. Optional - Data Cleaning and Preparation. The reader may directly use the preprocessed data included in the repository under: ./data/df_pivoted.zip for running this notebook.\n", "\n", "Tested with Python3, Pandas version 1.3.4.\n", "\n", "*References*\n", "* Dua, D. and Graff, C. (2019). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.\n", "* Direct link to UCI dataset: https://archive.ics.uci.edu/ml/machine-learning-databases/00502/online_retail_II.xlsx\n", "* scikit-learn github repo: https://github.com/scikit-learn/scikit-learn\n", "* tsfresh github repo: https://github.com/blue-yonder/tsfresh" ] }, { "cell_type": "code", "execution_count": 1, "id": "3ad73de0", "metadata": {}, "outputs": [], "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "id": "52b1645c", "metadata": {}, "outputs": [], "source": [ "# optional - suppress warnings\n", "\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "markdown", "id": "bdc7c272", "metadata": {}, "source": [ "### Load data" ] }, { "cell_type": "code", "execution_count": 3, "id": "9aa78e03", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(4605, 375) Index(['StockCode', '2009-12-01 00:00:00', '2009-12-02 00:00:00',\n", " '2009-12-03 00:00:00', '2009-12-04 00:00:00', '2009-12-05 00:00:00',\n", " '2009-12-06 00:00:00', '2009-12-07 00:00:00', '2009-12-08 00:00:00',\n", " '2009-12-09 00:00:00',\n", " ...\n", " '2010-11-30 00:00:00', '2010-12-01 00:00:00', '2010-12-02 00:00:00',\n", " '2010-12-03 00:00:00', '2010-12-04 00:00:00', '2010-12-05 00:00:00',\n", " '2010-12-06 00:00:00', '2010-12-07 00:00:00', '2010-12-08 00:00:00',\n", " '2010-12-09 00:00:00'],\n", " dtype='object', length=375)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StockCode2009-12-01 00:00:002009-12-02 00:00:002009-12-03 00:00:002009-12-04 00:00:002009-12-05 00:00:002009-12-06 00:00:002009-12-07 00:00:002009-12-08 00:00:002009-12-09 00:00:00...2010-11-30 00:00:002010-12-01 00:00:002010-12-02 00:00:002010-12-03 00:00:002010-12-04 00:00:002010-12-05 00:00:002010-12-06 00:00:002010-12-07 00:00:002010-12-08 00:00:002010-12-09 00:00:00
01000212.00.07.073.00.049.02.012.00.0...12.060.01.08.00.01.025.08.013.044.0
1100800.01.00.03.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
2101090.00.04.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
31012060.010.00.030.00.00.00.01.01.0...10.00.00.03.00.00.00.00.012.00.0
4101255.00.00.046.00.08.020.01.022.0...0.02.00.00.00.00.03.00.040.00.0
\n", "

5 rows × 375 columns

\n", "
" ], "text/plain": [ " StockCode 2009-12-01 00:00:00 2009-12-02 00:00:00 2009-12-03 00:00:00 \\\n", "0 10002 12.0 0.0 7.0 \n", "1 10080 0.0 1.0 0.0 \n", "2 10109 0.0 0.0 4.0 \n", "3 10120 60.0 10.0 0.0 \n", "4 10125 5.0 0.0 0.0 \n", "\n", " 2009-12-04 00:00:00 2009-12-05 00:00:00 2009-12-06 00:00:00 \\\n", "0 73.0 0.0 49.0 \n", "1 3.0 0.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 30.0 0.0 0.0 \n", "4 46.0 0.0 8.0 \n", "\n", " 2009-12-07 00:00:00 2009-12-08 00:00:00 2009-12-09 00:00:00 ... \\\n", "0 2.0 12.0 0.0 ... \n", "1 0.0 0.0 0.0 ... \n", "2 0.0 0.0 0.0 ... \n", "3 0.0 1.0 1.0 ... \n", "4 20.0 1.0 22.0 ... \n", "\n", " 2010-11-30 00:00:00 2010-12-01 00:00:00 2010-12-02 00:00:00 \\\n", "0 12.0 60.0 1.0 \n", "1 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 10.0 0.0 0.0 \n", "4 0.0 2.0 0.0 \n", "\n", " 2010-12-03 00:00:00 2010-12-04 00:00:00 2010-12-05 00:00:00 \\\n", "0 8.0 0.0 1.0 \n", "1 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 3.0 0.0 0.0 \n", "4 0.0 0.0 0.0 \n", "\n", " 2010-12-06 00:00:00 2010-12-07 00:00:00 2010-12-08 00:00:00 \\\n", "0 25.0 8.0 13.0 \n", "1 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 \n", "3 0.0 0.0 12.0 \n", "4 3.0 0.0 40.0 \n", "\n", " 2010-12-09 00:00:00 \n", "0 44.0 \n", "1 0.0 \n", "2 0.0 \n", "3 0.0 \n", "4 0.0 \n", "\n", "[5 rows x 375 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_pivoted = pd.read_csv('./data/df_pivoted.zip', low_memory=False)\n", "print(df_pivoted.shape, df_pivoted.columns)\n", "df_pivoted.head()" ] }, { "cell_type": "code", "execution_count": 4, "id": "d927f605", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1722270, 3) Index(['StockCode', 'timestamp', 'target_value'], dtype='object')\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StockCodetimestamptarget_value
0100022009-12-01 00:00:0012.0
1100802009-12-01 00:00:000.0
2101092009-12-01 00:00:000.0
3101202009-12-01 00:00:0060.0
4101252009-12-01 00:00:005.0
\n", "
" ], "text/plain": [ " StockCode timestamp target_value\n", "0 10002 2009-12-01 00:00:00 12.0\n", "1 10080 2009-12-01 00:00:00 0.0\n", "2 10109 2009-12-01 00:00:00 0.0\n", "3 10120 2009-12-01 00:00:00 60.0\n", "4 10125 2009-12-01 00:00:00 5.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# transpose data to match format neeed for further processing\n", "df_final = df_pivoted.melt(id_vars=['StockCode'], var_name='timestamp', value_name='target_value')\n", "print(df_final.shape, df_final.columns)\n", "\n", "df_final.head()" ] }, { "cell_type": "code", "execution_count": 5, "id": "32a32c02", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StockCodetimestamptarget_value
0100022009-12-0112.0
1100802009-12-010.0
2101092009-12-010.0
3101202009-12-0160.0
4101252009-12-015.0
\n", "
" ], "text/plain": [ " StockCode timestamp target_value\n", "0 10002 2009-12-01 12.0\n", "1 10080 2009-12-01 0.0\n", "2 10109 2009-12-01 0.0\n", "3 10120 2009-12-01 60.0\n", "4 10125 2009-12-01 5.0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# keep only the date part\n", "\n", "df_final['timestamp'] = df_final['timestamp'].str[:10] \n", "df_final.head()" ] }, { "cell_type": "markdown", "id": "91e992a0", "metadata": {}, "source": [ "### Train - Hold-out Split\n", "Hold-out set offers a way for verifying model performance on unseen data. With this dataset, we are looking to forecast a week out (Forecast Horizon = 1 Week) and therefore leave out a week worth of data out from the TTS as holdout set" ] }, { "cell_type": "code", "execution_count": 6, "id": "314ef5b2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1722270, 3), (1690035, 3), (32235, 3))" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_train = df_final[df_final['timestamp'] < '2010-12-03']\n", "df_test = df_final[df_final['timestamp'] > '2010-12-02']\n", "\n", "df_final.shape, df_train.shape, df_test.shape" ] }, { "cell_type": "code", "execution_count": 28, "id": "c488602f", "metadata": {}, "outputs": [], "source": [ "# verify that we have adequate coverage across train and test\n", "assert df_final.StockCode.nunique(),df_train.StockCode.nunique() \n", "assert df_final.StockCode.nunique(),df_test.StockCode.nunique()" ] }, { "cell_type": "markdown", "id": "eb27a871", "metadata": {}, "source": [ "## Extracting features with TSFresh" ] }, { "cell_type": "code", "execution_count": 5, "id": "43bedaa0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Looking in indexes: https://pypi.org/simple, https://pip.repos.neuron.amazonaws.com\n", "Requirement already satisfied: tsfresh in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (0.19.0)\n", "Requirement already satisfied: stumpy>=1.7.2 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (1.11.1)\n", "Requirement already satisfied: matrixprofile<2.0.0,>=1.1.10 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (1.1.10)\n", "Requirement already satisfied: pandas>=0.25.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (1.3.4)\n", "Requirement already satisfied: numpy>=1.15.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (1.20.3)\n", "Requirement already satisfied: statsmodels>=0.13 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (0.13.1)\n", "Requirement already satisfied: patsy>=0.4.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (0.5.2)\n", "Requirement already satisfied: tqdm>=4.10.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (4.62.3)\n", "Requirement already satisfied: dask[dataframe]>=2.9.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (2021.11.2)\n", "Requirement already satisfied: scikit-learn>=0.22.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (1.0.1)\n", "Requirement already satisfied: requests>=2.9.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (2.26.0)\n", "Requirement already satisfied: scipy>=1.2.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (1.5.3)\n", "Requirement already satisfied: cloudpickle in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (2.0.0)\n", "Requirement already satisfied: distributed>=2.11.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from tsfresh) (2021.11.2)\n", "Requirement already satisfied: pyyaml in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from dask[dataframe]>=2.9.0->tsfresh) (5.4.1)\n", "Requirement already satisfied: toolz>=0.8.2 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from dask[dataframe]>=2.9.0->tsfresh) (0.11.2)\n", "Requirement already satisfied: partd>=0.3.10 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from dask[dataframe]>=2.9.0->tsfresh) (1.2.0)\n", "Requirement already satisfied: fsspec>=0.6.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from dask[dataframe]>=2.9.0->tsfresh) (2021.11.1)\n", "Requirement already satisfied: packaging>=20.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from dask[dataframe]>=2.9.0->tsfresh) (21.3)\n", "Requirement already satisfied: tblib>=1.6.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from distributed>=2.11.0->tsfresh) (1.7.0)\n", "Requirement already satisfied: sortedcontainers!=2.0.0,!=2.0.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from distributed>=2.11.0->tsfresh) (2.4.0)\n", "Requirement already satisfied: jinja2 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from distributed>=2.11.0->tsfresh) (3.0.3)\n", "Requirement already satisfied: msgpack>=0.6.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from distributed>=2.11.0->tsfresh) (1.0.3)\n", "Requirement already satisfied: psutil>=5.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from distributed>=2.11.0->tsfresh) (5.8.0)\n", "Requirement already satisfied: zict>=0.1.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from distributed>=2.11.0->tsfresh) (2.0.0)\n", "Requirement already satisfied: click>=6.6 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from distributed>=2.11.0->tsfresh) (8.0.3)\n", "Requirement already satisfied: tornado>=6.0.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from distributed>=2.11.0->tsfresh) (6.1)\n", "Requirement already satisfied: setuptools in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from distributed>=2.11.0->tsfresh) (59.4.0)\n", "Requirement already satisfied: protobuf==3.11.2 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from matrixprofile<2.0.0,>=1.1.10->tsfresh) (3.11.2)\n", "Requirement already satisfied: matplotlib>=3.0.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from matrixprofile<2.0.0,>=1.1.10->tsfresh) (3.5.0)\n", "Requirement already satisfied: six>=1.9 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from protobuf==3.11.2->matrixprofile<2.0.0,>=1.1.10->tsfresh) (1.16.0)\n", "Requirement already satisfied: python-dateutil>=2.7.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from pandas>=0.25.0->tsfresh) (2.8.2)\n", "Requirement already satisfied: pytz>=2017.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from pandas>=0.25.0->tsfresh) (2021.3)\n", "Requirement already satisfied: idna<4,>=2.5 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from requests>=2.9.1->tsfresh) (3.1)\n", "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from requests>=2.9.1->tsfresh) (1.26.8)\n", "Requirement already satisfied: charset-normalizer~=2.0.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from requests>=2.9.1->tsfresh) (2.0.8)\n", "Requirement already satisfied: certifi>=2017.4.17 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from requests>=2.9.1->tsfresh) (2021.10.8)\n", "Requirement already satisfied: joblib>=0.11 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from scikit-learn>=0.22.0->tsfresh) (1.1.0)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from scikit-learn>=0.22.0->tsfresh) (3.0.0)\n", "Requirement already satisfied: numba>=0.54 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from stumpy>=1.7.2->tsfresh) (0.54.1)\n", "Requirement already satisfied: cycler>=0.10 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from matplotlib>=3.0.3->matrixprofile<2.0.0,>=1.1.10->tsfresh) (0.11.0)\n", "Requirement already satisfied: pyparsing>=2.2.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from matplotlib>=3.0.3->matrixprofile<2.0.0,>=1.1.10->tsfresh) (3.0.6)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from matplotlib>=3.0.3->matrixprofile<2.0.0,>=1.1.10->tsfresh) (1.3.2)\n", "Requirement already satisfied: pillow>=6.2.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from matplotlib>=3.0.3->matrixprofile<2.0.0,>=1.1.10->tsfresh) (9.0.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from matplotlib>=3.0.3->matrixprofile<2.0.0,>=1.1.10->tsfresh) (4.28.2)\n", "Requirement already satisfied: llvmlite<0.38,>=0.37.0rc1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from numba>=0.54->stumpy>=1.7.2->tsfresh) (0.37.0)\n", "Requirement already satisfied: locket in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from partd>=0.3.10->dask[dataframe]>=2.9.0->tsfresh) (0.2.0)\n", "Requirement already satisfied: heapdict in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from zict>=0.1.3->distributed>=2.11.0->tsfresh) (1.0.1)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from jinja2->distributed>=2.11.0->tsfresh) (2.0.1)\n", "\u001b[33mWARNING: You are using pip version 22.0.4; however, version 22.3.1 is available.\n", "You should consider upgrading via the '/home/ec2-user/anaconda3/envs/python3/bin/python -m pip install --upgrade pip' command.\u001b[0m\u001b[33m\n", "\u001b[0m" ] } ], "source": [ "!pip install tsfresh" ] }, { "cell_type": "markdown", "id": "b98947d8", "metadata": {}, "source": [ "### Generate metrics/features with TSFresh Library. \n", "The purpose of doing this is to convert sequential data to a flattened format so an euclidean distance metric can be used for clustering. Else, a distance metric like Dynamic Time Warp will have to be utilised instead. Refer to [here](http://alexminnaar.com/2014/04/16/Time-Series-Classification-and-Clustering-with-Python.html) for more info." ] }, { "cell_type": "code", "execution_count": 8, "id": "09942a7e", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Feature Extraction: 100%|█████████████████████████████████████████████████████████████████████████████| 20/20 [05:18<00:00, 15.91s/it]\n" ] } ], "source": [ "from tsfresh import extract_features\n", "extracted_features = extract_features(df_train, column_id=\"StockCode\", column_sort=\"timestamp\")" ] }, { "cell_type": "code", "execution_count": 9, "id": "0995d4a0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(4605, 789) Index(['target_value__variance_larger_than_standard_deviation',\n", " 'target_value__has_duplicate_max', 'target_value__has_duplicate_min',\n", " 'target_value__has_duplicate', 'target_value__sum_values',\n", " 'target_value__abs_energy', 'target_value__mean_abs_change',\n", " 'target_value__mean_change',\n", " 'target_value__mean_second_derivative_central', 'target_value__median',\n", " ...\n", " 'target_value__permutation_entropy__dimension_6__tau_1',\n", " 'target_value__permutation_entropy__dimension_7__tau_1',\n", " 'target_value__query_similarity_count__query_None__threshold_0.0',\n", " 'target_value__matrix_profile__feature_\"min\"__threshold_0.98',\n", " 'target_value__matrix_profile__feature_\"max\"__threshold_0.98',\n", " 'target_value__matrix_profile__feature_\"mean\"__threshold_0.98',\n", " 'target_value__matrix_profile__feature_\"median\"__threshold_0.98',\n", " 'target_value__matrix_profile__feature_\"25\"__threshold_0.98',\n", " 'target_value__matrix_profile__feature_\"75\"__threshold_0.98',\n", " 'target_value__mean_n_absolute_max__number_of_maxima_7'],\n", " dtype='object', length=789)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target_value__variance_larger_than_standard_deviationtarget_value__has_duplicate_maxtarget_value__has_duplicate_mintarget_value__has_duplicatetarget_value__sum_valuestarget_value__abs_energytarget_value__mean_abs_changetarget_value__mean_changetarget_value__mean_second_derivative_centraltarget_value__median...target_value__permutation_entropy__dimension_6__tau_1target_value__permutation_entropy__dimension_7__tau_1target_value__query_similarity_count__query_None__threshold_0.0target_value__matrix_profile__feature_\"min\"__threshold_0.98target_value__matrix_profile__feature_\"max\"__threshold_0.98target_value__matrix_profile__feature_\"mean\"__threshold_0.98target_value__matrix_profile__feature_\"median\"__threshold_0.98target_value__matrix_profile__feature_\"25\"__threshold_0.98target_value__matrix_profile__feature_\"75\"__threshold_0.98target_value__mean_n_absolute_max__number_of_maxima_7
100021.00.00.01.06654.01243566.030.046448-0.030055-0.0643840.0...4.6292225.235477NaN1.1563946.3221593.3359583.2933802.7591153.953322338.571429
10002R0.00.01.01.04.06.00.0218580.000000-0.0013700.0...0.1981990.232777NaN3.40334010.3923059.59102210.39230510.39230510.3923050.571429
100801.00.01.01.0102.08148.00.5573770.000000-0.0013700.0...0.3642420.425203NaN3.29609020.24925118.06984420.13988719.56731420.14048314.571429
101090.00.00.01.00.032.00.0437160.0000000.0000000.0...0.1520560.171431NaNNaNNaNNaNNaNNaNNaN1.142857
101201.00.00.01.0-8558.081013930.051.387978-0.1639340.0684930.0...1.7227411.997223NaN7.66770413.65122410.43384510.3843419.67387210.7832621316.000000
..................................................................
DCGS00760.01.01.01.014.020.00.0765030.0000000.0000000.0...0.6674520.787786NaN4.74987710.9093606.4743206.2589264.7498777.2153921.428571
DCGSLBOY0.01.00.01.0-16.0256.00.0874320.0000000.0000000.0...0.0950930.114358NaNNaNNaNNaNNaNNaNNaN2.285714
DCGSLGIRL1.01.00.01.0-57.03249.00.3114750.0000000.0000000.0...0.0950930.114358NaNNaNNaNNaNNaNNaNNaN8.142857
DCGSSBOY1.00.00.01.040.018236.01.1748630.0000000.0000000.0...0.6735340.772879NaN2.11989414.69693810.62808413.3143968.01104814.55695030.571429
DCGSSGIRL1.00.00.01.0144.010350.00.7759560.0000000.0000000.0...0.6509270.737655NaN4.56305616.00000012.60968415.8642066.46484815.92692720.000000
\n", "

4605 rows × 789 columns

\n", "
" ], "text/plain": [ " target_value__variance_larger_than_standard_deviation \\\n", "10002 1.0 \n", "10002R 0.0 \n", "10080 1.0 \n", "10109 0.0 \n", "10120 1.0 \n", "... ... \n", "DCGS0076 0.0 \n", "DCGSLBOY 0.0 \n", "DCGSLGIRL 1.0 \n", "DCGSSBOY 1.0 \n", "DCGSSGIRL 1.0 \n", "\n", " target_value__has_duplicate_max target_value__has_duplicate_min \\\n", "10002 0.0 0.0 \n", "10002R 0.0 1.0 \n", "10080 0.0 1.0 \n", "10109 0.0 0.0 \n", "10120 0.0 0.0 \n", "... ... ... \n", "DCGS0076 1.0 1.0 \n", "DCGSLBOY 1.0 0.0 \n", "DCGSLGIRL 1.0 0.0 \n", "DCGSSBOY 0.0 0.0 \n", "DCGSSGIRL 0.0 0.0 \n", "\n", " target_value__has_duplicate target_value__sum_values \\\n", "10002 1.0 6654.0 \n", "10002R 1.0 4.0 \n", "10080 1.0 102.0 \n", "10109 1.0 0.0 \n", "10120 1.0 -8558.0 \n", "... ... ... \n", "DCGS0076 1.0 14.0 \n", "DCGSLBOY 1.0 -16.0 \n", "DCGSLGIRL 1.0 -57.0 \n", "DCGSSBOY 1.0 40.0 \n", "DCGSSGIRL 1.0 144.0 \n", "\n", " target_value__abs_energy target_value__mean_abs_change \\\n", "10002 1243566.0 30.046448 \n", "10002R 6.0 0.021858 \n", "10080 8148.0 0.557377 \n", "10109 32.0 0.043716 \n", "10120 81013930.0 51.387978 \n", "... ... ... \n", "DCGS0076 20.0 0.076503 \n", "DCGSLBOY 256.0 0.087432 \n", "DCGSLGIRL 3249.0 0.311475 \n", "DCGSSBOY 18236.0 1.174863 \n", "DCGSSGIRL 10350.0 0.775956 \n", "\n", " target_value__mean_change \\\n", "10002 -0.030055 \n", "10002R 0.000000 \n", "10080 0.000000 \n", "10109 0.000000 \n", "10120 -0.163934 \n", "... ... \n", "DCGS0076 0.000000 \n", "DCGSLBOY 0.000000 \n", "DCGSLGIRL 0.000000 \n", "DCGSSBOY 0.000000 \n", "DCGSSGIRL 0.000000 \n", "\n", " target_value__mean_second_derivative_central target_value__median \\\n", "10002 -0.064384 0.0 \n", "10002R -0.001370 0.0 \n", "10080 -0.001370 0.0 \n", "10109 0.000000 0.0 \n", "10120 0.068493 0.0 \n", "... ... ... \n", "DCGS0076 0.000000 0.0 \n", "DCGSLBOY 0.000000 0.0 \n", "DCGSLGIRL 0.000000 0.0 \n", "DCGSSBOY 0.000000 0.0 \n", "DCGSSGIRL 0.000000 0.0 \n", "\n", " ... target_value__permutation_entropy__dimension_6__tau_1 \\\n", "10002 ... 4.629222 \n", "10002R ... 0.198199 \n", "10080 ... 0.364242 \n", "10109 ... 0.152056 \n", "10120 ... 1.722741 \n", "... ... ... \n", "DCGS0076 ... 0.667452 \n", "DCGSLBOY ... 0.095093 \n", "DCGSLGIRL ... 0.095093 \n", "DCGSSBOY ... 0.673534 \n", "DCGSSGIRL ... 0.650927 \n", "\n", " target_value__permutation_entropy__dimension_7__tau_1 \\\n", "10002 5.235477 \n", "10002R 0.232777 \n", "10080 0.425203 \n", "10109 0.171431 \n", "10120 1.997223 \n", "... ... \n", "DCGS0076 0.787786 \n", "DCGSLBOY 0.114358 \n", "DCGSLGIRL 0.114358 \n", "DCGSSBOY 0.772879 \n", "DCGSSGIRL 0.737655 \n", "\n", " target_value__query_similarity_count__query_None__threshold_0.0 \\\n", "10002 NaN \n", "10002R NaN \n", "10080 NaN \n", "10109 NaN \n", "10120 NaN \n", "... ... \n", "DCGS0076 NaN \n", "DCGSLBOY NaN \n", "DCGSLGIRL NaN \n", "DCGSSBOY NaN \n", "DCGSSGIRL NaN \n", "\n", " target_value__matrix_profile__feature_\"min\"__threshold_0.98 \\\n", "10002 1.156394 \n", "10002R 3.403340 \n", "10080 3.296090 \n", "10109 NaN \n", "10120 7.667704 \n", "... ... \n", "DCGS0076 4.749877 \n", "DCGSLBOY NaN \n", "DCGSLGIRL NaN \n", "DCGSSBOY 2.119894 \n", "DCGSSGIRL 4.563056 \n", "\n", " target_value__matrix_profile__feature_\"max\"__threshold_0.98 \\\n", "10002 6.322159 \n", "10002R 10.392305 \n", "10080 20.249251 \n", "10109 NaN \n", "10120 13.651224 \n", "... ... \n", "DCGS0076 10.909360 \n", "DCGSLBOY NaN \n", "DCGSLGIRL NaN \n", "DCGSSBOY 14.696938 \n", "DCGSSGIRL 16.000000 \n", "\n", " target_value__matrix_profile__feature_\"mean\"__threshold_0.98 \\\n", "10002 3.335958 \n", "10002R 9.591022 \n", "10080 18.069844 \n", "10109 NaN \n", "10120 10.433845 \n", "... ... \n", "DCGS0076 6.474320 \n", "DCGSLBOY NaN \n", "DCGSLGIRL NaN \n", "DCGSSBOY 10.628084 \n", "DCGSSGIRL 12.609684 \n", "\n", " target_value__matrix_profile__feature_\"median\"__threshold_0.98 \\\n", "10002 3.293380 \n", "10002R 10.392305 \n", "10080 20.139887 \n", "10109 NaN \n", "10120 10.384341 \n", "... ... \n", "DCGS0076 6.258926 \n", "DCGSLBOY NaN \n", "DCGSLGIRL NaN \n", "DCGSSBOY 13.314396 \n", "DCGSSGIRL 15.864206 \n", "\n", " target_value__matrix_profile__feature_\"25\"__threshold_0.98 \\\n", "10002 2.759115 \n", "10002R 10.392305 \n", "10080 19.567314 \n", "10109 NaN \n", "10120 9.673872 \n", "... ... \n", "DCGS0076 4.749877 \n", "DCGSLBOY NaN \n", "DCGSLGIRL NaN \n", "DCGSSBOY 8.011048 \n", "DCGSSGIRL 6.464848 \n", "\n", " target_value__matrix_profile__feature_\"75\"__threshold_0.98 \\\n", "10002 3.953322 \n", "10002R 10.392305 \n", "10080 20.140483 \n", "10109 NaN \n", "10120 10.783262 \n", "... ... \n", "DCGS0076 7.215392 \n", "DCGSLBOY NaN \n", "DCGSLGIRL NaN \n", "DCGSSBOY 14.556950 \n", "DCGSSGIRL 15.926927 \n", "\n", " target_value__mean_n_absolute_max__number_of_maxima_7 \n", "10002 338.571429 \n", "10002R 0.571429 \n", "10080 14.571429 \n", "10109 1.142857 \n", "10120 1316.000000 \n", "... ... \n", "DCGS0076 1.428571 \n", "DCGSLBOY 2.285714 \n", "DCGSLGIRL 8.142857 \n", "DCGSSBOY 30.571429 \n", "DCGSSGIRL 20.000000 \n", "\n", "[4605 rows x 789 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(extracted_features.shape, extracted_features.columns)\n", "extracted_features" ] }, { "cell_type": "markdown", "id": "8c03d1cd", "metadata": {}, "source": [ "### Drop all columns with na values" ] }, { "cell_type": "code", "execution_count": 10, "id": "1ce7246d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target_value__variance_larger_than_standard_deviationtarget_value__has_duplicate_maxtarget_value__has_duplicate_mintarget_value__has_duplicatetarget_value__sum_valuestarget_value__abs_energytarget_value__mean_abs_changetarget_value__mean_changetarget_value__mean_second_derivative_centraltarget_value__median...target_value__lempel_ziv_complexity__bins_3target_value__lempel_ziv_complexity__bins_5target_value__lempel_ziv_complexity__bins_10target_value__lempel_ziv_complexity__bins_100target_value__permutation_entropy__dimension_3__tau_1target_value__permutation_entropy__dimension_4__tau_1target_value__permutation_entropy__dimension_5__tau_1target_value__permutation_entropy__dimension_6__tau_1target_value__permutation_entropy__dimension_7__tau_1target_value__mean_n_absolute_max__number_of_maxima_7
100021.00.00.01.06654.01243566.030.046448-0.030055-0.0643840.0...0.1444140.1171660.2316080.3215261.5880372.6729523.7644654.6292225.235477338.571429
10002R0.00.01.01.04.06.00.0218580.000000-0.0013700.0...0.0790190.0790190.0790190.0790190.0952280.1294250.1637490.1981990.2327770.571429
100801.00.01.01.0102.08148.00.5573770.000000-0.0013700.0...0.0735690.0735690.0735690.0817440.1747990.2427420.3034210.3642420.42520314.571429
101090.00.00.01.00.032.00.0437160.0000000.0000000.0...0.0762940.0762940.0762940.0762940.0755550.1135530.1327630.1520560.1714311.142857
101201.00.00.01.0-8558.081013930.051.387978-0.1639340.0684930.0...0.0735690.0735690.0735690.0735690.6939091.0712711.4222691.7227411.9972231316.000000
..................................................................
DCGS00760.01.01.01.014.020.00.0765030.0000000.0000000.0...0.0926430.0926430.0926430.0926430.2694990.4033810.5362560.6674520.7877861.428571
DCGSLBOY0.01.00.01.0-16.0256.00.0874320.0000000.0000000.0...0.0735690.0735690.0735690.0735690.0377930.0568110.0759100.0950930.1143582.285714
DCGSLGIRL1.01.00.01.0-57.03249.00.3114750.0000000.0000000.0...0.0735690.0735690.0735690.0735690.0377930.0568110.0759100.0950930.1143588.142857
DCGSSBOY1.00.00.01.040.018236.01.1748630.0000000.0000000.0...0.0762940.0762940.0790190.0899180.2729940.4278470.5547700.6735340.77287930.571429
DCGSSGIRL1.00.00.01.0144.010350.00.7759560.0000000.0000000.0...0.0735690.0735690.0762940.0899180.2711000.4231360.5451050.6509270.73765520.000000
\n", "

4605 rows × 727 columns

\n", "
" ], "text/plain": [ " target_value__variance_larger_than_standard_deviation \\\n", "10002 1.0 \n", "10002R 0.0 \n", "10080 1.0 \n", "10109 0.0 \n", "10120 1.0 \n", "... ... \n", "DCGS0076 0.0 \n", "DCGSLBOY 0.0 \n", "DCGSLGIRL 1.0 \n", "DCGSSBOY 1.0 \n", "DCGSSGIRL 1.0 \n", "\n", " target_value__has_duplicate_max target_value__has_duplicate_min \\\n", "10002 0.0 0.0 \n", "10002R 0.0 1.0 \n", "10080 0.0 1.0 \n", "10109 0.0 0.0 \n", "10120 0.0 0.0 \n", "... ... ... \n", "DCGS0076 1.0 1.0 \n", "DCGSLBOY 1.0 0.0 \n", "DCGSLGIRL 1.0 0.0 \n", "DCGSSBOY 0.0 0.0 \n", "DCGSSGIRL 0.0 0.0 \n", "\n", " target_value__has_duplicate target_value__sum_values \\\n", "10002 1.0 6654.0 \n", "10002R 1.0 4.0 \n", "10080 1.0 102.0 \n", "10109 1.0 0.0 \n", "10120 1.0 -8558.0 \n", "... ... ... \n", "DCGS0076 1.0 14.0 \n", "DCGSLBOY 1.0 -16.0 \n", "DCGSLGIRL 1.0 -57.0 \n", "DCGSSBOY 1.0 40.0 \n", "DCGSSGIRL 1.0 144.0 \n", "\n", " target_value__abs_energy target_value__mean_abs_change \\\n", "10002 1243566.0 30.046448 \n", "10002R 6.0 0.021858 \n", "10080 8148.0 0.557377 \n", "10109 32.0 0.043716 \n", "10120 81013930.0 51.387978 \n", "... ... ... \n", "DCGS0076 20.0 0.076503 \n", "DCGSLBOY 256.0 0.087432 \n", "DCGSLGIRL 3249.0 0.311475 \n", "DCGSSBOY 18236.0 1.174863 \n", "DCGSSGIRL 10350.0 0.775956 \n", "\n", " target_value__mean_change \\\n", "10002 -0.030055 \n", "10002R 0.000000 \n", "10080 0.000000 \n", "10109 0.000000 \n", "10120 -0.163934 \n", "... ... \n", "DCGS0076 0.000000 \n", "DCGSLBOY 0.000000 \n", "DCGSLGIRL 0.000000 \n", "DCGSSBOY 0.000000 \n", "DCGSSGIRL 0.000000 \n", "\n", " target_value__mean_second_derivative_central target_value__median \\\n", "10002 -0.064384 0.0 \n", "10002R -0.001370 0.0 \n", "10080 -0.001370 0.0 \n", "10109 0.000000 0.0 \n", "10120 0.068493 0.0 \n", "... ... ... \n", "DCGS0076 0.000000 0.0 \n", "DCGSLBOY 0.000000 0.0 \n", "DCGSLGIRL 0.000000 0.0 \n", "DCGSSBOY 0.000000 0.0 \n", "DCGSSGIRL 0.000000 0.0 \n", "\n", " ... target_value__lempel_ziv_complexity__bins_3 \\\n", "10002 ... 0.144414 \n", "10002R ... 0.079019 \n", "10080 ... 0.073569 \n", "10109 ... 0.076294 \n", "10120 ... 0.073569 \n", "... ... ... \n", "DCGS0076 ... 0.092643 \n", "DCGSLBOY ... 0.073569 \n", "DCGSLGIRL ... 0.073569 \n", "DCGSSBOY ... 0.076294 \n", "DCGSSGIRL ... 0.073569 \n", "\n", " target_value__lempel_ziv_complexity__bins_5 \\\n", "10002 0.117166 \n", "10002R 0.079019 \n", "10080 0.073569 \n", "10109 0.076294 \n", "10120 0.073569 \n", "... ... \n", "DCGS0076 0.092643 \n", "DCGSLBOY 0.073569 \n", "DCGSLGIRL 0.073569 \n", "DCGSSBOY 0.076294 \n", "DCGSSGIRL 0.073569 \n", "\n", " target_value__lempel_ziv_complexity__bins_10 \\\n", "10002 0.231608 \n", "10002R 0.079019 \n", "10080 0.073569 \n", "10109 0.076294 \n", "10120 0.073569 \n", "... ... \n", "DCGS0076 0.092643 \n", "DCGSLBOY 0.073569 \n", "DCGSLGIRL 0.073569 \n", "DCGSSBOY 0.079019 \n", "DCGSSGIRL 0.076294 \n", "\n", " target_value__lempel_ziv_complexity__bins_100 \\\n", "10002 0.321526 \n", "10002R 0.079019 \n", "10080 0.081744 \n", "10109 0.076294 \n", "10120 0.073569 \n", "... ... \n", "DCGS0076 0.092643 \n", "DCGSLBOY 0.073569 \n", "DCGSLGIRL 0.073569 \n", "DCGSSBOY 0.089918 \n", "DCGSSGIRL 0.089918 \n", "\n", " target_value__permutation_entropy__dimension_3__tau_1 \\\n", "10002 1.588037 \n", "10002R 0.095228 \n", "10080 0.174799 \n", "10109 0.075555 \n", "10120 0.693909 \n", "... ... \n", "DCGS0076 0.269499 \n", "DCGSLBOY 0.037793 \n", "DCGSLGIRL 0.037793 \n", "DCGSSBOY 0.272994 \n", "DCGSSGIRL 0.271100 \n", "\n", " target_value__permutation_entropy__dimension_4__tau_1 \\\n", "10002 2.672952 \n", "10002R 0.129425 \n", "10080 0.242742 \n", "10109 0.113553 \n", "10120 1.071271 \n", "... ... \n", "DCGS0076 0.403381 \n", "DCGSLBOY 0.056811 \n", "DCGSLGIRL 0.056811 \n", "DCGSSBOY 0.427847 \n", "DCGSSGIRL 0.423136 \n", "\n", " target_value__permutation_entropy__dimension_5__tau_1 \\\n", "10002 3.764465 \n", "10002R 0.163749 \n", "10080 0.303421 \n", "10109 0.132763 \n", "10120 1.422269 \n", "... ... \n", "DCGS0076 0.536256 \n", "DCGSLBOY 0.075910 \n", "DCGSLGIRL 0.075910 \n", "DCGSSBOY 0.554770 \n", "DCGSSGIRL 0.545105 \n", "\n", " target_value__permutation_entropy__dimension_6__tau_1 \\\n", "10002 4.629222 \n", "10002R 0.198199 \n", "10080 0.364242 \n", "10109 0.152056 \n", "10120 1.722741 \n", "... ... \n", "DCGS0076 0.667452 \n", "DCGSLBOY 0.095093 \n", "DCGSLGIRL 0.095093 \n", "DCGSSBOY 0.673534 \n", "DCGSSGIRL 0.650927 \n", "\n", " target_value__permutation_entropy__dimension_7__tau_1 \\\n", "10002 5.235477 \n", "10002R 0.232777 \n", "10080 0.425203 \n", "10109 0.171431 \n", "10120 1.997223 \n", "... ... \n", "DCGS0076 0.787786 \n", "DCGSLBOY 0.114358 \n", "DCGSLGIRL 0.114358 \n", "DCGSSBOY 0.772879 \n", "DCGSSGIRL 0.737655 \n", "\n", " target_value__mean_n_absolute_max__number_of_maxima_7 \n", "10002 338.571429 \n", "10002R 0.571429 \n", "10080 14.571429 \n", "10109 1.142857 \n", "10120 1316.000000 \n", "... ... \n", "DCGS0076 1.428571 \n", "DCGSLBOY 2.285714 \n", "DCGSLGIRL 8.142857 \n", "DCGSSBOY 30.571429 \n", "DCGSSGIRL 20.000000 \n", "\n", "[4605 rows x 727 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "extracted_features_cleaned=extracted_features\n", "extracted_features_cleaned=extracted_features_cleaned.dropna(axis=1)\n", "extracted_features_cleaned" ] }, { "cell_type": "markdown", "id": "7c3a078b", "metadata": {}, "source": [ "### PCA (Dimension Reduction) + K-Means (Clustering)" ] }, { "cell_type": "code", "execution_count": 9, "id": "67c435a6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Looking in indexes: https://pypi.org/simple, https://pip.repos.neuron.amazonaws.com\n", "Requirement already satisfied: sklearn in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (0.0)\n", "Requirement already satisfied: scikit-learn in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from sklearn) (1.0.1)\n", "Requirement already satisfied: joblib>=0.11 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from scikit-learn->sklearn) (1.1.0)\n", "Requirement already satisfied: numpy>=1.14.6 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from scikit-learn->sklearn) (1.20.3)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from scikit-learn->sklearn) (3.0.0)\n", "Requirement already satisfied: scipy>=1.1.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.8/site-packages (from scikit-learn->sklearn) (1.5.3)\n", "\u001b[33mWARNING: You are using pip version 22.0.4; however, version 22.3.1 is available.\n", "You should consider upgrading via the '/home/ec2-user/anaconda3/envs/python3/bin/python -m pip install --upgrade pip' command.\u001b[0m\u001b[33m\n", "\u001b[0m" ] } ], "source": [ "!pip install sklearn" ] }, { "cell_type": "markdown", "id": "3744e1f2", "metadata": {}, "source": [ "Values in extracted features consist of both negative and positive values. Hence standard scaler is used as opposed to minmax scaler" ] }, { "cell_type": "code", "execution_count": 11, "id": "5a87cc11", "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler\n", "scaler = StandardScaler()\n", "extracted_features_cleaned_std = scaler.fit_transform(extracted_features_cleaned)" ] }, { "cell_type": "markdown", "id": "18a546b9", "metadata": {}, "source": [ "Use PCA to do dimensionality reduction" ] }, { "cell_type": "code", "execution_count": 12, "id": "7e01cf7c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
PCA()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "PCA()" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.decomposition import PCA\n", "pca = PCA()\n", "pca.fit(extracted_features_cleaned_std)" ] }, { "cell_type": "markdown", "id": "5d6fe0d3", "metadata": {}, "source": [ "The explained variance ratio is the percentage of variance that is attributed by each of the selected components. You will typically determine the number of components to include in your model by adding the explained variance ratio of each component in a cumulative manner until you reach 0.8 to 0.9 to avoid overfitting. The optimal value usually happens at the elbow." ] }, { "cell_type": "code", "execution_count": 13, "id": "c4ad556b", "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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UAEAAAAAGCyUKrADLF/fktO/c1tWbmjNAVNG5bvvPyqjGxUqAAAAAACDiVIFBlhTS3vOvPQPWbi6ObuPa8x/v++lGdNYV+5YAAAAAACUSKkCA6ilvTMf+O/b86clTRk/oj6Xv39WJo5sKHcsAAAAAABeBKUKDJCOzq784/fuym2Pr87I+pr89/temj12GV7uWAAAAAAAvEhKFRgAxWIx//r/7s91DyxLXU1VvnXmkTlo19HljgUAAAAAwJ9BqQID4PPXPZQrb38qVYXkK+8+LEfvtUu5IwEAAAAA8Gcqe6ly8cUXZ/r06WloaMhRRx2V22677XnPv+iii7Lffvtl2LBhmTZtWj784Q+npaVlB6WFF/aDPzyVi294NElywdsOyUkHTS5zIgAAAAAA+kNZS5Urr7wyc+bMyXnnnZc777wzM2bMyEknnZTly5dv9/wrrrgi5557bs4777z86U9/yne+851ceeWV+ehHP7qDk8P23fzoynz0/92XJPnH1+6bU166e5kTAQAAAADQX8paqlx44YU566yzMnv27Bx44IG55JJL0tjYmEsvvXS7599888152ctellNPPTXTp0/PiSeemHe/+90vOLsFdoRHV2zI3373znR0FfPGGbvmw8fvW+5IAAAAAAD0o5pyvXBbW1vuuOOOzJ07t/dYVVVVjj/++Nxyyy3bvebYY4/Nd7/73dx2222ZNWtWHnvssfziF7/I6aef/pyv09ramtbW1t77TU1NSZL29va0t7f3008zNPS8H96X0q1pbsvs/7ot6za1Z+a00bngzQeko6Oj3LF4EYwDMA4gMQ4gMQ4gMQ4gMQ4gMQ4qQSm/20KxWCwOYJbntHjx4kydOjU333xzjjnmmN7j55xzTm666abceuut273uy1/+cv75n/85xWIxHR0d+Zu/+Zt8/etff87X+eQnP5nzzz9/m+NXXHFFGhsb//wfhIrX2ZV87U9VWdBUlXH1xXz44M6Mqit3KgAAAAAA+qK5uTmnnnpq1q1bl1GjRj3vuWWbqfJi3HjjjfnMZz6Tr33taznqqKOyYMGCfPCDH8y//du/5eMf//h2r5k7d27mzJnTe7+pqSnTpk3LiSee+IJvTqVpb2/PvHnzcsIJJ6S2trbccQaNf7v6wSxoWpjhddW5/KxZecmkkeWOxJ/BOADjABLjABLjABLjABLjABLj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xrbc9sTqJEoVAAAAAADKp+RS5dxzz01nZ+c2x4vFYs4999x+CQVbmv+nZensKubAKaMybVxjueMAAAAAAFChSi5VHnnkkRx44IHbHN9///2zYMGCfgkFW/r1IyuTJMfboB4AAAAAgDIquVQZPXp0HnvssW2OL1iwIMOHD++XUNCjWCzmlke7S5WX7zO+zGkAAAAAAKhkJZcqb37zm/OhD30ojz76aO+xBQsW5J/+6Z/ypje9qV/DwUPL1mflhrYMq63OzGljyh0HAAAAAIAKVnKp8tnPfjbDhw/P/vvvnz333DN77rlnDjjggOyyyy75/Oc/PxAZqWC/W7AqSfLSPcelrqbkP64AAAAAANBvakq9YPTo0bn55pszb9683HPPPRk2bFgOPfTQvPKVrxyIfFS4nqW/Xrb3LmVOAgAAAABApSu5VEmSQqGQE088MSeeeGJ/54FeHZ1dufWx1UmSl9lPBQAAAACAMntRpcr8+fMzf/78LF++PF1dXVs9dumll5b8fBdffHE+97nPZenSpZkxY0a+8pWvZNasWds991WvelVuuummbY6ffPLJufrqq0t+bXZe9y5al/WtHRk9rDYHThlV7jgAAAAAAFS4kjepOP/883PiiSdm/vz5WblyZdasWbPVV6muvPLKzJkzJ+edd17uvPPOzJgxIyeddFKWL1++3fOvuuqqLFmypPfr/vvvT3V1dd7xjneU/Nrs3G5e0L301zF77ZKqqkKZ0wAAAAAAUOlKnqlyySWX5LLLLsvpp5/eLwEuvPDCnHXWWZk9e3bv81999dW59NJLc+65525z/rhx47a6//3vfz+NjY1KlSGoZ5P6l+1jPxUAAAAAAMqv5FKlra0txx57bL+8eFtbW+64447MnTu391hVVVWOP/743HLLLX16ju985zt517veleHDh2/38dbW1rS2tvbeb2pqSpK0t7envb39z0g/9PS8HzvD+9LS3pk7FnbPfJq1x5idIhOVYWcaB1AuxgEYB5AYB5AYB5AYB5AYB5WglN9toVgsFkt58o985CMZMWJEPv7xj5cc7NkWL16cqVOn5uabb84xxxzTe/ycc87JTTfdlFtvvfV5r7/tttty1FFH5dZbb33OPVg++clP5vzzz9/m+BVXXJHGxsY/7wdgwDy0rpCvPVCd0XXFnH94ZwpW/wIAAAAAYAA0Nzfn1FNP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BKX8bksuVf7hH/4hV111VT772c/mmGOOSZLccsst+eQnP5lVq1bl61//ep+eZ+XKlens7MykSZO2Oj5p0qQ8+OCD273msccey/XXX5/TTjstv/jFL7JgwYL83d/9Xdrb23Peeedt95oLLrgg559//jbHr7vuujQ2NvYpa6WZN29evzzPA2sKSarTmLb84he/6JfnhB2lv8YBDGbGARgHkBgHkBgHkBgHkBgHQ1lzc3Ofzy25VLniiivy/e9/P69//et7jx166KGZNm1a3v3ud/e5VHkxurq6MnHixHzzm99MdXV1jjjiiCxatCif+9znnrNUmTt3bubMmdN7v6mpKdOmTcuJJ56YUaNGDVjWwai9vT3z5s3LCSec0OcZR89n/e1PJw8+kH13m5CTTz68HxLCwOvvcQCDkXEAxgEkxgEkxgEkxgEkxkEl6Fnhqi9KLlXq6+u3u4/Jnnvumbq6uj4/z/jx41NdXZ1ly5ZtdXzZsmWZPHnydq+ZMmVKamtrt1rq64ADDsjSpUvT1ta23devr69PfX39Nsdra2sNgOfQX+/Nig3dU6amjGn0XjPo+DsCjANIjANIjANIjANIjANIjIOhrJTfa1WpT3722Wfn3/7t37bap6S1tTWf/vSnc/bZZ/f5eerq6nLEEUdk/vz5vce6uroyf/783mXFnu1lL3tZFixYkK6uZ/bmePjhhzNlypSSCh12jGVNLUmSyTapBwAAAABgCCh5pspdd92V+fPnZ7fddsuMGTOSJPfcc0/a2try2te+Nm9729t6z73qqque97nmzJmTM888M0ceeWRmzZqViy66KBs3bszs2bOTJGeccUamTp2aCy64IEnyt3/7t/nqV7+aD37wg/mHf/iHPPLII/nMZz6Tf/zHfyz1x2AHWLKuu1SZMlqpAgAAAADA4FdyqTJmzJi8/e1v3+rYtGnTXtSLn3LKKVmxYkU+8YlPZOnSpZk5c2auueaa3s3rFy5cmKqqZybTTJs2Lddee20+/OEP59BDD83UqVPzwQ9+MB/5yEde1OszsHpmqkxSqgAAAAAAMASUXKr813/9V78GOPvss59z2bAbb7xxm2PHHHNMfv/73/drBgbGUst/AQAAAAAwhJS8p8qDDz74nI9de+21f1YYho6W9s6sbe7eqH6ymSoAAAAAAAwBJZcqhx9+eC6++OKtjrW2tubs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j//4j21msTD0Nbd1ZFN7ZxIzVQAAAAAAGNr6pVRJkpqamixevLi/no5BYtXmpb/qa6rSWFdd5jQAAAAAADBwSt5T5Wc/+9lW94vFYpYsWZKvfvWrednLXtZvwRgcVm1e+mv8iPoUCoUypwEAAAAAgIFTcqnylre8Zav7hUIhEyZMyGte85p84Qtf6K9cDBKrN7YmScYNt/QXAAAAAABDW8mlSldX10DkYJBauXn5L/upAAAAAAAw1PXbnipUptWbl/8yUwUAAAAAgKGu5JkqxWIxP/rRj3LDDTdk+fLl28xcueqqq/otHDu/VRu6l/8aP6K+zEkAAAAAAGBglVyqfOhDH8o3vvGNvPrVr86kSZNsTl7hVpmpAgAAAABAhSi5VLn88stz1VVX5eSTTx6IPAwyqzYoVQAAAAAAqAwl76kyevTo7LXXXgORhUFoTfPmjeqVKgAAAAAADHEllyqf/OQnc/7552fTpk0DkYdBpmej+rFKFQAAAAAAhriSl/965zvfme9973uZOHFipk+fntra2q0ev/POO/stHDu/tc3tSZJxjUoVAAAAAACGtpJLlTPPPDN33HFH3vOe99iovsK1dnRmQ2tHEjNVAAAAAAAY+kouVa6++upce+21efnLXz4QeRhEemapVFcVMqqh5D9KAAAAAAAwqJS8p8q0adMyatSofg1x8cUXZ/r06WloaMhRRx2V22677TnPveyyy1IoFLb6amho6Nc89E3vfiqNtWYsAQAAAAAw5JVcqnzhC1/IOeeckyeeeKJfAlx55ZWZM2dOzjvvvNx5552ZMWNGTjrppCxfvvw5rxk1alSWLFnS+/Xkk0/2SxZKs6a3VLH0FwAAAAAAQ1/Jaza95z3vSXNzc/bee+80NjZus1H96tWrS3q+Cy+8MGeddVZmz56dJLnkkkty9dVX59JLL82555673WsKhUImT55canT62ZrNy3/ZTwUAAAAAgEpQcqly0UUX9duLt7W15Y477sjcuXN7j1VVVeX444/PLbfc8pzXbdiwIXvssUe6urpy+OGH5zOf+UwOOuigfstF36xufmb5LwAAAAAAGOpKLlXOPPPMfnvxlStXprOzM5MmTdrq+KRJk/Lggw9u95r99tsvl156aQ499NCsW7cun//853Psscfmj3/8Y3bbbbdtzm9tbU1ra2vv/aampiRJe3t72tvb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qaeeyvLly0vH3HrrrWlra8ukSZN2epvhpSiKIjNmzMgPfvCD3Hrrrdl///3L9h911FGpqakpq4XVq1dnzZo1ZbXwwAMPlP3htGjRojQ0NHT4gwxeKdra2tLY2KgG6DGOOeaYPPDAA1m5cmXpa8KECTnttNNK36sFeprNmzfn4YcfzvDhw30e0GMcffTRWb16ddm2X//619lvv/2S+FuZnuWaa67JkCFDcuKJJ5a2+Txgh17mhe95BbrhhhuKurq64tprry1++ctfFmeddVYxYMCAYt26dZVuGrwsNm3aVNx3333FfffdVyQpLr/88uK+++4rfve73xVFURTz5s0rBgwYUPzP//xPcf/99xcnnXRSsf/++xfPPPNM6RzHH398ceSRRxZ33XVXcfvttxejR48uTj311EpdErxoH/jAB4o999yzWLJkSbF27drS19atW0vHnH322cW+++5b3HrrrcW9995bTJ48uZg8eXJpf0tLS3HYYYcVxx13XLFy5cri5ptvLl71qlcVl1xySSUuCV60iy++uFi6dGnxyCOPFPfff39x8cUXF1VVVcUtt9xSFIUaoOd605veVMycObP0Wi2wu/vQhz5ULFmypHjkkUeKO+64o5g6dWoxePDgYsOGDUVRqAF6hrvvvruorq4uPvnJTxYPPfRQcf311xf19fXFN77xjdIx/lamJ2htbS323Xff4qKLLuqwz+cBXRGqUBRFUXzxi18s9t1336K2traYOHFiceedd1a6SfCyue2224okHb7OOOOMoiiKoq2trfjYxz5WDB06tKirqyuOOeaYYvXq1WXn+POf/1yceuqpRf/+/YuGhoZi+vTpxaZNmypwNfDSdFYDSYprrrmmdMwzzzxTnHPOOcXAgQOL+vr64h3veEexdu3asvM8+uijxQknnFD07du3GDx4cPGhD32oaG5u3slXAy/Ne97znmK//fYramtri1e96lXFMcccUwpUikIN0HO9MFRRC+zuTjnllGL48OFFbW1tMXLkyOKUU04pfvOb35T2qwF6ih//+MfFYYcdVtTV1RWHHnpo8V//9V9l+/2tTE+wcOHCIkmHZ7sofB7QtaqiKIqKDJEBAAAAAAB4BbGmCgAAAAAAQDcIVQAAAAAAALpBqAIAAAAAANANQhUAAAAAAIBuEKoAAAAAAAB0g1AFAAAAAACgG4QqAAAAAAAA3SBUAQAAXpIpU6bk/PPPr3QzSoqiyFlnnZVBgwalqqoqK1eurHSTAACA3YxQBQAA2C3cfPPNufbaa/OTn/wka9euzWGHHVbpJr0iXXvttRkwYEClmwEAALuk6ko3AAAAoF1ra2uqqqrSq9eL//+/Hn744QwfPjyve93r/gYtAwAAMFIFAABe0aZMmZLzzjsvH/7whzNo0KAMGzYsl156aWn/o48+2mEqrKeeeipVVVVZsmRJkmTJkiWpqqrKwoULc+SRR6Zv375585vfnA0bNuSmm27KmDFj0tDQkH/+53/O1q1by96/paUlM2bMyJ577pnBgwfnYx/7WIqiKO1vbGzMBRdckJEjR6Zfv36ZNGlS6X2TbaMifvSjH2Xs2LGpq6vLmjVrOr3WpUuXZuLEiamrq8vw4cNz8cUXp6WlJUny7ne/Ox/84AezZs2aVFVVZdSoUV3eszvuuCNTpkxJfX19Bg4cmGnTpuXJJ58stfe8887LkCFD0qdPn7z+9a/PPffcU/rZl3qvpkyZkhkzZuzwXj355JM5/fTTM3DgwNTX1+eEE07IQw891OFeLVy4MGPGjEn//v1z/PHHZ+3atWXXd/XVV2fMmDHp06dPDj300HzpS18q7Wt/Hr7//e/n7//+71NfX5/x48dn2bJlpeubPn16nn766VRVVaWqqqr0PH3pS1/K6NGj06dPnwwdOjTvfOc7u7zHAACwuxKqAADAK9x1112Xfv365a677sr8+fPziU98IosWLXrR57n00kvzn//5n/n5z3+e3//+9/mnf/qnXHHFFfnmN7+Z//3f/80tt9ySL37xix3eu7q6OnfffXc+//nP5/LLL8/VV19d2j9jxowsW7YsN9xwQ+6///6cfPLJOf7448vCgq1bt+bTn/50rr766jz44IMZMmRIh7Y99thjectb3pLXvOY1+b//+78sWLAgX/3qV3PZZZclST7/+c/nE5/4RPbee++sXbu2LAjZ3sqVK3PMMcdk7NixWbZsWW6//fa87W1vS2tra5Lkwx/+cL73ve/luuuuy4oVK3LQQQdl2rRpeeKJJ/7m9+rd73537r333vzoRz/KsmXLUhRF3vKWt6S5ubnsXn32s5/N17/+9fzsZz/LmjVrcsEFF5T2X3/99Zk9e3Y++clPZtWqVfnUpz6Vj33sY7nuuuvK2vLRj340F1xwQVauXJmDDz44p556alpaWvK6170uV1xxRRoaGrJ27dqsXbs2F1xwQe69996cd955+cQnPpHVq1fn5ptvzhvf+MZO7zEAAOzWCgAA4BXrTW96U/H617++bNtrXvOa4qKLLiqKoigeeeSRIklx3333lfY/+eSTRZLitttuK4qiKG677bYiSfHTn/60dMzcuXOLJMXDDz9c2vb+97+/mDZtWtl7jxkzpmhrayttu+iii4oxY8YURVEUv/vd74revXsXjz32WFn7jjnmmOKSSy4piqIorrnmmiJJsXLlyh1e50c+8pHikEMOKXuvK6+8sujfv3/R2tpaFEVR/Md//Eex33777fA8p556anH00Ud3um/z5s1FTU1Ncf3115e2NTU1FSNGjCjmz59fFMXf7l79+te/LpIUd9xxR2n/448/XvTt27f4zne+UxTFtnv1m9/8puweDB06tPT6wAMPLL75zW+WXde///u/F5MnTy6KYtvzcPXVV5f2P/jgg0WSYtWqVaX32XPPPcvO8b3vfa9oaGgoNm7c2Om9AwCAnsJIFQAAeIUbN25c2evhw4dnw4YNf9V5hg4dmvr6+hxwwAFl21543te+9rWpqqoqvZ48eXIeeuihtLa25oEHHkhra2sOPvjg9O/fv/S1dOnSPPzww6Wfqa2t7XANL7Rq1apMnjy57L2OPvrobN68OX/4wx+6fY3tI1U68/DDD6e5uTlHH310aVtNTU0mTpyYVatWlR37ct+rVatWpbq6OpMmTSrt32uvvXLIIYeUvXd9fX0OPPDA0uvtf9dbtmzJww8/nDPPPLPsfl922WVl9/uF7R8+fHiS7PCZOfbYY7PffvvlgAMOyLve9a5cf/31HaaCAwCAnsBC9QAA8ApXU1NT9rqqqiptbW1JUlrwvdhu7Y7tp5Pq6jxVVVU7PG93bN68Ob17987y5cvTu3fvsn39+/cvfd+3b9+ysOFvqW/fvi/LeV7ue/VS3rf9fdp/t5s3b06SfOUrXykLZ5J0uP8vbH+SHbZ3jz32yIoVK7JkyZLccsstmT17di699NLcc889GTBgwEu+HgAAeKUxUgUAAHZjr3rVq5KkbDHz7Ret/2vdddddZa/vvPPOjB49Or17986RRx6Z1tbWbNiwIQcddFDZ17Bhw17U+4wZM6a0zki7O+64I3vssUf23nvvbp9n3LhxWbx4caf7DjzwwNTW1uaOO+4obWtubs4999yTsWPHvqj2dmZH92rMmDFpaWkpO+bPf/5zVq9e3e33Hjp0aEaMGJHf/va3He73/vvv3+121tbWltaY2V51dXWmTp2a+fPn5/7778+jjz6aW2+9tdvnBQCA3YGRKgAAsBvr27dvXvva12bevHnZf//9s2HDhvzbv/3by3b+NWvWZNasWXn/+9+fFStW5Itf/GI+97nPJUkOPvjgnHbaaTn99NPzuc99LkceeWT+9Kc/ZfHixRk3blxOPPHEbr/POeeckyuuuCIf/OAHM2PGjKxevTpz5szJrFmzSqNxuuOSSy7J4YcfnnPOOSdnn312amtrc9ttt+Xkk0/O4MGD84EPfCAXXnhhBg0alH333Tfz58/P1q1bc+aZZ77oe/NCO7pXo0ePzkknnZT3ve99+fKXv5w99tgjF198cUaOHJmTTjqp2+/x8Y9/POedd1723HPPHH/88WlsbMy9996bJ598MrNmzerWOUaNGpXNmzdn8eLFGT9+fOrr63Prrbfmt7/9bd74xjdm4MCBufHGG9PW1pZDDjnkJd0LAAB4pRKqAADAbu5rX/tazjzzzBx11FE55JBDMn/+/Bx33HEvy7lPP/30PPPMM5k4cWJ69+6dmTNn5qyzzirtv+aaa3LZZZflQx/6UB577LEMHjw4r33ta/PWt771Rb3PyJEjc+ONN+bCCy/M+PHjM2jQoJx55pkvOiA6+OCDc8stt+QjH/lIJk6cmL59+2bSpEk59dRTkyTz5s1LW1tb3vWud2XTpk2ZMGFCFi5cmIEDB76o9+lMd+7VzJkz89a3vjVNTU154xvfmBtvvLHDlF878t73vjf19fX5zGc+kwsvvDD9+vXL4YcfnvPPP7/b53jd616Xs88+O6ecckr+/Oc/Z86cOZk6dWq+//3v59JLL82zzz6b0aNH51vf+lZe/epXv5hbAAAAr3hVxfbj5wEAAHjZTZkyJUcccUSuuOKKSjcFAAD4K1hTBQAAAAAAoBuEKgAAAAAAAN1g+i8AAAAAAIBuMFIFAAAAAACgG4QqAAAAAAAA3SBUAQAAAAAA6AahCgAAAAAAQDcIVQAAAAAAALpBqAIAAAAAANANQhUAAAAAAIBuEKoAAAAAAAB0g1AFAAAAAACgG/4fIolGR1fGeTwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(20,10))\n", "plt.grid()\n", "plt.plot(np.cumsum(pca.explained_variance_ratio_))\n", "plt.xlabel('number of components')\n", "plt.ylabel('cumulative explained variance');" ] }, { "cell_type": "markdown", "id": "f9ce2e58", "metadata": {}, "source": [ "As can be seen from the chart above, the elbow value is approximately 100" ] }, { "cell_type": "code", "execution_count": 14, "id": "7a85daf7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
PCA(n_components=100)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "PCA(n_components=100)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pca = PCA(n_components=100)\n", "pca.fit(extracted_features_cleaned_std)" ] }, { "cell_type": "code", "execution_count": 15, "id": "068dbcf5", "metadata": {}, "outputs": [], "source": [ "scores_pca = pca.transform(extracted_features_cleaned_std)" ] }, { "cell_type": "markdown", "id": "5399c791", "metadata": {}, "source": [ "Finding the optimal number of clusters to use - Adding more clusters decreases the inertia value but the information contained in each cluster also decreases. Hence we want to have a small cluster size with a relatively small inertia value. As with finding the optimal number of clusters, the elbow heuristic works well here." ] }, { "cell_type": "code", "execution_count": 16, "id": "479a3f46", "metadata": {}, "outputs": [], "source": [ "from sklearn.cluster import KMeans" ] }, { "cell_type": "code", "execution_count": 17, "id": "4f138c00", "metadata": {}, "outputs": [], "source": [ "wcss = []\n", "for i in range(1,10):\n", " km = KMeans(n_clusters=i) \n", " km.fit(scores_pca)\n", " wcss.append(km.inertia_)" ] }, { "cell_type": "code", "execution_count": 18, "id": "16433aa2", "metadata": {}, "outputs": [ { "data": { "image/png": "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7ZpvvHX7TPvcxLxx+0Et939/85M56Izrc94ds7N2XXOBCQEAAAA2vVaXKuPHj8+Pf/zjl3z+ox/9KPvtt98GCQUAtA31PetSXVVKkpTL5Vw4/enMWrQin/vz/dn/9Ovy22mzsnLtuoJTAgAAAGwarS5VTj755Fx++eU54ogjcvvtt6ehoSENDQ257bbb8va3vz1XXnllTj755I2ZFQAoUKlUyp9P2DtffOO2qe/ROfMaVuerlz6Ufb99XX5y7WNpWNVYdEQAAACAjaqmtQN33nnnXHjhhXnf+96Xiy++eL1nffv2zfnnn59ddtllgwcEANqO7p1r8sHxI3LcXsNy0V1z8/PrZ2b24pX57lWP5omFK3LGUTsVHREAAABgo2l1qTJr1qy8+c1vzlNPPZUrr7wyjz32WMrlckaNGpVJkyala9euGzMnANCG1NVW59g9tsg7dhuSv98/L2dOnZn37ze85fn8htVpbGrO0D5+PgAAAADaj1aXKiNHjsywYcMyceLETJw4Mcccc0yGDBmyMbMBAG1cTXVV3rLT4By24+YplUot9394zWM5/845ectOm+eECSOzVX2PAlMCAAAAbBitLlWuvfbaTJ06NVOnTs2f/vSnrF27NiNGjMgBBxzQUrQMGDBgY2YFANqo/yxUyuVyFixdnabmci66a24uvntuDhkzMCdMHJkdhvQuLiQAAADA69TqUmXChAmZMGFCkmT16tW5+eabW0qW3//+92lsbMw222yTBx98cGNlBQAqQKlUym/eOy73zlmSn019PFc++GyueHB+rnhwfvbbul8+esDW2X14n6JjAgAAALxqrS5V/lNdXV0OOOCA7Lvvvpk4cWIuv/zy/OIXv8gjjzyyofMBABVqx6G984vjdsujzy7Lz6fOzF/vfSY3PrYoOw3trVQBAAAAKtKrKlXWrl2bW2+9Ndddd12mTp2a2267LUOHDs348ePzk5/8JPvvv//GygkAVKhRA3rkjKN2yicPHpVf3/hE3rv3li3P7nxycZ5pWJ03bT8o1VWll/4iAAAAAG1Aq0uVAw44ILfddluGDx+e/fffPx/+8IdzzjnnZNCgQRszHwDQTgzt0zWnvmXsevdOv3JGbpu1ON+7akY+sv/IvG2XwelcU11QQgAAAICXV9XagTfeeGP69u2bAw44IAceeGAOPvhghQoA8Jo1NZez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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(20,10))\n", "plt.grid()\n", "plt.plot(range(1,10),wcss,marker='o',linestyle='--')\n", "plt.xlabel('number of clusters')\n", "plt.ylabel('WCSSS');" ] }, { "cell_type": "markdown", "id": "299bad7b", "metadata": {}, "source": [ "As can be seen from the chart above, the elbow value is 2" ] }, { "cell_type": "code", "execution_count": 19, "id": "6150f3b9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([0, 1], dtype=int32), array([4558, 47]))" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# cluster configuration\n", "N_CLUSTERS = 2\n", "\n", "km = KMeans(\n", " n_clusters=N_CLUSTERS\n", ")\n", "pca_km = km.fit_predict(scores_pca)\n", "np.unique(pca_km,return_counts=True)" ] }, { "cell_type": "markdown", "id": "9fbe3c6b", "metadata": {}, "source": [ "## Generate TTS for different clusters" ] }, { "cell_type": "markdown", "id": "28ec256d", "metadata": {}, "source": [ "### Train - Hold-out Split\n", "\n", "Hold-out set offers a way for verifying model performance on unseen data. With this dataset, we are looking to forecast a week out (Forecast Horizon = 1 Week) and therefore leave out a week worth of data out from the TTS as holdout set." ] }, { "cell_type": "markdown", "id": "b8958556", "metadata": {}, "source": [ "## Split data into clusters" ] }, { "cell_type": "code", "execution_count": 20, "id": "a751a674", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((4605, 2),\n", " StockCode object\n", " label int32\n", " dtype: object)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# lookup dataframe with item_ids and corresponding labels\n", "df_lbl = pd.DataFrame()\n", "extracted_features_cleaned['StockCode']=extracted_features_cleaned.index\n", "df_lbl['StockCode'] = extracted_features_cleaned['StockCode']\n", "df_lbl['label'] = pca_km\n", "\n", "df_lbl.shape, df_lbl.dtypes" ] }, { "cell_type": "code", "execution_count": 21, "id": "2934e57a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1690035, 4) (1690035, 3)\n", "(32235, 4) (32235, 3)\n" ] } ], "source": [ "# merge labels back to the TTS\n", "df_mrg = df_train.merge(df_lbl, how='left')\n", "df_mrg_test = df_test.merge(df_lbl, how='left')\n", "\n", "print(df_mrg.shape, df_train.shape)\n", "print(df_mrg_test.shape, df_test.shape)" ] }, { "cell_type": "code", "execution_count": 22, "id": "2eb89898", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StockCodetimestamptarget_valuelabel
380423851752010-02-210.00
1485621851732010-10-190.00
57229228022009-12-130.00
105895590124B2010-07-182.00
1424033218202010-10-0618.00
\n", "
" ], "text/plain": [ " StockCode timestamp target_value label\n", "380423 85175 2010-02-21 0.0 0\n", "1485621 85173 2010-10-19 0.0 0\n", "57229 22802 2009-12-13 0.0 0\n", "1058955 90124B 2010-07-18 2.0 0\n", "1424033 21820 2010-10-06 18.0 0" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_mrg.sample(5)" ] }, { "cell_type": "code", "execution_count": 23, "id": "2b517525", "metadata": {}, "outputs": [], "source": [ "# create required directory structure\n", "dir_paths = ['./train']\n", "for i in range(N_CLUSTERS):\n", " dir_paths.append(f\"./train/cls_{i+1}_TSF\")\n", "\n", "for dir_path in dir_paths:\n", " if not os.path.exists(dir_path):\n", " os.makedirs(dir_path)" ] }, { "cell_type": "code", "execution_count": 24, "id": "8fb80b8e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1690035 1690035\n" ] } ], "source": [ "# split and save TTS\n", "record_count = 0\n", "for i in range(N_CLUSTERS):\n", " df_tmp = df_mrg[['StockCode', 'timestamp', 'target_value']][df_mrg['label']==i]\n", " df_tmp.to_csv(f\"./train/cls_{i+1}_TSF/tts_{i+1}_TSF.csv\", header=None, index=None)\n", " df_tmp2 = df_mrg_test[['StockCode', 'timestamp', 'target_value']][df_mrg_test['label']==i]\n", " df_tmp2.to_csv(f\"./train/cls_{i+1}_TSF/test_{i+1}_TSF.csv\", header=None, index=None)\n", " record_count += df_tmp.shape[0]\n", " \n", "print(record_count, df_mrg.shape[0]) # verify that all time series are retained" ] }, { "cell_type": "markdown", "id": "6a6aafc6", "metadata": {}, "source": [ "Now you can train separate predictors for each cluster" ] }, { "cell_type": "code", "execution_count": null, "id": "edf8a518", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.15" } }, "nbformat": 4, "nbformat_minor": 5 }