Last active
February 7, 2017 14:29
-
-
Save mattsgithub/99ebbcf4b4a670ffbec6057208ea52be to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Introduction\n", | |
"<p>\n", | |
"Detecting unusual events can be a useful indicator for identifying an insider threat, or bank fraud. An unusual event by itself, however, is not absolute evidence that something bad has happened: it should always be considered in context. For example, an employee may enter/exit his office building during an unusual late-night hour. But perhaps he forgot something at the office and returned to pick it up.\n", | |
"</p>\n", | |
"<p>\n", | |
"This is why it is so very important to fuse data from multiple sources in order to tell a more accurate story. At Haystax, we fuse many pieces of evidence via probabilistic graphical models (specifically, <a href=\"http://haystax.com/blog/2016/08/22/making-bayesian-networks-accessible\">Bayesian networks</a>). But the evidence we apply to these graphical models can be learned from data. This blog post covers one particular case on how we might do that.\n", | |
"</p>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Detecting Unusual Access Times\n", | |
"Suppose we have building-access data for an employee. Actually, we can simulate that scenario using the programming language Python. Let's simulate access-point data for a typical week of work days (Monday-Friday). We engineer our simulated data so that our employee typically arrives around 9:00 AM. Then he leaves and re-enters around lunchtime, and then leaves for the day around 5:00 PM. Now say we throw in one anomalous event: he comes back around 7:30 PM and leaves shortly thereafter." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"# Loads the modules we need\n", | |
"from matplotlib import pyplot as plt\n", | |
"import matplotlib.dates as mdates\n", | |
"import scipy.stats as stats\n", | |
"import datetime\n", | |
"import numpy as np\n", | |
"from datetime import timedelta\n", | |
"import random\n", | |
"import numpy as np\n", | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def get_data_for_time_point(mean_time, num_points=100):\n", | |
" '''Specify a mean time and number of points\n", | |
" Returns event times distributed as N(0, 30)\n", | |
" '''\n", | |
" random_minutes = np.random.normal(loc=0., scale=30., size=num_points)\n", | |
" times = [mean_time + timedelta(minutes=m) for m in random_minutes]\n", | |
" return times\n", | |
"\n", | |
"# Simulates data for fictional employee\n", | |
"starts_workday = get_data_for_time_point(datetime.datetime(2016, 12, 1, 9, 0))\n", | |
"gets_lunch = get_data_for_time_point(datetime.datetime(2016, 12, 1, 12, 0), num_points=200)\n", | |
"ends_workday = get_data_for_time_point(datetime.datetime(2016, 12, 1, 17, 30))\n", | |
"unusual_access = get_data_for_time_point(datetime.datetime(2016, 12, 1, 19, 30), num_points=2)\n", | |
"\n", | |
"# Converts dates to format that matplotlib needs\n", | |
"# Gives the number of days (fraction part represents hours, minutes, seconds)\n", | |
"# since 0001-01-01 00:00:00 UTC, plus one\n", | |
"access_point_times = starts_workday + gets_lunch + ends_workday + unusual_access\n", | |
"access_point_nums = mdates.date2num(access_point_times)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Now that we have data simulated, let's see how it looks." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\nREREREREREREREREREREREREREREREREREREREREpEj/DxVncq2FyyPKAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10e0a23d0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"def plot_access_points(access_point_nums, num_bins, density_func_data=None, alpha=1.0):\n", | |
"\n", | |
" fig, ax = plt.subplots(1,1)\n", | |
" plt.xlabel('Time of Workday')\n", | |
" plt.ylabel('Count')\n", | |
" plt.title('Access Point Times for Typical Workday')\n", | |
"\n", | |
" # Gives nice x-axix labeling\n", | |
" locator = mdates.HourLocator()\n", | |
" ax.xaxis.set_major_locator(locator)\n", | |
" ax.xaxis.set_major_formatter(mdates.DateFormatter('%I:%m %p'))\n", | |
" \n", | |
" ax.hist(access_point_nums, bins=num_bins, normed=True, color='gray', alpha=alpha)\n", | |
" ax.annotate('anomaly?' if num_bins < 10 else 'anomaly',\n", | |
" xy=(access_point_nums[-1], 1),\n", | |
" xytext=(0.6, 0.5),\n", | |
" textcoords='axes fraction',\n", | |
" arrowprops=dict(facecolor='darkblue', shrink=0.05),)\n", | |
" fig.autofmt_xdate(rotation=90)\n", | |
" \n", | |
" # Used later in blog...\n", | |
" if density_func_data is not None:\n", | |
" ax.plot(density_func_data[0], density_func_data[1])\n", | |
" \n", | |
" plt.show()\n", | |
" \n", | |
"plot_access_points(access_point_nums, num_bins=5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"From this histogram, given the few number of bins we selected, our anomalous event is not so anomalous. So instead, let's choose to use many more bins." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10a8c7610>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plot_access_points(access_point_nums, num_bins=100)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<p>\n", | |
"Now the anomaly actually looks like an anomaly! What happened? First, we need to understand that the actual distribution that governs these data is continuous, and not discrete. Second, we learn that picking the number of bins (or, conversely, bin size) is a parameter that needs to be adjusted.\n", | |
"</p>\n", | |
"\n", | |
"<p>\n", | |
"For the remainder of this blog, we'll discuss how to estimate the underlying continuous distribution.\n", | |
"</p>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Kernel Density Estimation\n", | |
"A popular method for handling this type of problem is known as kernel density estimation. The idea is as follows: if we had the actual density estimation, we could compute the probability of observing the event as follows:\n", | |
"\n", | |
"\n", | |
"$ \\int_{t_0}^{t_0 + \\Delta t} f(t) \\; dt = P(t_0 < t < t_0 + \\Delta t) = P(t_0) $\n", | |
"\n", | |
"The problem is, we don't have access to $f(t)$. But we'd like to learn it from data. Suppose we restrict ourselves to a very tiny region. It’s reasonable to assume that the probability density in this small region is roughly constant. Thus:\n", | |
"\n", | |
"\n", | |
"$ \\int_{t_0}^{t_0 + \\Delta t} f(t) \\; dt \\approx f(t_0) \\int_{t_0}^{t_0 + \\Delta t} \\; dt = f(t_0) \\times h = P(t_0)$\n", | |
"\n", | |
"where we let $h$ be the bin width." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"We can now solve for $f$:\n", | |
"\n", | |
"$f(t) = \\frac{P(t)}{h}$\n", | |
"\n", | |
"But what is $P(t)$? It can be estimated by counting the number of time points that fell into this small region, and dividing by the number of all observed time points. Thus, $P(t) = \\frac{n_h}{N} $ where $N$ is the number of all time points, and $n_h$ is the number that fell into the particular region we are focusing on. Putting this all together, we get:\n", | |
"\n", | |
"\n", | |
"$f(t) = \\frac{n_h}{Nh} $" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"But there's a more general way we can write this, and that's as follows:\n", | |
"\n", | |
"$f(t) = \\frac{1}{N h} \\sum_i^N K(\\frac{t - t_i}{h})$\n", | |
"\n", | |
"Where $K = 1 \\; \\text{if} \\; (\\frac{|t - t_i|}{h} < 0) \\; \\text{else} \\; 0$" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
" Why construct this more complicated expression? Because it suggests a way to generalize our approach for computing $n_h$. Right now, we give all points equal weight (i.e., a weight of one) if and only if they exist within a distance of $h$ from t. But what if we didn't want to do this? What if we wanted to consider all points? And perhaps points very far away should be weighted less, but not zero? All we have to do is replace $K$ with an updated function that captures the criteria we want. This is the idea of kernel density estimation. $K$ is a kernel, and we can choose one we like. Another kernel we could choose is a Gaussian:\n", | |
" \n", | |
" $K = \\frac{1}{\\sqrt{2\\pi}} e^{- \\frac{1}{2}(\\frac{x - x_i}{h})^2}$" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Here, we are forcing data points further and further away to have less weight. Let's write a simple implementation of this to see how this looks. Here, we provide two kernels but we'll see how the Gauss kernel looks:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"class KDE(object):\n", | |
" def __init__(self, x):\n", | |
" self._x = x\n", | |
" self._N = len(x) * 1.\n", | |
" \n", | |
" @staticmethod\n", | |
" def uniform(x, x_center, h):\n", | |
" return (1. if np.abs(x - x_center)/h <= 0.5 else 0.)\n", | |
" \n", | |
" @staticmethod\n", | |
" def gauss(x, x_center, h):\n", | |
" return (1./(np.sqrt(2. * np.pi * h**2))) * np.exp((-0.5/h**2) * ((x - x_center)**2))\n", | |
" \n", | |
" def predict(self, x, h, kernel='uniform'):\n", | |
" if kernel == 'uniform':\n", | |
" sum_ = sum([KDE.uniform(xi, x, h) for xi in self._x])\n", | |
" elif kernel == 'gauss':\n", | |
" sum_ = sum([KDE.gauss(xi, x, h) for xi in self._x])\n", | |
" else:\n", | |
" raise ValueError('{0} is not a supported kernel'.format(kernel))\n", | |
" \n", | |
" return sum_ / self._N" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\nrYDXkJc/3Pu4Po9189zrXsxjXSNMYngI8xl/jWlf5C2JvL9vkPd3zob5vWeSe+yNwZwcKO5HTMlO\nXq/zOkyjzXT39teS//sNBX+mIiIiJXIb5gLkO0Im5E4cJHQU9JlKCOqCyf73cOqAQ+GYBjQ/YFpx\n78EU4Z2GiEjg2TDnmyX5rE9EiUOoKewzlWKwuo1DJUy971RM/bZ3Y5/KmKLqCZiGcjUwo359gqkX\nFBEJhEqYm5ZumCqHgdaGIwGgz7SCcFL4h9vWvZ2KnEQkUBIx55WDmDY7hW2nEofgl4h/n6kUg9Ul\nDkUViymVSC1sQxERP+3Cv67p/m4n1tuFPqtSE0pvbDSmzcP75B65TkRERMpIqJQ4RGC6BLkwfboL\nchpqQCkiIlIcf3LqfCK5hELi4EkaGmD6OxdU2nDaWWedtXfr1q0FbCIiIiL52IIZ3C3f5CHYEwdP\n0tAY0zr2cCHbn7Z161beffddXnvtNSZP9p2dNziMHTs2KGML1rggeGML1rggeGML1rggeGML1rgg\neGNTXEU3atQoNmzYcDam1D5oE4fKmOGHPU7HjCJ4EBP0bEyXzAGYJKKue7uD5J7gJJezzz6b2NhY\nWrf2HSAvOARrbMEaFwRvbMEaFwRvbMEaFwRvbMEaFwRvbIqr6KpUqVL4RlifOLTj5FC5Lsz492Cm\n6X0EMxypi9zji7swpQ9flk2IIiIi4mF14rCcgnt2hFKvDxERkXJPF2YRERHxm93qAALsNOCGG264\ngdNOO40WLVpYHU++gjW2YI0Lgje2YI0Lgje2YI0Lgje2YI0Lgjc2xVU0f/75J0uXLgWYQgGNI0sy\nn30wag2sW7duXdA2PhEREQlG69evp02bNgBtgPX5baeqChEREfGbEgcRERHxmxIHERER8ZsSBxER\nEfGbEgcRERHxmxIHERER8ZsSBxEREfGbEgcRERHxmxIHERER8ZsSBxEREfGbEgcRERHxmxIHERER\n8ZsSBxEREfGbEgcRERHxmxIHERER8ZsSBxEREfGbEgcRERHxmxIHERER8ZsSBxEREfGbEgcRERHx\nmxIHERER8ZsSBxEREfGbEgcRERHxmxIHERER8ZsSBxEREfGbEgcRERHxmxIHERER8ZsSBxEREfGb\nEgcRERHxmxIHERER8ZsSBxEREfGbEgcRERHxmxIHERER8ZvViUMX4FNgD+AELsljmwnAXiANSAGa\nlFl0Uq5lZmaSlpaW65GZmWl1WCIiQS3c4uNXAjYAU4GPAJfP+nuAW4BrgV3ARGARcA6gM7wUW2Zm\nJhs2bCArKyvX8sjISFq1akVUVJRFkYmIBDerE4eF7kdebMBYTLLwqXvZtcDfwCDgg1KPTsoth8NB\nVlYW8fHxREdHA5CRkcHBgwdxOBwWRyciErysrqooSCOgDrDYa9kRYA1woSURSbkTHR1NTEwMMTEx\nJxIIERHJXzAnDnXd//7ts/xvr3UiIiJShoI5cciPjVPbQoiIiEgZsLqNQ0H+cv9bh9ylDnWA9QU9\ncezYscTGxuZalpycTHJyckADFBERCUUzZsxgxowZuZalpqb69dxgThx+xSQPPYEf3MuqAecDLxX0\nxMmTJ9O6devSjU5ERCRE5XUzvX79etq0aVPoc61OHCoDZ3j9fTrQEjgI/A5MBv4LbOdkd8w9wLwy\njVJEREQA6xOHdsBS9/9dwDPu/78FjASexCQXU4BYYCVwEZC7872IiIiUCasTh+UU3kDzIfdDRERE\nLGZ14iAScjIzM3MNEpWTk0N4eO6fkt1u1+iTIlIuKXEQKQLfoaqzsrL47bffSExMJCIi4sR2Grpa\nRMorJQ4iReA7VPXhw4fZtm0bcXFxVK9eHdDQ1SJSvilxECkGz1DV6enpAERFRRETE2NxVCIipS8U\nR44UERERiyhxEBEREb8pcRARERG/KXEQERERvylxEBEREb8pcRARERG/KXEQERERvylxEBEREb8p\ncRARERG/KXEQERERvylxEBEREb8pcRARERG/KXEQERERvylxEBEREb8pcRARERG/KXEQERERvylx\nEBEREb8pcRARERG/KXEQERERvylxEBEREb8pcRARERG/KXEQERERvylxEBEREb8pcRARERG/KXEQ\nERERvylxEBEREb8pcRARERG/KXEQERERvylxEBEREb8pcRARERG/KXEQERERvwV74hAOPA78CqQB\nO4D/WhqRiIhIBRZudQCFuB8YBVwL/AS0A6YB/wAvWBiXVBCZmZk4HI4Tf6elpZGdnW1hRCLlm+9v\nzm63ExUVZWFE4ivYE4d2wDzgc/ffu4Gh7uUipSozM5MNGzaQlZV1YllGRga7du0iISGBmJgYC6MT\nKX/y+s1FRkbSqlUrJQ9BJNirKj4HegJnuP8+D+jIyURCpNQ4HA6ysrKIj48nISGBhIQEatSoQXZ2\n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\nxgAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10e10e690>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# We'd like to evaluate our learned density\n", | |
"# function by the minute. We'll evaluate\n", | |
"# from 8am to 8pm\n", | |
"start = datetime.datetime(2016, 12, 1, 8, 0)\n", | |
"end = datetime.datetime(2016, 12, 1, 20, 0)\n", | |
"minute = timedelta(minutes=1)\n", | |
"\n", | |
"t = [start]\n", | |
"while t[-1] <= end:\n", | |
" t.append(t[-1] + minute)\n", | |
"\n", | |
"t = mdates.date2num(t)\n", | |
"kde = KDE(access_point_nums)\n", | |
"W = [kde.predict(x=ui, h=0.02, kernel='gauss') for ui in t]\n", | |
"\n", | |
"plot_access_points(access_point_nums, 100, density_func_data=(t, W), alpha=0.2)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<p>\n", | |
"See how much better our estimates are?\n", | |
"</p>\n", | |
"\n", | |
"<p>\n", | |
"But this does not explain how to pick $h$. Choosing $h=0.015$ for this exercise was done by trial and error (to automatically choose an optimal $h$ is beyond the scope of this blog). Also, it is possible to compute a distribution not just for an individual, but by cohort. For example, we can calculate a distribution for employees by department (e.g., accounting, sales) or by location (e.g., HQ office, satellite office). We can compute distributions by specific positions (sysadmins, security-cleared, etc.). In our model-first approach, we allow expert knowledge and opinion to guide these modeling choices. By carefully choosing what parameters to condition on, we hope to reduce the number of false-positives detected. And even the anomalies that are detected, are still interpreted by a Bayesian network, which fuses heterogenous information from many different sources. This approach allows for a very rich, contextual interpretation, of the trustworthiness of a single individual.\n", | |
"</p>" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 2", | |
"language": "python", | |
"name": "python2" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 2 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython2", | |
"version": "2.7.10" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 1 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment