{
"cells": [
{
"cell_type": "markdown",
"id": "45278a2a",
"metadata": {},
"source": [
"(chapter8_part2)=\n",
"\n",
"\n",
"## Decision Trees in Classification\n",
"\n",
"- This is a supplement material for the [Machine Learning Simplified](https://themlsbook.com) book. It sheds light on Python implementations of the topics discussed while all detailed explanations can be found in the book. \n",
"- I also assume you know Python syntax and how it works. If you don't, I highly recommend you to take a break and get introduced to the language before going forward with my code. \n",
"- This material can be downloaded as a Jupyter notebook (Download button in the upper-right corner -> `.ipynb`) to reproduce the code and play around with it. \n",
"\n",
"\n",
"This notebook is a supplement for *Chapter 8. Decision Trees* of **Machine Learning For Everyone** book.\n",
"\n",
"## 1. Required Libraries, Data & Variables\n",
"\n",
"Let's import the data and have a look at it:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "e3bf2e2d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" x1 \n",
" x2 \n",
" Color \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0.25 \n",
" 1.41 \n",
" blue \n",
" \n",
" \n",
" 1 \n",
" 0.60 \n",
" 0.39 \n",
" blue \n",
" \n",
" \n",
" 2 \n",
" 0.71 \n",
" 1.29 \n",
" blue \n",
" \n",
" \n",
" 3 \n",
" 1.20 \n",
" 2.30 \n",
" blue \n",
" \n",
" \n",
" 4 \n",
" 1.75 \n",
" 0.59 \n",
" blue \n",
" \n",
" \n",
" 5 \n",
" 2.26 \n",
" 1.70 \n",
" green \n",
" \n",
" \n",
" 6 \n",
" 2.50 \n",
" 1.35 \n",
" green \n",
" \n",
" \n",
" 7 \n",
" 2.50 \n",
" 2.90 \n",
" green \n",
" \n",
" \n",
" 8 \n",
" 2.88 \n",
" 0.61 \n",
" green \n",
" \n",
" \n",
" 9 \n",
" 2.91 \n",
" 2.00 \n",
" green \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x1 x2 Color\n",
"0 0.25 1.41 blue\n",
"1 0.60 0.39 blue\n",
"2 0.71 1.29 blue\n",
"3 1.20 2.30 blue\n",
"4 1.75 0.59 blue\n",
"5 2.26 1.70 green\n",
"6 2.50 1.35 green\n",
"7 2.50 2.90 green\n",
"8 2.88 0.61 green\n",
"9 2.91 2.00 green"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"%config InlineBackend.figure_format = 'retina' #to make sharper and prettier plots\n",
"\n",
"# Creating the DataFrame based on the provided data\n",
"data = {\n",
" 'x1': [0.25, 0.60, 0.71, 1.20, 1.75, 2.26, 2.50, 2.50, 2.88, 2.91],\n",
" 'x2': [1.41, 0.39, 1.29, 2.30, 0.59, 1.70, 1.35, 2.90, 0.61, 2.00],\n",
" 'Color': ['blue', 'blue', 'blue', 'blue', 'blue', 'green', 'green', 'green', 'green', 'green']\n",
"}\n",
"\n",
"# Convert the dictionary to a pandas DataFrame\n",
"df = pd.DataFrame(data)\n",
"\n",
"# Display the DataFrame\n",
"df"
]
},
{
"cell_type": "markdown",
"id": "2d0d5d26",
"metadata": {},
"source": [
"## 2. Visualizing Dataframe"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "018e4001",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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0vIBAE7EHjsAALcSEBCg5cuXa82aNXrnnXe0fv36Ak9wuXDhgpYsWaIlS5bo7rvv1vz581WtWrVr2uUNJW6//Xa77dmTk5OjnTt3avfu3UpKStL58+fz7d+TlzNOhSrKmjVrrNcl3dukW7dumjlzpqTcY6r/9re/Fdq2ZcuWuuGGG8pWZDE+/fTTfKd1GYahM2fO6Lvvvst32pCHh4fmzp1rU3j37bffWq979eqlsLCwIttfd911uvPOO7Vy5UpJufvI3HHHHaWe11Z5Q83IyEi1bt26yPb+/v66//77rUeOb9iwQaNGjXJojVdc2RNKkt2D1e+++04ZGRmScveN6tOnT5HtPTw89NBDD1nDwOLC4cI44+fl6v25ChIREWG9nj17tnr37i1PT89i+wEAnIdgBwDglnr16qVevXopOTlZGzdu1HfffaedO3dq165dSktLy9f2q6++UlRUlLZu3XrNRsJ5N+/t2rVrmevKysrSu+++q7fffltJSUkl6lPU0efOsHXrVuv1rFmz9PHHHxfbJ+/XVtwxzW3atLG9uBJav3691q9fX2Sb0NBQzZ07V3fddZdNc+zatct6feutt5aoz2233Wb9Rf3HH3+0aV5b2VrvlWDHmfXm/e/y6v9+yyrv59C+fXt5eRX/f59vu+22fP0Nwyj1sfOO/nmpX7++qlevXuyYAwYM0OTJk5WTk6PVq1erefPmeuihh9SzZ081a9as1F8XAMD+CHYAAG4tODhYAwcO1MCBAyXlBivff/+95s2bp08++URZWVmSpJ9//lkvvvii3n333Xz9T548ab1u0KBBmWrJyMjQ3XffrbVr15aqX97VCs6WlpaWb/45c+aUeoy8p00VxBWPf1gsFgUGBio4OFitW7dWz549df/996ty5co2j5mcnGy9rlu3bon61KtXz3rt7ADPTPXmDSiuPBZoL2X9HDIzM5WamqoqVao4dd7iPv+S/nd1ww036I033tCECRNkGIZ++eUXPfPMM3rmmWdUrVo13XrrrercubP69u2rxo0bl2hMAIB9sccOAAB5eHl5qWPHjpo7d67i4uLyPdYxe/ZsXbx4MV97ez4C8vLLL1tDHYvFonvvvVdLly7VgQMHdO7cOWVmZsrIPfgg39HOea+d7dy5c2Ue40p4VpiyhCklNW/evHyfbU5Ojs6dO6fff/9dn332mR566KEy15F3JYm/v3+J+uRt5+wAz0z15g009u/fb9exy/o5SLZ9Fo7+/Evz8/zUU09pw4YNuv322/Ot0Dl79qxWr16tZ555Rk2aNFH37t21d+/eEo8LALAPgh0AAApx66236oUXXrC+vnTpkrZv356vjb0eAcnIyLA+wiJJ8+fP1+LFizVw4EA1bdpUVapUsW6MKrl2lU5eV//C+ddff+ULSEryZ+PGja4p3snyBn8XLlwoUZ+87a5+DNDRzFRvx44drdenTp3S4cOH7TZ2WT8HybbPorx9/p07d1ZsbKyOHz+uJUuW6Mknn9RNN92Ub1Pz9evX6+abb7ZuKA8AcA6CHQAAinDnnXfme338+PF8r0NDQ63XV06wscW2bduswVCzZs00bNiwItsfOXLE5rnsKSgoSD4+PtbXJ06ccGE15VveR1+OHj1aoj55A4riTi+yNzPV27Vr13wrSex5IldZPwdvb2+bQpby+vmHhoZq0KBBmjZtmnbu3KkTJ07onXfeUY0aNSRJFy9edNqm2QCAXAQ7AAAUwdfXN9/rvCGGJHXo0MF6nfcUm9I6duyY9bpFixbFts97DHVRbNnYtLR92rdvb73mX+oLl/dUqe+++65EffK2u+mmm66578iNax1Rr6PUrVtXPXv2tL6eOXOm0tPT7TJ23s9h27Ztys7OLrZP3s+hdevWNn2fzPL5BwcHa9y4cfryyy+t7/38889KSEhwyvwAAIIdAACKtGfPnnyv69Spk+913l8m169frwMHDtg0T97HGYr7hTQnJ0ezZs0q0bh5g6nCjksva5/evXtbr2fMmOHSPX/Ks27dulmv16xZo1OnThXZ/tixY/r6668L7H+FLd/fkso7365du/TTTz8V2T49PV2LFy8usL8zPPfcc9bro0eP6tlnn7VpnHXr1uV7feutt1oD3eTkZK1evbrI/jk5OZo3b571ta2fgyN+Xhzptttuy7eJdd6N5QEAjkWwAwBwG//5z38UGxtb4vbp6el67bXXrK9DQ0MVGRmZr0379u2tRxsbhqFhw4bZtNdO3hO14uLiityU+M0337wmcCrMlccjJOnPP/90SJ9Ro0YpKChIUu4Ryy+//HKJ5pFyT+4pyQqIiqBHjx6qX7++pNw9lcaPH19oW8Mw9MQTT1jDmoYNG6p79+7XtAsKCrKGgsnJyXYNd5o2bapOnTpZXz/++ONFjv/SSy9Zw4cqVapo8ODBdqulJKKiovTYY49ZX7///vv6xz/+UeL+Z86c0cCBA/Xqq6/mez8oKEj33nuv9fWECROK3OPq/ffft24g7OHhoZEjR5a4hrwc8fNii5KebpaSkpLvf/tCQkLsMj8AoHgEOwAAt7Ft2zZFR0erXbt2mj59epH/ovzDDz+oc+fO+U54efbZZ/OtrLni3Xfftf6L/o4dO9SpUyf98MMPBY574sQJvfXWW3rzzTfzvd+6dWtdd911knJPmho4cGC+x7Ok3F/uJk6cqOeee67Ep+Q0b97cev3ZZ585pE/VqlX19ttvW1+//PLLevDBBwvdF8QwDG3ZskWPPfaY6tSpc81JYxWVh4eHpkyZYn29aNEiPfroo9cEgampqRoxYoSWL19ufe+NN94o8GfPx8dHjRo1kpS7YmfFihV2rfnf//63PD09JUnx8fHq37//NStHMjMz9fzzz+f7GZg0aVKZT4mzxX/+8x/deuut1tevvPKKOnbsqG+//bbQADEhIUGTJk1S/fr19fnnnxfYZuLEidav57ffftMdd9xxzaNGOTk5mjZtmv7+979b3xs7dmy+E7tKwxE/L7YYNGiQevfurc8//7zQ1YR//vmnBg8erMzMTElS48aN1bBhQ7vMDwAonperCwAAwNl27NihHTt2aOzYsWrYsKGaNWummjVrysvLS8nJydq9e/c1GyH369dPTzzxRIHj3XTTTZo7d66GDx+urKws7dq1Sx06dFCTJk3UunVrVa1aVefOndP+/fu1b98+5eTkaNy4cfnG8PDw0L/+9S899NBDknIfB2ncuLFuvfVW1a1bV2fOnNHGjRt19uxZSdKsWbM0ZMiQYr/W/v37a+bMmZKk6dOna+fOnbrpppvk5+dnbTNmzJh8v4TZ0mf48OFKSEjQv/71L0nSJ598opiYGEVGRqpp06YKCAhQWlqakpKStHv3brsck25GgwYN0qZNm/TBBx9IkubMmaMlS5aoa9euCg0N1alTp7R+/fp8v7yPHz9ef/vb3wods3///taVZUOGDNH8+fN1/fXX5ztF7a233rKp3ltvvVVTpkzRhAkTJEkrV65UnTp11LVrV0VEROjs2bPasGGDzpw5Y+3Tr18//d///Z9N85WVj4+PYmNj9eCDD1pDyS1btuj2229XtWrV1L59e4WEhMjHx0cnT57Ub7/9pl9//TXfGAVtdNywYUPNmTNHQ4YMUXZ2trZu3aomTZooKipKDRs2VFpamuLj4/OtcOvQoYPeeOONMn09jvh5Ka2cnBytXr1aq1evlre3t5o1a6bGjRuratWqSk1N1dGjR7V161bl5ORIkjw9PTVt2jS7zQ8AKAEDAAA3MWvWLKN+/fqGpBL/qVy5svHPf/7TuHz5crHjr1+/vsTjv/jiiwWO8cILLxTZz9fX1/jwww8NwzDyvV+U+++/v8gxN2zYYJc+hmEYS5YsMWrXrl3iz7d9+/bGpUuXrhln0qRJ1jaTJk0q8uuzVd26da1zzJs3z67jHTp0qMi2//rXvwwfH59iv9evvfZasfOmpKQYTZs2LXKsspozZ45RpUqVIufw9PQ0xo0bZ2RlZRU5ljO+tzk5OcaCBQuM66+/vsQ/i7Vq1TLefPPNAn8er1i5cqURGhpa7Fj333+/ceHChSJrdMXPy4YNG6ztO3fuXGTbK3r37l3izzAkJMRYsWJFicYFANgPK3YAAG7j0Ucf1aOPPqp9+/YpLi5O33//vX755RcdOXJE586dk2EYCgwMVFhYmFq2bKmuXbtq4MCBqlatWonG79atm3799VctXrxYq1at0o4dO3Tq1CllZGSoatWquv7663XLLbeoX79+ioqKKnCMV199VT179tT777+vzZs3Kzk5WYGBgQoPD9edd96phx9+2ProTUnFxMSod+/eWrRokXbv3q3Tp0/r0qVLdu8j5a4w6Nu3rxYvXqxvvvlG27dvV3JystLS0uTv76/rrrtON9xwg6KiotSrVy81bty4VF9LRfHSSy9p6NChmjNnjr755hsdOnRIKSkpCgoKUoMGDXTHHXfokUceuWaz7oJUrVpV27dv1/Tp07V69WodOHBAKSkpdt1v5+GHH1bfvn01e/Zsff311/rtt9/0119/KTAwUBEREerevbseeugh3XjjjXabsywsFoseeOAB3XfffVq/fr3Wrl2rzZs36/jx4zp9+rRycnJUrVo11a9fX+3atdOdd96pHj16WB87K0zv3r31+++/66OPPtKqVav0888/6/Tp06pcubJq166trl27atiwYbr55pvt+vXY8+eltL766ivt2rVL69ev1w8//KADBw4oKSlJFy5ckI+Pj4KDg9WyZUv16tVLgwcPVpUqVexeAwCgaBbD4OgKAAAAAAAAM2LzZAAAAAAAAJMi2AEAAAAAADApgh0AAAAAAACTItgBAAAAAAAwKYIdAAAAAAAAkyLYAQAAAAAAMCmCHQAAAAAAAJMi2AEAAAAAADApgh0AAAAAAACTItgBAAAAAAAwKYIdAAAAAAAAkyLYAQAAAAAAMCm3DHbOnz+vxYsX66mnnlLnzp11/fXXq2rVqvL29lZISIi6dOmiN954Q2fOnLHbnF9//bX69eun8PBw+fj4KDw8XP369dPXX39ttzkAAAAAAIB7sRiGYbi6CGeLjY1VdHR0se1q1qypTz/9VHfccYfNc+Xk5GjkyJGaO3duoW0eeeQRzZw5Ux4ejsnZLl26pL1790qSgoOD5eXl5ZB5AAAAAABwZ1lZWUpOTpYktWjRQr6+vg6f021/w4+IiFDXrl3Vpk0bRUREqFatWsrJyVFSUpI+//xzLV++XKdPn9bdd9+tbdu2qVWrVjbN8+KLL1pDndatW+uZZ55Rw4YN9ccff+iNN97Qrl27NGfOHAUHB+u1116z55dotXfvXrVv394hYwMAAAAAgGtt27ZN7dq1c/g8brliJzs7W56enkW2WbFihfr16ydJ6tevn5YvX17qeX777Tc1a9ZMWVlZatu2rTZt2qTKlStb76enp6tz587asWOHvLy8dODAAV1//fWlnqc427dvJ9gBAAAAAMCJnBXsuOWKneJCHUm655571KRJE/3666+Kj4+3aZ533nlHWVlZkqT33nsvX6gjSX5+fnrvvfd0yy23KCsrS2+//bY++OADm+YqSnBwsPV627ZtqlWrlt3nAAAAAADA3R0/fty6sCLv7+KO5JbBTkkFBgZKyt2jprQMw9CXX34pSWratKk6dOhQYLsOHTpYA6Qvv/xS77//viwWi+1FFyDvnjq1atVSeHi4XccHAAAAAAD5OWt/W7c8Faskfv31V+3evVtSbjBTWocOHdKxY8ckSZ07dy6y7ZX7f/75pw4fPlzquQAAAAAAgHsi2MkjPT1dBw8e1H/+8x917tzZ+hjV+PHjSz3W/v37rdfFBUN57x84cKDUcwEAAAAAAPfk9o9izZ8/XyNGjCj0/nPPPafBgweXetykpCTrdXGPPkVERFivExMTyzRXQY4fP17qMQEAAAAAQPnn9sFOYSIjIzVr1iybd7BOTU21XgcEBBTZ1t/f33qdlpZW6rnyBkMAAAAAAMB9uP2jWPfcc4/27t2rvXv3atu2bVq0aJH69eun3bt36/7779eqVatsGjfvhsve3t5FtvXx8bFeX7x40ab5AAAAAACA+3H7FTtBQUEKCgqyvm7Xrp3uu+8+LViwQA8++KD69u2ruXPnavjw4aUa19fX13qdmZlZZNuMjAzr9dVHopdEcY9v5T1uDQAAAAAAVBxuH+wUZujQoVq1apWWLl2qxx9/XHfffbeqV69e4v5XjkqXin+86sKFC9br4h7bKgjHlwMAAAAA4J7c/lGsovTt21dSbvDy3//+t1R984YtxW1unHfFDfvlAAAAAACAkiLYKUJwcLD1+siRI6Xqe+ONN1qvf/nllyLb5r1/ww03lGoeAAAAAADgvgh2ivDnn39ar0v7iFT9+vVVu3ZtSVJcXFyRbTdt2iRJuu6661SvXr3SFQkAAAAAANwWe+wU4bPPPrNet2jRolR9LRaL+vbtqxkzZuiXX37R999/rw4dOlzT7vvvv7eu2Onbt68sFkvZinagS5cuKSUlRenp6crOznZ1OUCxPD095e3trSpVqiggIEAeHmTZAAAAACoWtwx25s+fr/vuuy/fyVVXe/vtt7VmzRpJuatvoqKi8t3fuHGjunbtKkl68MEHNX/+/GvGGD9+vGbNmqXs7Gw98cQT2rRpU75Try5evKgnnnhCkuTl5aXx48eX8StzDMMwdPz4cZ07d87VpQClkpWVpYyMDKWmpspisei6667Lt7E5AAAAAJidWwY7kydP1lNPPaX+/furY8eOatiwoQICApSamqq9e/cqJiZGW7ZskSR5e3tr1qxZ8vT0LPU8jRs31oQJEzRlyhTt2LFDt912m5599lk1bNhQf/zxh15//XXt2rVLkjRhwgQ1atTIrl+nvZw5c+aaUMfLyy1/dGAy2dnZMgxDUm5A+eeffxLuAAAAAKhQ3Pa387/++kuzZ8/W7NmzC20THh6ujz76SN27d7d5nldffVWnTp3SRx99pF27dum+++67ps3DDz+sV155xeY5HCkzM1PJycnW1yEhIQoKCrIp6AKczTAMpaen66+//lJaWpo13GncuDGPZQEAAACoENwy2Pnmm2+0evVqbdmyRb///rtOnjypM2fOqHLlygoJCVFkZKR69+6tQYMGyc/Pr0xzeXh4aO7cuerfv79mzZql7du36/Tp06pZs6batWunUaNGqWfPnnb6yuwvLS3Nel2jRg3VqFHDhdUApWOxWOTv7y8/Pz8lJSVZw520tDRVqVLF1eUBAAAAQJlZjCvPKaDCSkpKUkREhCQpMTFR4eHhJe6bmJhoDXfq169f5L5EQHl24cIFHT16VJIUGBhYqv8OAAAAAKAkyvL7t614FgFFyszMlJS78sHHx8fF1QC28/Pzs546d+XnGgAAAADMjmAHRcrJyZGUe2x0eT6KHSiOxWKx7g2VnZ3t4moAAAAAwD4IdgAAAAAAAEyKYAcAAAAAAMCkCHYAAAAAAABMimAHAAAAAADApAh2AAAAAAAATIpgB26jS5cuslgs6tKli6tLMa358+fLYrHIYrHo8OHDri4HAAAAJpV+OV0n004q/XK6q0sBTI9gB06xceNGayBw9R8/Pz/VrVtX99xzjxYuXKisrCxXl1tunT59Wu+995769OmjBg0aqEqVKvLx8VFYWJi6dOmiF198Ufv27XN1mQAAAMA10jLTNHPHTEV+GCn/1/wVNjVM/q/5K/LDSM3cMVNpmWmuLhEwJYIduNzFixd19OhRffnllxoyZIhuvfVWnThxwtVl2cRRK1pycnL0yiuvqEGDBnryySe1atUqHTp0SKmpqcrMzNTJkycVFxen1157TS1atFCPHj20f/9+u80PAAAAlEX8kXg1mNZAo1eP1p6Te/Ld23Nyj0avHq0G0xoo/ki8iyoEzMvL1QXA/YwZM0aPPfaY9XVaWpp27NihqVOn6vDhw9q+fbv69u2r77//XhaLxW7zbty40W5jOdPFixd17733auXKlZIkb29v3XvvvYqOjla9evXk5+enkydPaseOHfriiy+0e/durVu3TrNmzdI777zj2uIBAADg9uKPxCt6QbQysjOKbJecnqzoBdFaN3SdoupGOak6wPwIduB0ISEhat68eb73OnTooCFDhqh9+/b6/ffftW3bNq1atUp9+vRxUZXlx5gxY6yhzs0336zFixerXr1617Tr1auXJk6cqFWrVmn8+PHOLRIAAAAoQFpmmvov7V9sqHNFRnaG+i/tr4RxCQrwDnBwdUDFwKNYKDeqVaum559/3vr6v//9rwurKR+++OILffzxx5Kkli1bav369QWGOnn17t1bO3bsULdu3ZxQIQAAAFC4mJ9ilJyeXKo+yenJWrh3oYMqAioe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\n",
"text/plain": [
""
]
},
"metadata": {
"image/png": {
"height": 454,
"width": 571
}
},
"output_type": "display_data"
}
],
"source": [
"# Plotting\n",
"fig, ax = plt.subplots()\n",
"colors = {'blue': 'blue', 'green': 'green'}\n",
"\n",
"# Group by color and then plot each group\n",
"for key, group in df.groupby('Color'):\n",
" group.plot(ax=ax, kind='scatter', x='x1', y='x2', label=key, color=colors[key])\n",
"\n",
"# Setting plot labels and title\n",
"ax.set_xlabel('x1')\n",
"ax.set_ylabel('x2')\n",
"ax.set_title('Scatter Plot of Colors')\n",
"\n",
"# Display the legend\n",
"ax.legend(title='Point Color')\n",
"\n",
"# Show the plot\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "b107274b",
"metadata": {},
"source": [
"## 3. Preprocessing Dataframe"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "a013cdab",
"metadata": {},
"outputs": [],
"source": [
"df['Color'] = df['Color'].map({'blue': 0, 'green': 1})"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "2863845a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" x1 \n",
" x2 \n",
" Color \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0.25 \n",
" 1.41 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 0.60 \n",
" 0.39 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" 0.71 \n",
" 1.29 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" 1.20 \n",
" 2.30 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" 1.75 \n",
" 0.59 \n",
" 0 \n",
" \n",
" \n",
" 5 \n",
" 2.26 \n",
" 1.70 \n",
" 1 \n",
" \n",
" \n",
" 6 \n",
" 2.50 \n",
" 1.35 \n",
" 1 \n",
" \n",
" \n",
" 7 \n",
" 2.50 \n",
" 2.90 \n",
" 1 \n",
" \n",
" \n",
" 8 \n",
" 2.88 \n",
" 0.61 \n",
" 1 \n",
" \n",
" \n",
" 9 \n",
" 2.91 \n",
" 2.00 \n",
" 1 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x1 x2 Color\n",
"0 0.25 1.41 0\n",
"1 0.60 0.39 0\n",
"2 0.71 1.29 0\n",
"3 1.20 2.30 0\n",
"4 1.75 0.59 0\n",
"5 2.26 1.70 1\n",
"6 2.50 1.35 1\n",
"7 2.50 2.90 1\n",
"8 2.88 0.61 1\n",
"9 2.91 2.00 1"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "markdown",
"id": "3dd74f94",
"metadata": {},
"source": [
"## 4. Training a Decision Tree with Gini"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "4111c236",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score"
]
},
{
"cell_type": "markdown",
"id": "2bdfa1c7",
"metadata": {},
"source": [
"#### 4.1. Splitting into X and y"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "0964d844",
"metadata": {},
"outputs": [],
"source": [
"X = df[['x1', 'x2']]\n",
"y = df['Color']\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
]
},
{
"cell_type": "markdown",
"id": "b8f48f53",
"metadata": {},
"source": [
"#### 4.2. Building the Decision Tree Classifier"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "a36a8169",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"DecisionTreeClassifier(random_state=42) In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org. "
],
"text/plain": [
"DecisionTreeClassifier(random_state=42)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tree_classifier = DecisionTreeClassifier(criterion='gini', random_state=42)\n",
"tree_classifier.fit(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"id": "5fe81c9b",
"metadata": {},
"source": [
"#### 4.3. Predict and Evaluate the Model"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "32549979",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy of the decision tree model: 1.0\n"
]
}
],
"source": [
"y_pred = tree_classifier.predict(X_test)\n",
"accuracy = accuracy_score(y_test, y_pred)\n",
"print(\"Accuracy of the decision tree model:\", accuracy)"
]
},
{
"cell_type": "markdown",
"id": "46c97eed",
"metadata": {},
"source": [
"#### 4.4. Visualize the Tree (optional)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "e8a7ce47",
"metadata": {},
"outputs": [],
"source": [
"from sklearn import tree\n",
"import graphviz\n",
"\n",
"dot_data = tree.export_graphviz(tree_classifier, out_file=None, \n",
" feature_names=['x1', 'x2'], \n",
" class_names=['blue', 'green'],\n",
" filled=True, rounded=True, \n",
" special_characters=True) \n",
"graph = graphviz.Source(dot_data) "
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "928cbc1c",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"Tree \n",
" \n",
"\n",
"\n",
"0 \n",
" \n",
"x1 ≤ 2.005 \n",
"gini = 0.5 \n",
"samples = 8 \n",
"value = [4, 4] \n",
"class = blue \n",
" \n",
"\n",
"\n",
"1 \n",
" \n",
"gini = 0.0 \n",
"samples = 4 \n",
"value = [4, 0] \n",
"class = blue \n",
" \n",
"\n",
"\n",
"0->1 \n",
" \n",
" \n",
"True \n",
" \n",
"\n",
"\n",
"2 \n",
" \n",
"gini = 0.0 \n",
"samples = 4 \n",
"value = [0, 4] \n",
"class = green \n",
" \n",
"\n",
"\n",
"0->2 \n",
" \n",
" \n",
"False \n",
" \n",
" \n",
" \n"
],
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Visualize the decision tree\n",
"graph"
]
},
{
"cell_type": "markdown",
"id": "5246d56a",
"metadata": {},
"source": [
"## 5. Training a Decision Tree with Entropy\n",
"\n",
"#### 4.1. Splitting into X and y"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "c33aa131",
"metadata": {},
"outputs": [],
"source": [
"X = df[['x1', 'x2']]\n",
"y = df['Color']\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
]
},
{
"cell_type": "markdown",
"id": "4f28e878",
"metadata": {},
"source": [
"#### 4.2. Building the Decision Tree Classifier"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "7e70ffdf",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"DecisionTreeClassifier(criterion='entropy', random_state=42) In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org. "
],
"text/plain": [
"DecisionTreeClassifier(criterion='entropy', random_state=42)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tree_classifier = DecisionTreeClassifier(criterion='entropy', random_state=42)\n",
"tree_classifier.fit(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"id": "ffbb9ce4",
"metadata": {},
"source": [
"#### 4.3. Predict and Evaluate the Model"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "e4b8c2f8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy of the decision tree model: 1.0\n"
]
}
],
"source": [
"y_pred = tree_classifier.predict(X_test)\n",
"accuracy = accuracy_score(y_test, y_pred)\n",
"print(\"Accuracy of the decision tree model:\", accuracy)"
]
},
{
"cell_type": "markdown",
"id": "0dfbb74c",
"metadata": {},
"source": [
"#### 4.4. Visualize the Tree (optional)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "b6781767",
"metadata": {},
"outputs": [],
"source": [
"from sklearn import tree\n",
"import graphviz\n",
"\n",
"dot_data = tree.export_graphviz(tree_classifier, out_file=None, \n",
" feature_names=['x1', 'x2'], \n",
" class_names=['blue', 'green'],\n",
" filled=True, rounded=True, \n",
" special_characters=True) \n",
"graph = graphviz.Source(dot_data) "
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "cf58ec4e",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"Tree \n",
" \n",
"\n",
"\n",
"0 \n",
" \n",
"x1 ≤ 2.005 \n",
"entropy = 1.0 \n",
"samples = 8 \n",
"value = [4, 4] \n",
"class = blue \n",
" \n",
"\n",
"\n",
"1 \n",
" \n",
"entropy = 0.0 \n",
"samples = 4 \n",
"value = [4, 0] \n",
"class = blue \n",
" \n",
"\n",
"\n",
"0->1 \n",
" \n",
" \n",
"True \n",
" \n",
"\n",
"\n",
"2 \n",
" \n",
"entropy = 0.0 \n",
"samples = 4 \n",
"value = [0, 4] \n",
"class = green \n",
" \n",
"\n",
"\n",
"0->2 \n",
" \n",
" \n",
"False \n",
" \n",
" \n",
" \n"
],
"text/plain": [
""
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Visualize the decision tree\n",
"graph"
]
}
],
"metadata": {
"jupytext": {
"formats": "md:myst",
"text_representation": {
"extension": ".md",
"format_name": "myst"
}
},
"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.10.7"
},
"source_map": [
11,
30,
47,
52,
71,
76,
81,
83,
88,
92,
97,
101,
106,
109,
114,
118,
123,
136,
139,
146,
150,
155,
158,
163,
167,
172,
185
]
},
"nbformat": 4,
"nbformat_minor": 5
}