{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", " \n", "## [mlcourse.ai](https://mlcourse.ai) – Open Machine Learning Course \n", "###
Author: Alexander Nichiporenko, AlexNich\n", " \n", "##
Tutorial\n", "###
\"Anomaly Detection: Isolation Forest\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In our course we quite a bit touched unsupervised learning tasks (reduction of dimenstion and clustering), and one more important class remained unnoticed - the detection of anomalies.\n", "\n", "In data science anomaly detection (outlier or novelty detection) is the identification of rare items, events or observations which raise suspicions by differing significantly from the majority of the data. Typically the anomalous items will translate to some kind of problem such as bank fraud, a structural defect, medical problems or errors in a text. Anomalies are also referred to as outliers, novelties, noise, deviations and exceptions. Outliers often reduce the quality of ML algorithms because models tune to them." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# A bit of theory and the main idea of algorithm." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the proven anomaly detection algorithms is the Isolation Forest. As the name implies - this is an ensemble of trees, which are built independently of each other. But in this case, the principle of building a tree is different from what is used in regression or classification problems - minimizing the splitting criterion at each step.\n", "The trees are also binary, but at each node the feature is chosen randomly, the feature values for splitting are also chosen randomly from the range (min, max) that the feature accepts. The tree is built to the maximum possible depth - when there is only one object in each leaf.\n", "With this approach, it appears that the anomalies will get to the final leaf much earlier than normal objects. This is the principle of detecting anomalies which Isolation Forest uses, this algorithm \"isolates\" anomalies by normal objects at early steps.\n", "\n", "Perhaps it seems not quite obvious, but we can consider the following one-dimensional toy example - such a set of numbers [1,20,21,25]. Obviously, the outlier in this case is the number 1. If we choose the threshold for the first splitting (1,25), then in the overwhelming majority of cases, the number 1 will immediately “isolate” in the first leaf of the tree. Let's simulate this situation for 1000 random threshold choices." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Importing libaries\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The portion of cases when the \"1\" goes to the first leaf: 0.804\n" ] } ], "source": [ "# Toy example\n", "\n", "hits = 0\n", "K = 1000\n", "for k in range(K):\n", " np.random.seed(k + 101)\n", " split = np.random.uniform(1, 25)\n", " if split < 20:\n", " hits += 1\n", "\n", "print('The portion of cases when the \"1\" goes to the first leaf:', hits / K)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this way, we can measure the anomaly score using the path length of the object, i.e. the number of edges an observation must pass in the tree going from the root to the terminal node. But we have a problem, for sample data $X$= {$x_1,...,x_n$} the maximum possible height of isolation tree grows in the order of $n$, the average path length grows in the order of $log({n})$. Therefore, we cannot compare the anomaly of objects in samples of different sizes, normalization by any of the above values will not help either. So we will use this formula for normalization:\n", "\n", "## $$c{(n)} = 2H(n-1) - {2 (n-1)\\over n}$$\n", "\n", "where $H(n-1)$ is $n$-$Harmonic$ number:\n", "\n", "## $$H(n-1) = \\sum_{k=1}^{n-1} {1\\over k} \\approx \\gamma\\ {(Euler's\\ constant)} + \\ln{(n-1)} \\approx 0.5772156649 + \\ln{(n-1)}$$\n", "\n", "$c({n})$ gives the average path length of unsuccessful search in Binary Search Tree (BST). We can use it because isolation tree has a equivalent structure to BST and $c({n})$ equals to estimation of average $h({x})$ for external nodes.\n", "\n", "So final anomaly score is calculated by this formula:\n", "\n", "## $$S(x,n) = {2 ^ {E(x)\\over c(n)}}$$\n", "where $E(x)$ - average path length in trees of our forest where example $x$ was isolated:\n", "\n", "## $$E(x) = {1\\over N}\\sum_{i=1}^{N} {h(x)_i}$$\n", "and $N$ - number of trees in the forest.\n", "\n", "$S(x,n)$ changes from $0$ to $1$. When $S(x,n)$ of example is very close to $1$ it means that it is definitely anomaly, when it much smaller then $0.5$ then this example safe to be regarded as normal instance, and if all examples have $S(x,n) \\approx 0.5$, then the entire data doesn't have any distinct anomaly.\n", "\n", "When we decide which example is anomaly we can choose portion of examples with high score or make a threshold in $S(x,n)$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Let's grow our IsolationForest!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this part of the tutorial, we will implement our own Isolation Forest and see how it works with outliers and normal objects." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from math import log as ln\n", "\n", "import matplotlib.pyplot as plt\n", "# Importing libaries ----\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# External Node - leaf with 1 example\n", "\n", "\n", "class ExNode:\n", " def __init__(self, size):\n", " self.size = size" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Internal Node\n", "\n", "\n", "class InNode:\n", " def __init__(self, left, right, split_feature, split_threshold):\n", " self.left = left\n", " self.right = right\n", " self.split_feature = split_feature\n", " self.split_threshold = split_threshold" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Build one Isolation tree\n", "\n", "\n", "def IsolationTree(X):\n", " if len(X) <= 1:\n", " return ExNode(len(X))\n", " else:\n", " f = np.random.choice(X.columns)\n", " t = np.random.uniform(X[f].min(), X[f].max())\n", " X_l = X[X[f] < t]\n", " X_r = X[X[f] >= t]\n", " return InNode(IsolationTree(X_l), IsolationTree(X_r), f, t)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Build forest\n", "\n", "\n", "def MyIsolationForest(X, n_trees):\n", " forest = []\n", " for i in range(n_trees):\n", " forest.append(IsolationTree(X))\n", " return forest" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Depth of external node where object was isolated\n", "\n", "\n", "def path_length(x, tree, curr_depth):\n", " if isinstance(tree, ExNode):\n", " return curr_depth\n", " t = tree.split_feature\n", " if x[t] < tree.split_threshold:\n", " return path_length(x, tree.left, curr_depth + 1)\n", " else:\n", " return path_length(x, tree.right, curr_depth + 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Functions which is needed to calculate degree of anomaly: $E(d), H(x), c(n), S(x,n)$." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def E(d):\n", " return np.mean(d)\n", "\n", "\n", "def H(x):\n", " return ln(x) + 0.5772156649\n", "\n", "\n", "def c(n):\n", " return 2 * H(n - 1) - 2 * (n - 1) / n if n > 2 else 1 if n == 1 else 0\n", "\n", "\n", "def S(x, n):\n", " return 2 ** (-E(x) / c(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's find outliers using our forest!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Firstly we will generate 1-d data - normal distribution and find average path length and $S(x,n)$ of normal and anomaly objects depends on number of trees." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Normal interval: 80 - 120\n", "Partition of outliers: 0.04\n" ] } ], "source": [ "# Generating normal distributed 1d-data\n", "random_generator = np.random.RandomState(42)\n", "\n", "true_mean = 100\n", "true_sigma = 10\n", "\n", "X_all = random_generator.normal(true_mean, true_sigma, size=500)\n", "\n", "print(\"Normal interval:\", true_mean - 2 * true_sigma, \"-\", true_mean + 2 * true_sigma)\n", "\n", "X_outliers = pd.DataFrame(\n", " np.hstack(\n", " [\n", " X_all[X_all < true_mean - 2 * true_sigma],\n", " X_all[X_all > true_mean + 2 * true_sigma],\n", " ]\n", " ),\n", " columns=[\"x\"],\n", ")\n", "X_normal = pd.DataFrame(list(set(X_all).difference(set(X_outliers))), columns=[\"x\"])\n", "X_all = pd.DataFrame(X_all, columns=[\"x\"])\n", "\n", "print(\"Partition of outliers:\", len(X_outliers) / len(X_all))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 5))\n", "plt.hist(X_all[\"x\"], bins=10)\n", "plt.hist(X_outliers[\"x\"], bins=10)\n", "plt.legend([\"X_all\", \"X_outliers\"])\n", "plt.ylabel(\"Count\")\n", "plt.xlabel(\"X value\")\n", "plt.title(\"Distribution of X\");" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x 67.587327\n", "Name: 2, dtype: float64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Outlier for test\n", "\n", "X_outliers.iloc[2, :]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x 108.657552\n", "Name: 0, dtype: float64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Normal example for test\n", "\n", "X_normal.iloc[0, :]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 8min 29s\n" ] } ], "source": [ "%%time\n", "\n", "anomaly_x = []\n", "normal_x = []\n", "\n", "anomaly_mean_depth = []\n", "normal_mean_depth = []\n", "\n", "anomaly_S = []\n", "normal_S = []\n", "\n", "for n in range(1, 51, 1):\n", " MyIF = MyIsolationForest(X_all, n)\n", " for iTree in MyIF:\n", " anomaly_x.append(path_length(X_outliers.iloc[2, :], iTree, 0))\n", " normal_x.append(path_length(X_normal.iloc[0, :], iTree, 0))\n", " anomaly_mean_depth.append(E(anomaly_x))\n", " normal_mean_depth.append(E(normal_x))\n", " anomaly_S.append(S(anomaly_x, len(X_all)))\n", " normal_S.append(S(normal_x, len(X_all)))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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RNEnTERERKTbUwgTERERiYBCmIiIiEgEFMJEREREIqAQJiIiIhIBhTARERGRCCiEiYiIiERAIUxEREQkAgphIiIiIhFQCBMRERGJgEKYiIiISAQUwkREREQioBAmIiIiEgGFMBEREZEIKISJiIiIREAhTERERCQCCmEiIiIiEVAIExEREYmAQpiIiIhIBBTCRERERCKgECYiIiISAYUwERERkQgohImIiIhEQCFMREREJAIKYSIiIiIRUAgTERERiYBCmIiIiEgEFMJEREREIqAQJiIiIhIBhTARERGRCCiEiYiIiERAIUxEREQkAgphIiIiIhFQCBMRERGJgEKYiIiISAQUwkREREQioBAmIiIiEgGFMBEREZEIKISJiIiIREAhTERERCQCCmEiIiIiEYgshJlZupm9bWZ/i6oGERERkahE2RJ2OfBhhPsXERERiUxGFDs1s6HAvwPXA1dFUUM91dXBEJWMjGAQERGRbiOqb/7fAj8ACiLaf32//z1ceWV0+y8ogFmzYPr06GoQERGRTtXpIczMTgDWu/tbZja1mfUuAi4CGDZsWHKLmjIFbrghuftoztNPw4wZ8Pbb8POfQ3p6dLWIiIhIpzB379wdmt0AnAtUAzlAT+Av7n5OU88pKiryBQsWdFKFEaishCuugD/+EY47Dh58EPr0iboqERERaQMze8vdi1par9M75rv71e4+1N1HANOBuc0FsG4hKwv+8Ae44w548UUoLoZ33426KhEREUkiXScslVx4IcybBzt3wuTJ8OijUVckIiIiSRJpCHP3F939hChrSDmTJ8Nbb8GECXDGGXD11VBTE3VVIiIi0sHUEpaKBg2CF16Aiy6CX/wCTjgBtmyJuioRERHpQAphqSo7G26/HW67DebMCfqJvf9+1FWJiIhIB1EIS3UXXxy0ipWWwqGHwk9+Ah/qRgMiIiJ7OoWwPcGUKbBgARx1FPzP/8ABBwR9xm64AT7/POrqREREpA0UwvYUQ4bAM8/AF1/ALbdAjx5wzTWwzz5BC9lvfhM8JiIiInsEhbA9zaBB8L3vwauvwrJl8MtfQlUVXHUV7L03HH10cNHX9eujrlRERESa0elXzG+LLn/F/I7w8cfw8MPB1fY/+gjS0oLTmKecAiefDCNHRl2hiIhIt5DoFfMVwroa9+Bq+48/Dn/9664r70+YEASyU06B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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 5))\n", "plt.plot(range(1, 51, 1), anomaly_mean_depth, c=\"r\")\n", "plt.plot(range(1, 51, 1), normal_mean_depth, c=\"g\")\n", "plt.title(\"Average path length (n_trees)\")\n", "plt.legend([\"anomaly\", \"normal\"])\n", "plt.xlabel(\"Number of trees\")\n", "plt.ylabel(\"Average path length\");" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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IiIikgQWZKPWLy8vzwsKClLdjJaxbVvQo/bBB/DsszBpUqpbJCIiIofAzBa7e6N2iekOBq3Njh1w+umwahU8/bSCmoiIyBFOYa012bUruNn6smXBfT5POy3VLRIREZEkU1hrLfbsgTPPhLfegieeCMZFRETkiKewdijy8oK7A6TCzp3w6afw2GNwzjmpaYOIiIi0OIW1QzFiBBQXp277F14IZ52Vuu2LiIhIi1NYOxQPPpjqFoiIiEgbk8yL4oqIiIjIYVJYExEREQkxhTURERGREFNYExEREQkxhTURERGREFNYExEREQkxhTURERGREFNYExEREQkxhTURERGREFNYExEREQkxhTURERGREFNYExEREQkxhTURERGREFNYExEREQkxhTURERGREFNYExEREQkxhTURERGREFNYExEREQkxhTURERGREEtqWDOzqWa2ysxWm9m19Tz+azNbEivvm9mOhMeqEh6bm8x2ioiIiIRVWrJWbGZR4F7gNKAQWGRmc919RbyOu89MqH8VMCphFSXuPjJZ7RMRERFpDZLZszYWWO3ua929HJgDTDtA/QuAvySxPSIiIiKtTjLDWm9gY8J0YWzefsysHzAAeDFhdpaZFZjZG2Z2bvKaKSIiIhJeSdsNClg987yBuucDf3P3qoR5fd19k5kNBF40s3fdfU2tDZhdClwK0Ldv3+Zos4iIiEioJLNnrRA4JmG6D7CpgbrnU2cXqLtvig3XAi9T+3i2eJ373T3P3fN69OjRHG0WERERCZVkhrVFwCAzG2BmGQSBbL+zOs1sCJADLEyYl2NmmbHx7sB4YEXdZUVERESOdEnbDerulWZ2JTAPiAKz3X25md0CFLh7PLhdAMxx98RdpEOB+8ysmiBQ/jzxLFIRERGRtsJqZ6TWKy8vzwsKClLdDBEREZGDMrPF7p7XmLq6g4GIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiISYwpqIiIhIiCmsiYiIiIRYUsOamU01s1VmttrM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rLOYOXMmU6ZMqffx+l47M1vs7nmNWX+jetbcPdvdI+7ezt07xaYbDGqxZSqBK4F5wErgcXdfHruo7jmxavOAbWa2AngJuMbdtwFDgQIzeyc2/+cHCmoiIiIiLW3Hjh0MHjyYdu3aNRjUmkNjj1mrxcx6AdvdvexA9dz9WeDZOvNuShh34PuxkljndaD5T6cQERERaSZdunTh/fffT/p2mnpv0EeA98zszuZsjIiIiIjU1qSeNXc/1YLzX49v5vaIiIiISILGXhT31HpmfzPxZAERERERaX6N3Q16k5n93sw6mFlPM3saODuZDRMRERGRxoe1icAaYAnwKvCou381aa0SERERCZlJkyaRisuENTas5RDcKmoNwbXW+lniPRtEREREQqyhW1C1Bo0Na28A/3T3qcAY4GjgtaS1SkRERKSO9evXM3ToUP7jP/6DYcOGcfrpp1NSUsKSJUsYN24cubm5fPnLX6aoqAgIesKuv/56Jk6cyN13382MGTO47LLLmDx5MgMHDmT+/PlcfPHFDB06lBkzZtRs57LLLiMvL49hw4Zx8803p+jZ7tPYs0FPdfcPAdy9BLjazE5OXrNEREQkrL73f99jySdLmnWdIz8zkrumHvwG8R988AF/+ctfmDVrFueddx5PPPEEt99+O7/5zW+YOHEiN910Ez/5yU+4K3az+R07djB//nwAZsyYQVFRES+++CJz587l7LPP5rXXXuOBBx5gzJgxLFmyhJEjR3LrrbfStWtXqqqqmDJlCkuXLiU3N7dZn++hOGDPmpn1B4gHtUTuvsACfZLTNBEREZHaBgwYwMiRIwEYPXo0a9asYceOHUycOBGA6dOns2DBgpr6X/va12otf/bZZ2NmDB8+nJ49ezJ8+HAikQjDhg1j/fr1ADz++OOceOKJjBo1iuXLl7NiRWpvonSwnrU7zCwCPAUsBrYCWcBngckE9/28meCG7CIiItIGNKYHLFkyMzNrxqPRKDt27Dhg/Q4dOtS7fCQSqbWuSCRCZWUl69at484772TRokXk5OQwY8YMSktLm/EZHLoD9qy5+78DPwaGAPcCCwiC2yXAKuAUd38+2Y0UERERqU/nzp3JycnhlVdeAeCRRx6p6WVril27dtGhQwc6d+7M5s2b+ec//9lcTW2yA/asmdkYYKO73xCbng58BfgUeNbdUxs1RUREpM17+OGH+e53v0txcTEDBw7koYceavK6RowYwahRoxg2bBgDBw5k/PjxzdjSprHgXuoNPGj2FsHJBdtjJxTMAa4CRgJDw3Sttby8PE/FtU9ERETagpUrVzJ06NBUN6NVqu+1M7PF7p7XmOUPdsxa1N23x8a/Btzv7k8AT5hZ854GIiIiIiL7Odh11qJmFg90U4AXEx5r0k3gRURERKTxDha4/gLMN7NPgRLgFQAz+yywM8ltExERkRBxd3QDo0NzoMPNGuuAYc3dbzWzF4BewHO+b4sRgmPXREREpA3Iyspi27ZtdOvWTYGtkdydbdu2kZWVdVjrOeiuTHd/o5557x/WVkVERKRV6dOnD4WFhWzdujXVTWlVsrKy6NPn8O4foOPORERE5KDS09MZMGBAqpvRJjX2Ru4iIiIikgIKayIiIiIhprAmIiIiEmIKayIiIiIhprAmIiIiEmJJDWtmNtXMVpnZajO7toE655nZCjNbbmaPJsyfbmYfxMr0ZLZTREREJKySdukOM4sC9wKnAYXAIjOb6+4rEuoMAq4Dxrt7kZkdFZvfFbgZyAMcWBxbtihZ7RUREREJo2T2rI0FVrv7WncvB+YA0+rU+Q/g3ngIc/ctsflnAM+7+/bYY88DU5PYVhEREZFQSmZY6w1sTJgujM1LNBgYbGavmdkbZjb1EJYVEREROeIl8w4G9d04rO7dTNOAQcAkoA/wipmd0MhlMbNLgUsB+vbtezhtFREREQmlZPasFQLHJEz3ATbVU+cpd69w93XAKoLw1phlcff73T3P3fN69OjRrI0XERERCYNkhrVFwCAzG2BmGcD5wNw6dZ4EJgOYWXeC3aJrgXnA6WaWY2Y5wOmxeSIiIiJtStJ2g7p7pZldSRCyosBsd19uZrcABe4+l32hbAVQBVzj7tsAzOynBIEP4BZ3356stoqIiIiElbnvdyhYq5SXl+cFBQWpboaIiIjIQZnZYnfPa0xd3cFAREREJMQU1kRERERCTGFNREREJMQU1kRERERCTGFNREREJMQU1kRERERCTGFNREREJMQU1kRERERCTGFNREREJMQU1kRERERCTGFNREREJMQU1kRERERCTGFNREREJMQU1kRERERCTGFNREREJMQU1kRERERCTGFNREREJMQU1kRERERCTGFNREREJMQU1kRERERCTGFNREREJMQU1kRE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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 5))\n", "plt.plot(range(1, 51, 1), anomaly_S, c=\"r\")\n", "plt.plot(range(1, 51, 1), normal_S, c=\"g\")\n", "plt.title(\"S (n_trees)\")\n", "plt.legend([\"anomaly\", \"normal\"])\n", "plt.xlabel(\"Number of trees\")\n", "plt.ylabel(\"S(x,n)\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see anomaly object has obviously less path depth and bigger $S(x,n)$. Also we don't need many trees to detect anomalies, approximately at 15 trees we reach the asymptote.\n", "\n", "Ok, let's find outliers in 2-d data. We will use IsolationForest with 30 trees to find our otliers and check the quality of detection." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Generating 2d-data\n", "random_generator = np.random.RandomState(42)\n", "\n", "# Generating normal data\n", "X_normal = random_generator.randn(2000, 2) * 0.5\n", "X_normal = pd.DataFrame(X_normal, columns=[\"x1\", \"x2\"])\n", "X_normal[\"type\"] = \"normal\"\n", "\n", "# Generating outliers\n", "X_outliers_1 = random_generator.uniform(low=-6, high=6, size=(78, 2))\n", "X_outliers_2 = random_generator.uniform(low=-6, high=-3, size=(35, 2))\n", "\n", "X_outliers = np.vstack([X_outliers_1, X_outliers_2])\n", "\n", "X_outliers = pd.DataFrame(X_outliers, columns=[\"x1\", \"x2\"])\n", "X_outliers[\"R\"] = X_outliers[\"R\"] = np.sqrt(\n", " X_outliers[\"x1\"] ** 2 + X_outliers[\"x2\"] ** 2\n", ")\n", "X_outliers = X_outliers[X_outliers[\"R\"] > 3].drop(columns=[\"R\"])\n", "X_outliers[\"type\"] = \"anomaly\"\n", "\n", "# Full data\n", "\n", "X_full = pd.concat([X_normal, X_outliers])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(8, 8))\n", "plt.scatter(X_outliers[\"x1\"], X_outliers[\"x2\"], c=\"r\")\n", "plt.scatter(X_normal[\"x1\"], X_normal[\"x2\"], c=\"g\")\n", "plt.xlabel(\"x1\")\n", "plt.ylabel(\"x2\")\n", "plt.legend([\"outliers\", \"normal\"])\n", "plt.title(\"2d distribution\");" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((2000, 3), (100, 3), (2100, 3))" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_normal.shape, X_outliers.shape, X_full.shape" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 48.6 s\n" ] } ], "source": [ "%%time\n", "MyIF = MyIsolationForest(X_full[[\"x1\", \"x2\"]], 30)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x1 -0.179784\n", "x2 -4.97516\n", "type anomaly\n", "Name: 0, dtype: object" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_outliers.iloc[0, :]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x1 0.248357\n", "x2 -0.0691322\n", "type normal\n", "Name: 0, dtype: object" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_normal.iloc[0, :]" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 18.1 s\n" ] } ], "source": [ "%%time\n", "\n", "aScore = []\n", "\n", "\n", "for i in range(X_full.shape[0]):\n", " depth = []\n", " for iTree in MyIF:\n", " depth.append(path_length(X_full.iloc[i, :], iTree, 0))\n", "\n", " aScore.append(S(depth, X_full.shape[0]))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": true }, "outputs": [], "source": [ "X_full[\"aScore\"] = aScore" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "t = X_full[\"aScore\"].quantile(0.95)\n", "X_full[\"Outlier\"] = X_full[\"aScore\"].apply(\n", " lambda x: -1 if x >= t else 1\n", ") # -1 for outliers and 1 for normal object" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAEP5JREFUeJzt3XusZWV9xvHvAyOoqFwHgzMTDpZBaywNODG0GkVHjUoDmEILtYqWdqrBWzHVsTHRtInB3vBSYzOCdjBUtGhkFJRaEI2tIIeLIAzKCAhTKBzl4q0oyK9/7HfqcTjM2cc5Z+9zXr6fZGev9a537fXbiz3PWbx773enqpAk9WuXcRcgSVpYBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpc8vGXQDAfvvtVxMTE+MuQ5KWlCuuuOL7VbV8tn6LIugnJiaYnJwcdxmStKQk+d4w/Ry6kaTOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzi2Kb8YuVRPrzx/LcW857aixHFfS0uQVvSR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnTPoJalzBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktQ5g16SOmfQS1LnDHpJ6txQQZ/kL5Jcl+RbST6R5LFJDkpyWZIbk3wyyW6t7+5tfUvbPrGQT0CStGOzBn2SFcCbgDVV9UxgV+AE4L3A6VW1GrgHOLntcjJwT1UdDJze+kmSxmTYoZtlwOOSLAMeD9wBvBA4t23fCBzblo9p67Tta5NkfsqVJM3VrEFfVf8N/D1wK4OAvw+4Ari3qh5s3bYCK9ryCuC2tu+Drf++81u2JGlYwwzd7M3gKv0g4CnAHsDLZuha23bZwbbpj7suyWSSyampqeErliTNyTBDNy8Cbq6qqap6APgM8LvAXm0oB2AlcHtb3gqsAmjb9wTu3v5Bq2pDVa2pqjXLly/fyachSXokwwT9rcARSR7fxtrXAtcDXwaOa31OAs5ry5vaOm37xVX1sCt6SdJoDDNGfxmDN1WvBK5t+2wA3g6cmmQLgzH4M9suZwL7tvZTgfULULckaUjLZu8CVfUu4F3bNd8EPHuGvvcDx+98aZKk+eA3YyWpcwa9JHXOoJekzhn0ktQ5g16SOmfQS1LnDHpJ6pxBL0mdM+glqXMGvSR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnRvqh0cWs4n154+7BEla1Lyil6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktQ5g16SOmfQS1LnDHpJ6pxBL0mdM+glqXMGvSR1zqCXpM4Z9JLUOYNekjo3VNAn2SvJuUluSLI5ye8k2SfJl5Lc2O73bn2T5ANJtiS5JsnhC/sUJEk7MuwV/fuBL1bV04HfBjYD64GLqmo1cFFbB3gZsLrd1gEfnteKJUlzMmvQJ3kS8DzgTICq+nlV3QscA2xs3TYCx7blY4CzauBSYK8kB8x75ZKkoQxzRf9UYAr4WJKrkpyRZA/gyVV1B0C737/1XwHcNm3/ra1NkjQGwwT9MuBw4MNVdRjwE345TDOTzNBWD+uUrEsymWRyampqqGIlSXM3TNBvBbZW1WVt/VwGwX/ntiGZdn/XtP6rpu2/Erh9+wetqg1Vtaaq1ixfvvzXrV+SNItZg76q/ge4LcnTWtNa4HpgE3BSazsJOK8tbwJe3T59cwRw37YhHknS6C0bst8bgbOT7AbcBLyWwR+JTyU5GbgVOL71vQB4ObAF+GnrK0kak6GCvqquBtbMsGntDH0LOGUn65IkzRO/GStJnTPoJalzBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktQ5g16SOmfQS1LnDHpJ6pxBL0mdM+glqXMGvSR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnTPoJalzBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzg0d9El2TXJVks+39YOSXJbkxiSfTLJba9+9rW9p2ycWpnRJ0jDmckX/ZmDztPX3AqdX1WrgHuDk1n4ycE9VHQyc3vpJksZkqKBPshI4CjijrQd4IXBu67IROLYtH9PWadvXtv6SpDEY9or+fcDbgIfa+r7AvVX1YFvfCqxoyyuA2wDa9vtaf0nSGMwa9El+D7irqq6Y3jxD1xpi2/THXZdkMsnk1NTUUMVKkuZumCv65wBHJ7kFOIfBkM37gL2SLGt9VgK3t+WtwCqAtn1P4O7tH7SqNlTVmqpas3z58p16EpKkRzZr0FfVO6pqZVVNACcAF1fVK4EvA8e1bicB57XlTW2dtv3iqnrYFb0kaTR25nP0bwdOTbKFwRj8ma39TGDf1n4qsH7nSpQk7Yxls3f5paq6BLikLd8EPHuGPvcDx89DbZKkeeA3YyWpcwa9JHXOoJekzhn0ktQ5g16SOmfQS1LnDHpJ6pxBL0mdM+glqXMGvSR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnTPoJalzBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzi0bdwGau4n154/t2LecdtTYji3p1+MVvSR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnTPoJalzswZ9klVJvpxkc5Lrkry5te+T5EtJbmz3e7f2JPlAki1Jrkly+EI/CUnSIxvmiv5B4K1V9ZvAEcApSZ4BrAcuqqrVwEVtHeBlwOp2Wwd8eN6rliQNbdagr6o7qurKtvwjYDOwAjgG2Ni6bQSObcvHAGfVwKXAXkkOmPfKJUlDmdMYfZIJ4DDgMuDJVXUHDP4YAPu3biuA26bttrW1SZLGYOigT/IE4NPAW6rqhzvqOkNbzfB465JMJpmcmpoatgxJ0hwNFfRJHsMg5M+uqs+05ju3Dcm0+7ta+1Zg1bTdVwK3b/+YVbWhqtZU1Zrly5f/uvVLkmYxzKduApwJbK6qf5y2aRNwUls+CThvWvur26dvjgDu2zbEI0kavWHmo38O8Crg2iRXt7a/Ak4DPpXkZOBW4Pi27QLg5cAW4KfAa+e1YknSnMwa9FX1NWYedwdYO0P/Ak7ZybokSfPEb8ZKUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktQ5g16SOmfQS1LnDHpJ6pxBL0mdM+glqXMGvSR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnTPoJalzBr0kdc6gl6TOGfSS1DmDXpI6t2zcBWhpmVh//liOe8tpR43luFIPvKKXpM4Z9JLUOYNekjpn0EtS53wzVtKvGNcb7uCb7gvFK3pJ6pxBL0mdM+glqXMGvSR1zjdjJS0afvN6YXhFL0mdW5Ar+iQvBd4P7AqcUVWnLcRx9Ogxzo/8SUvdvAd9kl2BDwEvBrYClyfZVFXXz/exJGk+9P7dgYUYunk2sKWqbqqqnwPnAMcswHEkSUNYiKBfAdw2bX1ra5MkjcFCjNFnhrZ6WKdkHbCurf44ybfn4dj7Ad+fh8dZyjwHngPwHMASOQd5707tfuAwnRYi6LcCq6atrwRu375TVW0ANszngZNMVtWa+XzMpcZz4DkAzwF4DqZbiKGby4HVSQ5KshtwArBpAY4jSRrCvF/RV9WDSd4AXMjg45Ufrarr5vs4kqThLMjn6KvqAuCChXjsWczrUNAS5TnwHIDnADwH/y9VD3ufVJLUEadAkKTOLcmgT/LSJN9OsiXJ+hm2vy7JtUmuTvK1JM8YR50LabZzMK3fcUkqSXefPhjidfCaJFPtdXB1kj8dR50LaZjXQZI/SHJ9kuuS/Ouoa1xIQ7wGTp/23/87Se4dR51jV1VL6sbgDd7vAk8FdgO+CTxjuz5PmrZ8NPDFcdc96nPQ+j0R+CpwKbBm3HWP4XXwGuCfxl3rmM/BauAqYO+2vv+46x7l89+u/xsZfDhk7LWP+rYUr+hnnWKhqn44bXUPZvjC1hI37DQTfwP8LXD/KIsbEafaGO4c/Bnwoaq6B6Cq7hpxjQtprq+BE4FPjKSyRWYpBv1QUywkOSXJdxkE3ZtGVNuozHoOkhwGrKqqz4+ysBEadqqN309yTZJzk6yaYftSNsw5OAQ4JMl/Jrm0zSzbi6GnW0lyIHAQcPEI6lp0lmLQDzXFQlV9qKp+A3g78M4Fr2q0dngOkuwCnA68dWQVjd4wr4PPARNVdSjwH8DGBa9qtIY5B8sYDN8cyeCK9owkey1wXaMyVBY0JwDnVtUvFrCeRWspBv1QUyxMcw5w7IJWNHqznYMnAs8ELklyC3AEsKmzN2RnfR1U1Q+q6mdt9SPAs0ZU26gM829hK3BeVT1QVTcD32YQ/D2YSxacwKN02AaWZtDPOsVCkukv5KOAG0dY3yjs8BxU1X1VtV9VTVTVBIM3Y4+uqsnxlLsghnkdHDBt9Whg8wjrG4Vhphv5LPACgCT7MRjKuWmkVS6coaZbSfI0YG/g6yOub9FYcr8ZW48wxUKSvwYmq2oT8IYkLwIeAO4BThpfxfNvyHPQtSHPwZuSHA08CNzN4FM43RjyHFwIvCTJ9cAvgL+sqh+Mr+r5M4d/BycC51T76M2jkd+MlaTOLcWhG0nSHBj0ktQ5g16SOmfQS1LnDHpJ6pxBr0UnySvajJtPH3MdP55D312SfCDJt9rMqZcnOWgh65OGZdBrMToR+BqDL8AsFX8IPAU4tKp+C3gFsFNT4iZZct9z0eJk0GtRSfIE4DnAyUwL+iRHJrmkTU52Q5Kzk6RtW5vkqnYl/dEku7f2W5K8J8nXk0wmOTzJhUm+m+R1246X5KIkV7b9Hzb7YZKPT29vxz56u24HAHdU1UMAVbV124yRbc70K5N8M8lFrW2fJJ9tE65dmuTQ1v7uJBuS/DtwVpJdk/xd+z+Ea5L8+Xydaz2KjHueZG/ept+APwbObMv/BRzelo8E7mMwn8kuDL7O/lzgsQxmMDyk9TsLeEtbvgV4fVs+HbiGwTxAy4G7Wvsy2u8XAPsBW/jlFwl/3O6fD3y2Le8J3Aws267ule14VwP/ABzW2pe3+g5q6/u0+w8C72rLLwSubsvvBq4AHtfW1wHvbMu7A5PbHsubt2FvXtFrsTmRwUR0tPsTp237Rg2ulB9iEKgTwNOAm6vqO63PRuB50/bZ9jX4a4HLqupHVTUF3N9mcQzwniTXMJjhcgXw5OkFVdVXgIOT7N/q+XRVPbhdn62tlncADwEXJVnLYEK5r9ZgQjGq6u62y3OBj7e2i4F9k+y5reaq+t+2/BLg1UmuBi4D9qWfSck0Io4BatFIsi+Dq9tnJikG85dUkre1Lj+b1v0XDF6/M01VO922fR7abv+H2v6vZHDV/ayqeqDN9vnYGR7n463vCcCfzHSgGsyU+QXgC0nuZDBr6peYeercHU2x+5Pt+r2xqi6c6ZjSMLyi12JyHHBWVR1Yg5k3VzEYJnnuDva5AZhIcnBbfxXwlTkcc08GwzgPJHkBcOAj9PsX4C0AVXXd9hvb+P9T2vIuwKHA9xgMMT1/2ydwkuzTdvkqgz8cJDkS+H796i+jbXMh8Pokj2l9D0myxxyen+QVvRaVE4HTtmv7NPBHwCdn2qGq7k/yWuDf2qdULgf+eQ7HPBv4XJJJBsNBNzzCce5MspnBtL8z2R/4yLY3goFvMPi92vuTrAM+0/4A3AW8mMFY/MfakNFPeeQZVs9gMER1ZXvzeYr+fl9BC8zZK6UhJHk8g3H+w6vqvnHXI82FQzfSLNpvG9wAfNCQ11LkFb0kdc4reknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktS5/wNv6SFNBwBGCQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(X_full[\"aScore\"])\n", "plt.xlabel(\"Anomaly Score\");" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 7))\n", "plt.scatter(X_full[\"x1\"], X_full[\"x2\"], c=X_full[\"Outlier\"])\n", "plt.title(\"Detection outliers using MyIF\")\n", "plt.xlabel(\"x1\")\n", "plt.ylabel(\"x2\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Reader may notice that our forest works long enough. What will happen to the larger dataset? But fortunately, during the experiments, the authors of this algorithm found that not all data should be used to build a single tree from a forest, which leads not only to an increase in the speed of work, but also improves the quality of anomalies detection. This is because subsamples have fewer normal points ‘interfering’ with anomalies, thus, making anomalies easier to isolate. It is shown on the image below." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X_sample = X_full.sample(256)\n", "plt.figure(figsize=(8, 8))\n", "plt.scatter(\n", " X_sample[\"x1\"], X_sample[\"x2\"], c=X_sample[\"type\"].map({\"normal\": 1, \"anomaly\": -1})\n", ")\n", "plt.xlabel(\"x1\")\n", "plt.ylabel(\"x2\")\n", "plt.title(\"2d distribution of Sample (size=256)\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We won't develop our IsolationForest and will use sklearn's version with these improvements further." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Sklearn is our everything!" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Import IsolationForest\n", "\n", "from sklearn.ensemble import IsolationForest" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### IsolationForest important params:\n", "\n", " n_estimators - The number of base estimators in the ensemble, default=100.\n", " max_sample - The number of samples from data to train each tree in the forest, default \"auto\" = min(256, n_samples)\n", " max_features - The number of features from data to train each tree in the forest, default = 1.0 (all features)\n", " bootstrap - bootstrap, default=False\n", " contamination - The proportion of outliers in the data set, threshold, default = 0.1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will test this implementation of IF on our 2-d dataset." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true }, "outputs": [], "source": [ "isof = IsolationForest(random_state=77, n_jobs=4, contamination=0.05)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 1.8 s\n" ] }, { "data": { "text/plain": [ "IsolationForest(bootstrap=False, contamination=0.05, max_features=1.0,\n", " max_samples='auto', n_estimators=100, n_jobs=4, random_state=77,\n", " verbose=0)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "isof.fit(X_full[[\"x1\", \"x2\"]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Very fast! How about the quality?" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# predictions\n", "y_pred_full = isof.predict(X_full[[\"x1\", \"x2\"]])" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": true }, "outputs": [], "source": [ "X_full[\"Outlier_sk\"] = y_pred_full" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 7))\n", "plt.scatter(X_full[\"x1\"], X_full[\"x2\"], c=X_full[\"Outlier_sk\"])\n", "plt.title(\"Detection outliers using sklearn.IF\")\n", "plt.xlabel(\"x1\")\n", "plt.ylabel(\"x2\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Image looks grate! Purple points are outliers which IsolationForest found. " ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1 100\n", "Name: Outlier, dtype: int64" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# count of detected outliers \"-1\"\n", "X_full.iloc[2000:, 4].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see our IsolationForest found almost of outliers." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Time to challenge!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It this part of tutorial we will compare IsolationForest with another algorithms. We will use this data set from Kaggle: https://www.kaggle.com/mlg-ulb/creditcardfraud" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.neighbors import LocalOutlierFactor\n", "from sklearn.svm import OneClassSVM\n", "from xgboost import XGBClassifier\n", "\n", "pd.options.display.max_columns = 500" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": true }, "outputs": [], "source": [ "data = pd.read_csv(\"creditcard.csv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at the data. All features are numeric, so we will not do any data processing and will train models on what we downloaded. To prevent overfitting of supervised models we will devide initial dataset by train and test parts." ] }, { "cell_type": "code", "execution_count": 38, "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", "
TimeV1V2V3V4V5V6V7V8V9V10V11V12V13V14V15V16V17V18V19V20V21V22V23V24V25V26V27V28AmountClass
00.0-1.359807-0.0727812.5363471.378155-0.3383210.4623880.2395990.0986980.3637870.090794-0.551600-0.617801-0.991390-0.3111691.468177-0.4704010.2079710.0257910.4039930.251412-0.0183070.277838-0.1104740.0669280.128539-0.1891150.133558-0.021053149.620
10.01.1918570.2661510.1664800.4481540.060018-0.082361-0.0788030.085102-0.255425-0.1669741.6127271.0652350.489095-0.1437720.6355580.463917-0.114805-0.183361-0.145783-0.069083-0.225775-0.6386720.101288-0.3398460.1671700.125895-0.0089830.0147242.690
21.0-1.358354-1.3401631.7732090.379780-0.5031981.8004990.7914610.247676-1.5146540.2076430.6245010.0660840.717293-0.1659462.345865-2.8900831.109969-0.121359-2.2618570.5249800.2479980.7716790.909412-0.689281-0.327642-0.139097-0.055353-0.059752378.660
31.0-0.966272-0.1852261.792993-0.863291-0.0103091.2472030.2376090.377436-1.387024-0.054952-0.2264870.1782280.507757-0.287924-0.631418-1.059647-0.6840931.965775-1.232622-0.208038-0.1083000.005274-0.190321-1.1755750.647376-0.2219290.0627230.061458123.500
42.0-1.1582330.8777371.5487180.403034-0.4071930.0959210.592941-0.2705330.8177390.753074-0.8228430.5381961.345852-1.1196700.175121-0.451449-0.237033-0.0381950.8034870.408542-0.0094310.798278-0.1374580.141267-0.2060100.5022920.2194220.21515369.990
\n", "
" ], "text/plain": [ " Time V1 V2 V3 V4 V5 V6 V7 \\\n", "0 0.0 -1.359807 -0.072781 2.536347 1.378155 -0.338321 0.462388 0.239599 \n", "1 0.0 1.191857 0.266151 0.166480 0.448154 0.060018 -0.082361 -0.078803 \n", "2 1.0 -1.358354 -1.340163 1.773209 0.379780 -0.503198 1.800499 0.791461 \n", "3 1.0 -0.966272 -0.185226 1.792993 -0.863291 -0.010309 1.247203 0.237609 \n", "4 2.0 -1.158233 0.877737 1.548718 0.403034 -0.407193 0.095921 0.592941 \n", "\n", " V8 V9 V10 V11 V12 V13 V14 \\\n", "0 0.098698 0.363787 0.090794 -0.551600 -0.617801 -0.991390 -0.311169 \n", "1 0.085102 -0.255425 -0.166974 1.612727 1.065235 0.489095 -0.143772 \n", "2 0.247676 -1.514654 0.207643 0.624501 0.066084 0.717293 -0.165946 \n", "3 0.377436 -1.387024 -0.054952 -0.226487 0.178228 0.507757 -0.287924 \n", "4 -0.270533 0.817739 0.753074 -0.822843 0.538196 1.345852 -1.119670 \n", "\n", " V15 V16 V17 V18 V19 V20 V21 \\\n", "0 1.468177 -0.470401 0.207971 0.025791 0.403993 0.251412 -0.018307 \n", "1 0.635558 0.463917 -0.114805 -0.183361 -0.145783 -0.069083 -0.225775 \n", "2 2.345865 -2.890083 1.109969 -0.121359 -2.261857 0.524980 0.247998 \n", "3 -0.631418 -1.059647 -0.684093 1.965775 -1.232622 -0.208038 -0.108300 \n", "4 0.175121 -0.451449 -0.237033 -0.038195 0.803487 0.408542 -0.009431 \n", "\n", " V22 V23 V24 V25 V26 V27 V28 \\\n", "0 0.277838 -0.110474 0.066928 0.128539 -0.189115 0.133558 -0.021053 \n", "1 -0.638672 0.101288 -0.339846 0.167170 0.125895 -0.008983 0.014724 \n", "2 0.771679 0.909412 -0.689281 -0.327642 -0.139097 -0.055353 -0.059752 \n", "3 0.005274 -0.190321 -1.175575 0.647376 -0.221929 0.062723 0.061458 \n", "4 0.798278 -0.137458 0.141267 -0.206010 0.502292 0.219422 0.215153 \n", "\n", " Amount Class \n", "0 149.62 0 \n", "1 2.69 0 \n", "2 378.66 0 \n", "3 123.50 0 \n", "4 69.99 0 " ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "code", "execution_count": 39, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TimeV1V2V3V4V5V6V7V8V9V10V11V12V13V14V15V16V17V18V19V20V21V22V23V24V25V26V27V28AmountClass
count284807.0000002.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+05284807.000000284807.000000
mean94813.8595753.919560e-155.688174e-16-8.769071e-152.782312e-15-1.552563e-152.010663e-15-1.694249e-15-1.927028e-16-3.137024e-151.768627e-159.170318e-16-1.810658e-151.693438e-151.479045e-153.482336e-151.392007e-15-7.528491e-164.328772e-169.049732e-165.085503e-161.537294e-167.959909e-165.367590e-164.458112e-151.453003e-151.699104e-15-3.660161e-16-1.206049e-1688.3496190.001727
std47488.1459551.958696e+001.651309e+001.516255e+001.415869e+001.380247e+001.332271e+001.237094e+001.194353e+001.098632e+001.088850e+001.020713e+009.992014e-019.952742e-019.585956e-019.153160e-018.762529e-018.493371e-018.381762e-018.140405e-017.709250e-017.345240e-017.257016e-016.244603e-016.056471e-015.212781e-014.822270e-014.036325e-013.300833e-01250.1201090.041527
min0.000000-5.640751e+01-7.271573e+01-4.832559e+01-5.683171e+00-1.137433e+02-2.616051e+01-4.355724e+01-7.321672e+01-1.343407e+01-2.458826e+01-4.797473e+00-1.868371e+01-5.791881e+00-1.921433e+01-4.498945e+00-1.412985e+01-2.516280e+01-9.498746e+00-7.213527e+00-5.449772e+01-3.483038e+01-1.093314e+01-4.480774e+01-2.836627e+00-1.029540e+01-2.604551e+00-2.256568e+01-1.543008e+010.0000000.000000
25%54201.500000-9.203734e-01-5.985499e-01-8.903648e-01-8.486401e-01-6.915971e-01-7.682956e-01-5.540759e-01-2.086297e-01-6.430976e-01-5.354257e-01-7.624942e-01-4.055715e-01-6.485393e-01-4.255740e-01-5.828843e-01-4.680368e-01-4.837483e-01-4.988498e-01-4.562989e-01-2.117214e-01-2.283949e-01-5.423504e-01-1.618463e-01-3.545861e-01-3.171451e-01-3.269839e-01-7.083953e-02-5.295979e-025.6000000.000000
50%84692.0000001.810880e-026.548556e-021.798463e-01-1.984653e-02-5.433583e-02-2.741871e-014.010308e-022.235804e-02-5.142873e-02-9.291738e-02-3.275735e-021.400326e-01-1.356806e-025.060132e-024.807155e-026.641332e-02-6.567575e-02-3.636312e-033.734823e-03-6.248109e-02-2.945017e-026.781943e-03-1.119293e-024.097606e-021.659350e-02-5.213911e-021.342146e-031.124383e-0222.0000000.000000
75%139320.5000001.315642e+008.037239e-011.027196e+007.433413e-016.119264e-013.985649e-015.704361e-013.273459e-015.971390e-014.539234e-017.395934e-016.182380e-016.625050e-014.931498e-016.488208e-015.232963e-013.996750e-015.008067e-014.589494e-011.330408e-011.863772e-015.285536e-011.476421e-014.395266e-013.507156e-012.409522e-019.104512e-027.827995e-0277.1650000.000000
max172792.0000002.454930e+002.205773e+019.382558e+001.687534e+013.480167e+017.330163e+011.205895e+022.000721e+011.559499e+012.374514e+011.201891e+017.848392e+007.126883e+001.052677e+018.877742e+001.731511e+019.253526e+005.041069e+005.591971e+003.942090e+012.720284e+011.050309e+012.252841e+014.584549e+007.519589e+003.517346e+003.161220e+013.384781e+0125691.1600001.000000
\n", "