{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "*This notebook contains an excerpt from the book [Machine Learning for OpenCV](https://www.packtpub.com/big-data-and-business-intelligence/machine-learning-opencv) by Michael Beyeler.\n", "The code is released under the [MIT license](https://opensource.org/licenses/MIT),\n", "and is available on [GitHub](https://github.com/mbeyeler/opencv-machine-learning).*\n", "\n", "*Note that this excerpt contains only the raw code - the book is rich with additional explanations and illustrations.\n", "If you find this content useful, please consider supporting the work by\n", "[buying the book](https://www.packtpub.com/big-data-and-business-intelligence/machine-learning-opencv)!*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [Using Decision Trees to Make a Medical Diagnosis](05.00-Using-Decision-Trees-to-Make-a-Medical-Diagnosis.ipynb) | [Contents](../README.md) | [Using Decision Trees to Diagnose Breast Cancer](05.02-Using-Decision-Trees-to-Diagnose-Breast-Cancer.ipynb) >" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Building Our First Decision Tree\n", "\n", "Let's consider the example where a number of patients have suffered from the same illness - such as a rare form of basorexia. Let's further assume that the true causes of the disease remain unknown to this day, and that all the information that is available to us consists of a bunch of physiological measurements. For example, we might have access to the following information:\n", "\n", "- a patient's blood pressure ('BP'),\n", "- a patient's cholesterol level ('cholesterol'),\n", "- a patient's gender ('sex'),\n", "- a patient's age ('age'),\n", "- a patient's blood sodium concentration ('Na'), and\n", "- a patient's blood potassium concentration ('K').\n", "\n", "Based on all this information, let's suppose a doctor made recommendations for the patient to treat their disease using one of four possible drugs - drug A, B, C, or D. \n", "\n", "We have data available for 20 different patients:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "data = [\n", " {'age': 33, 'sex': 'F', 'BP': 'high', 'cholesterol': 'high', 'Na': 0.66, 'K': 0.06, 'drug': 'A'},\n", " {'age': 77, 'sex': 'F', 'BP': 'high', 'cholesterol': 'normal', 'Na': 0.19, 'K': 0.03, 'drug': 'D'},\n", " {'age': 88, 'sex': 'M', 'BP': 'normal', 'cholesterol': 'normal', 'Na': 0.80, 'K': 0.05, 'drug': 'B'},\n", " {'age': 39, 'sex': 'F', 'BP': 'low', 'cholesterol': 'normal', 'Na': 0.19, 'K': 0.02, 'drug': 'C'},\n", " {'age': 43, 'sex': 'M', 'BP': 'normal', 'cholesterol': 'high', 'Na': 0.36, 'K': 0.03, 'drug': 'D'},\n", " {'age': 82, 'sex': 'F', 'BP': 'normal', 'cholesterol': 'normal', 'Na': 0.09, 'K': 0.09, 'drug': 'C'},\n", " {'age': 40, 'sex': 'M', 'BP': 'high', 'cholesterol': 'normal', 'Na': 0.89, 'K': 0.02, 'drug': 'A'},\n", " {'age': 88, 'sex': 'M', 'BP': 'normal', 'cholesterol': 'normal', 'Na': 0.80, 'K': 0.05, 'drug': 'B'},\n", " {'age': 29, 'sex': 'F', 'BP': 'high', 'cholesterol': 'normal', 'Na': 0.35, 'K': 0.04, 'drug': 'D'},\n", " {'age': 53, 'sex': 'F', 'BP': 'normal', 'cholesterol': 'normal', 'Na': 0.54, 'K': 0.06, 'drug': 'C'},\n", " {'age': 36, 'sex': 'F', 'BP': 'high', 'cholesterol': 'high', 'Na': 0.53, 'K': 0.05, 'drug': 'A'},\n", " {'age': 63, 'sex': 'M', 'BP': 'low', 'cholesterol': 'high', 'Na': 0.86, 'K': 0.09, 'drug': 'B'},\n", " {'age': 60, 'sex': 'M', 'BP': 'low', 'cholesterol': 'normal', 'Na': 0.66, 'K': 0.04, 'drug': 'C'},\n", " {'age': 55, 'sex': 'M', 'BP': 'high', 'cholesterol': 'high', 'Na': 0.82, 'K': 0.04, 'drug': 'B'},\n", " {'age': 35, 'sex': 'F', 'BP': 'normal', 'cholesterol': 'high', 'Na': 0.27, 'K': 0.03, 'drug': 'D'},\n", " {'age': 23, 'sex': 'F', 'BP': 'high', 'cholesterol': 'high', 'Na': 0.55, 'K': 0.08, 'drug': 'A'},\n", " {'age': 49, 'sex': 'F', 'BP': 'low', 'cholesterol': 'normal', 'Na': 0.27, 'K': 0.05, 'drug': 'C'},\n", " {'age': 27, 'sex': 'M', 'BP': 'normal', 'cholesterol': 'normal', 'Na': 0.77, 'K': 0.02, 'drug': 'B'},\n", " {'age': 51, 'sex': 'F', 'BP': 'low', 'cholesterol': 'high', 'Na': 0.20, 'K': 0.02, 'drug': 'D'},\n", " {'age': 38, 'sex': 'M', 'BP': 'high', 'cholesterol': 'normal', 'Na': 0.78, 'K': 0.05, 'drug': 'A'}\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Understanding the task by understanding the data\n", "\n", "What is always the first step in tackling a new machine learning problem?\n", "\n", "You are absolutely right: to get a sense of the data. The better you understand the data, the better you understand the problem you are trying to solve.\n", "\n", "The first thing to realize is that the 'drug' column is actually not a feature value like all the other columns. \n", "\n", "Thus, it would be a good idea to remove all 'drug' entries from the dictionaries listed in the 'data' variable and store them in a separate variable. For this we need to go through the list and extract the 'drug' entry, which is easiest to do with a list comprehension:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['A',\n", " 'D',\n", " 'B',\n", " 'C',\n", " 'D',\n", " 'C',\n", " 'A',\n", " 'B',\n", " 'D',\n", " 'C',\n", " 'A',\n", " 'B',\n", " 'C',\n", " 'B',\n", " 'D',\n", " 'A',\n", " 'C',\n", " 'B',\n", " 'D',\n", " 'A']" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "target = [d['drug'] for d in data]\n", "target" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then remove the 'drug' entry from all the dictionaries:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "[d.pop('drug') for d in data];" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sweet! Now let's look at the data:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "plt.style.use('ggplot')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[33,\n", " 77,\n", " 88,\n", " 39,\n", " 43,\n", " 82,\n", " 40,\n", " 88,\n", " 29,\n", " 53,\n", " 36,\n", " 63,\n", " 60,\n", " 55,\n", " 35,\n", " 23,\n", " 49,\n", " 27,\n", " 51,\n", " 38]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "age = [d['age'] for d in data]\n", "age" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sodium = [d['Na'] for d in data]\n", "potassium = [d['K'] for d in data]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nGQVvvPGGNm/erFAopMLCQs2bN0+VlZXKy8tTfn6+urq6VFZWpsOHD8vn86m4uFi5ubl6/vnn9eKL\nL/Y50rZ8+XINHz78S39eQ0NDtCPZkqj/ZyINfFWpt6NdPS68qjSRt/lAyO6+7G7NLZmTPdJXSpqS\n+3wM9FjFwxE3x4qb0yhusefW7G7NLZHdjdndmltyb3a35pbio7jxyQkAAACGoLgBAAAYguIGAABg\nCIobAACAIShuAAAAhqC4AQAAGILiBgAAYAiKGwAAgCEobgAAAIaguAEAABiC4gYAAGAIihsAAIAh\nKG4AAACGoLgBAAAYguIGAABgCIobAACAIShuAAAAhqC4AQAAGILiBgAAYAiKGwAAgCEobgAAAIag\nuAEAABiC4gYAAGAIihsAAIAhKG4AAACGoLgBAAAYguIGAABgCIobAACAIShuAAAAhqC4AQAAGILi\nBgAAYAiKGwAAgCEobgAAAIaguAEAABiC4gYAAGAIihsAAIAhKG4AAACGoLgBAAAYguIGAABgCIob\nAACAIShuAAAAhvBYlmXFeggAAAAMjCNuUfZP//RPsR4hZtya3a25JbK7kVtzS+7N7tbcUnxkp7gB\nAAAYguIGAABgiOSf/exnP4v1EInusssui/UIMePW7G7NLZHdjdyaW3JvdrfmlmKfnYsTAAAADMGp\nUgAAAEN4Yz1AoqitrdWmTZsUCoU0c+ZMzZ07t8/9Bw8e1ObNm/Xhhx+quLhYBQUFMZo08gbK/tJL\nL+nll19WcnKyhg0bpjvuuEM5OTkxmjZyBsr9X//1X9q+fbuSkpI0dOhQ/eAHP9CoUaNiNG1kDZT9\nM7t379Zjjz2m1atXKy8vz+EpI2+g3NXV1fq3f/s3ZWVlSZJmzZqlmTNnxmLUiLOzzWtqavTss8/K\n4/FozJgxWrJkSQwmjayBcj/99NN6++23JUldXV3605/+pKeffjoGk0beQNlbW1u1bt06dXR0KBQK\n6e/+7u/0zW9+M0bTRtZA2VtaWvTrX/9aJ06ckM/n0+LFi+X3+50ZzsIF6+3ttX784x9bTU1NVnd3\nt7V06VLr6NGjfdb56KOPrA8++MAqLS21Xn/99RhNGnl2su/fv986ffq0ZVmWtX37duuxxx6LxagR\nZSd3R0dH+N979+61/vmf/9npMaPCTnbLsqzOzk5rxYoV1n333WfV1dXFYNLIspP7lVdesZ588skY\n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\n+wFvAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 6))\n", "plt.scatter(sodium, potassium)\n", "plt.xlabel('sodium')\n", "plt.ylabel('potassium')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But, what we really want is to color the data points according to their target labels:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 3, 1, 2, 3, 2, 0, 1, 3, 2, 0, 1, 2, 1, 3, 0, 2, 1, 3, 0]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "target = [ord(t) - 65 for t in target]\n", "target" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n0KMN2dkFaO8UwbNLxycVdgzxMNTXW0iSeu80lpthUTy7dKxEWG89Xj86m7tgMBmQMywrKsXSUSya\nlPA9TBMAACAASURBVMW7aDqq29MDp9cPm9mIDMvxFwqJ0Ae1QrKE9oALkiwj12CFQaeHFJLQ0diJ\nrKxsCGYZokEf7zBPyLGfhwA3dHBAhgUS7BHemTiSaZtSwn4kjmgUTcl23pm+wqDTY1ha5jFT0hBC\nCaDPBZDcGzhRstDrdCjMVndXukSTZjaicFR+5IaUsjIsaYMqlpKRXtChwBh+HbBOr0NeqT0lfhh+\nlYx0hJAe7zCIUgLHbBERERERESlg0URERERERKSARRMREREREZECFk1EREREREQKWDQREREREREp\nYNFERERERESkgEUTERERERGRAhZNREREREREClg0ERERERERKWDRREREREREpIBFExERERERkQIW\nTURERERERApYNBERERERESlg0URERERERKSARRMREREREZECFk1EREREREQKWDQREREREREpYNFE\nRERERESkgEUTERERERGRAhZNREREREREClg0ERERERERKWDRREREREREpIBFExERERERkQIWTURE\nRERERApYNBERERERESlg0URERERERKSARRMREREREZECFk1EREREREQKWDQREREREREpYNFERERE\nRESkQNRqQTU1NVi5ciUkScK8efOwcOHCsPmBQADLly/Hvn37YLPZsHjxYuTn5wMAXn75ZaxduxY6\nnQ7XXXcdpk6dqlXY/5+9O4+PqjzYPn6dmclkg2yTjbATgntBjAi4AJLWFsRSZFEfF17aWqFu9am7\nIlZtqRaXKq3WUsWliisWrVUBQQFRRFCWqoQdEgjJELIvM3PePyh5TJNMQiaZMzP5ff/wkznnnuG6\nTyZOrpwNANBF8DkFAGhJUPY0+Xw+LViwQHfccYceeeQRrV69Wvv27Ws0Zvny5YqPj9fjjz+u8ePH\n68UXX5Qk7du3T2vWrNHDDz+sO++8UwsWLJDP5wtGbABAF8HnFADAn6CUpvz8fGVmZiojI0MOh0Mj\nR47UunXrGo35/PPPNXr0aEnS8OHDtXnzZpmmqXXr1mnkyJGKiopSenq6MjMzlZ+fH4zYAIAugs8p\nAIA/QSlNbrdbLper4bHL5ZLb7W5xjN1uV1xcnMrLy5s8NyUlpclzAQAIBJ9TAAB/gnJOk2maTZYZ\nhtGmMc0tb87SpUu1dOlSSdLcuXOVmprajqSRw+FwdPlt0B5st/Zhu7UP2y10WPU5FQnvgUiYg8Q8\nQkkkzEFiHqGkI+YQlNLkcrlUUlLS8LikpETJycnNjnG5XPJ6vaqqqlK3bt2aPNftdislJaXJv5GX\nl6e8vLyGx8XFxZ0wk/CRmpra5bdBe7Dd2oft1j6Rvt2ysrKsjtBmVn1ORcJ7IBLmIDGPUBIJc5CY\nRyjxN4e2flYF5fC87OxsFRYWqqioSB6PR2vWrFFubm6jMWeccYZWrFghSVq7dq1OOeUUGYah3Nxc\nrVmzRvX19SoqKlJhYaEGDhwYjNgAgC6CzykAgD9B2dNkt9s1Y8YMPfDAA/L5fBozZox69+6tRYsW\nKTs7W7m5uTr//PP1xBNP6LrrrlO3bt104403SpJ69+6tESNG6KabbpLNZtNPf/pT2WzcXgoA0HH4\nnAIA+GOYbT0YO8wUFBRYHcFSkbAr1Qpst/Zhu7VPpG+3cDo8zwoFBQUR8R6IhDlIzCOURMIcJOYR\nSsLm8DwAAAAACFeUJgAAAADwg9IEAAAAAH5QmgAAAADAD0oTAAAAAPhBaQIAAAAAPyL2kuMAAAAA\n0BHY0xShbrvtNqsjhCW2W/uw3dqH7YZIeA9Ewhwk5hFKImEOEvMIJR0xB0oTAAAAAPhBaQIAAAAA\nP+xz5syZY3UIdI4BAwZYHSEssd3ah+3WPmw3RMJ7IBLmIDGPUBIJc5CYRygJdA5cCAIAAAAA/ODw\nPAAAAADwg9IEAAAAAH44rA6AwGzcuFHPPPOMfD6fxo4dq4kTJzZa//bbb2vZsmWy2+1KSEjQzJkz\nlZaWZlHa0NHadjtm7dq1evjhh/W73/1O2dnZQU4ZWtqyzdasWaNXX31VhmGob9++uuGGGyxIGlpa\n227FxcWaP3++Kisr5fP5dNlll2no0KEWpUVnOfZ9Li0tlWEYysvL07hx41RRUaFHHnlEhw4dUlpa\nmn71q1+pW7duVsdtUV1dne655x55PB55vV4NHz5cU6dOVVFRkR599FFVVFSof//+uu666+RwhPav\nGD6fT7fddptSUlJ02223heUcfvnLXyomJkY2m012u11z584Nu/eUJFVWVurJJ5/U3r17ZRiGZs6c\nqaysrLCZR0FBgR555JGGx0VFRZo6dapGjRoVNnM45u2339by5ctlGIZ69+6tWbNmqbS0NOx+Nv75\nz39q2bJlMk1TY8eO1fjx4wP/2TARtrxer3nttdeaBw4cMOvr681f//rX5t69exuN2bRpk1lTU2Oa\npmm+99575sMPP2xF1JDSlu1mmqZZVVVlzp4927zjjjvM/Px8C5KGjrZss4KCAvPmm282y8vLTdM0\nzdLSUiuihpS2bLcnn3zSfO+990zTNM29e/eas2bNsiIqOpnb7Ta3b99umubR/7dcf/315t69e83n\nn3/efPPNN03TNM0333zTfP75562M2Sqfz2dWV1ebpmma9fX15u23325+88035rx588xVq1aZpmma\nTz31VMN7OpQtWbLEfPTRR83f/e53pmmaYTmHWbNmmUeOHGm0LNzeU6Zpmo8//ri5dOlS0zSPvq8q\nKirCch6mefT/+z/72c/MoqKisJtDSUmJOWvWLLO2ttY0zaM/Ex9++GHY/Wzs3r3bvOmmm8yamhrT\n4/GYv/nNb8yCgoKAvx8cnhfG8vPzlZmZqYyMDDkcDo0cOVLr1q1rNObUU09VdHS0JCknJ0dut9uK\nqCGlLdtNkhYtWqSLLrpIUVFRFqQMLW3ZZsuWLdMFF1zQ8FebxMREK6KGlLZsN8MwVFVVJUmqqqpS\ncnKyFVHRyZKTkxuu3BQbG6uePXvK7XZr3bp1GjVqlCRp1KhRzf6/KJQYhqGYmBhJktfrldfrlWEY\n2rJli4YPHy5JGj16dMjPo6SkRF988YXGjh0rSTJNM+zm0JJwe09VVVXp3//+t84//3xJksPhUHx8\nfNjN45hNmzYpMzNTaWlpYTkHn8+nuro6eb1e1dXVKSkpKex+Nvbv36+cnBxFR0fLbrfrpJNO0mef\nfRbw9yO0963BL7fbLZfL1fDY5XJp27ZtLY5fvny5hgwZEoxoIa0t223nzp0qLi7WGWecoSVLlgQ7\nYshpyzYrKCiQJN19993y+XyaMmVKl3+/tWW7TZkyRffff7/+9a9/qba2VnfffXewYyLIioqKtHPn\nTg0cOFBHjhxpKMrJyckqKyuzOF3rfD6fbr31Vh04cEAXXHCBMjIyFBcXJ7vdLklKSUkJ+T/QPfvs\ns7r88stVXV0tSSovLw+7ORzzwAMPSJK+//3vKy8vL+zeU0VFRUpISNCf/vQn7d69WwMGDND06dPD\nbh7HrF69WmeffbYkhd0cUlJSNGHCBM2cOVNOp1ODBw/WgAEDwu5no3fv3nr55ZdVXl4up9OpDRs2\nKDs7O+DvB6UpjJnNXC3eMIxmx3700UfasWOHuC1X69vN5/Np4cKFmjVrVjBjhbS2vNd8Pp8KCwt1\nzz33yO12a/bs2Zo3b57i4+ODFTPktGW7rV69WqNHj9aECRP07bff6vHHH9e8efNks3EgQCSqqanR\nvHnzNH36dMXFxVkdp11sNpseeughVVZW6g9/+IP2799vdaTjsn79eiUmJmrAgAHasmWL1XECct99\n9yklJUVHjhzR/fffr6ysLKsjHTev16udO3dqxowZysnJ0TPPPKPFixdbHatdPB6P1q9fr8suu8zq\nKO1SUVGhdevWaf78+YqLi9PDDz+sjRs3Wh3ruPXq1Us//vGPdf/99ysmJkZ9+/btkM9USlMYc7lc\nKikpaXhcUlLS7KE9X331ld58803NmTOHQ83U+narqanR3r17de+990qSSktL9eCDD+qWW27psheD\naMt7LSUlRYMGDZLD4VB6erqysrJUWFiogQMHBjtuyGjLdlu+fLnuuOMOSdKgQYNUX1+v8vJyDm+M\nQB6PR/PmzdO5556rs846S9LRw1gPHz6s5ORkHT58WAkJCRanbLv4+HidfPLJ2rZtm6qqquT1emW3\n2+V2u5WSkmJ1vBZ98803+vzzz7VhwwbV1dWpurpazz77bFjN4ZhjGRMTE3XmmWcqPz8/7N5TLpdL\nLpdLOTk5kqThw4dr8eLFYTcPSdqwYYP69++vpKQkSeH3871p0yalp6c35DzrrLP0zTffhOXPxvnn\nn99wyOff//53uVyugL8f/CkzjGVnZ6uwsFBFRUXyeDxas2aNcnNzG43ZuXOnnn76ad1yyy38EvYf\nrW23uLg4LViwQPPnz9f8+fOVk5PTpQuT1Lb32rBhw7R582ZJUllZmQoLC5WRkWFF3JDRlu2Wmpra\nsN327dun+vr6kP9gxfEzTVNPPvmkevbsqQsvvLBheW5urlauXClJWrlypc4880yrIrZJWVmZKisr\nJR29kt6mTZvUs2dPnXLKKVq7dq0kacWKFU3e56Hksssu05NPPqn58+frxhtv1Kmnnqrrr78+rOYg\nHf0D37HDC2tqavTVV1+pT58+YfeeSkpKksvlajjEe9OmTerVq1fYzUNqfGieFH4/36mpqdq2bZtq\na2tlmmbD9yLcfjako4dGSkevXPrZZ5/p7LPPDvj7YZjNHT+CsPHFF19o4cKF8vl8GjNmjCZNmqRF\n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\ndXz00Ud88cUXuFwuRkZG+OSTTwiFQjgcDu69916qqqpwOvXbh4iIiMiVpKZJ5CorKCjg1Vdfxev1\ncujQId599112795Ne3s7oVCIN998k2nTphEMBi/6XkNDA16vl927dxOLxdixYweGYbBq1SqLKhER\nERGZGvQTtchVtnz5cvx+P06nkzvuuIPZs2dz8uRJfv75Z1avXo1hGOTk5LB+/fr0dwYGBjh69CiB\nQACPx0NeXh5r1qzh4MGDFlYiIiIiMjXoSpPIVdbW1kZLSwt9fX0AjI2NEY1GiUQiGIaR/lx+fn76\ndX9/P8lkkscffzz9nmmaF31eRERERK4MNU0iV1FfXx/vvfcetbW13HTTTTidTrZt24Zpmvh8PsLh\ncPqz/f396deGYeB2u/nwww9xuVxWRBcRERGZsjSeJ3IVxWIxHA4Hubm5APz444+cOXMGGB/b279/\nP+FwmOHhYb799tv093w+H4sWLeLTTz9lZGSEVCrF2bNnOXbsmCV1iIiIiEwlutIkchUVFRWxdu1a\nXnzxRZxOJ3fffTc333wzAJWVlfT09PD8888zffp0HnjgAY4dO5Z+Ot5TTz3FZ599xtatWxkdHaWg\noOCi+55ERERE5MpwmKZpWh1CRP4pFArxwQcfsGfPHqujiIiIiExpGs8TuUbE43E6OjpIJpOEw2G+\n/vprli1bZnUsERERkSlPV5pErhGxWIxXXnmF7u5usrKyWLx4MYFAgOzsbKujiYiIiExpappERERE\nREQy0HieiIiIiIhIBmqaREREREREMlDTJCIiIiIikoGaJhERERERkQzUNImIiIiIiGSgpklERERE\nRCSD/wAOo9NhiQmtggAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(14, 10))\n", "\n", "plt.subplot(221)\n", "plt.scatter([d['Na'] for d in data], [d['K'] for d in data],\n", " c=target, s=100)\n", "plt.xlabel('sodium (Na)')\n", "plt.ylabel('potassium (K)')\n", "\n", "plt.subplot(222)\n", "plt.scatter([d['age'] for d in data], [d['K'] for d in data],\n", " c=target, s=100)\n", "plt.xlabel('age')\n", "plt.ylabel('potassium (K)')\n", "\n", "plt.subplot(223)\n", "plt.scatter([d['age'] for d in data], [d['Na'] for d in data],\n", " c=target, s=100)\n", "plt.xlabel('age')\n", "plt.ylabel('sodium (Na)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Preprocessing the data\n", "\n", "We need to convert all categorical features into numerical features:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.feature_extraction import DictVectorizer\n", "vec = DictVectorizer(sparse=False)\n", "data_pre = vec.fit_transform(data)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['BP=high',\n", " 'BP=low',\n", " 'BP=normal',\n", " 'K',\n", " 'Na',\n", " 'age',\n", " 'cholesterol=high',\n", " 'cholesterol=normal',\n", " 'sex=F',\n", " 'sex=M']" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vec.get_feature_names()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1. , 0. , 0. , 0.06, 0.66, 33. , 1. , 0. ,\n", " 1. , 0. ])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_pre[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Convert to 32-bit floating point numbers in order to make OpenCV happy:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "data_pre = np.array(data_pre, dtype=np.float32)\n", "target = np.array(target, dtype=np.float32).reshape((-1, 1))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((20, 10), (20, 1))" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_pre.shape, target.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then split data into training and test sets:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "import sklearn.model_selection as ms\n", "X_train, X_test, y_train, y_test = ms.train_test_split(\n", " data_pre, target, test_size=5, random_state=42\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building the decision tree\n", "\n", "Building the decision tree with OpenCV works in much the same way as in Chapter 3, First Steps in Supervised Learning. Recall that all machine learning function reside in OpenCV 3.1's ml module. You can create an empty decision tree using the following code:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "import cv2\n", "dtree = cv2.ml.DTrees_create()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then train the model:\n", "\n", "> Note: It appears the `DTrees` object in OpenCV 3.1 is broken (segmentation fault). As a result, calling the `train` method will lead to \"The kernel has died unexpectedly.\" There's a bug report [here](https://stackoverflow.com/questions/31808495/error-when-using-decision-trees-in-opencv-3-0-0-rc1)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# dtree.train(X_train, cv2.ml.ROW_SAMPLE, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Predict some values:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# y_pred = dtree.predict(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Calculate the score on the training and test sets:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# from sklearn import metrics\n", "# metrics.accuracy_score(y_test, dtree.predict(X_test))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# metrics.accuracy_score(y_train, dtree.predict(X_train))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualizing a trained decision tree\n", "\n", "OpenCV's implementation of decision trees is good enough if you are just starting out, and don't care too much what's going on under the hood. However, in the following sections we will switch to Scikit-Learn. Their implementation allows us to customize the algorithm and makes it a lot easier to investigate the inner workings of the tree. Their usage is also much better documented..." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn import tree" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dtc = tree.DecisionTreeClassifier()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The model is trained by calling `fit`:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n", " max_features=None, max_leaf_nodes=None,\n", " min_impurity_split=1e-07, min_samples_leaf=1,\n", " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", " presort=False, random_state=None, splitter='best')" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtc.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtc.score(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.40000000000000002" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtc.score(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, here's the cool thing: If you want to know what the tree looks like, you can do so using GraphViz to create a PDF file (or any other supported file type) from the tree structure. For this to work, you need to install GraphViz first, which you can do from the command line using conda:\n", "\n", " $ conda install graphviz" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "with open(\"tree.dot\", 'w') as f:\n", " f = tree.export_graphviz(dtc, out_file=f,\n", " feature_names=vec.get_feature_names(),\n", " class_names=['A', 'B', 'C', 'D'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, back on the command line, you can use GraphViz to turn \"tree.dot\" into (for example) a PNG file:\n", "\n", " $ dot -Tpng tree.dot -o tree.png" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rating the importance of features\n", "\n", "Scikit-Learn provides a function to rate feature importance, which is a number between 0 and 1 for each feature, where 0 means \"not used at all in any decisions made\" and 1 means \"perfectly predicts the target\". The feature importances are normalized such that they all sum to 1:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0. , 0. , 0.13554217, 0.29718876,\n", " 0.24096386, 0.32630522, 0. , 0. , 0. ])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtc.feature_importances_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we remind ourselves of the feature names, it will become clear which features seem to be the most important. A plot might be most informative:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12, 6))\n", "plt.barh(range(10), dtc.feature_importances_, align='center', tick_label=vec.get_feature_names())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Understanding decision rules\n", "\n", "Two of the most commonly used criteria for making decisions are the following:\n", "\n", "- `criterion='gini'`: The Gini impurity is a measure of misclassification, with the aim of minimizing the probability of misclassification.\n", "\n", "- `criterion='entropy'`: In information theory, entropy is a measure of the amount of uncertainty associated with a signal or distribution.\n", "\n", "In Scikit-Learn, you can specify the split criterion in the constructor of the decision tree call. For example, if you want to use entropy, you would type the following:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dtce = tree.DecisionTreeClassifier(criterion='entropy')" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,\n", " max_features=None, max_leaf_nodes=None,\n", " min_impurity_split=1e-07, min_samples_leaf=1,\n", " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", " presort=False, random_state=None, splitter='best')" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtce.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtce.score(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.40000000000000002" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtce.score(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "with open(\"tree.dot\", 'w') as f:\n", " f = tree.export_graphviz(dtce, out_file=f,\n", " feature_names=vec.get_feature_names(),\n", " class_names=['A', 'B', 'C', 'D'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Controlling the complexity of decision trees\n", "\n", "There are two common ways to avoid overfitting:\n", "\n", "- pre-pruning: This is the process of stopping the creation of the tree early.\n", "\n", "- post-pruning (or just pruning): This is the process of first building the tree but then removing or collapsing nodes that contain only little information.\n", "\n", "\n", "There are a number of ways to pre-prune a tree, all of which can be achieved by passing optional arguments to the `DecisionTreeClassifier` constructor:\n", "\n", "- limiting the maximum depth of the tree via the `max_depth parameter`\n", "\n", "- limiting the maximum number of leaf nodes via `max_leaf_nodes`\n", "\n", "- requiring a minimum number of points in a node to keep splitting it via `min_samples_split`\n" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dtc0 = tree.DecisionTreeClassifier(criterion='entropy', max_leaf_nodes=6)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,\n", " max_features=None, max_leaf_nodes=6, min_impurity_split=1e-07,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n", " splitter='best')" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtc0.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtc0.score(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.40000000000000002" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtc0.score(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [Using Decision Trees to Make a Medical Diagnosis](05.00-Using-Decision-Trees-to-Make-a-Medical-Diagnosis.ipynb) | [Contents](../README.md) | [Using Decision Trees to Diagnose Breast Cancer](05.02-Using-Decision-Trees-to-Diagnose-Breast-Cancer.ipynb) >" ] } ], "metadata": { "anaconda-cloud": {}, "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.5.3" } }, "nbformat": 4, "nbformat_minor": 2 }