{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "# Clustering: Picking the 'K' hyperparameter\n", "The unsupervised machine learning technique of clustering data into similar groups can be useful and fairly efficient in most cases. The big trick is often how you pick the number of clusters to make (the K hyperparameter). \n", "The number of clusters may vary dramatically depending on the characteristics of the data, the different types of variables (numeric or categorical), how the data is normalized/encoded and the distance metric used.\n", "\n", "
\n", "\n", "**For this notebook we're going to focus specifically on the following:**\n", "- Optimizing the number of clusters (K hyperparameter) using Silhouette Scoring\n", "- Utilizing an algorithm (DBSCAN) that automatically determines the number of clusters\n", "\n", "\n", "### Software\n", "- Zeek Analysis Tools (ZAT): https://github.com/SuperCowPowers/zat\n", "- Pandas: https://github.com/pandas-dev/pandas\n", "- Scikit-Learn: http://scikit-learn.org/stable/index.html\n", "\n", "
\n", "\n", "### Techniques\n", "- One Hot Encoding: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html\n", "- t-SNE: https://distill.pub/2016/misread-tsne/\n", "- Kmeans: http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html\n", "- Silhouette Score: https://en.wikipedia.org/wiki/Silhouette_(clustering)\n", "- DBSCAN: https://en.wikipedia.org/wiki/DBSCAN" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ZAT: 0.3.6\n", "Pandas: 0.25.1\n", "Scikit Learn Version: 0.21.2\n" ] } ], "source": [ "# Third Party Imports\n", "import pandas as pd\n", "import numpy as np\n", "import sklearn\n", "from sklearn.manifold import TSNE\n", "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n", "from sklearn.cluster import KMeans, DBSCAN\n", "\n", "# Local imports\n", "import zat\n", "from zat.log_to_dataframe import LogToDataFrame\n", "from zat.dataframe_to_matrix import DataFrameToMatrix\n", "\n", "# Good to print out versions of stuff\n", "print('ZAT: {:s}'.format(zat.__version__))\n", "print('Pandas: {:s}'.format(pd.__version__))\n", "print('Scikit Learn Version:', sklearn.__version__)" ] }, { "cell_type": "code", "execution_count": 2, "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", "
uidid.orig_hid.orig_pid.resp_hid.resp_ptrans_depthmethodhosturireferrer...info_msgfilenametagsusernamepasswordproxiedorig_fuidsorig_mime_typesresp_fuidsresp_mime_types
ts
2013-09-15 23:44:27.668081999CyIaMO7IheOh38Zsi192.168.33.10103154.245.228.191801GETguyspy.com/NaN...NaNNaN(empty)NaNNaNNaNNaNNaNFnjq3r4R0VGmHVWiN5text/html
2013-09-15 23:44:27.731701851CoyZrY2g74UvMMgp4a192.168.33.10103254.245.228.191801GETwww.guyspy.com/NaN...NaNNaN(empty)NaNNaNNaNNaNNaNFCQ5aX37YzsjAKpcv8text/html
2013-09-15 23:44:28.092921972CoyZrY2g74UvMMgp4a192.168.33.10103254.245.228.191802GETwww.guyspy.com/wp-content/plugins/slider-pro/css/advanced-sl...http://www.guyspy.com/...NaNNaN(empty)NaNNaNNaNNaNNaNFD9Xu815Hwui3sniSftext/html
2013-09-15 23:44:28.150300980CiCKTz4e0fkYYazBS3192.168.33.10104054.245.228.191801GETwww.guyspy.com/wp-content/plugins/contact-form-7/includes/cs...http://www.guyspy.com/...NaNNaN(empty)NaNNaNNaNNaNNaNFMZXWm1yCdsCAU3K9dtext/plain
2013-09-15 23:44:28.150601864C1YBkC1uuO9bzndRvh192.168.33.10104154.245.228.191801GETwww.guyspy.com/wp-content/plugins/slider-pro/css/slider/adva...http://www.guyspy.com/...NaNNaN(empty)NaNNaNNaNNaNNaNFA4NM039Rf9Y8Sn2Rhtext/plain
\n", "

5 rows × 26 columns

\n", "
" ], "text/plain": [ " uid id.orig_h id.orig_p \\\n", "ts \n", "2013-09-15 23:44:27.668081999 CyIaMO7IheOh38Zsi 192.168.33.10 1031 \n", "2013-09-15 23:44:27.731701851 CoyZrY2g74UvMMgp4a 192.168.33.10 1032 \n", "2013-09-15 23:44:28.092921972 CoyZrY2g74UvMMgp4a 192.168.33.10 1032 \n", "2013-09-15 23:44:28.150300980 CiCKTz4e0fkYYazBS3 192.168.33.10 1040 \n", "2013-09-15 23:44:28.150601864 C1YBkC1uuO9bzndRvh 192.168.33.10 1041 \n", "\n", " id.resp_h id.resp_p trans_depth method \\\n", "ts \n", "2013-09-15 23:44:27.668081999 54.245.228.191 80 1 GET \n", "2013-09-15 23:44:27.731701851 54.245.228.191 80 1 GET \n", "2013-09-15 23:44:28.092921972 54.245.228.191 80 2 GET \n", "2013-09-15 23:44:28.150300980 54.245.228.191 80 1 GET \n", "2013-09-15 23:44:28.150601864 54.245.228.191 80 1 GET \n", "\n", " host \\\n", "ts \n", "2013-09-15 23:44:27.668081999 guyspy.com \n", "2013-09-15 23:44:27.731701851 www.guyspy.com \n", "2013-09-15 23:44:28.092921972 www.guyspy.com \n", "2013-09-15 23:44:28.150300980 www.guyspy.com \n", "2013-09-15 23:44:28.150601864 www.guyspy.com \n", "\n", " uri \\\n", "ts \n", "2013-09-15 23:44:27.668081999 / \n", "2013-09-15 23:44:27.731701851 / \n", "2013-09-15 23:44:28.092921972 /wp-content/plugins/slider-pro/css/advanced-sl... \n", "2013-09-15 23:44:28.150300980 /wp-content/plugins/contact-form-7/includes/cs... \n", "2013-09-15 23:44:28.150601864 /wp-content/plugins/slider-pro/css/slider/adva... \n", "\n", " referrer ... info_msg filename \\\n", "ts ... \n", "2013-09-15 23:44:27.668081999 NaN ... NaN NaN \n", "2013-09-15 23:44:27.731701851 NaN ... NaN NaN \n", "2013-09-15 23:44:28.092921972 http://www.guyspy.com/ ... NaN NaN \n", "2013-09-15 23:44:28.150300980 http://www.guyspy.com/ ... NaN NaN \n", "2013-09-15 23:44:28.150601864 http://www.guyspy.com/ ... NaN NaN \n", "\n", " tags username password proxied orig_fuids \\\n", "ts \n", "2013-09-15 23:44:27.668081999 (empty) NaN NaN NaN NaN \n", "2013-09-15 23:44:27.731701851 (empty) NaN NaN NaN NaN \n", "2013-09-15 23:44:28.092921972 (empty) NaN NaN NaN NaN \n", "2013-09-15 23:44:28.150300980 (empty) NaN NaN NaN NaN \n", "2013-09-15 23:44:28.150601864 (empty) NaN NaN NaN NaN \n", "\n", " orig_mime_types resp_fuids \\\n", "ts \n", "2013-09-15 23:44:27.668081999 NaN Fnjq3r4R0VGmHVWiN5 \n", "2013-09-15 23:44:27.731701851 NaN FCQ5aX37YzsjAKpcv8 \n", "2013-09-15 23:44:28.092921972 NaN FD9Xu815Hwui3sniSf \n", "2013-09-15 23:44:28.150300980 NaN FMZXWm1yCdsCAU3K9d \n", "2013-09-15 23:44:28.150601864 NaN FA4NM039Rf9Y8Sn2Rh \n", "\n", " resp_mime_types \n", "ts \n", "2013-09-15 23:44:27.668081999 text/html \n", "2013-09-15 23:44:27.731701851 text/html \n", "2013-09-15 23:44:28.092921972 text/html \n", "2013-09-15 23:44:28.150300980 text/plain \n", "2013-09-15 23:44:28.150601864 text/plain \n", "\n", "[5 rows x 26 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a Pandas dataframe from the Zeek log\n", "log_to_df = LogToDataFrame()\n", "http_df = log_to_df.create_dataframe('../data/http.log')\n", "\n", "# Print out the head of the dataframe\n", "http_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Our HTTP features are a mix of numeric and categorical data\n", "When we look at the http records some of the data is numerical and some of it is categorical so we'll need a way of handling both data types in a generalized way. We have a DataFrameToMatrix class that handles a lot of the details and mechanics of combining numerical and categorical data, we'll use below." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "## Transformers\n", "**We'll now use the Scikit-Learn tranformer class to convert the Pandas DataFrame to a numpy ndarray (matrix). The transformer class takes care of many low-level details**\n", "* Applies 'one-hot' encoding for the Categorical fields\n", "* Normalizes the Numeric fields\n", "* The class can be serialized for use in training and evaluation\n", " * The categorical mappings are saved during training and applied at evaluation\n", " * The normalized field ranges are stored during training and applied at evaluation" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Normalizing column id.resp_p...\n", "Normalizing column request_body_len...\n", "\n", "NOTE: The resulting numpy matrix has 12 dimensions based on one-hot encoding\n", "(150, 12)\n" ] }, { "data": { "text/plain": [ "array([[0., 0., 1., 0., 0., 1., 0., 0., 0., 0., 0., 0.]], dtype=float32)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# We're going to pick some features that might be interesting\n", "# some of the features are numerical and some are categorical\n", "features = ['id.resp_p', 'method', 'resp_mime_types', 'request_body_len']\n", "\n", "# Use the DataframeToMatrix class (handles categorical data)\n", "# You can see below it uses a heuristic to detect category data. When doing\n", "# this for real we should explicitly convert before sending to the transformer.\n", "to_matrix = DataFrameToMatrix()\n", "http_feature_matrix = to_matrix.fit_transform(http_df[features], normalize=True)\n", "\n", "print('\\nNOTE: The resulting numpy matrix has 12 dimensions based on one-hot encoding')\n", "print(http_feature_matrix.shape)\n", "http_feature_matrix[:1]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Plotting defaults\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.rcParams['font.size'] = 12.0\n", "plt.rcParams['figure.figsize'] = 14.0, 7.0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "# Silhouette Scoring\n", "\"The silhouette value is a measure of how similar an object is to its own cluster (cohesion) compared to other clusters (separation). The silhouette ranges from -1 to 1, where a high value indicates that the object is well matched to its own cluster and poorly matched to neighboring clusters. If most objects have a high value, then the clustering configuration is appropriate. If many points have a low or negative value, then the clustering configuration may have too many or too few clusters.\"\n", "- https://en.wikipedia.org/wiki/Silhouette_(clustering)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzUAAAGvCAYAAABijvvgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3hUVeLG8fdMeqdDIITeO4Qi6NpRF7suu4CIIk1s67q2VXctu+7q7vpz7WJDqoqABVFXBV0VC6EECDWU0AMJkErKzJzfH4kYYoABktyZ5Pt5njyZOTkz8xIxmZdz77nGWisAAAAACFQupwMAAAAAwOmg1AAAAAAIaJQaAAAAAAGNUgMAAAAgoFFqAAAAAAS0YKcDSFKjRo1s69atnY4BAAAAwE8tW7Ys01rbuLKv+UWpad26tZKTk52OAQAAAMBPGWPSj/U1Dj8DAAAAENAoNQAAAAACGqUGAAAAQECj1AAAAAAIaH6xUQAAAABQm3m9Xu3cuVP5+flOR/FrUVFRSkhIkMt1cmsvlBoAAACgmmVmZsoYo06dOp30G/a6wuv1ateuXcrMzFSTJk1O6rF8RwEAAIBqdujQITVt2pRCcxwul0tNmzZVdnb2yT+2GvIAAAAAKMfj8SgkJMTpGH4vJCREbrf7pB9HqQEAAABqgDHG6Qh+71S/R5QaAAAAAAGNUgMAAAAgoFFqAAAAAAQ0n0qNMeZWY0yyMabIGDP1BHPvNMbsNcbkGGNeN8aEVUlSAAAAAAHFWiuv11vtr+PrSs1uSX+V9PrxJhljLpJ0n6TzJbWS1FbSI6cTEAAAAED1euKJJ9SiRQvFxMSoU6dO+uKLL+TxePT444+rXbt2iomJUb9+/bRjxw5J0pIlS9S/f3/FxcWpf//+WrJkyZHnOuecc/TAAw9oyJAhioyM1JYtW5Sdna2bbrpJ8fHxatGihR588EF5PJ4qy+/TxTettfMkyRiTJCnhOFPHSHrNWptaNv8xSTNVWnQAAIAfyT5cohKPV42iOagCqGmPfJiqtbtzqvU1ujaP1V8u63bCeRs2bNBzzz2npUuXqnnz5tq2bZs8Ho+eeuopzZ49WwsXLlTHjh21atUqRUZG6sCBAxo2bJieeeYZjRgxQnPmzNGwYcOUlpamhg0bSpKmT5+ujz/+WJ06dZK1VsOHD1eTJk2Ulpam/Px8XXrppWrZsqUmTpxYJX9Wn0rNSegm6f1y91MkNTXGNLTWZpWfaIyZIGmCJCUmJlZxDAAAcCx7swv18v82a/aP21VYUlpqOjeLKf2Ij1XnZjFq3yRa4SFBTkcFUAOCgoJUVFSktWvXqnHjxmrdurUk6dVXX9WTTz6pTp06SZJ69eolqbSwdOjQQaNHj5YkjRgxQs8884w+/PBD3XDDDZKkG264Qd26lRaqjIwMLVy4UIcOHVJERISioqJ05513asqUKX5baqIllb8E6E+3YyQdVWqstVMkTZGkpKQkW8U5AABABTsOFOilrzZrTvJOeazVlb1bqEt8jDbszdX6vbma/n26itylx74HuYxaN4xU5/hYdWkWo07NSstOQv0IrrUBVAFfVlBqSvv27fX000/r4YcfVmpqqi666CI99dRT2rFjh9q1a/eL+bt371arVq2OGmvVqpV27dp15H7Lli2P3E5PT1dJSYni4+OPjHm93qPmnK6qLjV5kmLL3f/pdm4Vvw4AAPDRlv15euHLzZq/YpeCjNG1SQm6+ex2atkg8qh5Hq/Vtqx8rd+Tqw17c7Rub65W7Tykj1btOTInJixYHX9a1Slb2enULEax4VwpHQhkI0eO1MiRI5WTk6OJEyfq3nvvVcuWLbV582Z17979qLnNmzdXenr6UWPbt2/XxRdffOR++X/8aNmypcLCwpSZmang4KquH6Wq+llTJfWS9E7Z/V6SMioeegYAAKrfhr25en5xmhas2q2QIJeuP6OVJvyqreLjIiqdH+Qyatc4Wu0aR2tYz5//RTWvyF22mpNT+nlPrj5M2a2ZP7iPzGlRL6Ks5JSu6nRpFqM2jaIUHMTVIwB/t2HDBu3atUtDhgxReHi4IiIi5PF4NG7cOD300EPq2rWr2rdvr9WrV6tFixb69a9/rdtuu02zZs3S8OHDNXfuXK1du1aXXnpppc8fHx+voUOH6q677tJjjz2m6Ohobd26VTt37tTZZ59dJX8Gn0qNMSa4bG6QpCBjTLgkt7XWXWHqNElTjTEzVbpj2oOSplZJUgAA4JPVO7P13OJN+jQ1Q1GhQRr/q7Yad2ZbNY45tQ0BosOC1a9VffVrVf/ImLVWe7ILtX5vjtaXFZ31e3P01cb9cntLjyoPDXapfeNodY6PUZdmpSs6neNj1Dg6jEPYAD9SVFSk++67T+vWrVNISIgGDx6sKVOmqGnTpioqKtLQoUOVmZmpzp07a/78+UpISNCCBQt0xx136Oabb1b79u21YMECNWrU6JivMW3aNN13333q2rWrcnNz1bZtW917771V9mcw1p74dBZjzMOS/lJh+BGVbvG8VlJXa+32srl/kHSvpAhJcyVNstYWHe/5k5KSbHJy8kmHBwAAP1uWflDPLdqkxRv2KyY8WDcOaaMbB7dW/ajQGstQ5PZo8778I6s66/bmav2eHO3L/fmtQIOo0LLD12KPrO50aBKjiFA2JkDttW7dOnXp0sXpGAHhWN8rY8wya21SZY/xdUvnhyU9fIwvR1eY+5Skp3x5XgAAcHqstfpuS5aeW5SmJZuzVD8yRHdf1Emjz2jlyHkuYcFB6to8Vl2bxx41fiC/uHRVZ0/ukUPZZv2YrsKS0o0JXEZq3TBKneNLy06nZqWrOwn1I+RysaoD4Piq50wdAABQray1+mrjfj23KE3J6QfVOCZMDw7ropEDExUZ6n+/3htEhWpwu0Ya3O7nw1M8XqvtBwq0fk/ZIWx7c5S6O0cfr9mrnw4kiQoNKtuYIPbnzQmaxSouko0JAPzM/37qAQCAY/J6rT5bl6HnFqVp9a5sNY8L16NXdNPwpJYBd12ZIJdRm0ZRatMoSpf0+HljgvwitzZmlG4zvWFvrtbtydHC1Xs0+8ftR+bEx4UfdV2dzs1i1bZxlELYmACokyg1AAAEAI/XauHqPXp+cZrW781VYoNIPXFND13VJ0GhwbXrjXxUWLD6JNZXn8SjNybIyCnSuiOHsJWu7ny9KfPIxgQhQaW7t3Up22a6c7MYdYmPVZMY/9uYwFort9fK4y377LFye70/3z/y2Su318rtsRW+5q3w2ErGvVZBxig6PFgx4cGKCQ8p+xysmLAQhYe4/O77UttZa/men4Av5/tXhlIDAIAfK/F49f7K3XphcZq2ZOarXeMo/d9ve+myns3r1HbJxhg1iwtXs7hwndupyZHxYrdXWzLzynZfKz2E7bvNWZq/4ueLANaLDDmymtM4JkzeYxSHX5aECuPl5/+iZFSYX7GkVCgeXj+47Hiwy/yi7ESHhSi2QgmKLnc7tvx4WLCiQoM558lHQUFBKikpUWhozW3cEYhKSkpO6Vo2lBoAAPxQkdujuct26cWv0rTjwGF1iY/VC6P66uJuzXgTWU5osKvsfJujNyY4VFBcttV0jjZk5Grdnly9vXSHDpd4jsxxGSnY5VKQyyg4yCjYZRTkcpV9Lh0LclUyXvY5LMSlyErGj5ofdIzxn+5X8rohQZW/XvCxxsv9GSqOu71e5Ra6lVfkVm5hiXIL3cop/Pl2XrnbuYVu7TxYcNT8E5UvY0q3/I49qhiVL0o/l6HoshWiXxap4DpR0OvVq6eMjAy1aNFCLlft//OeCq/Xq4yMDMXFxZ30Y33a0rm6saUzAAClDhd79NbS7Xr5qy3am1OoXi3r6bZz2+v8Lk04bOU0eb1WRW5v6Zt/YyiHJ2CtVUGxp6zwlCinQjkqX4aOul9UvjC5VezxnvC1IkODjl4dqlCUyo/HhIcctWL002pSWLB/n1Pm9Xq1c+dO5efnOx3Fr0VFRSkhIaHS4nfaWzoDAIDqlVfk1szv0/XK11uUmVesAa0b6J+/6akz2zeizFQRl8twLZyTYIxRVFiwosKC1Swu/JSfp7DEc1Tp+akY5VQoQ3nlClFOoVu7Dh0+Ml5+he1YQoNdigwNkssYuUxpfiPJZYyMKf0sSS5X2VjZ11T2NZeRjErnmrL7Pz325+eqbMzI5TrGY8u+j6Wvf4zHmp/nGFXyuuUfe9Tzla0YBrvKPoIUFlLudrBLoccYL70fdOSxtWGljFIDAICDsg+X6M0l2/T6t1t1qKBEZ3VopFvPba+BbRs6HQ2oEuEhQQoPCVLjmLBTfo4Sj/fIyk9OhXJUvhgVFHtkZWWt5LWlq02lt62syj6XjXutyo2Vm1f+sSo/VvZYWXm9ZZ+t5PZ6ZT3lX0OVPF/pkVHen173yHP9NPZTrp+z/fR85Z+r4mPdXq+K3N4jW6CfquOVo9Aj474VpLCQoEq/ftTzhAQd9ZwhQea0//GGUgMAgAMO5Bfr9W+26s0l25Rb5NYFXZrolnPbH7XjF4BSIUEu1Y8KVf0oTrKv6Ked9IrcXhWVeEo/u70qcntUVHL07WJP5eNHbru9Zfd/+Ty5hW4Vuyt8rez13Ke584UxOn5RKitTx0OpAQCgBu3LKdQrX2/RjO+3q9Dt0SXdm+mWc9urW/OTPzEWAIwp3VwiJMil6DBn3tq7PWWF6bgFyVNWiiopTscrY2XzD+YXHzcDpQYAgBqw+9BhvfzVZs1eukNuj1dX9G6hyee0U4emMU5HA4DTEhxUel5OZDUvpJnbjpOhel8aAIC6LT0rXy9+uVlzl++UtdI1fRN08znt1LpRlNPRAKDWoNQAAFAN0vbl6oXFm/V+ym4FuYxGDEjUxLPbqUW9CKejAUCtQ6kBAKAKrd2do+cXp2nhmj0KDw7SjYNba/yv2qpp7KlviQsAOD5KDQAAVWDljkN6blGaPl+XoeiwYE0+p53GDmmjhtGnvo0tAMA3lBoAAE7Dj1sP6NlFm/T1pkzFRYTozgs66obBrRUXGeJ0NACoMyg1AACcJGutvk3L0jOLNunHrQfUKDpU913SWdcNauXYlqoAUJfxkxcAAB9Za7Vo/T49uyhNK3ccUtPYMP350q4aMSBREaFBTscDgDqLUgMAwAl4vVafpu7Vs4vStHZPjhLqR+hvV3XXtf0SFBZMmQEAp1FqAAA4BrfHqwWr9uj5xWnatC9PbRpF6Z/X9tSVfVooJMjldDwAQBlKDQAAFRS7vXpvxS698GWatmUVqGPTaD0zoo+G9YhXkMs4HQ8AUAGlBgCAMoUlHs1J3qGXvtqiXYcOq3uLWL10XT8N7dpULsoMAPgtSg0AAJL+t3G/7p+3WrsOHVbfxHr661XddU7HxjKGMgMA/o5SAwCo03IKS/S3Bev0dvIOtWscpZnjBmpwu4aUGQAIIJQaAECdtXj9Pt0/b7X25RZq0tnt9PsLOig8hN3MACDQUGoAAHVOdkGJHl2wVnOX71SHJtF6afQQ9W5Zz+lYAIBTRKkBANQpn6/N0J/mr1ZWfrFuPbe9bju/PdeaAYAAR6kBANQJB/OL9ciHqXpv5W51bhaj18b0V4+EOKdjAQCqAKUGAFDrfZq6Vw/MX6NDBcW6/fwOuvXc9goN5uKZAFBbUGoAALXWgfxi/eWDVH2Ysltd42P15tj+6tac1RkAqG0oNQCAWmnh6j166L01yiks0R8u7Kibz2mnkCBWZwCgNqLUAABqlcy8Iv3l/VR9tHqPureI1czfDFTnZrFOxwIAVCNKDQCgVrDWasGqPfrLB6nKK3Tr7os6acKv2rI6AwB1AKUGABDw9uUW6qH31ujT1Az1SojTP3/TSx2bxjgdCwBQQyg1AICAZa3V+yt36+EPU1VQ7NF9l3TWuDPbKJjVGQCoUyg1AICAtC+nUH+av0afr8tQn8R6+ue1vdS+SbTTsQAADqDUAAACirVW85bv0iMfpqrI7dWDw7roxiFtFOQyTkcDADiEUgMACBh7swt1/7xVWrxhv5Ja1deT1/ZU28aszgBAXUepAQD4PWut5iTv1GMfrVWJx6s/X9pVYwa3ZnUGACCJUgMA8HO7Dx3WffNW638b92tAmwZ68pqeat0oyulYAAA/QqkBAPgla63eWrpDf/tonbzW6pHLu2n0oFZysToDAKiAUgMA8Ds7Dxbovrmr9U1aps5o21BPXttTLRtEOh0LAOCnKDUAAL/h9VrN/HG7/rFwnSTpr1d218gBiazOAACOi1IDAPAL27MKdO/cVfpuS5bObN9I/7imhxLqszoDADgxSg0AwFFer9X079P1j4/XK8hl9I+re+i3/VvKGFZnAAC+odQAAByzLTNf98xdpR+3HtDZHRvr71f3UPN6EU7HAgAEGJcvk4wxDYwx840x+caYdGPMyGPMq2eMedMYs6/s4+EqTQsAqBU8XqvXvtmqi//zP63bk6Mnr+2pqTf2p9AAAE6Jrys1z0sqltRUUm9JHxljUqy1qRXm/Z+kSEmtJTWR9IUxJt1a+0YV5QUABLgt+/N0z7urlJx+UOd1bqLHr+qhZnHhTscCAASwE5YaY0yUpGskdbfW5kn6xhjzgaTRku6rMP0ySZdYawskbTPGvCZprCRKDQDUcR6v1evfbNW//rtBYcEuPTW8l67q04JzZwAAp82XlZqOktzW2o3lxlIknX2M+abC7e6VTjJmgqQJkpSYmOhDDABAoErbl6u7312lFdsP6YIuTfX4Vd3VJJbVGQBA1fCl1ERLyqkwli0pppK5n0i6zxgzRqWHqo1V6eFov2CtnSJpiiQlJSVZXwMDAAKH2+PVK19v1f99vlGRoUH6z+966/JezVmdAQBUKV9KTZ6k2ApjsZJyK5l7u6RnJW2SlCVptqQRpxMQABCYNmbk6u45KUrZma2LuzXTY1d2V+OYMKdjAQBqIV9KzUZJwcaYDtbaTWVjvSRV3CRA1toDkkb9dN8Y87ikH6siKAAgMJR4vHr5q8165os0RYcH67mRfTSsRzyrMwCAanPCUmOtzTfGzJP0qDFmnEp3P7tC0uCKc40x7SQdKvsYqtJzZo517g0AoJZZtydHd7+bojW7cjSsZ7wevbybGkazOgMAqF6+buk8WdLrkvap9LCym621qcaYsyR9bK2NLpvXT9LTkuqpdIVnVCXbPgMAapkSj1cvLN6s5xZvUlxEiF4c1VeX9Ih3OhYAoI7wqdSUHVZ2ZSXjX6t0I4Gf7r8j6Z0qSwcA8Hupu7N195xVWrsnR5f3aq6HL++mBlGhTscCANQhvq7UAABwlGK3V88tTtMLi9NULzJUL4/up4u6NXM6FgCgDqLUAABO2uqd2br73RSt35urq/u00J8v66p6kazOAACcQakBAPisyO3RM19s0ktfbVGj6FC9NiZJ53dp6nQsAEAdR6kBAPgkZcch3f1uijZm5Onafgl6aFhXxUWGOB0LAABKDQDg+ApLPHr6802a8r/NahITrjdu7K9zOzVxOhYAAEdQagAAx7R8+0HdPSdFm/fn63f9W+pPw7ooNpzVGQCAf6HUAAB+obDEo6c+26hXv96i+LgITRs7QL/q2NjpWAAAVIpSAwA4yrL0g7r73RRt2Z+vkQMTdf8lnRXD6gwAwI9RagAAkkpXZ/793w169Zutah4XoRk3DdSZHRo5HQsAgBOi1AAAlLztgO55d5W2ZOZr1MBE3f/rLooO41cEACAw8BsLAOqww8Ue/eu/G/T6t6WrMzPHDdSQ9qzOAAACC6UGAOqopdsO6O45KdqWVaDRg1rp3ks6szoDAAhI/PYCgDrmcLFHT366XlOXbFNC/QjNGj9Qg9uxOgMACFyUGgCoQ37cekB3v5ui9KwCjTmjle65uLOiWJ0BAAQ4fpMBQB1QUOzWk59s0JvfbVPL+pGaPX6QzmjX0OlYAABUCUoNANRyP2zJ0j1zVyk9q0A3DG6tey7upMhQfvwDAGoPfqsBQC2VX+TWk5+s15vfpSuxQaTemjBIg9qyOgMAqH0oNQBQC323OUv3zE3RjgOHWZ0BANR6/IYDgFokv8itJz5Zr2nfpatVw0i9PWGQBrI6AwCo5Sg1AFBLLNmcqXveXaVdhw5r7JA2uvuiTooIDXI6FgAA1Y5SAwABLr/Irb9/vE4zvt+u1g0j9c7EM9S/dQOnYwEAUGMoNQAQwJakZeqeuaWrMzed2UZ/HMrqDACg7qHUAEAAyity6+8L12nmD9vVtlGU3p10hvq1YnUGAFA3UWoAIMB8m1Z67szu7MMaf1Yb3TW0k8JDWJ0BANRdlBoACBC5hSX6+8frNYvVGQAAjkKpAYAA8PWm/bpv7mrtyT6sCb9qqz9c2JHVGQAAylBqAMCP5RaW6PGF6zT7xx1q2zhKcyYNVr9W9Z2OBQCAX6HUAICf+mrjft0/d5X25hRq4tltdecFrM4AAFAZSg0A+JmcwhL9bcE6vZ28Q+0aR2nuzYPVJ5HVGQAAjoVSAwB+5MsN+3T/vNXKyCnUpLPb6fcXdGB1BgCAE6DUAIAfyD5cor99tFbvJO9UhybRenHyEPVuWc/pWAAABARKDQA4bPGGfbp/7mrtyy3U5HPa6fbzWZ0BAOBkUGoAwCHZh0v01wVrNWfZTnVsGq2XRw9RL1ZnAAA4aZQaAHDAovUZun/eamXmFeuWc0tXZ8KCWZ0BAOBUUGoAoAZlF5To0QVrNXf5TnVqGqNXrk9SzwRWZwAAOB2UGgCoIV+sK12dycov1m3ntdet57VndQYAgCpAqQGAapZdUKJHPkzVvBW71LlZjF4b0189EuKcjgUAQK1BqQGAavT52gz9aX7p6szt57XXred1UGiwy+lYAADUKpQaAKgGhwqK9ciHazW/bHXm9Rv6q3sLVmcAAKgOlBoAqGKfla3OHMwv1h3nd9At57ZndQYAgGpEqQGAKnIwv1iPfJiq91buVpf4WE29sb+6NWd1BgCA6kapAYAq8GnqXj0wf40OFRTr9xd00ORzWJ0BAKCmUGoA4DQcyC/Wwx+k6oOU3eoaH6tpYweoa/NYp2MBAFCnUGoA4BR9smaPHnxvjbIPl+gPF3bUzee0U0gQqzMAANQ0Sg0AnKQD+cX68/trtGDVHnVrHqvpNw1Ul3hWZwAAcAqlBgBOwidr9uiB+WuUU1iiuy7sqEmszgAA4DiffhMbYxoYY+YbY/KNMenGmJHHmBdmjHnJGJNhjDlgjPnQGNOiaiMDQM1ze7x6bMFaTZqxXPH1wvXhbWfqtvM7UGgAAPADvq7UPC+pWFJTSb0lfWSMSbHWplaYd4ekMyT1lJQtaYqkZyVdXTVxAaDmHcwv1q2zl+vbtCzdMLi1HhjWhTIDAIAfOWGpMcZESbpGUndrbZ6kb4wxH0gaLem+CtPbSPrUWptR9ti3JT1VtZEBoOas35uj8dOSlZFdpCev7anhSS2djgQAACrw5Z8aO0pyW2s3lhtLkdStkrmvSRpijGlujImUNErSx5U9qTFmgjEm2RiTvH///pPNDQDV7uPVe3T1C0tUVOLV2xMHUWgAAPBTvhx+Fi0pp8JYtqSYSuZukrRD0i5JHkmrJd1a2ZNaa6eo9PA0JSUlWR/zAkC183qtnv58o55ZlKY+ifX00nX91DQ23OlYAADgGHwpNXmSKu5VGispt5K5z0sKk9RQUr6ke1S6UjPwNDICQI3JLSzRnW+v1Ofr9ml4UoIeu7K7woKDnI4FAACOw5fDzzZKCjbGdCg31ktSxU0CpNJNBKZaaw9Ya4tUuknAAGNMo9OPCgDVa8v+PF31whIt3rBfj1zeTU9c05NCAwBAADjhSo21Nt8YM0/So8aYcSotLldIGlzJ9KWSrjfGfCmpQNJkSbuttZlVFxkAqt7iDft0++wVCglyacZNA3VGu4ZORwIAAD7ydU/SyZIiJO2TNFvSzdbaVGPMWcaYvHLz/iipUKXn1uyX9GtJV1VhXgCoUtZavfjlZo2dulQt60fqg1uHUGgAAAgwPl2nxlp7QNKVlYx/rdKNBH66n6XSHc8AwO8dLvbonrmr9GHKbl3aM17/vLaXIkI53AwAgEDj68U3AaBW2XmwQBOmLdO6vTm69+LOmnR2WxljnI4FAABOAaUGQJ3z/ZYsTZ65XCUer14f01/ndm7idCQAAHAaKDUA6gxrraZ/n65HP1yrVg0j9cr1SWrbOPrEDwQAAH6NUgOgTihye/Tn91L1dvIOXdClif7vt70VEx7idCwAAFAFKDUAar19OYWaNGOZlm8/pNvOa687L+gol4vzZwAAqC0oNQBqtRXbD2rSjGXKLXTrxVF9dUmPeKcjAQCAKkapAVBrzUneoQfmr1HTuDDNmzxYnZvFOh0JAABUA0oNgFqnxOPV3z5ap6lLtmlI+4Z6bkRf1Y8KdToWAACoJpQaALXKgfxi3TJzub7bkqWbzmyj+y/prOAgl9OxAABANaLUAKg11u7O0YTpydqXW6R//6aXrumX4HQkAABQAyg1AGqFj1bt0R/npCguIkRzJp6hXi3rOR0JAADUEEoNgIDm8Vo99dkGPb94s/q1qq8Xr+urJjHhTscCAAA1iFIDIGDlFJbo92+t1KL1+zRiQEs9fHk3hQUHOR0LAADUMEoNgIC0eX+exk9L1vasAj12ZXddNzBRxnBBTQAA6iJKDYCAs2h9hu6YvVKhwS7NHDdQA9s2dDoSAABwEKUGQMCw1uqFLzfrX//doG7NY/Xy6CS1qBfhdCwAAOAwSg2AgFBQ7Nbdc1bpo9V7dHmv5nrimp6KCOX8GQAAQKkBEAB2HCjQ+GnJ2piRqz/9urPGn9WW82cAAMARlBoAfm1JWqZumbVcHq/VGzcO0NkdGzsdCQAA+BlKDQC/ZK3VG99u098WrlPbRlF65foktW4U5XQsAADghyg1APxOYYlHD8xfo7nLd+rCrk31f7/tregwflwBAIDK8S4BgF/JyCnUhOnLlLLjkO44v4PuOL+DXC7OnwEAAMdGqQHgN5alH9SkGcuUX+TWS9f108XdmzkdCQAABABKDQC/8PbS7XrovVQ1iwvXjJsGqlOzGKcjAQCAAEGpAeCoEo9Xjy1Yq2nfpeusDo307Ig+qkYnbCEAACAASURBVBcZ6nQsAAAQQCg1AByTlVekyTOX64etBzT+rDa69+LOCg5yOR0LAAAEGEoNAEes2ZWtidOXKTOvSE//treu7NPC6UgAACBAUWoA1LgPUnbrnndTVD8yVO9OGqweCXFORwIAAAGMUgOgxni8Vk9+ul4vf7VF/VvX1wuj+qlxTJjTsQAAQICj1ACoEdkFJbr9rRX6auN+jRqYqL9c1k2hwZw/AwAATh+lBkC1S9uXq/HTlmnnwQL97aruGjWwldORAABALUKpAVCtPluboTvfXqnwEJdmjR+k/q0bOB0JAADUMpQaANXC67V6bnGanvpso3q0iNPLo/upeb0Ip2MBAIBaiFIDoMrlF7l11zsp+iR1r67q00J/v7qHwkOCnI4FAABqKUoNgCq1PatA46cla9O+XD04rItuOrONjDFOxwIAALUYpQZAlflmU6ZumbVckvTm2AE6q0NjhxMBAIC6gFID4LRZa/XaN1v1+MJ1at8kWq9cn6RWDaOcjgUAAOoISg2A01JY4tGf5q3WvBW7dFG3pvr38N6KDuNHCwAAqDm88wBwyjJyCjV+WrJW7czWHy7sqFvPbS+Xi/NnAABAzaLUADglqbuzddPUZOUUlmjK6H4a2q2Z05EAAEAdRakBcNK+WJeh22avUFxEiN6dNFhdm8c6HQkAANRhlBoAPrPW6o1vt+mvH61Vt+Zxem1MkprEhjsdCwAA1HGUGgA+cXu8euTDtZr+fbqGdm2qp3/XW5Gh/AgBAADO4x0JgBPKLSzRrbNW6KuN+zXxV21178Wd2RAAAAD4DUoNgOPaebBAN01NVtr+PP396h4aMSDR6UgAAABHodQAOKaVOw5p3JvJKnJ79OaNA3Rmh0ZORwIAAPgFly+TjDENjDHzjTH5xph0Y8zIY8z72BiTV+6j2BizumojA6gJC1fv0W9f/k4RoS7Nu3kwhQYAAPgtX1dqnpdULKmppN6SPjLGpFhrU8tPstZeUv6+MeZLSYuqICeAGmKt1UtfbdETn6xX38R6mnJ9khpFhzkdCwAA4JhOWGqMMVGSrpHU3VqbJ+kbY8wHkkZLuu84j2st6SxJN1RFUADVr9jt1YPvrdY7yTt1Wa/m+ue1PRUeEuR0LAAAgOPyZaWmoyS3tXZjubEUSWef4HHXS/raWrutsi8aYyZImiBJiYmceAw4LbugRJNmLNN3W7J0+3nt9fsLOrLDGQAACAi+nFMTLSmnwli2pJgTPO56SVOP9UVr7RRrbZK1Nqlx48Y+xABQXbZl5uuqF79VcvoBPTW8l/4wtBOFBgAABAxfVmryJMVWGIuVlHusBxhjzpTUTNK7px4NQE1Yuu2AJkxLlpU046aBGti2odORAAAAToovKzUbJQUbYzqUG+slKfUY8yVpjKR5ZefgAPBT763YpVGv/KD6kaF6b/IQCg0AAAhIJ1ypsdbmG2PmSXrUGDNOpbufXSFpcGXzjTERkoZLuqoqgwKoOtZaPf35Jv3ni00a1LaBXrqun+pFhjodCwAA4JT4dJ0aSZMlRUjaJ2m2pJuttanGmLOMMRVXY66UdEjS4qqLCaCqFJZ4dMdbK/WfLzbp2n4JmjZ2IIUGAAAENJ+uU2OtPaDSslJx/GuVbiRQfmy2SosPAD+TlVekidOXKTn9oO6+qJMmn9NOxrAhAAAACGy+XnwTQIBL25ensVOXKiOnUM+P7KthPeOdjgQAAFAlKDVAHfBtWqYmzVimsGCX3powSH0S6zsdCQAAoMpQaoBa7u2l2/XA/DVq2zhKr43pr5YNIp2OBAAAUKUoNUAt5fVaPfHper381Rad1aGRnh/VV7HhIU7HAgAAqHKUGqAWOlzs0Z1vr9QnqXs1amCiHrm8m4KDfN3sEAAAILBQaoBaZl9OocZNS9bqXdl66NKuGjukNTucAQCAWo1SA9Qi6/bk6KapS3WwoERTRifpwq5NnY4EAABQ7Sg1QC2xeP0+3TpruaLDgzVn0hnq3iLO6UgAAAA1glID1AJvLtmmRz5MVZf4WL02pr+axYU7HQkAAKDGUGqAAObxWj22YK2mLtmmC7o01X9+11tRYfxvDQAA6hbe/QABKq/Irdtnr9Ci9fs07sw2uv/XXRTkYkMAAABQ91BqgAC0+9BhjZ26VJv25emxK7tr9KBWTkcCAABwDKUGCDCrdh7STW8mq7DYo9dv6K+zOzZ2OhIAAICjKDVAAPk0da/ueGuFGkaFacbNA9WpWYzTkQAAABxHqQECgLVWr3y9RX//eL16JdTTK9cnqXFMmNOxAAAA/AKlBvBzJR6v/vz+Gs3+cYeG9YjXv4f3UnhIkNOxAAAA/AalBvBj2YdLdMvM5fomLVO3nNtOd13YSS52OAMAADgKpQbwU9uzCjT2zaVKz8rXP6/tqd8ktXQ6EgAAgF+i1AB+aFn6AU2Ytkxur9W0sQN1RruGTkcCAADwW5QawM+8v3KX7n53lZrHhev1G/qrbeNopyMBAAD4NUoN4CestXp2UZqe+myjBrRuoJdG91ODqFCnYwEAAPg9Sg3gB4rcHt0/d7Xmrdilq/u00N+v6aGwYHY4AwAA8AWlBnDYgfxiTZq+TD9uO6C7LuyoW89rL2PY4QwAAMBXlBrAQZv352ns1KXak12oZ0b00eW9mjsdCQAAIOBQagCHfLc5S5NmLFOwy2j2+EHq16q+05EAAAACEqUGcMA7yTv0wPzVatUwSq+P6a/EhpFORwIAAAhYlBqgBnm9Vv/67wa98OVmndm+kZ4f1VdxESFOxwIAAAholBqghhSWeHTXOyn6aPUejRjQUo9e0V0hQS6nYwEAAAQ8Sg1QA/bnFmn8tGSl7DykP/26s8af1ZYdzgAAAKoIpQaoZhv25mrs1KXKyi/Si6P66eLuzZyOBAAAUKtQaoBq9NXG/bpl5nJFhgZpzsTB6pEQ53QkAACAWodSA1ST6d+n6+EPUtWhSbRev6G/mteLcDoSAABArUSpAaqYx2v1+MJ1eu2brTqvcxM9M6KPosP4Xw0AAKC68E4LqEJ5RW79/q2V+nxdhm4Y3FoPXdpVQS42BAAAAKhOlBqgimzen6eJ05dpy/48PXJ5N40Z3NrpSAAAAHUCpQaoAp+s2as/zklRaLBLM24aqMHtGzkdCQAAoM6g1ACnweO1+vd/N+iFLzerV0KcXriun1qwIQAAAECNotQAp+hgfrFuf2uFvt6UqREDWuovl3VTeEiQ07EAAADqHEoNcArW7MrWxOnLtD+3SP+4uod+NyDR6UgAAAB1FqUGOEnvLtupB+avVoOoUL0z6Qz1blnP6UgAAAB1GqUG8FGx26tHF6RqxvfbdUbbhnp2ZB81ig5zOhYAAECdR6kBfLA3u1CTZy7T8u2HNPFXbXX3RZ0UHORyOhYAAABEqQFO6IctWbpl1goVFLv1/Mi+GtYz3ulIAAAAKIdSAxyDtVZvfLtNf1u4Tq0aRGrW+IHq2DTG6VgAAACogFIDVKKg2K37563W+yt368KuTfXv4b0UGx7idCwAAABUwqeTAowxDYwx840x+caYdGPMyOPM7WuM+Z8xJs8Yk2GMuaPq4gLVb1tmvq5+YYk+SNmtPw7tqJev60ehAQAA8GO+rtQ8L6lYUlNJvSV9ZIxJsdamlp9kjGkk6RNJd0p6V1KopISqiwtUr0XrM3THWysV5DKaeuMAnd2xsdORAAAAcAInLDXGmChJ10jqbq3Nk/SNMeYDSaMl3Vdh+h8kfWqtnVl2v0jSuirMC1QLr9fqmUWb9PTnm9Q1PlYvj+6nlg0inY4FAAAAH/hy+FlHSW5r7cZyYymSulUyd5CkA8aYJcaYfcaYD40xXGodfi27oETjpiXr6c836eq+LTRv8mAKDQAAQADx5fCzaEk5FcayJVW2DVSCpL6SLpS0WtKTkmZLGlJxojFmgqQJkpSYSO+BM9btydGkGcu06+BhPXZFN103qJWMMU7HAgAAwEnwpdTkSYqtMBYrKbeSuYclzbfWLpUkY8wjkjKNMXHW2uzyE621UyRNkaSkpCR7ssGB0/X+yl26d+4qxYaH6O2Jg9SvVQOnIwEAAOAU+FJqNkoKNsZ0sNZuKhvrJSm1krmrJJUvKJQV+J0Sj1d/X7her3+7Vf1b19fzo/qqSUy407EAAABwik54To21Nl/SPEmPGmOijDFDJF0haXol09+QdJUxprcxJkTSQ5K+qbhKAzhlX26hRr36g17/dqtuGNxas8YPotAAAAAEOF+3dJ4s6XVJ+yRlSbrZWptqjDlL0sfW2mhJstYuMsb8SdJHkiIlfSPpmNe0AWrSsvSDmjxzmbIPl+jp3/bWlX1aOB0JAAAAVcCnUmOtPSDpykrGv1bpRgLlx16U9GKVpAOqgLVWM37Yrkc/TFV8XITm3TxAXZtXPE0MAAAAgcrXlRogIBWWePTA/DWau3ynzu3UWE//to/iIkOcjgUAAIAqRKlBrbXjQIEmzVim1N05uuP8Drrj/A5yudiuGQAAoLah1KBW+t/G/br9rRXyeK1eG5Ok87s0dToSAAAAqgmlBrWKtVYvfLlZ//rvBnVsEqOXR/dT60ZRTscCAABANaLUoNbILSzRXe+k6L9rM3RZr+Z64poeigzlrzgAAEBtxzs+1AqbMnI1ccYypWcV6KFLu2rskNYyhvNnAAAA6gJKDQLex6v36I9zUhQRGqSZ4wZqUNuGTkcCAABADaLUIGC5PV79878b9PJXW9QnsZ5eGNVX8XERTscCAABADaPUICBl5RXp9rdW6Nu0LI0amKg/X9ZVYcFBTscCAACAAyg1CDirdh7SpOnLlJlfrCev7anhSS2djgQAAAAHUWoQUN5eul0PvZ+qxtFhmjtpsHokxDkdCQAAAA6j1CAgFLk9eviDtZr943ad2b6RnhnRRw2iQp2OBQAAAD9AqYHf233osG6euVwpOw5p8jntdNfQTgpysV0zAAAASlFq4NeWbM7UbbNWqLDEo5eu66uLu8c7HQkAAAB+hlIDv2St1atfb9U/Plmv1g0j9fLoM9S+SbTTsQAAAOCHKDXwO/lFbt0zd5U+WrVHF3drpn8N76XoMP6qAgAAoHK8U4Rf2bI/T5NmLFPavjzde3FnTTq7rYzh/BkAAAAcG6UGfuOztRn6w9srFRxkNG3sQJ3ZoZHTkQAAABAAKDVwnMdr9fTnG/XsojT1aBGnF6/rq4T6kU7HAgAAQICg1MBRhwqKdcdbK/XVxv0anpSgR6/orvCQIKdjAQAAIIBQauCY1N3ZmjRjmfZmF+rxq3poxICWnD8DAACAk0apgSPmLd+p++etVv3IUL0z8Qz1SazvdCQAAAAEKEoNalSx26u/fbRWb36XroFtGui5kX3VOCbM6VgAAAAIYJQa1JiMnEJNnrlcy9IPatyZbXTfJZ0VHORyOhYAAAACHKUGNWLptgOaPHO58grdenZEH13Wq7nTkQAAAFBLUGpQray1enPJNv31o3VKqB+hGTcNVKdmMU7HAgAAQC1CqUG18XqtHl2wVlOXbNMFXZro38N7Ky4ixOlYAAAAqGUoNagWHq/VA/NX662lOzR2SBs9OKyLXC62awYAAEDVo9Sgyrk9Xt397irNX7FLt57bXncN7cj1ZwAAAFBtKDWoUsVur+54a4U+XrNXfxzaUbee18HpSAAAAKjlKDWoMoUlHt0yc7m+WL9PDw7ronFntXU6EgAAAOoASg2qREGxWxOmLdM3aZn665Xddd2gVk5HAgAAQB1BqcFpyytya+wbS5WcfkD/+k0vXdsvwelIAAAAqEMoNTgt2QUlGvPGj1q9K1v/+R0X1QQAAEDNo9TglGXlFWn0az8qbV+eXhzVV0O7NXM6EgAAAOogSg1Oyb6cQo169QdtP1CgKdf30zmdmjgdCQAAAHUUpQYnbfehwxr16g/KyCnUGzf21+B2jZyOBAAAgDqMUoOTsj2rQCNf/V7ZBSWaftMA9WvVwOlIAAAAqOMoNfDZ5v15GvXKDyp0ezRr/CD1SIhzOhIAAABAqYFv1u/N0XWv/iBJmj1+kLrExzqcCAAAAChFqcEJrdmVrete+0FhwS7NHDdI7ZtEOx0JAAAAOIJSg+Naln5QN7zxo2LDQzRr/EC1ahjldCQAAADgKJQaHNN3m7N005tL1SQmTDPHD1KLehFORwIAAAB+gVKDSn21cb8mTEtWYoNIzRw3UE1iw52OBAAAAFSKUoNf+Gxthm6ZuVztmkRrxk0D1DA6zOlIAAAAwDFRanCUBat26/dvrVS3FnGaduMAxUWGOB0JAAAAOC6XL5OMMQ2MMfONMfnGmHRjzMhjzHvYGFNijMkr99G2aiOjusxdtlO3z16hPon1NOMmCg0AAAACg68rNc9LKpbUVFJvSR8ZY1KstamVzH3bWntdVQVEzZj5Q7oemL9GQ9o31CvXJykylEU8AAAABIYTrtQYY6IkXSPpIWttnrX2G0kfSBpd3eFQM177ZqsemL9G53VuotfG9KfQAAAAIKD4cvhZR0lua+3GcmMpkrodY/5lxpgDxphUY8zNp50Q1er5xWl6bMFaXdK9mV66rp/CQ4KcjgQAAACcFF/+ST5aUk6FsWxJMZXMfUfSFEkZkgZKmmuMOWStnV1xojFmgqQJkpSYmHgymVEFrLV66rONenZRmq7o3Vz//k0vBQf5dIoVAAAA4Fd8eRebJym2wlispNyKE621a621u621HmvtEkn/kXRtZU9qrZ1irU2y1iY1btz4ZHPjNFhr9fjCdXp2UZp+m9RSTw3vTaEBAABAwPLlnexGScHGmA7lxnpJqmyTgIqsJHMqwVA9vF6rP7+fqle+3qoxZ7TS36/uoSAX/4kAAAAQuE5Yaqy1+ZLmSXrUGBNljBki6QpJ0yvONcZcYYypb0oNkHS7pPerOjROjcdrde/cVZr+fbomnt1WD1/eTS4KDQAAAAKcr8ccTZYUIWmfpNmSbrbWphpjzjLG5JWb9ztJaSo9NG2apCestW9WZWCcmhKPV79/e6XmLNup31/QQfdd3FnGUGgAAAAQ+Hzau9dae0DSlZWMf63SjQR+uj+i6qKhqhS5Pbp99gp9mpqh+y7prElnt3M6EgAAAFBluCBJLVdY4tGkGcv05Yb9euTybhozuLXTkQAAAIAqRampxfKL3Br3ZrK+35qlf1zdQ78bwNbZAAAAqH0oNbVUTmGJxr6xVCt2HNL/De+tK/u0cDoSAAAAUC0oNbXQoYJiXf/6j1q7O0fPjeijS3rEOx0JAAAAqDaUmlomM69I1736g7Zk5mvK9f10XuemTkcCAAAAqhWlphbZm12oUa9+r12HDuv1Mf11ZodGTkcCAAAAqh2lppbYebBAI1/5QVl5RZo2dqAGtGngdCQAAACgRlBqaoFtmfka+cr3yitya8a4geqTWN/pSAAAAECNodQEuE0ZuRr16g9ye61mTxikbs3jnI4EAAAA1ChKTQBL3Z2t0a/9qCCX0VsTBqlj0xinIwEAAAA1zuV0AJyalTsOacSU7xUe7NI7E8+g0AAAAKDOYqUmAC3ddkA3vrFU9aNCNGvcILVsEOl0JAAAAMAxlJoA821apsa9maz4euGaNW6QmsWFOx0JAAAAcBSHnwWQxev36capS9WqYaTennAGhQYAAAAQKzUB45M1e3Tb7BXq1CxG08cOVP2oUKcjAQAAAH6BlZoA8P7KXbpl1gr1aBGnmeMGUWgAAACAclip8XPvLN2he+et0sA2DfTamP6KCuM/GQAAAFAe75D92LTvtunP76fqVx0b6+Xr+ikiNMjpSAAAAIDfodT4qSn/26zHF67XhV2b6rmRfRQWTKEBAAAAKkOp8TPWWj3zRZr+7/ONGtYzXk//trdCgjj1CQAAADgWSo0fsdbqyU836MUvN+uavgl68tqeCnIZp2MBAAAAfo1S4yestXrkw7WaumSbRg1M1GNXdJeLQgMAAACcEKXGD3i9Vg+8t1qzf9yhsUPa6KFLu8gYCg0AAADgC0qNw9wer+55d5XmrdilW85tpz8O7UShAQAAAE4CpcZBxW6vfv/2Ci1cvVd/HNpRt57XwelIAAAAQMCh1DiksMSjW2ct1+fr9unBYV007qy2TkcCAAAAAhKlxgGHiz2aMD1ZX2/K1GNXdtfoQa2cjgQAAAAELEpNDcs+XKLx05KVvO2A/vWbXrq2X4LTkQAAAICARqmpIYUlHs34Pl3PL05TTqFb//ldH13Wq7nTsQAAAICAR6mpZh6v1dzlO/X0Zxu1O7tQZ3VopHsv7qzuLeKcjgYAAADUCpSaamKt1X/XZuhfn27Qpn156tWynv71m14a3L6R09EAAACAWoVSUw2+35KlJz5ZrxXbD6lt4yi9dF1fXdStGdefAQAAAKoBpaYKpe7O1j8/3aAvN+xXs9hw/ePqHrq2X4KCg1xORwMAAABqLUpNFdieVaB/f7ZB76/crbiIEN1/SWeNGdxa4SFBTkcDAAAAaj1KzWnYn1ukZxdt0qwftis4yGjyOe008ex2iosIcToaAAAAUGdQak5BTmGJXvnfFr32zVYVub36Xf+WuuP8DmoSG+50NAAAAKDOodSchPLXmjlYUKJLe8brrqGd1KZRlNPRAAAAgDqLUuMDrjUDAAAA+C9KzXFwrRkAAADA/1FqjqHitWZeHNVXF3fnWjMAAACAv6HUVMC1ZgAAAIDAQqkpw7VmAAAAgMBU50sN15oBAAAAAludLTWVXWvm9vM7qCnXmgEAAAACSp0rNVxrBgAAAKhd6kypqexaM/dc1Fk9ErjWDAAAABDIfCo1xpgGkl6TNFRSpqT7rbWzjjM/VFKKpBhrbUJVBD1V1lp9tjZD//zpWjMJcVxrBgAAAKhFfF2peV5SsaSmknpL+sgYk2KtTT3G/Lsl7ZcUc/oRT90PZdeaWc61ZgAAAIBa64SlxhgTJekaSd2ttXmSvjHGfCBptKT7KpnfRtJ1kv4g6ZWqjeubtbtz9OSn67nWDAAAAFAH+LJS01GS21q7sdxYiqSzjzH/WUl/knT4eE9qjJkgaYIkJSYm+hDjxLZnFeipzzbo/ZTdig3nWjMAAABAXeBLqYmWlFNhLFuVHFpmjLlKUpC1dr4x5pzjPam1doqkKZKUlJRkfUp7DPtzi/Tcok2a9eN2BbmMbj6ba80AAP6/vfuP9auu7zj+fNkiSksB5cdAWDtbphsG0EEgRGAZLszfi4XBNhLRwESDdnM4XIJd1+oyRqJmFqdMQMZ0VgxuhglxZvJjI3NrnBIbRfnRrfy4tIUW29pWbN/745yGb+5uL+3t995zv9/7fCTf3O/3c875nlfvJ9/b7/ucz/kcSdJMsS9FzVZg3qi2ecCW3oZ2mNpfAW/qT7QXtqW918znvNeMJEmSNGPtS1HzI2B2khOr6sdt2ynA6EkCTgQWAPe1F+K/GDgsyQhwZlWt7UtivNeMJEmSpOe9YFFTVduS3A4sT3IZzexnbwfOGrXq94ETel6fBawEXkczE9oB27W7uP07j/HJb/6Yxzdv914zkiRJkvZ5Suf3ATcB64GngfdW1ZokZwN3VtXcqvo5MLJngyTPALuramTMd9wPY91r5roLTvZeM5IkSZL2raipqmeA3x6j/T6aiQTG2uZu4IBvvOm9ZiRJkiSNZ1/P1Ew57zUjSZIkaV9Mu6LGe81IkiRJ2h/TpqgZfa+ZK85dyBXnLOSwQ7zXjCRJkqS9mxZFzVM/2cG5132LnT/fzUWnn8AS7zUjSZIkaR9Ni6Jm/ZadvO3VR3OV95qRJEmStJ+mRVGz6Ki5XP97r+s6hiRJkqQBNC2mEnvpi50EQJIkSdLETIuiRpIkSZImyqJGkiRJ0kCzqJEkSZI00CxqJEmSJA00ixpJkiRJA82iRpIkSdJAs6iRJEmSNNAsaiRJkiQNNIsaSZIkSQPNokaSJEnSQLOokSRJkjTQLGokSZIkDTSLGkmSJEkDzaJGkiRJ0kCzqJEkSZI00FJVXWcgyRbgwa5zaNIcCWzsOoQmlX083Ozf4Wb/Djf7d7jNtP6dX1VHjbVg9lQn2YsHq+q0rkNociRZbf8ON/t4uNm/w83+HW7273Czf5/n8DNJkiRJA82iRpIkSdJAmy5FzQ1dB9Cksn+Hn3083Ozf4Wb/Djf7d7jZv61pMVGAJEmSJE3UdDlTI0mSJEkTYlEjSZIkaaBZ1EiSJEkaaJ0VNUkOTnJjkv9JsiXJd5O8sas8mjxJTkyyI8nfd51F/Zfk4iQ/SLItycNJzu46k/ojyYIkX0+yKclIkpVJpsv9zbSfklyZZHWSnUk+P2rZeUl+mOSnSb6VZH5HMTVBe+vfJGcm+ZckzyTZkOS2JMd2GFUTMN7nt2edpUkqyRumON600OWZmtnAOuBc4DDgGuDLSRZ0mEmT43rgv7oOof5L8pvAtcC7gEOBc4BHOg2lfvo0sB44FjiV5u/1+zpNpAPxBPBR4KbexiRHArcDHwFeBqwGVk15Oh2oMfsXOIJmhqwFwHxgC3DzlCZTP+ytfwFIshC4EHhyKkNNJ50dcauqbcCynqY7kjwK/BqwtotM6r8kFwObgfuBRR3HUf/9ObC8qv6jff14l2HUd78ErKyqHcBIkruAkzrOpAmqqtsBkpwGHN+z6B3Amqq6rV2+DNiY5NVV9cMpD6oJ2Vv/VtWdveslWQncM7XpdKDG+fzucT1wNc3BqBlp2lxTk+QY4JeBNV1nUX8kmQcsBz7YdRb1X5JZwGnAUUkeSvJYOzzppV1nU998Erg4ySFJXgG8Ebir40zqv5OA7+150R50fBgL2GF1Dn7XGipJLgR2VtXXu87SpWlR1CQ5CPgCcItHhYbKCuDGqnqs6yCaFMcABwEXAGfTDE96Lc1QUg2He2m+2P4EeIxmWNI/dppIk2Eu8OyotmdphpRqiCQ5GVgKfKjrLOqPJIcCfwEs6TpL1zovc3NrBAAABYdJREFUapK8CLgV+BlwZcdx1CdJTgXeAHyi6yyaNNvbn5+qqieraiPwceBNHWZSn7R/m++iudZiDnAkzdj8a7vMpUmxFZg3qm0ezbUXGhJJFgF3Akuq6r6u86hvlgG3VtXajnN0rtOiJkmAG2mO+C6uque6zKO++nWaixL/N8kIcBWwOMl3ugyl/qmqTTRH76u3uaM46r+XAb9Ic03Nzqp6mubiYovW4bMGOGXPiyRzgIU4RGlotLPZfRNYUVW3dp1HfXUe8IF2hsoR4ASaibeu7jjXlOv6TM3fAL8CvLWqtr/QyhooN9D8p3hq+/gM8M/A+V2GUt/dDLw/ydFJjgD+CLij40zqg/bM26PAe5PMTnI48E7ggW6TaaLafnwJMAuYleQl7RTdXwVek2Rxu3wp8IDDwQfL3vq3vR7uX2kOUHym25SaqHE+v+cBr+H571tPAO+hmThgRunyPjXzaX7pp9LMqrO1ffx+V5nUP1X106oa2fOgGd6wo6o2dJ1NfbWCZrruHwE/AP4b+FinidRP7wB+C9gAPAQ8R1O4ajBdQzNs9MPAJe3za9q/y4tpPrubgDOAi7sKqQkbs3+By4BXAst6vmtt7S6mJmhvn9+nR33f2gVsqqoZ18epcrSIJEmSpMHV9fAzSZIkSTogFjWSJEmSBppFjSRJkqSBZlEjSZIkaaBZ1EiSJEkaaBY1kiRJkgaaRY0kaVpKcmmSf+s6hyRp+rOokaQZKsnaJOuTzOlpuyzJ3VOY4fwk9ybZkmRDknuSvK3P+6gki/r5npKk6cWiRpJmtlnAki52nOQC4Dbg74DjgWOApcBbu8gzliSzu84gSXphFjWSNLNdB1yV5PDRC5IsaM9yzO5puzvJZe3zS5P8e5JPJNmc5JEkZ7Xt69qzQO8ca6dJAnwcWFFVn6uqZ6tqd1XdU1WXTyDLovYsz7NJNiZZ1bbf267+vSRbk1zUtr8lyXfb3PcnObnnfdcmuTrJA8C2JLPb14+3Z5QeTHLefv+mJUmTxqJGkma21cDdwFUT3P4M4AHg5cAXgS8BpwOLgEuAlUnmjrHdq4ATgK9McL+jrQC+ARxBc9bnUwBVdU67/JSqmltVq5K8FrgJeE+b+7PA15Ic3PN+vwu8GTgcWAhcCZxeVYcC5wNr+5RbktQHFjWSpKXA+5McNYFtH62qm6tqF7CKplBZXlU7q+obwM9oCpzRXt7+fHJCif+/54D5wHFVtaOqxptg4A+Az1bVt6tqV1XdAuwEzuxZ56+ral1VbQd2AQcDv5rkoKpaW1UP9ym3JKkPLGokaYarqu8DdwAfnsDmT/U8396+3+i2sc7UPN3+PHYC+xzLnwAB/jPJmiTvHmfd+cAft0PPNifZTFOMHdezzro9T6rqIeAPgWXA+iRfStK7riSpYxY1kiSAPwMuB17R07at/XlIT9sv9Gl/D9IUDov3cf1xs1TVSFVdXlXH0Qwr+/Q4M56tAz5WVYf3PA6pqn/oWad6N6iqL1bV62kKogKu3cfckqQpYFEjSdpzNmIV8IGetg3A48AlSWa1Zz8W9ml/BXwQ+EiSdyWZl+RFSV6f5IYx1h83S5ILkxzfvtxEU3jsbl8/Bbyy5+3+FrgiyRlpzEny5iSHjpU1yauS/EZ7zc0OmrNPu8daV5LUDYsaSdIey4E5o9ouBz5EM1zsJOD+fu2sqr4CXAS8G3iCpvj4KPBPe9lkvCynA99OshX4GrCkqh5ply0DbmmHmv1OVa1u32slTQH0EHDpOFEPBv4S2AiMAEcDf7o//1ZJ0uRKc7BMkiRJkgaTZ2okSZIkDTSLGkmSJEkDzaJGkiRJ0kCzqJEkSZI00CxqJEmSJA00ixpJkiRJA82iRpIkSdJAs6iRJEmSNND+D/aCj5wIPFDZAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import silhouette_score\n", "\n", "scores = []\n", "clusters = range(2,16)\n", "for K in clusters:\n", " \n", " clusterer = KMeans(n_clusters=K)\n", " cluster_labels = clusterer.fit_predict(http_feature_matrix)\n", " score = silhouette_score(http_feature_matrix, cluster_labels)\n", " scores.append(score)\n", "\n", "# Plot it out\n", "pd.DataFrame({'Num Clusters':clusters, 'score':scores}).plot(x='Num Clusters', y='score')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Silhouette graphs shows that 10 is the 'optimal' number of clusters\n", "- 'Optimal': Human intuition and clustering involves interpretation/pattern finding and is often partially subjective :)\n", "- For large datasets running an exhaustive search can be time consuming\n", "- For large datasets you can often get a large K using max score, so pick the 'knee' of the graph as your K" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# So we know that the highest (closest to 1) silhouette score is at 10 clusters\n", "kmeans = KMeans(n_clusters=10).fit_predict(http_feature_matrix)\n", "\n", "# TSNE is a great projection algorithm. In this case we're going from 12 dimensions to 2\n", "projection = TSNE().fit_transform(http_feature_matrix)\n", "\n", "# Now we can put our ML results back onto our dataframe!\n", "http_df['cluster'] = kmeans\n", "http_df['x'] = projection[:, 0] # Projection X Column\n", "http_df['y'] = projection[:, 1] # Projection Y Column" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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tuqpp57Sjh07BnU8t9xyi6644opBvcZIQbgCAAAARog9e/Zo3bp1KigoUH5+5hsDO+eUn5+vgoICrVu3Tnv27Dms6/7oRz9SVVWVioqKNHnyZJ1//vlas2bNYZ0zXXV1tZxz6uzsDO2cvXniiSc0b948lZSU6JhjjtH9998f6vkJVwAAAMAI4L3Xhg0blJubq1gs1q9jYrGYcnNztWHDBnnvD+m6d911l6699lrdeOONevvtt/X666/rc5/7nB599NFDOt9g6E8o6+jo0IUXXqjPfvazamho0E9/+lMtWbJEGzZsCG0chCsAAEa5OePmZPV4AOFoaGhQQ0OD4vH4gI6Lx+P7jz2Ua95888265557dNFFF6mwsFCxWEwXXHCBvvWtbx2w/6pVq3TUUUd121ZZWanf/va3kqR169apqqpKJSUlmjhxopYsWSJJOuussyRJZWVlKioq0tq1ayVJDz74oObMmaPy8nKdd955qqmp2X9e55zuuecezZgxQzNmzDjoa9mzZ4/27t2rK6+8Us45nXrqqZozZ45eeumlAb8vmRCuAAAY5Z75xDNZPR5AOKqrqxWJRAbcAdA5p0gkourq6gFfc+3atWptbdWFF1444GN7s3jxYi1evFh79+7Va6+9pksuuUSS9OSTT0qS6uvr1dTUpPnz5+vRRx/V7bffrkceeUS1tbVauHChLrvssm7nW758uZ555pn9AekDH/iAvvGNb/R67YkTJ+qyyy7Td7/7XXV1dWnt2rWqqanRggULQnltEuEKAIBRr7i4WJWllYd0bGVpJTcQBoaJ3bt3D7hqFYjH49q9e/chXXP8+PGKRsNpMh6LxbRlyxbt2rVLRUVFOv300zPue++99+qGG27QnDlzFI1GdeONN+r555/vVr264YYbVFFRofz8fEnSihUr9JWvfCXjOS+77DItXbpUeXl5WrhwoW677TZNnTo1lNcmEa4AABgTtl27TQWRggEdU5hTqG3XbhukEQEYqM7OTkUih/breyQSOaRmEePGjdOuXbtCazTxwAMPaPPmzZo9e7ZOPfVUrVixIuO+NTU1Wrx4scrKylRWVqaKigp577V9+/b9+wwkGL388su69NJL9f3vf1/t7e3auHGjvvnNb+qxxx47rNeUbsSFK+dchXPuF865fc65Gufc32XYzznn7nTO7U4+7nTcRQ0AMIbt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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Now use dataframe group by cluster\n", "cluster_groups = http_df.groupby('cluster')\n", "\n", "# Plot the Machine Learning results\n", "colors = {-1:'black', 0:'green', 1:'blue', 2:'red', 3:'orange', 4:'purple', 5:'brown', 6:'pink', 7:'lightblue', 8:'grey', 9:'yellow'}\n", "fig, ax = plt.subplots()\n", "for key, group in cluster_groups:\n", " group.plot(ax=ax, kind='scatter', x='x', y='y', alpha=0.5, s=250,\n", " label='Cluster: {:d}'.format(key), color=colors[key])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Cluster 0: 13 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:44:40.230550051 80 GET application/pdf 0\n", "2013-09-15 23:44:40.230550051 80 GET application/pdf 0\n", "2013-09-15 23:44:40.230550051 80 GET application/pdf 0\n", "\n", "Cluster 1: 40 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:44:28.150300980 80 GET text/plain 0\n", "2013-09-15 23:44:28.150601864 80 GET text/plain 0\n", "2013-09-15 23:44:28.192918062 80 GET text/plain 0\n", "\n", "Cluster 2: 22 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:44:30.064238070 80 GET image/jpeg 0\n", "2013-09-15 23:44:30.104156017 80 GET image/jpeg 0\n", "2013-09-15 23:44:30.725122929 80 GET image/jpeg 0\n", "\n", "Cluster 3: 14 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:44:31.386100054 80 GET NaN 0\n", "2013-09-15 23:44:31.417192936 80 GET NaN 0\n", "2013-09-15 23:44:31.471001863 80 GET NaN 0\n", "\n", "Cluster 4: 10 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:48:10.495719910 80 POST text/plain 69823\n", "2013-09-15 23:48:11.495719910 80 POST text/plain 69993\n", "2013-09-15 23:48:12.495719910 80 POST text/plain 71993\n", "\n", "Cluster 5: 15 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:44:30.061532021 80 GET image/png 0\n", "2013-09-15 23:44:30.061532021 80 GET image/png 0\n", "2013-09-15 23:44:30.063459873 80 GET image/png 0\n", "\n", "Cluster 6: 14 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:44:27.668081999 80 GET text/html 0\n", "2013-09-15 23:44:27.731701851 80 GET text/html 0\n", "2013-09-15 23:44:28.092921972 80 GET text/html 0\n", "\n", "Cluster 7: 8 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:44:47.464160919 80 GET application/x-dosexec 0\n", "2013-09-15 23:44:47.464160919 80 GET application/x-dosexec 0\n", "2013-09-15 23:44:49.221977949 80 GET application/x-dosexec 0\n", "\n", "Cluster 8: 7 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:48:06.495719910 80 OPTIONS text/plain 0\n", "2013-09-15 23:48:07.495719910 80 OPTIONS text/plain 0\n", "2013-09-15 23:48:08.495719910 80 OPTIONS text/plain 0\n", "\n", "Cluster 9: 7 observations\n", " id.resp_p method resp_mime_types request_body_len\n", "ts \n", "2013-09-15 23:48:03.495719910 8080 GET text/plain 0\n", "2013-09-15 23:48:04.495719910 8080 GET text/plain 0\n", "2013-09-15 23:48:04.495719910 8080 GET text/plain 0\n" ] } ], "source": [ "# Now print out the details for each cluster\n", "pd.set_option('display.width', 1000)\n", "for key, group in cluster_groups:\n", " print('\\nCluster {:d}: {:d} observations'.format(key, len(group)))\n", " print(group[features].head(3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "# Look Ma... No K!\n", "\n", "### DBSCAN\n", "Density-based spatial clustering is a data clustering algorithm that given a set of points in space, groups points that are closely packed together and marking low-density regions as outliers.\n", "\n", "- You don't have to pick K\n", "- There are other hyperparameters (eps and min_samples) but defaults often work well\n", "- https://en.wikipedia.org/wiki/DBSCAN\n", "- Hierarchical version: https://github.com/scikit-learn-contrib/hdbscan" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of Clusters: 10\n" ] } ], "source": [ "# Now try DBScan\n", "http_df['cluster_db'] = DBSCAN().fit_predict(http_feature_matrix)\n", "print('Number of Clusters: {:d}'.format(http_df['cluster_db'].nunique()))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Now use dataframe group by cluster\n", "cluster_groups = http_df.groupby('cluster_db')\n", "\n", "# Plot the Machine Learning results\n", "fig, ax = plt.subplots()\n", "for key, group in cluster_groups:\n", " group.plot(ax=ax, kind='scatter', x='x', y='y', alpha=0.5, s=250,\n", " label='Cluster: {:d}'.format(key), color=colors[key])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "# DBSCAN automagically determined 10 clusters!\n", "So obviously we got a bit lucky here and for different datasets with different feature distributions DBSCAN may not give you the optimal number of clusters right off the zat. There are two hyperparameters that can be tweeked but like we said the defaults often work well. See the DBSCAN and Hierarchical DBSCAN links for more information.\n", "\n", "- https://en.wikipedia.org/wiki/DBSCAN\n", "- Hierarchical version: https://github.com/scikit-learn-contrib/hdbscan\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Wrap Up\n", "Well that's it for this notebook, given the usefulness and relatively efficiency of clustering it a good technique to include in your toolset. Understanding the K hyperparameter and how to determine optimal K (or not if you're using DBSCAN) is a good trick to know.\n", "\n", "If you liked this notebook please visit the [zat](https://github.com/SuperCowPowers/zat) project for more notebooks and examples." ] } ], "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.4" } }, "nbformat": 4, "nbformat_minor": 1 }