1542 lines
215 KiB
Plaintext
1542 lines
215 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Decision trees, overarching aims\n",
|
||
"\n",
|
||
"\n",
|
||
"We start here with the most basic algorithm, the so-called decision\n",
|
||
"tree. With this basic algorithm we can in turn build more complex\n",
|
||
"networks, spanning from homogeneous and heterogenous forests (bagging,\n",
|
||
"random forests and more) to one of the most popular supervised\n",
|
||
"algorithms nowadays, the extreme gradient boosting, or just\n",
|
||
"XGBoost. But let us start with the simplest possible ingredient.\n",
|
||
"\n",
|
||
"Decision trees are supervised learning algorithms used for both,\n",
|
||
"classification and regression tasks.\n",
|
||
"\n",
|
||
"\n",
|
||
"The main idea of decision trees\n",
|
||
"is to find those descriptive features which contain the most\n",
|
||
"**information** regarding the target feature and then split the dataset\n",
|
||
"along the values of these features such that the target feature values\n",
|
||
"for the resulting underlying datasets are as pure as possible.\n",
|
||
"\n",
|
||
"The descriptive features which reproduce best the target/output features are normally said\n",
|
||
"to be the most informative ones. The process of finding the **most\n",
|
||
"informative** feature is done until we accomplish a stopping criteria\n",
|
||
"where we then finally end up in so called **leaf nodes**. \n",
|
||
"\n",
|
||
"## Basics of a tree\n",
|
||
"\n",
|
||
"A decision tree is typically divided into a **root node**, the **interior nodes**,\n",
|
||
"and the final **leaf nodes** or just **leaves**. These entities are then connected by so-called **branches**.\n",
|
||
"\n",
|
||
"The leaf nodes\n",
|
||
"contain the predictions we will make for new query instances presented\n",
|
||
"to our trained model. This is possible since the model has \n",
|
||
"learned the underlying structure of the training data and hence can,\n",
|
||
"given some assumptions, make predictions about the target feature value\n",
|
||
"(class) of unseen query instances.\n",
|
||
"\n",
|
||
"\n",
|
||
"## General Features\n",
|
||
"\n",
|
||
"The overarching approach to decision trees is a top-down approach.\n",
|
||
"\n",
|
||
"* A leaf provides the classification of a given instance.\n",
|
||
"\n",
|
||
"* A node specifies a test of some attribute of the instance.\n",
|
||
"\n",
|
||
"* A branch corresponds to a possible values of an attribute.\n",
|
||
"\n",
|
||
"* An instance is classified by starting at the root node of the tree, testing the attribute specified by this node, then moving down the tree branch corresponding to the value of the attribute in the given example.\n",
|
||
"\n",
|
||
"This process is then repeated for the subtree rooted at the new\n",
|
||
"node.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"In simplified terms, the process of training a decision tree and\n",
|
||
"predicting the target features of query instances is as follows:\n",
|
||
"\n",
|
||
"1. Present a dataset containing of a number of training instances characterized by a number of descriptive features and a target feature\n",
|
||
"\n",
|
||
"2. Train the decision tree model by continuously splitting the target feature along the values of the descriptive features using a measure of information gain during the training process\n",
|
||
"\n",
|
||
"3. Grow the tree until we accomplish a stopping criteria create leaf nodes which represent the *predictions* we want to make for new query instances\n",
|
||
"\n",
|
||
"4. Show query instances to the tree and run down the tree until we arrive at leaf nodes\n",
|
||
"\n",
|
||
"Then we are essentially done!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"2nd degree coefficients:\n",
|
||
"zero power: -6.548110376991839\n",
|
||
"first power: 0.2232822462117919\n",
|
||
"second power: -0.0007480407244119591\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAHFCAYAAAAKbwgcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAC4uUlEQVR4nOzdd1hT1xvA8W/YG0TZgrgV954VR9W6R1v3Xq1V66g/rdqqra1W66jW0bq1atVW66rVOnFvrXsrIAIOZM+Q+/vjmmsCAQFBhufzPHlIbs6999wAyZsz3qOSJElCEARBEAQhnzPK7QoIgiAIgiBkBxHUCIIgCIJQIIigRhAEQRCEAkEENYIgCIIgFAgiqBEEQRAEoUAQQY0gCIIgCAWCCGoEQRAEQSgQRFAjCIIgCEKBIIIaQRAEQRAKBBHUCEIOWb16NSqVSrmZmJhQtGhR+vfvT1BQUKaP17hxYxo3bpz9Fc0Fhw8fRqVScfjw4RzbV1tOezM2NsbJyYl27dpx7ty5rFU8H9L+HT58+DC3qyIIOc4ktysgCAXdqlWrKFeuHHFxcRw5coQZM2bg5+fHlStXsLa2zu3q5Yrq1atz8uRJfHx8cvxc06dPp0mTJiQlJXHx4kW++eYbfH19uXTpEqVLl87x8+e2Nm3acPLkSdzc3HK7KoKQ40RQIwg5rGLFitSsWROAJk2akJyczLRp09i2bRs9e/bM5drlDjs7O+rWrftWzlW6dGnlXO+99x4ODg707duXdevW8c0337yVOmjFxsZiZWX1Vs/p5OSEk5PTWz2nIOQW0f0kCG+Z9gPW398fgPj4eCZMmEDx4sUxMzPDw8ODYcOGER4enuYxJEmidOnStGzZMtVz0dHR2NvbM2zYMOBVN8zvv//OpEmTcHd3x87Ojvfff59bt26l2n/lypVUqVIFCwsLHB0d6dSpEzdu3NAr069fP2xsbLh58yYtW7bE2toaNzc3fvjhBwBOnTpFw4YNsba2pkyZMqxZs0Zvf0NdSOfOnaNbt254e3tjaWmJt7c33bt3V16n7KINMENDQ/W237lzhx49euDs7Iy5uTnly5dn0aJFqfa/du0aLVq0wMrKCicnJ4YNG8bff/+d6noaN25MxYoVOXLkCPXr18fKyooBAwYAEBkZydixY/V+56NGjSImJkbvXH/88Qd16tTB3t4eKysrSpQooRwDQKPR8N1331G2bFksLS1xcHCgcuXKzJ8/XymTVvdTZn7Pd+/epXXr1tjY2ODp6ckXX3xBQkJCxl90QXhLRFAjCG/Z3bt3AfkbtCRJdOzYkdmzZ9O7d2/+/vtvxowZw5o1a2jatGmaHxwqlYoRI0awb98+7ty5o/fc2rVriYyMVIIarYkTJ+Lv78/y5ctZunQpd+7coV27diQnJytlZsyYwcCBA6lQoQJbt25l/vz5XL58mXr16qU6T1JSEp07d6ZNmzZs376dVq1aMWHCBCZOnEjfvn0ZMGAAf/31F2XLlqVfv36cP38+3dfl4cOHlC1blp9++om9e/cyc+ZMgoODqVWrFs+ePcvw6/s6Dx48AKBMmTLKtuvXr1OrVi2uXr3KnDlz2LVrF23atOHzzz/Xa80JDg7G19eXW7dusWTJEtauXUtUVBTDhw83eK7g4GB69epFjx492L17N5999hmxsbH4+vqyZs0aPv/8c/755x/Gjx/P6tWrad++PZIkAXDy5Em6du1KiRIl2LhxI3///TeTJ09GrVYrx581axZTp06le/fu/P3332zatImBAwemGxBD5n/P7du3p1mzZmzfvp0BAwYwb948Zs6cmanXXRDeCkkQhByxatUqCZBOnTolJSUlSVFRUdKuXbskJycnydbWVgoJCZH27NkjAdKsWbP09t20aZMESEuXLlW2+fr6Sr6+vsrjyMhIydbWVho5cqTevj4+PlKTJk2Ux4cOHZIAqXXr1nrlNm/eLAHSyZMnJUmSpBcvXkiWlpapygUEBEjm5uZSjx49lG19+/aVAGnLli3KtqSkJMnJyUkCpAsXLijbnz9/LhkbG0tjxoxJVadDhw6l+fqp1WopOjpasra2lubPn5+pfXXLbdq0SUpKSpJiY2Ol48ePS2XLlpV8fHykFy9eKGVbtmwpFS1aVIqIiNA7xvDhwyULCwspLCxMkiRJ+t///iepVCrp2rVreuVatmyZqk6+vr4SIB04cECv7IwZMyQjIyPp7Nmzetv//PNPCZB2794tSZIkzZ49WwKk8PDwNK+xbdu2UtWqVdN9HbR/hw8ePJAkKWu/582bN+uVbd26tVS2bNl0zysIuUG01AhCDqtbty6mpqbY2trStm1bXF1d+eeff3BxceHgwYOA3Myv6+OPP8ba2poDBw6keVxbW1v69+/P6tWrlW6LgwcPcv36dYMtB+3bt9d7XLlyZeBVN9jJkyeJi4tLVRdPT0+aNm2aqi4qlYrWrVsrj01MTChVqhRubm5Uq1ZN2e7o6Iizs/Nru5Gio6MZP348pUqVwsTEBBMTE2xsbIiJiUnVLZIZXbt2xdTUFCsrKxo0aEBkZCR///03Dg4OgNz9d+DAATp16oSVlRVqtVq5tW7dmvj4eE6dOgWAn58fFStWTDXAuXv37gbPXahQIZo2baq3bdeuXVSsWJGqVavqnatly5Z6XVi1atUCoEuXLmzevNngjLnatWvz33//8dlnn7F3714iIyNf+3pk5ffcrl07vW2VK1fO9m5BQcgOIqgRhBy2du1azp49y8WLF3n8+DGXL1+mQYMGADx//hwTE5NUAzlVKhWurq48f/483WOPGDGCqKgo1q9fD8DChQspWrQoHTp0SFW2cOHCeo/Nzc0BiIuLU+oCGJwl4+7unqouVlZWWFhY6G0zMzPD0dEx1f5mZmbEx8eney09evRg4cKFDBo0iL1793LmzBnOnj2Lk5OTUsesmDlzJmfPnsXPz49JkyYRGhpKx44dla6958+fo1ar+fnnnzE1NdW7aYM2bffX8+fPcXFxSXUOQ9vA8GsZGhrK5cuXU53L1tYWSZKUczVq1Iht27ahVqvp06cPRYsWpWLFivz+++/KsSZMmMDs2bM5deoUrVq1onDhwjRr1izdKevZ8Xs2Nzd/7e9TEHKDmP0kCDmsfPnyyuDUlAoXLoxarebp06d6gY0kSYSEhCjf1tNSqlQpWrVqxaJFi2jVqhU7duzgm2++wdjYONP11AY9wcHBqZ57/PgxRYoUyfQxMyoiIoJdu3YxZcoUvvzyS2V7QkICYWFhb3TsEiVKKK9/o0aNsLS05KuvvuLnn39m7NixFCpUCGNjY3r37p1qHJJW8eLFAfk1SjnAGCAkJMTgfiqVKtW2IkWKYGlpycqVKw3uo/s6d+jQgQ4dOpCQkMCpU6eYMWMGPXr0wNvbm3r16mFiYsKYMWMYM2YM4eHh7N+/n4kTJ9KyZUsCAwMNzrTKzd+zIOQ00VIjCLmoWbNmAKxbt05v+5YtW4iJiVGeT8/IkSO5fPkyffv2xdjYmMGDB2epLvXq1cPS0jJVXR49esTBgwczVJesUqlUSJKktB5pLV++XG8gc3YYN24cpUqV4ocffiAqKgorKyuaNGnCxYsXqVy5MjVr1kx10wYCvr6+XL16levXr+sdc+PGjRk+f9u2bbl37x6FCxc2eC5vb+9U+5ibm+Pr66sMzr148WKqMg4ODnz00UcMGzaMsLCwNJPt5ebvWRBymmipEYRc1Lx5c1q2bMn48eOJjIykQYMGXL58mSlTplCtWjV69+6doWP4+Phw6NAhevXqhbOzc5bq4uDgwNdff83EiRPp06cP3bt35/nz53zzzTdYWFgwZcqULB03I+zs7GjUqBE//vgjRYoUwdvbGz8/P1asWKGMfckupqamTJ8+nS5dujB//ny++uor5s+fT8OGDXnvvfcYOnQo3t7eREVFcffuXXbu3KmMfRo1ahQrV66kVatWfPvtt7i4uLBhwwZu3rwJgJHR678njho1ii1bttCoUSNGjx5N5cqV0Wg0BAQE8O+///LFF19Qp04dJk+ezKNHj2jWrBlFixYlPDyc+fPnY2pqiq+vLwDt2rVT8iA5OTnh7+/PTz/9RLFixdJMLJibv2dByGmipUYQcpFKpWLbtm2MGTOGVatW0bp1a2V698GDB1O1XKSlS5cuAGlOLc6oCRMmsHz5cv777z86duzI8OHDqVChAidOnMjx7LsbNmygSZMmjBs3js6dO3Pu3Dn27duHvb19tp/r448/pk6dOsydO5eIiAh8fHy4cOECFStW5KuvvqJFixYMHDiQP//8U6/lwt3dHT8/P8qUKcOnn35Kz549MTMz49tvvwXIUABmbW3N0aNH6devH0uXLqVNmzZ06dKFBQsWULRoUaWlpk6dOoSEhDB+/HhatGjBkCFDsLS05ODBg1SoUAGQkzkeOXKETz/9lObNm/PVV1/RrFkz/Pz8MDU1TbMOufl7FoScpJKkl0kRBEHIt2rWrIlKpeLs2bO5XZV30pAhQ/j99995/vw5ZmZmuV0dQXhnie4nQcinIiMjuXr1Krt27eL8+fP89ddfuV2ld8K3336Lu7s7JUqUIDo6ml27drF8+XK++uorEdAIQi4TQY0g5FMXLlygSZMmFC5cmClTptCxY8fcrtI7wdTUlB9//JFHjx6hVqspXbo0c+fOZeTIkbldNUF454nuJ0EQBEEQCgQxUFgQBEEQhAJBBDWCIAiCIBQIIqgRBEEQBKFAeKcGCms0Gh4/foytra3B9OWCIAiCIOQ9kiQRFRWFu7t7ukku36mg5vHjx3h6euZ2NQRBEARByILAwECKFi2a5vPvVFBja2sLyC+KnZ1dLtdGEARBEISMiIyMxNPTU/kcT8s7FdRou5zs7OxEUCMIgiAI+czrho6IgcKCIAiCIBQIIqgRBEEQBKFAEEGNIAiCIAgFwjs1piajkpOTSUpKyu1qCMIbMzU1xdjYOLerIQiC8FaIoEaHJEmEhIQQHh6e21URhGzj4OCAq6uryM0kCEKBJ4IaHdqAxtnZGSsrK/EhIORrkiQRGxvLkydPAHBzc8vlGgmCIOQsEdS8lJycrAQ0hQsXzu3qCEK2sLS0BODJkyc4OzuLrihBEAo0MVD4Je0YGisrq1yuiSBkL+3ftBgnJghCQSeCmhREl5NQ0Ii/aUEQ3hUiqBEEQRAEoUDIM0HNkSNHaNeuHe7u7qhUKrZt26b3fL9+/VCpVHq3unXr5k5lBYW3tzc//fRTblcjWzx8+BCVSsWlS5cAOHz4MCqVSsyGEwRByCfyTFATExNDlSpVWLhwYZplPvjgA4KDg5Xb7t2732IN8ybdYM/ExAQvLy+GDh3KixcvcrtqOWbPnj2oVCpCQkL0tru6uqZahf3Ro0eoVCr+/ffft1I33d+HqakpLi4uNG/enJUrV6LRaDJ1rNWrV+Pg4JAzFRUEQSiA8szsp1atWtGqVat0y5ibm+Pq6vqWapR/fPDBB6xatQq1Ws3169cZMGAA4eHh/P7777ldtRzRsGFDTExMOHz4MN26dQPgxo0bxMfHExcXx927dylVqhQAhw4dwtTUlAYNGry1+ml/H8nJyYSGhrJnzx5GjhzJn3/+yY4dOzAxyTP/dkI+l6xJ5lHkIwCK2hXF2Eie3fY05imxSbFKOWdrZyxNLXOljoLwNuWZlpqMOHz4MM7OzpQpU4bBgwcr+TfSkpCQQGRkpN6tINIGe0WLFqVFixZ07dpVr2UiOTmZgQMHUrx4cSwtLSlbtizz58/XO0a/fv3o2LEjs2fPxs3NjcKFCzNs2DC9GTNPnjyhXbt2WFpaUrx4cdavX5+qLgEBAXTo0AEbGxvs7Ozo0qULoaGhyvNTp06latWqrFy5Ei8vL2xsbBg6dCjJycnMmjULV1dXnJ2d+f7779O8XhsbG2rVqsXhw4eVbYcPH6Zhw4Y0bNgw1fbatWtjbW3Nnj17aNiwIQ4ODhQuXJi2bdty7969DL/OcXFxtGnThrp16xIWFpZmOe3vw8PDg+rVqzNx4kS2b9/OP//8w+rVq5Vyc+fOpVKlSlhbW+Pp6clnn31GdHS0Uu/+/fsTERGhtPxMnToVgHXr1lGzZk1sbW1xdXWlR48er/1fEAqmZmub4T3fG+/53jRd2xSAjVc34jzbWdnuPd+bYj8VIyI+IpdrKwg5L98ENa1atWL9+vUcPHiQOXPmcPbsWZo2bUpCQkKa+8yYMQN7e3vllrJrIj2SJBGTGJMrN0mSsvw63b9/nz179mBqaqps02g0FC1alM2bN3P9+nUmT57MxIkT2bx5s96+hw4d4t69exw6dIg1a9awevVqvQ/hfv368fDhQw4ePMiff/7J4sWL9T5MJUmiY8eOhIWF4efnx759+7h37x5du3bVO8+9e/f4559/2LNnD7///jsrV66kTZs2PHr0CD8/P2bOnMlXX33FqVOn0rzOJk2acOjQIb26N27cGF9f31TbmzRpAshdnGPGjOHs2bMcOHAAIyMjOnXqlKFuoYiICFq0aEFiYiIHDhzA0dHxtfvoatq0KVWqVGHr1q3KNiMjIxYsWMDVq1dZs2YNBw8eZNy4cQDUr1+fn376CTs7O6W7dezYsQAkJiYybdo0/vvvP7Zt28aDBw/o169fpuoj5H8J6gT8/P2Ux0f8j5CgTuDA/QMAmBiZYGFiAcDT2KdceXIlV+opCG9TvmkH1/1grFixIjVr1qRYsWL8/fffdO7c2eA+EyZMYMyYMcrjyMjIDAc2sUmx2MywebNKZ1H0hGiszawzXH7Xrl3Y2NiQnJxMfHw8ILcCaJmamvLNN98oj4sXL86JEyfYvHkzXbp0UbYXKlSIhQsXYmxsTLly5WjTpg0HDhxg8ODB3L59m3/++YdTp05Rp04dAFasWEH58uWV/ffv38/ly5d58OCB8jr/9ttvVKhQgbNnz1KrVi1ADrJWrlyJra0tPj4+NGnShFu3brF7926MjIwoW7YsM2fO5PDhw2kOBm/cuDHTp08nODgYNzc3/Pz8+N///odGo1FaoQIDA3nw4IES1Hz44Yd6x1ixYgXOzs5cv36dihUrpvn6hoaG0rVrV0qWLMnvv/+OmZnZa34jhpUrV47Lly8rj0eNGqXcL168ONOmTWPo0KEsXrwYMzMz7O3tUalUqbpcBwwYoNwvUaIECxYsoHbt2kRHR2Njkzt/s8LbFxQVBIC5sTkqlYp4dTyPIh8REBkAwNK2S+lfrT+NVzfGz9+PgIiA3KyuILwV+aalJiU3NzeKFSvGnTt30ixjbm6OnZ2d3q0gatKkCZcuXeL06dOMGDGCli1bMmLECL0yv/zyCzVr1sTJyQkbGxuWLVtGQID+m1yFChX0Ms66ubkpLTE3btzAxMSEmjVrKs+XK1dObyDrjRs38PT01AscfXx8cHBw4MaNG8o2b29vbG1tlccuLi74+PhgZGSkty29LpUGDRpgZmbG4cOHuX79OnFxcVSvXp0aNWoQGRnJnTt3OHToEObm5tSvXx+QW4h69OhBiRIlsLOzo3jx4gCpXoeU3n//fUqUKMHmzZuzHNCA3JKlmzPm0KFDNG/eHA8PD2xtbenTpw/Pnz8nJiYm3eNcvHiRDh06UKxYMWxtbWncuHGGrkMoWLRBipe9F172XgAERgbqbdf9KYIa4V2Qb1pqUnr+/DmBgYE5tp6NlakV0ROic+TYGTl3ZlhbWysDYxcsWECTJk345ptvmDZtGgCbN29m9OjRzJkzh3r16mFra8uPP/7I6dOn9Y6j22UFctI2bdeMtkssvURuKT+009pu6DzpndsQKysrateuzaFDhwgLC6Nhw4ZKQFa/fn0OHTrEyZMnqVevHhYWchN8u3bt8PT0ZNmyZbi7u6PRaKhYsSKJiYlpngegTZs2bNmyhevXr1OpUqV0y6bnxo0bSiDl7+9P69at+fTTT5k2bRqOjo4cO3aMgQMHppv5NyYmhhYtWtCiRQvWrVuHk5MTAQEBtGzZ8rXXIRQsgRGBAHjae6JCxe3ntwmICNDbDuBp56lXXhAKsjwT1ERHR3P37l3l8YMHD7h06RKOjo44OjoydepUPvzwQ9zc3Hj48CETJ06kSJEidOrUKUfqo1KpMtUFlJdMmTKFVq1aMXToUNzd3Tl69Cj169fns88+U8pkZoAsQPny5VGr1Zw7d47atWsDcOvWLb0cLj4+PgQEBBAYGKi01ly/fp2IiAi9bqrs0qRJEzZu3MiLFy+U1goAX19fDh8+zMmTJ+nfvz8gB8E3btzg119/5b333gPg2LFjGTrPDz/8gI2NDc2aNePw4cP4+Phkuq4HDx7kypUrjB49GoBz586hVquZM2eO0kKVcoyTmZkZycnJettu3rzJs2fP+OGHH5TX+Ny5c5muj5D/6bbIqJC/NPwX8h8xSXJLnzaYUVpqIkVLjVDw5Znup3PnzlGtWjWqVasGwJgxY6hWrRqTJ0/G2NiYK1eu0KFDB8qUKUPfvn0pU6YMJ0+e1OvGEGSNGzemQoUKTJ8+HYBSpUpx7tw59u7dy+3bt/n66685e/Zspo5ZtmxZPvjgAwYPHszp06c5f/48gwYNUhZMBLmbpnLlyvTs2ZMLFy5w5swZ+vTpg6+vr163VXZp0qQJd+7cYc+ePfj6+irbfX192bVrFw8fPlTG0xQqVIjChQuzdOlS7t69y8GDB/XGW73O7Nmz6dmzJ02bNuXmzZvplk1ISCAkJISgoCAuXLjA9OnT6dChA23btqVPnz4AlCxZErVazc8//8z9+/f57bff+OWXX/SO4+3tTXR0NAcOHODZs2fExsbi5eWFmZmZst+OHTuUFjnh3RIYKbe8eNm96n46HngcACcrJ2UKt7bFRrTUCO+CPBPUNG7cGEmSUt1Wr16NpaUle/fu5cmTJyQmJuLv78/q1aszNZvpXTNmzBiWLVtGYGAgn376KZ07d6Zr167UqVOH58+f67XaZNSqVavw9PTE19eXzp07M2TIEJydnZXntZmgCxUqRKNGjZSxKJs2bcrOS1PUq1cPc3NzAGrUqKFsr1WrFsnJyVhaWiqDmo2MjNi4cSPnz5+nYsWKjB49mh9//DFT55s3bx5dunShadOm3L59O81ye/bswc3NDW9vbz744AMOHTrEggUL2L59u9JFVrVqVebOncvMmTOpWLEi69evZ8aMGXrHqV+/Pp9++ildu3bFycmJWbNm4eTkxOrVq/njjz/w8fHhhx9+YPbs2Zm6DqFg0LbUeNp7Kq0yF4IvKNu0xJga4V2ikt5k/nA+ExkZib29PREREakGDcfHx/PgwQOKFy+ujMEQhIJA/G0XTJWWVOLqk6vs7bUXFSparGuhPNexXEf+6voXAJEJkdj/YA9A1IQobMzEDDkh/0nv81tXnmmpEQRBEDLO0OwnLS+7V4/tzO2wM5c/BEQXlFDQiaBGEAQhn4mIjyAyQc6Q7mnnqdfdBKR6LLqghHeFCGoEQRDyGe0gYUdLR6zNrLEytaKwZWHl+ZQtN8q07kjRUiMUbCKoEQRByGdSJthL777uY9FSIxR0IqgRBEHIZ5QEe3avupl0u5x0twN6GYcFoSATQY0gCEI+Y7Cl5uXgYBMjE1xt9NcL0wY5oqVGKOjyTEZhQRAE4ZXDDw+z9+5eANqUaUNDr4Y8i33GL+d+YdedXYDhLqeidkUxNjLWO5b2ucuhl5mwfwIgL8fySc1PcLZ21iurkTQsPruYoMggLE0tGVJjSKogSRDyKhHUCIIg5DGSJNFpUyfC48MBWP3faoK/CGbuybnMOPYqSWMpx1Kp7utu0yrpWBKAZ7HP+OH4D8r2iIQIZrfQT964//5+RvzzakHcsLgwfvrgpze+JkF4G0RQIwiCkMc8i32mBDQAIdEhRCVEcSfsDgDNijejeYnmtCvTTinTtkxbZjefTctSLVMdr6hdUdZ2XKtkHL729Br77u9TjqfrznP9bYbKCEJeJcbUCAY9fPgQlUrFpUuXcrsqeY63tzc//fRTbldDKMC0Y19cbVyxN5ezAQdGBirbh9cezviG4zE1frW6vamxKV/U/4KKzhUNHrN3ld7M+2Ae8z6Yx8g6I/XOY+jcPk4+aZYRhLxKBDX53IwZM6hVqxa2trY4OzvTsWNHbt269VbO3bhxY1QqFSqVCnNzczw8PGjXrh1bt259K+fPSbrXpntTq9WcPXuWIUOGKGW1a14JQnYxlC04ICLA4ADhrEhvird2Ne8Gng3SLCMIeZUIavI5Pz8/hg0bxqlTp9i3bx9qtZoWLVoQExPzVs4/ePBggoODuXv3Llu2bMHHx4du3brpfejnlMTExBw9vvbadG8mJiY4OTlhZWWVo+cW3m3aqdeedp5KAHI37C4h0SHK9jehnf4dFhdGTKL+e4V2unh9z/qAvHZURHzEG51PEN4WEdTkc3v27KFfv35UqFCBKlWqsGrVKgICAjh//rxSxtvbm+nTpzNgwABsbW3x8vJi6dKlesc5c+YM1apVw8LCgpo1a3Lx4sUMnd/KygpXV1c8PT2pW7cuM2fO5Ndff2XZsmXs379fKRcUFETXrl0pVKgQhQsXpkOHDjx8+FB5Xq1W8/nnn+Pg4EDhwoUZP348ffv2pWPHjkqZxo0bM3z4cMaMGUORIkVo3rw5ANevX6d169bY2Njg4uJC7969efbsmbKfJEnMmjWLEiVKYGlpSZUqVfjzzz8zfG26N+3rqe1+8vb2BqBTp06oVCrlsSC8Cd0WGW0Ac/LRSQAsTCwoYlXkjY5vb26PrZktkDp3jfbc5YuUx9HS0WAZQcirRFCTFkmCmJjcub3BwukREfI3KkdHR73tc+bMUYKVzz77jKFDh3Lz5k0AYmJiaNu2LWXLluX8+fNMnTqVsWPHZrkOffv2pVChQko3VGxsLE2aNMHGxoYjR45w7NgxbGxs+OCDD5TWlpkzZ7J+/XpWrVrF8ePHiYyMNNils2bNGkxMTDh+/Di//vorwcHB+Pr6UrVqVc6dO8eePXsIDQ2lS5cuyj5fffUVq1atYsmSJVy7do3Ro0fTq1cv/Pz8snyNWmfPngVg1apVBAcHK48F4U1ogwjd7qfjAceVbSqV6o2Or1KpXiXk01nkUq1RExQVlOrcogtKyC/E7Ke0xMaCjU3unDs6GqytM72bJEmMGTOGhg0bUrGi/mDB1q1b89lnnwEwfvx45s2bx+HDhylXrhzr168nOTmZlStXYmVlRYUKFXj06BFDhw7NUvWNjIwoU6aM0hKzceNGjIyMWL58ufJmvGrVKhwcHDh8+DAtWrTg559/ZsKECXTq1AmAhQsXsnv37lTHLlWqFLNmzVIeT548merVqzN9+nRl28qVK/H09OT27dt4eHgwd+5cDh48SL169QAoUaIEx44d49dff8XX1zfN61i8eDHLly9XHn/yySfMmTNHr4yTkxMADg4OSkuOILwpbRDhaedJvDoeAP8If2VbdvC09+Ta02t6AUtwVDAaSYOpkSkuNi542nlyKeSSWN1byDdEUFOADB8+nMuXL3Ps2LFUz1WuXFm5r1KpcHV15cmTJwDcuHGDKlWq6I0T0QYAWSVJkhLAnD9/nrt372Jra6tXJj4+nnv37hEREUFoaCi1a9dWnjM2NqZGjRpoNBq9fWrWrKn3+Pz58xw6dAgbAwGo9tjx8fFKV5VWYmIi1apVS/caevbsyaRJk5THDg4O6ZYXhOyi2/0Up47Te+5NBwkrx7FLvXSC9rxF7YpipDISLTVCviOCmrRYWcktJrl17kwaMWIEO3bs4MiRIxQtWjTV86ampnqPVSqVEjBIb9DdZUhycjJ37tyhVq1aAGg0GmrUqMH69etTldW2dGjrpMtQvaxTtGBpNBratWvHzJkzU5V1c3Pj6tWrAPz99994eHjoPW9ubp7uddjb21OqVOpEZoKQk5KSkwiOCgbk1hRtS41WdrbUgH7AogxQfvmcsrxCpAhqhPxBBDVpUamy1AX0tkmSxIgRI/jrr784fPgwxYsXz/QxfHx8+O2334iLi8PS0hKAU6dOZblOa9as4cWLF3z44YcAVK9enU2bNuHs7IydnZ3BfVxcXDhz5gzvvfceIAdGFy9epGrVqumeq3r16mzZsgVvb29MTFL/Ofv4+GBubk5AQEC6XU1vwtTUlOTk5Bw5tvDuCYoKQkLCzNgMZ2tnkjXJqFAhIQf52dZSY6AVJuWUcUPjbgQhLxMDhfO5YcOGsW7dOjZs2ICtrS0hISGEhIQQFxf3+p1f6tGjB0ZGRgwcOJDr16+ze/duZs+e/fodkQcBh4SE8OjRI06fPs348eP59NNPGTp0KE2aNAHkbpwiRYrQoUMHjh49yoMHD/Dz82PkyJE8evQIkFuaZsyYwfbt27l16xYjR47kxYsXrx0QOWzYMMLCwujevTtnzpzh/v37/PvvvwwYMIDk5GRsbW0ZO3Yso0ePZs2aNdy7d4+LFy+yaNEi1qxZk+HXKD3e3t4cOHCAkJAQXrx4kS3HFN5duitwG6mMMDU2xc3WTXledzXuN2Fo5W4lqLHTD2pE95OQX4igJp9bsmQJERERNG7cGDc3N+W2adOmDB/DxsaGnTt3cv36dapVq8akSZMMducYsmzZMtzc3ChZsiSdOnXi+vXrbNq0icWLFytlrKysOHLkCF5eXnTu3Jny5cszYMAA4uLilJab8ePH0717d/r06UO9evWwsbGhZcuWWFhYpHt+d3d3jh8/TnJyMi1btqRixYqMHDkSe3t7jIzkP+9p06YxefJkZsyYQfny5WnZsiU7d+7MUquWIXPmzGHfvn14enq+dpyOILyOMkhYJ3gxtHDlm9JduVvb1Zuq++nlz0eRj9BIGgNHEYS8RSVl94CKPCwyMhJ7e3siIiJSdYPEx8fz4MEDihcv/toPUiHnaTQaypcvT5cuXZg2bVpuVydfE3/b+cuMozOYeHAifar0YU1HuTWxyx9d+OP6HwBET4jG2uzNu8YT1AlYfC//PTz931OKWBWh2q/VuBRyib97/E3r0q1Ra9SYf2eORtLweMxjvRYjQXib0vv81iVaaoQ8wd/fn2XLlnH79m2uXLnC0KFDefDgAT169MjtqgnCW6WbTVhL2zrjaOmYLQENgLmJOS7WLsCr1iHdqeQAJkYmuNu66z0nCHmZCGqEPMHIyIjVq1dTq1YtGjRowJUrV9i/fz/ly5fP7aoJwltlaH2nlAN3s4vumJmYxBjC4sLSPHd6WYXXX16PzyIfbjy9ka31E4TMErOfhDzB09OT48eP53Y1BCHXGQpqGng2wFhljG+x7J3B52XvxdnHZwmMCFSCFjtzO+wt7PXKnAg8kW5LzZr/1nDj2Q123NpBeSfxRUTIPSKoEQRByEMMdT/VcK/B83HPsTNPeyxBVugOFtaddZVWmdfVWawRJeQ2EdQIgiDkEVEJUYTHhwOpp27rtp5kF92uJUMtRCnLGCJJUqoxOYKQW8SYGkEQhDxCGzjYm9tne6uMIbpjal4X1KQVsITFhRGbFJtuGUF4W0RQIwiCkEekFVjkFG1rUGBkoMFuL93HaQUsui04ovtJyG0iqBEEQcgj3nZQoz3P46jH3Htxz+C5tY+fRD8hLil1pnLdYCcsLoyYxJicqq4gvJYYUyMIgpBHpDVYN6c4WztjamRKkiaJc4/PAeBo5MiuXbs4c+YMly5d4v79+3APSACrb6ywtLSkSJEieHt7U7lyZaKcoiAasHl5DZGBlCtS7q3UXxBSEkGNkKapU6eybds2Ll26lNtVyfNWr17NqFGjCA8Pz+2qCPmYdjXst9VSY6QywtPek/sh94m9GAuXoeN3HVGr1WnuExcXR2BgIIGBgRw9evTVE15Adbj75K4IaoRcI7qf8rkjR47Qrl073N3dUalUbNu2LVUZSZKYOnUq7u7uWFpa0rhxY65du6ZXJq19M+vw4cOoVCpUKhVGRkbY29tTrVo1xo0bR3Bw8BsfPzfpXpvu7auvvqJr167cvn1bKTt16tTXrjAuCClpW2reVlBz5swZYjbHwGxgO/AA1Go1JUuWpH///vz888/s3buXejPqwRiYv38+9+/f5+TJk6xbt47Ro0dTqEQh+WABwDbo3qA7c+bMydSiuoKQXURQk8/FxMRQpUoVFi5cmGaZWbNmMXfuXBYuXMjZs2dxdXWlefPmREVF5Vi9bt26xePHjzl79izjx49n//79VKxYkStXruTYOUEO4NL7lpkdbt26RXBwsHL78ssvsbS0xNnZOUfPKxR8hhazzAnHjh2jZcuW1KlTh9DjoZAEOILNBzbcvXuXu3fvsnLlSoYPH06LFi3kzN52EGESQfHixalbty49e/Zk7ty5lJ9UHkaDZUtLsIfo8GjGjh1LmTJlsuWLkiBkhghq8rlWrVrx3Xff0blzZ4PPS5LETz/9xKRJk+jcuTMVK1ZkzZo1xMbGsmHDBgC8vb0B6NSpEyqVSnms9dtvv+Ht7Y29vT3dunXLUDDk7OyMq6srZcqUoVu3bhw/fhwnJyeGDh2qV27VqlWUL18eCwsLypUrp7e6N8CJEyeoWrUqFhYW1KxZk23btqFSqZQuMW3ryd69e6lZsybm5uYcPXoUSZKYNWsWJUqUwNLSkipVqvDnn3/qHfv69eu0bt0aGxsbXFxc6N27N8+ePcvwtWlvNjY2rF69GgcHB0Duivrmm2/477//lNac1atXv/a4wrtNI2mU2UM51VJz/vx5mjZtynvvvce///6LsbExlZpXggHACPD50IeSJUum2i+9XDWBEYFgD837NYfPocGIBnh5efHo0SM6derExx9/zIsXL3LkegQhJRHUpEGSJGJiYnLllp0Lpz948ICQkBBatGihbDM3N8fX15cTJ04AcPbsWUAOMIKDg5XHAPfu3WPbtm3s2rWLXbt24efnxw8//JDpelhaWvLpp59y/Phxnjx5AsCyZcuYNGkS33//PTdu3GD69Ol8/fXXrFkjr0wcFRVFu3btqFSpEhcuXGDatGmMHz/e4PHHjRvHjBkzuHHjBpUrV+arr75i1apVLFmyhGvXrjF69Gh69eqFn58fAMHBwfj6+lK1alXOnTvHnj17CA0NpUuXLpm+tpS6du3KF198QYUKFZTWnK5du77xcYWC7WnMUxKTE1GhwsPWI1uP/eTJEwYNGkStWrU4dOgQpqamDBkyhNu3bzNs+jB5PIwq7QHK2pajlNO61Ro1QVFBgLyUA8ZgUdOCGzduMGHCBExMTPjzzz+pUqUKp0+fztZrEgRDxEDhNMTGxmJjY5Mr546OjsbaOntW4g0JCQHAxcVFb7uLiwv+/v4AODk5AeDg4ICrq6teOY1Gw+rVq7G1tQWgd+/eHDhwgO+//z7TdSlXTh48+PDhQ5ydnZk2bRpz5sxRWpmKFy/O9evX+fXXX+nbty/r169HpVKxbNkyLCws8PHxISgoiMGDB6c69rfffkvz5s0BuUtu7ty5HDx4kHr16gFQokQJjh07xq+//oqvry9LliyhevXqTJ8+XTnGypUr8fT05Pbt25QpUybN6yhatKjeY+3rqGVpaYmNjQ0mJiapXk9BSIs2YHCzdcPU2DRbjpmcnMyiRYv4+uuviYyMBKBnz57MmDEDT085UPFKTr14ZUppJeALjgpGI2kwNTKllnstpYyVlRXTp0+nc+fOdO/enbt37+Lr68vKlSvp0aNHtlybIBgigpp3hEql0nssSVKqbYZ4e3srAQ2Am5ub0tKSWdoWKJVKxdOnTwkMDGTgwIF6QYparcbeXk4Hf+vWLSpXroyFhYXyfO3atQ0eu2bNmsr969evEx8frwQ5WomJiVSrVg2Qm+EPHTpkMHC9d+9eukHN0aNH9V6TQoUKpVlWEDIqu7uebt26xYABA5QW2Ro1arBgwQLq16+vV87Qitwp6XY/6b53aIMcDzsPvB28U5WpWbMmFy5coHfv3mzfvp2ePXsSGBiYZourILwpEdSkwcrKiujo6Fw7d3bRthSEhITg5uambH/y5Emq1htDTE31vzGqVCo0Gk2W6nLjxg1ADpS0x1i2bBl16tTRK2dsbAwYDrzS6prTbdnSHvvvv//Gw0O/Gd/c3Fwp065dO2bOnJnqWLqvkyHFixdXxs8IQnZRBgm/YY6a5ORk5s6dy9dff01CQgK2trbMnDmTIUOGKP9bunQHJad17qJ2cutkdGI0a/9bS0OvhpR0LKmXLNDDzgMVKuLV8ay6tIpGxRpRyrEUltaWfDLrEzSOGnau2smXX35JZGQk3333XYa+WAlCZoigJg0qlSrbuoByU/HixXF1dWXfvn1KK0ViYiJ+fn56H+impqYkJyfnWD3i4uJYunQpjRo1Urq7PDw8uH//Pj179jS4T7ly5Vi/fj0JCQlKMHLu3LnXnsvHxwdzc3MCAgLw9fU1WKZ69eps2bIFb29vTEyy/9/AzMwsR19PoeDJjmzCgYGB9OzZU8kf07JlS5YuXYqXV9rHtDO3w8HCgfD4cIo5FDNYxsrUCicrJ57GPqXf9n44WzvzeMxjvdYlM2Mz3GzdeBz1mIE7BlLYsjAhY0NYd3kd/bf3h2LA+8B+mD59OiYmJnzzzTdZvlZBMEQMFM7noqOjuXTpkjIb6MGDB1y6dImAAPkNUqVSMWrUKKZPn85ff/3F1atX6devH1ZWVnp9297e3hw4cICQkJBsmanw5MkTQkJCuHPnDhs3bqRBgwY8e/aMJUuWKGWmTp3KjBkzmD9/Prdv3+bKlSusWrWKuXPnAtCjRw80Gg1Dhgzhxo0b7N27l9mzZyvXlRZbW1vGjh3L6NGjWbNmDffu3ePixYssWrRIGYQ8bNgwwsLC6N69O2fOnOH+/fv8+++/DBgwIFuCEW9vb+V38ezZMxISEt74mELBltbaSxn1119/UaVKFaV7dMWKFfzzzz/pBjRas5vPZlitYVR3q55mmVnNZ9G0eFNUqHgS84TQmNBUrUs/NPuBpsWbYqwy5nnccx5HPea/kP9eHaQhvP/Z+4A8Dm7OnDlZulZBSJP0DomIiJAAKSIiItVzcXFx0vXr16W4uLhcqFnWHTp0SAJS3fr27auU0Wg00pQpUyRXV1fJ3NxcatSokXTlyhW94+zYsUMqVaqUZGJiIhUrVkySJEmaMmWKVKVKFb1y8+bNU55/XX1UKpVka2srValSRfrf//4nBQcHpyq/fv16qWrVqpKZmZlUqFAhqVGjRtLWrVuV548fPy5VrlxZMjMzk2rUqCFt2LBBAqSbN2/qne/Fixd6x9VoNNL8+fOlsmXLSqamppKTk5PUsmVLyc/PTylz+/ZtqVOnTpKDg4NkaWkplStXTho1apSk0WjSvbaU55IkSVq1apVkb2+vPI6Pj5c+/PBDycHBQQKkVatWpfma5bT8+rf9rqm9rLbEVKSt17e+vrCO2NhYaejQocr/Xa1ataS7d+/mUC0lyXOup8RUpFOBp6R2G9pJTEVacnaJXpkS80tITEU66n9U6ryps8RUpGLziklMReqxpYf0/fffK/XdtGlTjtVVKDjS+/zWJYKal8Qbf/6wbt06ydTUVIqNjc3tquQb4m87f3Cb7SYxFelc0LkM73Pt2jWpUqVKSoDwv//9T0pISMjBWkpS/RX1JaYibb66War6S1WJqUh/3/5br4zvKl+JqUgbLm+Qai2tpQQzTEV6b+V7kkajkUaNGiUBkrm5uXTy5MkcrbOQ/2U0qBHdT0KetnbtWo4dO8aDBw/Ytm0b48ePp0uXLlhaWuZ21QQh2ySoEwiOlpcRyWg24d9//51atWpx5coVnJ2d2bt3L7NmzcLMzCwnq6o3Eyqtwc26U8C1ZRp4NlC2qVQqZs+eTbt27UhISKBTp075fhkVIW8QQY2Qp4WEhNCrVy/Kly/P6NGj+fjjj1m6dGluV0sQspU2gZ25sTlOVk7plk1KSmLUqFH06NGD2NhY3n//fS5fvqyXYDMnaQOYm89uEhYXBqQe3KwtczfsLqExocCroCYoKohkTTLGxsZs2LCBihUrEhISQpcuXUhKSnor1yAUXCKoEfK0cePG8fDhQ+Lj43nw4AHz5s3L1invgpAXaBey9LT3THcQfHBwME2bNmX+/PkATJw4kT179mQoPUN20QYwxwOPA/LsKXsLe4NlTjySc+RYmlhS0bkiJkYmqDVqQqLlpKA2NjZs3boVOzs7jh07xsSJE9/WZQgFlAhqBEEQcllGpnMfO3aM6tWrc+zYMezs7Ni2bRvff/+9wdwzOUlbx+tPrwOGZ2ulLONl74WxkbGy/INuZuLSpUsrsxJnz57Nvn37cq7yQoEngpoUpGxcd0kQ8gLxN533pZdNWJIk5s+fT5MmTQgJCaFChQqcPXuWDh06vO1qAmmPn9Erk2JckPax9mfKhTE7duyoLHbbp08fnj59mm31Fd4tIqh5SZs5NzY2NpdrIgjZS/s3nTI7tJB3pDXgNiYmhp49ezJq1CjUajXdunXj9OnT6S7jkdPSGj+TXhkvOy+97SnXkAK5lcbHx4eQkBA+//zz7Kqu8I4RGYVfMjY2xsHBQVnXyMrKSqTwFvI1SZKIjY3lyZMnODg4vPVuCiHjDHU/3blzh86dO3P16lVMTEyYPXs2n3/+ea6/LzlaOmJpYkmcOg4w3FJjZ26HnbkdkQnyIpraFhptcGMoqLGysmLt2rXUrl2bjRs30qtXL9q0aZNTlyEUUCKo0aFdJymrCzYKQl5kaPV1IW9JmU1427Zt9O3bl8jISFxdXdm8eTPvvfdeblZRoVKp8LL34tbzW0D6i2BefXJVr0xa3U9aNWrUYMyYMcyePZuhQ4dy7do1vcVjBeF1RFCjQ6VS4ebmhrOzs5haKBQIpqamooUmH9C2XLhbu/Pll18q67I1aNCAP/7447WLrL5tukFNWnl1DAU16XU/aX3zzTds3bqV+/fvM2nSJBYsWJCdVRcKOBHUGGBsbCw+CARBeCsi4iPkbppoGN5jOEcOHwFg1KhRzJo1K0+OhdIdR5NWS41uGe197c/0ghorKyt+/fVXmjdvzsKFC+nevTv16tXLjmoL7wAxUFgQBCEXBUYGQiColqo4cvgI1tbWbNq0iXnz5uXJgAZeBTIqVMo07bTKgM6YmpfbnsU+Iy4pLs3jv//++/Tr1w9Jkhg0aJBoORcyTAQ1giAIuUSSJBYtXASrQIqUKFeuHGfOnKFLly65XbV0aYMUFxsXzE3MDZd52SpT2LIwVqZywkwHCwdszGwAw+NqTj06Rfct3QmMCGTOnDk4OTlx/fp1fIf7su7yupy4FKGAEUGNIAhCLoiKiqJXr178Mu0X0IBbHTfOnDmDj49Pblfttaq6VgWgikuVNMtUca2i9xPkcYvpdUHNPTmXjVc3su7yOhwdHfn2228BOPnbSb7c+WV2VV8owERQIwiC8JadP3+e6tWrs2HDBlRGKmgJHb/qmG9m+lR3q87pQadZ33l9mmUqu1TmzKAzbPpok952ZUHMiNQtNf4R/no/Bw0ahHsJd4iDoN1BJCWLbighfSKoEQRBeEskSWLevHnUq1ePu3fv4unpSfNpzaEeFHMoltvVy5TaHrUpbFU43TK1PGpRxKqI3rb0Wmq0gY62a8rExIRmnzSTnzwFJ/478abVFgo4EdQIgiC8BU+fPqVt27aMGTOGpKQkOnXqxKVLl0hwTwDSnhpd0CgtNSnG1CSoEwiODgb0Ax7zcuZQCtDAlElT3lo9hfxJBDWCIAg5bN++fVSpUoXdu3djbm7OokWL2LJlC46OjhlazLIgSStXTVBUkHJf97mAyABoAajAb48fR44ceSv1FPInEdQIgiDkkKioKD799FNatGhBcHAw5cuX58yZM3z22WeoVCo0koZHkY+Adyeo0bZIpQxqdMfYRCZEEhEf8Wq7M1BDfm78+PFikVYhTSKoEQRByAEHDhygUqVK/PrrrwAMHz6cs2fPUrlyZaVMaHQoSZokjFRGuNu651ZV3yrd7ifd4CRVkPPyeWW7L5iYm3Dq1Cn27t371uor5C8iqBEEQchG0dHRDBs2jPfffx9/f3+8vb05dOgQP//8M9bW1nplleURbN0xMXo3ErwXtSsKQGxSLGFxYcr2lGNsAiMCCY8PJyYpRt5gC17vywHR5MmTRWuNYJAIagRBELLJzp07qVixIosXLwZg6NChXLlyhcaNGxssn3Ihy3eBhYkFztbOQIqxMylaagIiAlJts2hkgZWVFWfPnmX37t05X1kh3xFBjSAIwhvy9/enQ4cOtG/fHn9/f4oVK8b+/ftZvHgxNjY2ae73rg0S1jI0A0r7WmizD+sGNdptwVIww4cPB2DKlCmitUZIRQQ1giAIWRQbG8u0adPw8fFhx44dmJiYMH78eK5du0azZs1eu792cOy7FtQYylWjDXDqFq2rPE657UX8C4aOHIqNjQ3nz59n586db7PaQj4gghpBEIRM0mg0rFmzhjJlyjB58mRiY2Px9fXlv//+44cffkg1diYtAZHyh/q71P0Ehqd1a+839GyoPNZuq+BUAXtzewDiTOMYMWIEII+t0Wg0b63eQt6XZ4KaI0eO0K5dO9zd3VGpVGzbtk3veUmSmDp1Ku7u7lhaWtK4cWOuXbuWO5UVBOGdJEkSu3btombNmvTr14+goCC8vb3ZuHEjhw4dyvS6Te9q95M2iNO2xETERxCZEAlAfc/6ynPa573svfSmgn/xxRfY2try33//idYaQU+eGW4fExNDlSpV6N+/Px9++GGq52fNmsXcuXNZvXo1ZcqU4bvvvqN58+bcunUr36yXIghC/iRJEnv27GHKlCmcPXsWADs7O74aMYIRrVphERYGy5dDSAg8ewZRURAZqX9LTITkZFCrldue2OckGEHhFZ+B5TgwNwczM7C1hUKFwMFB/lmoEDg6gpsbeHhA0aLg4gLGxrn7wmRRypYabfDiaOlIeafy8raIQFxtXAE5CPKy9+Lqk6sERgbSslRLhg0bxg8//MCsWbPo0KFDLlyFkBflmaCmVatWtGrVyuBzkiTx008/MWnSJDp37gzAmjVrcHFxYcOGDXzyySdvs6qCkC9oJA2RCZE4WDgAEJUQhaWpZbpTh6MSorAwscDU2DTVc0nJSdx7cS/NfQtbFsbJ2um19VJr1MQlxWFrrv9l5EXcCwpZFnrt/pmRrEkmJikGO3M7ve3BUcFEJEQY3EeFilKOpTA2MkYdGcmWRYuYvXw55+7fB8DKyIjhVlb8LzKSIt9/D99/n+X6KSsnRT/O/M7GxuDqCsWKQenSr25lykCpUpDOAOXcpg1qHoY/5Oazm5x6dErZ7m7rjpHKiCRNEheCLyjbvez0A6GRI0cyd+5cTpw4wfHjx2nQoEEuXImQ1+SZoCY9Dx48ICQkhBYtWijbzM3N8fX15cSJE2kGNQkJCSQkJCiPIyMjc7yugpBXDNoxiHWX13F56GWcrZ0pMb8ENdxrcKDPAYPlw+PDKTG/BBWdK3Kkf+pU9I1WN1I+fAwxUhlxZtAZarjXSLdeLX5rwYXgC9wfeR9HS0cA/rj2B13+7MLCVgsZVntYJq4yfR9u/pB/7/3LnRF38LDzAGDP3T20Wp/iC5QE3uFQ4zFUegL1o1y4HpDMvGfP8H9ZxBL4DBin0eAcHS1vNDGRA4uXN8nFhRWB23lqksjYD77FtFBhsLNj26MDzDq/gG+bf8/7ZT4AExMCooP4YH1r7FTmnOx1GFVSEiQkyLeoKHjxQv/2/Dk8fgxBQXKLUHKyfD8oCE4YWOixeHGoUgWqVn31s1gxUKmy7fXNKm1X0uOox5RfVP7VdjtPTIxMcLd151HkI+LV8Ur5lJmIXV1d6du3L8uWLWPmzJns2LHjLV+FkBfli6AmJCQEABcXF73tLi4u+Pv7G9oFgBkzZvDNN9/kaN0EIa/y8/cjSZPEqUenKGZfjIiECI76H0UjaTBSpR5OdyX0Ci/iX3A88DhqjVqvRSdeHa8ENA4WDqjQ/2CMTowmSZPE8cDj6QY1yZpkjgYcRa1Rczn0Mo29GwNwxF8Ooo4EHMnWoMbP3484dRzng88rQc1R/6PYxUPDYFPqPzamRmAyNQLVFImROAv8CswilNiXxyiiUjHc05PP6tfHyccHSpaEEiXkoMHJCYxevZZhsc8Z/OMKADp0a46PkzzGZsMf6zjpBdvtgnm/enUA7j14zg1nKFO4GKq6dTN3YcnJEBoqBzQPHsCdO3D7tvzzzh25C+zBA/mmOz6xUCGoWxfq15dvtWvnSouOm40bH5b/kIMPDirbzE3M6VOlDwCf1viUeafmoZE0NPZujIeth8Fp4GPHjmX58uXs3LmT69evZ3pMk1Dw5IugRkuV4huGJEmptumaMGECY8aMUR5HRkbi6fluzTIQ3k0aSaNMFw6ICFCCkCRNEqHRobjZuqXaR/sNWCNpeBz1WG/wqnZ9IksTS8LGhaX6vxuzdwzzTs1LlSwtpZDoENQatd754NUsoNftnxmRCZGEx4cDEPz4NtzbDYcOMWjrSqbdByOSgCQeAauBdcBlnf3Le3ny+bDh9B0+HEsrqwydM+VsHm1Qo92uvU7dbVkaJGxsDO7u8q1WrdTPh4XB5ctw6ZJ8++8/uHZNbvH55x/5BnJAVrkyNGoEzZuDr688nieHqVQq/uzyZ5rPT2o0iUmNJultMzRjqkyZMnTq1ImtW7cye/ZsVq5cmTMVFvKNfBHUuLrKg8VCQkJwc3v1ZvzkyZNUrTe6zM3NMTc3z/H6CUJeo11TCPSDGu3j9IIa7X3dD1vdfCqGvkgY+hZtiKFka7r3sy2o0Wh4dvBvvj0I79+H2t+OA42cqK04EAD8aW/DLnMrDj99qiRxMzc3R+OjIalqEn/88A8VnCtk6rS616e7QKN2u6G8LDkyndvRERo3lm9aiYlyoHPypNxddeIEBAS8CnwWLJC70+rUgfffl4OcOnXkbXmAMmMqIlDvC+24cePYunUr69at49tvv6Vo0aK5WU0hl+WZKd3pKV68OK6uruzbt0/ZlpiYiJ+fH/Xr18/FmglC3qT34aozNTblc2nuE6Ff5nWtCoa+RRui96Eekfp8wVHBJCUnpXuMNEVGwp9/Qv/+4OZGidY9+PoI1HsERhqJ8x4eTKlWDedCJhQDvoiI5tCTJ0iSxHvvvccvv/zC48ePKTe4HBR71TqVGYYCtcTkRIKjglNd81ufzm1mBjVrwogR8Pvv4O8Pjx7Bpk3wySdyt5paDcePwzffQMOG8lihvn1h61bQjiPKJR52HqhQkZCcwNPYp8r2OnXq4OvrS1JSEvPnz8/FGgp5Qd4IwZEXgbt7967y+MGDB1y6dAlHR0e8vLwYNWoU06dPp3Tp0pQuXZrp06djZWVFjx49crHWgpA3pfxwTdlSk5F9DD2XVquCoQyxrz3Hy66YmMQYnsc9B0BCIigqCG8H73SPowgPl8eMbN4M+/dDkhwQJQCnLcxYZpfIESMIjTYhQTuoFkAFterW4uNOH9OlSxeKFSumHNLL3osrT65kqdXI0PUFRQYhIbcEPY97TkxiDNZm1no5WHKNhwd06SLfQB6Ds3+/fNu3Tx6cvHatfDM3h2bNoEMH+PBDKFw4/WNnMzNjM1xtXAmODiYgIkBZPwpg/Pjx+Pn58euvvzJ58mSR5uMdlmeCmnPnztGkSRPlsXYsTN++fVm9ejXjxo0jLi6Ozz77jBcvXlCnTh3+/fdf8ccrCAakbBHISFCTXmvO6z6Atdu1LS2GpoQbqpehcwVEBKQf1ERGwvbtciCzdy8kJfEcOAEcL1SI41ZWnH3yhIT4RIjX7qTG2toa32a+7DbajaqMihMzThic3p7RAM3g9Rlo7TL0WpYrUu61gWKuKF4cBg+Wb9pWmx075Nf73j3YvVu+DRsGLVtC9+5ykPOWBht72XsRHB1MYEQgNd1rKts/+OADypUrx82bN1mzZo2yPpTw7skz3U+NGzdGkqRUt9WrVwPywLKpU6cSHBxMfHw8fn5+VKxYMXcrLQh5lO4HcmxSLHfC7iiP0+p+ylBLjb3hD2AnayfMjM2UlpY065VioKwkSam6ulI+BuTZPnv3QrduSE5O3O7Th1W7djEoKYny5uYUAdoDM1+84FhQEAlJSZjbmUNZ4H1QDVQR+jSUyYsmQ1Uo6lo0zXw9GR0fZPD6MjBOSDsmJM9nEzYxkQcOz5kjz6i6dg2mT4dq1eSA5++/oVcvcHaGrl1h5055ew5Kq5tTpVIpSyf8/PPPYumEd1ieCWoEQcg+usEDoMw4AsMtEFEJUcpMIUNlXtdSY6Qy0hvImRbd56ITo4lIiEgzgALgzh0Sxo3juKsrsz74gA6bNuGcmEhZYACwArj5MhdVuXLlGDhwICtXruTWrVvUm18PugMNQfKUeJ74PEOBREbHB73u+h5FPtKbhaZ7fREJEUQnymNU0goU8xSVCnx8YMIEuHABbtyAyZPlZH9xcXKrWfv24OUFEyeCzlCC7JRyeQVdffr0wd7entu3b7N3794cOb+Q9+WZ7idBELJPRgMLZVsa3U1AhlsVvOy9uPfiXrrBgKEAJuW2ew9vsnPH/zi6cSPHHz3iHJCY4jjm5ubUqlWLBg0a0KBBA+rVq0eRIkX0r2FP6mDidS1Ous9lNqhRa9R6rVQJyQk8jXma7jUXtiyMlWnGpovnKeXKyYOJp06Vg5wNG+C33yA4GGbMkG+NG8PAgfDRR2BhkS2nTS/gtLGxYeDAgcydO5cFCxakmaFeKNhEUCMIBZD2Tb+YfTH8I/z17ofGhBKvjsfCxCLN8mFxYUQnRmNjZkN4fLjSqlDULu3psq8LBuKS4pRZK9rzBEYEcufRHbgOLg+tUV2LYWXMWlak2NfJzo4GjRvT4L33aNCgAdWrV083XYNG0iiBme65lBYnu9e31GhbWgwlKjTkcdRjNJIGUyNTilgVUQa0alvNvB28eRj+kMDIwLzf9ZRRKhXUqCHfZsyQu6CWL5e7Cg8flm+jR8OQIfDZZ/LA5Dfwula0YcOGMW/ePPbs2cPNmzcpV67cG51PyH9E95MgFDAJ6gRCY0IBaOD1aj2cqq5VsTSxBFJPV9a23lR0rqisk5RyoGsRqyLptipoA4W0xqJoz2llbEWx2GJwGIZ3HsbvfX6HzRB6JoaQGJCAMsbGDKpenVVz53L79m1Cw8P5a/t2xo4dS7169V6bf+ppzFMSkxNRoaJuUTlbb0ZbajxsdaYOxzxNs1xK2terqF1RijkUU14L7fYGng2Uemi35Yuup4wyM5NnRf3zDzx8KLfkeHrK2Y2nTwdvb+jWTc6P8zIvUGZpX6+0/sZKlChB+/btAVi4cGGWziHkbyKoEYQCRjf7bzXXasp2L3uvV4Ng08lDk3KgbEZbFdL7Fp2UlMQf2/6A7ZDwYwJHJh2Bw/DwmtyKVAF5XaXJReDjjhbciotj2fnz9Bs9mtKlS6ebOdwQbR3cbd0pWaiksi0j12JqbKokJ8xMF5Sh11D3nLpBjVI2nRajfM3LSx5zc/8+bNkiDzhWq+WcOA0ayFmQN22SB4Bn5rA6s+wSk1N2Sso+//xzAFavXk1EhOFFS4WCSwQ1glDA6LZG6H54e9l7pdlFpO0i8bTzTDWlWWlVeM3U45TfoiVJws/Pj08++QRXV1cmDZoEFyE5MhlrFXQElgH3jOHz6vD5wT/4djj8UTWeSE1c1l8AnTroLoSom4QwowFaZmZA6Z3z5Wt17ck1ZTXw+p71lXLK612QWmoMMTGBzp3lbqhLl2DAADnfzfnzcqtNuXKwbJm8iGcGOFk5YW5sLs+yizQ8y65JkyZUrFiRmJgYVq1alX3XIuQLIqgRhAJG94Nb98Pb085TaRkwNM045T4ppyRnNBB4+Pghs2fPpmzZsjRu3JilS5cSFhZGIUsz+pvCv8BzCVZagLplYeqNhk/ag/d77XCwcNCrT1YZajW59fwWT2KeABkI0LKQq0a39UV7zuOBxwEoZFGIckXk8R3x6nguBF9Q6vfOqFIFVqyQsxh/8428lMPdu/J4mxIl5KnjUVHpHkKlUr22C0qlUil5an755RdlCQzh3SAGCgtCAWPowxUMdy2l3Ee3dUfpforMWFATGRAJWyHyWiT/S/4fAGYWpnQqV4ZBDx7ROCICEyDCyY7HQ/tSOelnos3lTMKuNq6Ym5jjZe9FeHw4kw9PVgKL90u8T9sybd/4Nbj9/DYAVqZWOFo6pru/dp/1V9YTHh/OqLqjlIBLKyYxhrkn5yrZkP+996+yr4uNvCbdjWc3lG3mJua42rgSEh3CzWc39c7zTilSRO6a+uILuZVm9mw50/PYsfD99/C//8lLOaSR0M/L3ou7YXf1Ak5JklhybonyO050SsTM0oxbt25x+PBhvcSuKV0KucTBBwf5vM7naeYuEvIP8RsUhAJGdxCqi7ULNmY2xCbFUqJQCYPdTxpJo4zD8bL3ylT3kyRJHDlyhJkzZ/KPduVnQOUKTR1h6cMkSly6BsBjZ0sm1oujyaQ5fFC+HTFzFsLL5QNKO5YGoEzhMlwOvczWG1uVY/16/lciv4xMM0uxwddApyuomH0xTI1MlQU+Szu+foxOmcJlADj3+BznHp/DztyOMfXG6JX5/ervTD48OdW+pQuXxsXaJdU27XFDokMAUKGiRKESGb6mAsfaGkaNkmdFrVsHM2fC7dtynpt58+DLL2HoULC01NvNUD6kSyGXGLZ7mP7xKwDnYMmSJekGNSP+GcGxgGOUK1KO1qVbZ9fVCblEBDWCUMDotqwYGxmzvdt2wuPDcbFxMTiY92nMUxKSE1ChwsPWI9Vg4rS6n06dOsWECRM4fPgwAEZGRjRu+R6tbOIYcuAadtdjAPB3NKbY7GW0iJrJtRe36FOkBC42Lvzx8R+cDz6PscqYbhW7ATDr/VlUcKqgDAKdfWI28ep4Hkc9VmYUZeg10Kmzrbktf3X9i+OBxzFSGfFh+Q9fu3+vyr2ITIhk5+2dHPE/wt2w1MnktNvqeNShafGmgDzzqbF3Y4xURqzpuIabz25iamRK36p9AVjSZgm/X/mdZCmZGm41cLVxzfA1FVhmZvJYm759YeNGOffN3btyS87s2TBpEgwaJI/FwfCAdO3voph9MXpU6sGpR6c4VPMQnIO//vqLkJAQXF0Nv9bafQ39joX8RwQ1glDApFxTSPuBC/oDYCVJQqVSKeXdbN0wNTbV+9DQTSinbeW5ceMGkyZN4q+//gLAzMyMAf3780WFCpRasEDJJqsu5sknVQJZV1VDdJ9ePJw5Qq9eH/p8yIc++gFG8ULFmdp4qvJ407VN3H9xn4CIgEwFNSlbl9qUaUObMm0yvL+VqRVj64/FztyOI/5HDI6t0W772Odjvqj/Rarn+1Tpk2qbj5MP05pOy3A93inGxtCzp7zkwtq18ribgAAYPhx+/FGeFt6t26u/zxRLbgDU86zH9GbTWX1pNYceHsK+lD0RdyNYsWIFkyZNSnXKBHWC0nKWlQzSQt4jBgoLQgHyuuy/2uR50YnRyrIIKWcEedi9ytNyJfQKao0aY5UxNpINY8eOpVKlSvz1118YGRnRv39/7qxfz5JLlyj1+edyQOPiAkuWYHTrNutqmZFoJHH1yVVikmL06pARWVmyIEGdQHB0cJqvQWakd/4Ck0AvrzExkVtubt+GRYvA3R38/eWAp25dKt2SZ5MZWhxVOxBe+zuxqifnVVq6dCnJBqaP6+ZrEkFNwSCCGkEoQF63ppCVqRVFrOTlBFLObtK2apgZmyndIscDj4MEhe4XooJPBebMmUNycjLt2rXj8vbtrHz+HK+PP4bTp+UxEtqug08/xcjcQglgtLOAnKycsDTVHyORnvTW+kmLtmXJwsRCudasSm9qt+64HSEHmJvL423u3JEHENvYwNmz1Okxli0bwfTuA6VoysBc+3cTUTICR0dHAgIC2LNnT6pTpLcyvZA/iaBGEAqQjKwplDJQ0J3OrZR5+UG9//J+2ADP1jzj8ePHlChRgr//+IMdZcpQoVMn2LFD7jb49FM5mJkyRW/WSsqpzZlt1chKS41u11Nmk/alpH2twuPDiUp4Nd1YrVEreVJES00Os7J6tUjmp58iGRnR+Sac+imahOFDITw8VaZobTAdSyzdesnjtZYsWZLq0OmtTC/kTyKoEYQCxFCAklKqPDQGpmx72XvBNdg5cifcASMTI6ZMnszViRNpPWKEnFNErYa2beHqVViyBAwMxFSCmoA3C2oy8y06O7uFbM1tX+XO0alDcFQwyVIypkamYrDv2/KyW1N15Qp7y5liqgHzRb9AmTLUP3AblebV79zS1BJna2cAWnRpAcDu3bsJCEh7RfjgqGCSkpPe0sUIOUUENYJQgGRkbaO0ZjdpWyUiIyO5uuQq/AGaWA24wrgv2zF1/34sBw2CkBAoXRp275YXMExn0cCUrUKvS3qX1v6ZaqnJ5m4hQ61F2nN42HlkeMFLIZv4+DB+pA/v94bokp7w9CkLNkdxbCUUfxCuFNP+7RgVMaJJkyZIkpQqw7DuuBwJSW+VdSF/Ev+NglCAZGQVaiVQiNTPQ+Nl78WVK1eoWbMmNw/dBBWY1YefPGD69zvkhQitreXVmK9cgVatXluflK0lb6P7KbvXVTIUWIlBwrnL096TAyVh47oveTplHNGmUP8R2DVsJs+WevFC729n4MCBAKxcuVJvwLDuDCptWSF/E0GNIBQgGfmw1X2z150pdGr3KerUqcOdO3co4lqERk3gwWUYeR5UkgTdu8OtW3JStNeskq2VsmUms60n2vIpx7SkJ7sDDkOLgKZs3RLeLm3A+jD2MVf6tqTccNhd3RaVRiPPmCpblvYX40CSf1edO3fGwcGBgIAADhw4oBxH+3s0NZITO77p8hxC7hNBjSAUIJntfgqKCoJkMNptxPDBw4mLi6NFo0ac9CmD30Fwj4bbjnDvz2WwYQN4eGSqPm/aUmNnboe9ub1c3wyOq8mx7iedb/UZGbsk5JyUq6AH2cP80fXgwAEoXx6ePqXfzD3s+B1iHtzC0tKSXr16AbB8+XJAP/1BDfcayvGE/E0ENYJQgGRkFWrth/2jyEdcDbgK60FzRoNKpWJKq1bsvnCBUgdPkGQE0xpB5aHg2Pr1WXjTO5fyOAstG5ntgsrulhpDafl1VzUX3j69ldd1Ey02bQoXL8LUqWhMjGl3G2aO3AWLFzOwf38Atm3bxtOnT/XSH9Qv+moFdSF/E0GNIBQQyZpkvTWc0uJm44axypjkF8kM6TQE7oOxqRHbypZl6j//YBwdjVS3LnU+M2VyUzC1tkm1mGNG6ba0mBiZZGmmkPIBloGugYj4CCITIuX9singMBRUiTE1uStlS43uNszNYcoUruz9jRNFwTo+GYYNo+rnn1OjQgWSkpJYt26d8vdU2LKwsoK6aKnJ/0RQIwgFRGhMqJL9183GLc1yxkbGOEU4wTIIfRCKtTkclaD9zZtgawuLFqE6fpyoMvKyBF72Xm+U70X7YVPUrijGRsaZ398u4y012m/ajpaOWJtZZ/pcBs//sv6PIh+hkTTyeUT3U67S/Z34R/jrbdNyquXLewPg89YqJBsbOH6cQbduAXIXlH+4vJ+nvafBhV6F/EkENYJQQGjfkD3sPNINHo4ePcrTxU8hBkqawY0EqKfWwPvvyzlnPvsMjIyUlo43bfHQfmBk9TiZyVWTEy0o7rbuyrIRT2OeEpMYw/O454DIJpxb3G3dMVIZkZicyLnH54DUf1+uNq4Ym5jyc22J4JP7oFUruqvVWALXr1/n7F/bAflvJSv5kIS8SQQ1gpDHTDk0BavvrbD4zgKL7yyw/N6SL/bKCyZuub4F75+8ORF4ItV+GZmRs3fvXlq2bElyfDLvqeBCIjiawvEve8K//4JXigR8vHmAkHI9nsxK61v0F3u/oPKSykp3E6ReyDI7mBqb4m7rLh93nieOsxwBsDWzVbrWhLfLxMhE+Z28iH8BpP77MlIZ4WEnD2x/aK8h5q/NzO/pSWdjudUx4KuVDDwPXraeaWaO1ppzYg6lfy4tZkflAyKoEYQ8ZvV/q4lTx5GQnEBCcgLx6nhW/7cakFet9o/wZ/vN7an2e12XyNatW2nXrh1xcXG0BvZKcMkLag03o/AXX0GKLqZmxZthpDLSW+U7K5qVkI/TrHizLO2f1kDhVZdWceXJFU4/Oq1sy6mxLs1LNgcgSZNEYnKisu1Nl2EQsq55iebK/ZKFSuLt4J2qjO7fzrng80wpHcixj+Tp238ka5i3E0ZNP4BtWLTBzNFaay+v5W7YXfbf35/9FyJkK5PcroAgCK8ka5KVNYXODT6HtZk15ReVJywujJjEGOVD29Abb3of6Fu2bKFrly4kazR8DKwzMyPxm68oPqQ3p60LY2tum2qf3lV685HPR5lagNKQj3w+InpCdJaPo/0WrR3TYqQyIjoxWvmGbmhRwuyelbSy/Uq+a/KdMqZGpVLhYZu56e1C9lrRfgXTmkxDI2lwsXHB1Ng0VRndxInaJRD8yyVSqlRJ7t69xzoVDD1xEypWpHcXe352ldeR8nHy0TtOysVfhbxLBDWCkIcER8trCpkYmVDVtSrGRsbYmdsRmRApT1+N1F/aQFdaH+g7t26l28uApi+womJFjDduxKxCBWxSHUXfmwY02XEcDzsPvTEtLjYuBhPh6d7P7pYalUqldGUIeUNGfie6OZnUGvXLHaFNt7bM/24+XzhDb6cy2Fy9zYJfwihdG4Ka34NSr44RlRBFeHy4fBwx5ibPE91PgpCHaD+UdWcKad+Y74XdIzgqWK+coX11P9D/Xb6cjz76CLVGQw9gxfDhGJ89CxUq5ORlZCszYzPcbOXZXIaCOkNrMolZSQLoJ07U/Tup2qIqGEFcKJxa9BN8IY9ZG3EGWveZBjdvKmV1AxnRUpP3iaBGEPIQQ+NitC0vpx6dQkIC4HHU41ffPF/SyyYsSRweO5YOgweTKEl8aGbGmu3bMf75Z7CweBuXkq1Srr9kqMtJI2leDRQWs5IE9BMn6v7N3E26C2Xk+zu37oHZs9n8Yz+eWIHbvVCoUQNWrABJ0msVFC01eZ8IagQhDzE0g0kb4BwLPKZsS5aSlVYbgLikOJ7GPpXLGztyqU0b2s+ZQzzQtkgRNty+jUn79m/hCnJGysHChlpqQqNDSdIkYaQyUmbGCO82Q0n6AI4HHodq8v0N6zeQmJhIUov3qTIUzlUoBLGxMGgQdO9OcNAtZb+AiAAkSXqr1yBkjghqBCEPMdSFpL2vO8sH9L81ajMJV39hSUT9ZrT65x+igMYlSvCHvz9mxYrlcM1zVsqlCvS6nCICkSRJeT3cbd0xMRLDBYVXLXbP455zL+yesv30o9NQCkztTXn27Bk7d+7Ey96LEFvoPqgQ/PADmJjApk207fkNFULl/WKTYgmLC8uNSxEySAQ1gpCHGBrsq70fp47TK5uytaLrFfhrcRyt7t4lBKhUogR/nT+PhZVVzlc8h6VcVFI3oItTx/E87rlYukBIxd7cHlszeWaf7v9PnDoOjKFUU3lE8MqVK1/lQ4p+hGbc/+DoUfD0pEhQGKeXQ4/L8r6iCypvE0GNIOQh6bXUpFWWhATcJ05n5RbolgS3AE8PD/45cgQHB4ccrvHboTuLBVIP2AyICBBLFwipqFSqdP8eGrRvAMCePXsgElSoSExO5GnMU6hbFy5c4FyFQlgnwfqt8PPf8OjpvTSPJ+Q+EdQIQh5iaPZOykGvRayKyGUjAiEgAN57j3KbDtIfOAk4ODiw599/8fAoOFOQdbMKSzqDN3Vfi4xkVBbePbr/P9q/F62qPlV577330Gg0bFi3QRmLpQTNRYrQY1Ahvm0kPxx+Fmp2HwuBorUmrxJBjSDkEbFJsTyLfQbovxF72Mp5WrQaejUEwOb0RahZE86e5WszYzYDRsZGbNu2DR8f/eRh+Z02yAuJDiEoKoiE5ARUqKhXtB7wciBopOh+ElLTLtMBUNujtt54Ky97LwYMGADIXVBF7YoCr4IajaQhIDqIKU3hu3F1eWEBrtceQvXqcODA27sIIcNEUCMIeYS29SHlmkLmJua42rgqjxt4NuCTs/Dtd8fh6VP+9Pbm+8RkAPpM7IOvr+/brfhb4GTlhLmxORISJwNPAvKChSULlQTkFq6cWPdJyP90vyB423vrZYL2tPfk448/xsbGhnv37mEZJCeJ1LaYPo15qgTQpu06Uv0TeFC8EDx7Bi1bws8/g5gNlaeIoEYQ8ghlkLC9Z6o1hbRvzKZq6LX4GL/8DaYauNiiBX1CX07NqAu9+vV6q3V+W1QqlfIaHA88DsjfsnW7pcRAYcGQlOPTdIMcL3svrK2t6datGwBPjj0BUudDcrN1o6RjSR4WgoHjy0Hv3pCcDJ9/DkOGQGLi27oc4TVEUCMIeUR6H8pe9l44R4PfOhNc129HA3z+HrS/cZ24uDiMSxtD84L9ga69Nt2gRrvtbthdQmNC9coJAqQOarSPrU2tKWRRCICBAwcCcOfoHYhPnbnay95LaQG8G/sI1qyB2bPByAiWL4emTUH75ULIVSKZgyBkwcEHB/Vm4DhaOtK6dOs3yo+izN6xS/2hXDfUjDlLwStSjWRnx8cdEtl6LB4CH1GydEnudb4HxihjAgoi7YfK+cfnlcfabRdDLgJgaWKJo6Vj7lRQyJP00iPYv/qb0W0RrVOnDuXLl+fGjRtwFQJK6id59LTzVIKhx1GPUUvJmHzxBfj4QPfucPw41KoF27dDtWpv8/KEFERLjSBk0vnH52m2thn9t/dXbh02dmDztc1vdFy9ZQ50bdvG52P/wCsSHrnboDpzBr9Qa3gA5pbmzFw2EyzlcSfZtQBlXuTt4A2gLBXh7eCtbNOunu3t4J2q6054txW1K4qxSl5HrZh9MeVvRvsT5O5NbWsNF3W6n3TSBLjYuGBqZKqfzbtVKzh9GsqUkWdENWgAf/zxVq5LMEy01AhCJl15cgUAZ2tnarrX5Oazm9x/cZ8roVegUtaPm2r2jiTBvHkwdiymksSV6kWJ/20V52/e5Pm/zwHoO7kvZq5m+vsVUAOrDeT289tEJERQ2LIw3St1p4hVEaY3nc6xwGMYqYwYXH1wbldTyGPMTcyZ/8F8wuLC8LT3pEuFLpx/fJ5+VfvplevVqxdffvkl6iA1IfdDSFAnKP+TnnaeGKmMKGpXlAfhDwiICHj15aNsWTmw6dYN9u6FLl1gxgwYPx5EgP3WiaBGEDJJ+y2uXZl2LG+/nB+P/8i4/eOUN8Cs0pu9o1bDiBHwyy/yk0OHUmnBAu4+fMj7fWrI2+qAW123tFt4ChhPe082fLgh1fYJ703IhdoI+cmw2sOU+46WjixrvyxVGRcXF9q2bcu2bdvgIgRFBaUa5+Zl78WD8Aepswo7OMDff8urfc+fDxMmwL17sHgxmJrm1GUJBojuJ0HIpJRTh7XBhO5qvpklSZLyBlpMVQjatpUDGpUK5s6FRYtISE6mS5cuREZG4lXJC1rorz5saCyOIAgZp3RB/Qf3n95PlaVad7ZdKsbG8NNPsGDBqwHEbdtCZOTbqLrwkghqBCGTUnYTpVxBOivC4sKIU8fhGQ7e7XrLzdhWVrB1K4weDSoV48aN4+LFixQpUoTRs0eDsVwXMZVZELLHBx98gJmDGcTC1h1bCYkOAV4FM9ovDun+r48YAdu2yf+///4LDRuKDMRvkQhqBCGTUn570/4MigoiWZOcpWMGRARQNRjOrjDC6OpVcHUFPz/o2BGAHTt2sGDBAgBWr15NldJVlP1089sIgpB1JiYmlG1WFoBdm3YhIWFubI6TlROgswbZ6xa1bNcOjhyR/4+vXIE6deDChRytuyATQY0gZIJuN5E2iHCzccNYZYxao1a+2WVW7N5d+K0ClygNVKwoDzysWROAwMBA+vfvD8CYMWNo06aN3gKP/uH+gGipEYTs0Ki9vNBT4PlAiJT/r7Qz6tLtfkqpRg35/7hCBQgOhkaN5BZYIUeJoEYQMuFF/AtikmKAV2NqjI2M8bCTU69nqQtq82bqDvkWu0S46lMEjh0DLzlAUavV9OzZk7CwMGrWrMmMGTOAV/lo4tRxr1pqxPIAgvDGqlasCl6ABPxHqgzEkInxc15ecg6b99+HmBh5jM2G1IPdhewjghpByATd1aF1c8JoA4rXNkun9PPP0K0bxklq/vCBNTO6gf2rdZ9mzZrF0aNHsbW1ZePGjZiZydO3zU3McbF2UcqZGJnorQ8lCELWeNl7gTZ/3sUUyfte3n8e95yYxJiMHdDeXp4Z1b27PKuxZ095hpSQI0RQIwiZkNag3EwPFpYkmDRJXjtGkvi3ZSm6fQTuTiWUIhcvXmTKlCkALFy4kJIlSxo8J7xMMGZknOnrEQRBn5e9F/gAZkAY4P/qOXsLe+zM7YBMfoExM4N16+T/d4BRo2DiRLEYZg4QQY0gZIIyfTqNoCZDzdJqNQwaBNOny4+nTeObj53QGL1q6o6Pj6dXr16o1Wo6d+5M7969Ux1Gt1lcdD0JQvbwtPMEc6Ci/Pj2/tt6z2e6C0rLyEie8v399/LjGTNg8GD5/UDINiKoEYRM0F0LRpf28WsT8MXHw0cfwcqV8pvcsmXw1VcEpAiWJk2axPXr13FxceHXX381mPpfNy+NGCQsCNnD2sxaXj/sZRfUhQMXiNTJNaP8r2dl/JxKJbfQLFsm//+vWCG/H8TFZUfVBURQIwiZ8kbdTzEx8lTP7dvB3FzOQTNoEGqNmsdRjwH5DfPw4cPMmzcPgBUrVlCkSBGDh9Otg2ipEYTs42nnCUWBIpAQl8Dmza/WdcvwtO70DBoEW7bI7wPbt8trSEVFvWGtBRBBjSBkSpa7nyIioGVL2L8frK3hn3+gQwdAXvVXI2kwNTLFItmCvn37IkkSgwcPpk2bNmnWxdCsDEEQ3pyXvReoUFprVqxYoTz3Ri01ujp2lJPz2dnJOamaN4cXL97smIIIagQhM9LsfnoZYDyNfUpcUoqm5GfPoGlTeWqng4Mc2DRpojytLLtg78mY0WMICAigRIkSzJ07N9266AYyIqgRhOyj/X9yqOOAiYkJp06d4vr163rPvXFQA3LumgMHwNFRzmnTtCk8ffrmx32HiaBGEDIoWZNMUGQQkDqIKGRRCGtTawAeRT569URwMPj6ytlEnZzg0CGoW5dJByZRd3ld6i6vy4AdAwCwvGvJ6tWrMTIyYu3atdjY2KRbH72ppiKbsCBkG+3/VjGPYrRt2xaAVatWAZnrfgqPD+ejzR+x7ea2tAvVrAmHD4OzM1y6JL9fPH78JtV/p4mgRhAyKDg6mGQp2WBOGJVKlTrbqL8/vPceXL8OHh5y2vSqVQmLC2P6semcDjrN6aDT3H5+G2LhwboHAIwbN44GDRq8tj4uNi6427pjZ25HiUIlXlteEISMqe5WXfk5YID8pWPt2rUkJSXp/Z9Lr5mSvfPWTrbc2MKMYzPSP2GlSvL7g4cH3Lght+D4+6e/j2DQGwc18fHx2VEPQcjztMGKh62HwZwwes3Sd+7IC9nduwfFi8PRo1CunN5xHC0d2dFtBzu67aD53ebEvoilfPnyTJ06NUP1MVIZcWbQGS5+chEbs/RbdQRByLj3S7zP+SHnWdh6Ia1atcLV1ZUnT56wc+dOPGw9UKEiXh3P87jn6R7HP0IOTDLUVVW2rPw+Uby4/L7x3nvy+4iQKVkKajQaDdOmTcPDwwMbGxvu378PwNdff603oEoQCpKUC1mmpJ1iHXP9EjRuDI8eyYGM9o3qJe0bXIlCJWhXth2mD0zZt3UfKpWKFStWYG5unuE6edh5iFYaQchmKpWK6m7VsTK1wsTERFl77ZdffpGzedvI2bxfF6xonw+JDiFBnfD6ExcvLrfYlC0rr+zdqJHcciNkWJaCmu+++47Vq1cza9YsJW07QKVKlVi+fHm2VU4Q8pKUC1mm5GnvSeln0PPz5XKfeIUK8qwGDw+9csrAYDtPoqKi+OSTTwAYOXIk9erVy8ErEAQhK4YMGYJKpWLfvn3cvXs3w4OFdcfdBEUFZexkRYvK7xuVKkFIiDyp4ObNLNf9XZOloGbt2rUsXbqUnj17Ymz8qhm+cuXK3BQvvlBAKTlq7Ay31FQMN+PQGigUFisHNAcPyoP/0jqOvRdffvklAQEBFC9enO+++y7nKi8IQpZ5e3vTqlUrAJYuXZrhrMK6QU+mZku5uMjvH5UrQ2ioCGwyIUtBTVBQEKVKlUq1XaPRkJSU9MaVEoS8SFkN21BLze3btBkyG48ouO1mnmZAA6+yDifdT2Lx4sUALFu2DGtr65ypuCAIb+zTTz8FYOXKlbhZuAHpByqSJGU9qAEoUkSe7q3bYnPrVuYr/o7JUlBToUIFjh49mmr7H3/8QbVq1QzsIQj5X1rZhLl9Gxo3xvzJc644Q4t+RkhOTmkeJzAiEJLgr1l/ATBo0CCaNWuWY/UWBOHNtW7dGk9PT54/f86LC3KSvPSWRYlIiCA6MVp5nOm1okAObA4eFIFNJphkZacpU6bQu3dvgoKC0Gg0bN26lVu3brF27Vp27dqV3XUUhDzBYDbhlwENwcFoKlSgaetrPDOP40X8C3n9GAMCIgLgMAT7B+Pu7s6PP/6Y85UXBOGNGBsbM3jwYCZPnsy57eegQ/qBSsrnspysT9ti06wZXLkiBzaHD0OZMlk7XgGXpZaadu3asWnTJnbv3o1KpWLy5MncuHGDnTt30rx58+yuoyDkutikWJ7FPgN0kt7dvasENFSsiNGhQ6hettCk9Qam1qgJuh0EJ+THS5YswcHBIYdrLwhCdhg0aBDGxsbcvHgTQtMPVFI+99rFbtPj5CQHNhUryu83TZqI6d5pyHKempYtW+Ln50d0dDSxsbEcO3aMFi1aZGfdBCHP0H7rsjGzwcHCAQIC5G9OLwMaDh4EJ6fXDiB8FP4IzQ4NSPDRxx/Rvn37t3UJgiC8ITc3Nzp27Cg/OCcn5ExKNjyOVBvUaHNIZan7SZc2sKlQQZ5d2bQpPHz4ZscsgLIU1Jw9e5bTp0+n2n769GnOnTv3xpUShLxGGSRs54kqNBTef18ObMqUkddyetlCkyqrcAoLFi6Ax6CyULFg/oK3U3lBELKNdsAwl0ETp+FxlOElDbTvGXWL1gWyaa0oZ2f5C1T58nIerGbNxJIKKWQpqBk2bBiBgamjzqCgIIYNG/bGlRKEvEb7hlTRyFUOaO7cgWLF5IDGxUUpp53ubegN7PHjx/wy6xcASn5cEjc3t7dQc0EQslOzZs0oV64cJACX0g5WtNsbeMpLnkQlRhERH/HmFXB2lt93SpSA+/fl9yOxCKYiS0HN9evXqV69eqrt1apVU1YyzW5Tp05FpVLp3VxdXV+/oyBkg8CIQOzj4Mc5V+DaNXB3l78xeepP705vsbuRI0cSFxMHHlC7fe23Um9BELKXSqVi5MiR8oPT4P/C8BpN2veAckXKKZMGsqW1BuT3nwMH5ER9N25Ay5YQHp49x87nshTUmJubExoammp7cHAwJiZZmlCVIRUqVCA4OFi5XblyJcfOJQi6QkPusXs9FLv37FXfdonUyxOk1f20a9cu/vzzT1RGKmgHxQoVeyv1FgQh+/Xu3RszazN4Af/u+ddgGSUDuZ1nhjMQZ4q3t9xi4+wMFy9C69YQHf3a3Qq6LAU1zZs3Z8KECUREvGpKCw8PZ+LEiTk6+8nExARXV1fl5pROLhBByDZxcQz+dhf1H0GCrRXs26csTpmSoZaa+6H3lW7ZEq1LgGva60cJgpD3WVtbU6NtDQD2rt/LpZBLereLwRcJipSXRfCy91L+3089OqWUCYsLe/OKlC0rvx8VKgQnT0KHDpCNi0yHRIe8diXyvCZLQc2cOXMIDAykWLFiNGnShCZNmlC8eHFCQkKYM2dOdtdRcefOHdzd3SlevDjdunVTFtJMS0JCApGRkXo3QciUpCTo0oVqN14QZQZX1/wIVaqkWVz75hUUGYRao2bnrZ2U7FySgIAAvLy8sGpupVdOEIT8qX3v9qCCJ1efUO2balT79dWt+tLqJGmSMFIZ4WbrpqSB+O7od0qZYj8Vy57ApnJl2LMHbGzkLvGPPoLExDc+7N+3/8Ztjhvf+H3z5nV8i7IU1Hh4eHD58mVmzZqFj48PNWrUYP78+Vy5cgVPT8OL/b2pOnXqsHbtWvbu3cuyZcsICQmhfv36PH+e9tLvM2bMwN7eXrnlVN2EAkqjgUGDYNcu4kygbQ+w900/bYGLtQsmRiYkS8kERwWzzW8bnJSfW7RoEY/j5ZkKSq4bQRDypd7v9cahmgMAVhescLd1T3UbWWckJkYm9KzUk7KFyyrbTYxMiE6M5uqTq9lTmdq1YdcusLCAv/+Gfv3k9683cCLwhN7PfEPKp6KjoyUXFxdpzpw5aZaJj4+XIiIilFtgYKAESBEREW+xpkK+NXasJIGkMTaW2nZHYipSXFLca3fz/slbYirS0YdHJadyThIg2Va1laIToiWmyscJjwt/CxcgCEJOOn78uARI5ubm0pMnTzK8X9M1TSWmIv3232/ZW6F//pEkExNJAkkaOVKSNJosH6rX1l4SU5HK/lw2++r3BiIiIjL0+Z3lUb23b9/m8OHDPHnyBE2KiHDy5MlvFGhlhLW1NZUqVeJOOlkVzc3NMTc3z/G6CAXQjz/C7NkABMyZzK7wKThbO2NhYvHaXT3tPHkY/pD169bz9OZTMIXklsnKOBtbM1vsLexztPqCIOS8evXqUatWLc6ePcuSJUsy/NmXIwOHAT74AFavhl69YP58Od3EhAlZOpS2bgERAUiShEqlysaK5pwsdT8tW7YMHx8fJk+ezJ9//slff/2l3LZt25bNVTQsISGBGzduiFwfQvZbvRrGjZPv//gjl1rKY2gyOg7Gy94L4uC32b/JG3wh1jKWK6FXMnUcQRDyNpVKxZgxYwCYP38+0RmcfaTtfn7jLMOG9OwJc+fK9ydOhBUrsnQYbd3i1HHZM/bnLclSUPPdd9/x/fffExISwqVLl7h48aJyu3DhQnbXEYCxY8fi5+fHgwcPOH36NB999BGRkZH07ds3R84nvKN27pTH0QCMHQtjxxpeyDIdXvZecAhiwmOgCCAnFOVYwLFMHUcQhLzv448/pnTp0oSFhfHrr79maB+lpeZN1oNKz+jRMH68fH/IENixI1O7ayQNjyIfKY+zvUUpB2UpqHnx4gUff/xxdtclXY8ePaJ79+6ULVuWzp07Y2ZmxqlTpyhWTOT7ELLJsWPQpQskJ0PfvjBzJqCfbyJDQoCzL++3Bl528h4PPJ654wiCkOcZGxvz5ZdfAjB79mziMzClOse6n3TNmAH9+8sDhrt2haNHM7xraHQoSZpXa1oV+KDm448/5t9/DSccyikbN27k8ePHJCYmEhQUxJYtW/Dx8XmrdRAKsCtXoF07OcdD27awbBkYyf8emWmp0Wg0bJuzDSRQVVCBTn6+SyGXMnwcQRDyj169euHp6UlISAirVq16bfkc7X7SUqlg6VL5/Sw+Xn5/y2DC2pRBjKEM6XlVlgYKlypViq+//ppTp05RqVIlTE1N9Z7//PPPs6VygvBWPHoErVrJacYbNIBNm0DnbzozLTVr167lxsUbYApSC/2kVclSsnwce9FSIwgFiZmZGePGjWPEiBHMnDmTQYMGpfpc1KV9D4hIiCAiPiLnJg6YmMjvZy1awPHj8nIKJ0/K69alI2UQk59aarIU1CxduhQbGxv8/Pzw8/PTe06lUomgRsg/IiOhTRsICpJXvt25E6ys9Ipo/6Ff18ISHh7OOO0A48ZAGu9ToqVGEAqegQMH8t133+Hv78/69evp169fmmVtzGwoZFGIF/EvCIwMzNnZkFZW8vvae+/J69a1aSN3tTs4pLlLyiAmPwU1Wep+evDgQZq312X5FYQ8IylJzr55+bI89XH3bjnduA61Rs3jKDlh3uuCka+//pqnT59Svnx5bN6zUbYXdyiuV04ENYJQ8FhaWiozoWbMmEFycnK65ZUlVXKyC0qrUCH45x9wc5MDmw8/TDfrsDaI0b535afupywFNYKQ70kSfPqpvG6KlZWchdPbO1Wxx1GP0UgaTI1McbFxSfNwFy9eZPHixQAsXLgQr8KvApcGXg30ynrYemTPNQiCkKcMHTqUQoUKcfv2bTZs2JBu2bcyWFiXp6f8PqddTmHwYKIiI1m4cCG1atXCxMQEExMTKlasyLGdxyD51XtXfmqpyXLyvUePHrFjxw4CAgJITBHxzdXOkReEvOq772DlSnkw8ObNUKOGwWLaf+aidkUxUhn+DqDRaBg2bBgajYauXbvStGlTvIK9uP70OgANPBuw7vI6AFxtXDE3EQkhBaEgsrW1Zfz48Xz55ZdMnjyZLl26pJkAVhks/DZbQapVk9/v2rXjwNq1DNy+HX+dhakBrl27BtcAT6jxfg3WsY7HUY9Ra9SYGGU5ZHhrstRSc+DAAcqWLcvixYuZM2cOhw4dYtWqVaxcuZJLly5lcxUFIZutWQPazJ+LFsl9zGnQNg2n12W0Zs0aTp48ibW1tbKgq5fdq/K1PWpjrDJ+7XEEQcj/RowYgZubGw8fPmTp0qVplnvrLTUvSR98wLetW/M+4B8RQbHChZk/fz4PHjzA39+fmTNnorJQQSBs/HojJhoTNJJG6YbP67IU1EyYMIEvvviCq1evYmFhwZYtWwgMDMTX1/et568RhEw5cOBVcr3x4+UuqHQoM5/SmLH04sULxr9McjV16lQ8PDxSlS/uUBwPu5fbRY4aQSjQrKysmDJlCgDTpk0jIkVLiFZuBDVqtZrBgwczZedOAD4BroaH87mPD97e3nh5efH5mM+RekpgCqePnMbqkNVbr+ebyFJQc+PGDSWTr4mJCXFxcdjY2PDtt98y82XCMkHIc65ehc6dQa2Gbt1g+vTX7qLkqLEz3MKiHRzs4+PDyJEjle3aNywbMxscLByUx6KlRhAKvgEDBlC2bFmePn3Kd999Z7CM9otPWt1P/977l/mn5iNJksHnda2+tJpPdn6i3EbtGcWDFw/0yiQnJ9Ovfz9WrFiBykhFk88a8+OHbbFJTkbduSPfLvyYT3Z+wqAdg8ATzLqZARB5LBKewLd+3zLj6Aw00put/p3TstRBZm1tTUJCAgDu7u7cu3ePChUqAPDs2bPsq50gZJcnT+QkVJGR0KiRvL6T0etj+vRaai5cuMCSJUsAeXCwbl6KsoXLKj9VKhVlC5flWMAxZbsgCAWXqakpc+fOpU2bNsyfP58hQ4ZQunRpvTK6s580kibVmL3+2/vzOOoxTYs3pZJLpTTP9TTmKQO2D0BCP/iJSYxhWftlgDzub/Dgwaxftx6MQPpI4pDzYUY37sXyp40wOXKEfpP+pM5gCLGV9/dp4IN3lLe8nuM+2Oe8j33391HPsx6NvRu/2QuUg7LUUlO3bl2OH5dTvrdp04YvvviC77//ngEDBlC3bt1sraAgvLGEBOjUCfz9oVQp2LoVMrh6e1o5anQHB3fr1o0mTZroPV/bozbrOq1jTcc1AExrMo1l7ZbRp0qfbLggQRDyutatW/PBBx+QlJTEqFGjUrW4uNu6Y6QyIkmTRGh0qN5zcUlxyhiWey/upXueB+EPkJAoZFGIbxt/S5cKXQC4H/4qvcqECRNYtWoVRsZG8CHwMhn/7Wh/NFu3cKsIeEXCqb/d+L7e10xrMo3fOv3GzJkzMTExgTvgGSZ/sbsXln59cluWgpq5c+dSp04dQB5H0Lx5czZt2kSxYsVYkcUVQQUhR0gSDB4MJ06AvT3s2gWFC2d497SWSFizZg2nTp3CxsaG2bNnp9pPpVLRs3JPKjjLLZhutm4Mqj4IS1PLN7gYQRDyk3nz5mFqasru3bv5888/9Z4zMTLB3dYdSN0Fpfv4dXlstM+XK1KOr32/5rOanwGvvpAtWLCAWbNmAdD2i7ZQASo5V1LKPDFX06Y7hFlAsZvBTFxzj6/em0RF54qUKVOGIUOGyPU9Z2KwrnlNloKaEiVKULlyZUAeFLV48WIuX77M1q1bxQKTQt4ycyb89hsYG8Off0LZjHf/xCTGEBYXBugP8H3x4oWSOVh3cLAgCIKucuXKMWHCBECeFfXixQu959MaLKz7+HUDdFO2Jut2a23atIlRo0YB8P333+NY3xGQ00wABEUF8TD8IfcKw6f9i8jLKmzYoDfe8JNPPpHPcyYAYvL+gOEsBzXPnz9PtT08PJwSJUoY2EMQcsFff8HLNxR+/hnefz9Tu2u/kdiZ2+mlMf/qq6949uwZPj4+YkkQQRDSNWHCBMqWLUtoaCijR4/We077ZSnVApI6rTOvaxnRPq89loedBypUJNxNoE+fPkiSxGeffcaECROU49YpWgdjlTFqjZozQWcAeFSjNCxcKB/0q69gyxYAKleuTPXq1UlWJ8OVAtpS8/DhQ4MpoBMSEggKCnrjSgnCG7t4EXr1ku8PHw5Dh2b6EIYWsjx//rwyOHjRokXpLlonCIJgYWHB8uXLMTIyYs2aNXrdUGktlfAmLTVmxmYUDi8Mv0NiYiKdO3dmwYIFqFQqpay3g7eSZuJ4oDw+1tPeEz75BLSzOPv0gQsXAOjfv7+87VLeb6nJ1OynHTt2KPf37t2Lvf2rb6/JyckcOHAAbwOp5gXhrQoOhvbtITZWXp123rwsHSblm4VGo2H48OFIkkT37t1p3LhxdtVYEIQCrGHDhnz55ZdMnz6dIUOGUKdOHTw9PV+11ESmaKnRaQ3JbFBz8+ZNwpeHQyJUrF2R9evXY2xsjCRJemMEvey9CIgI4FjAMXmbNm3F7Nlw6xbs2SO/j549S48ePRjzxRiSQpJ4eOshkiShUqne+HXJCZkKajp27AjIgyC1eWq0TE1N8fb2VjKqCkKuiIuDjh3h0SMoVw42bZL7ibMgZTbhVatWpTs4WBAEIS1Tp07l33//5dy5c3Tq1ImjR49mqKUmODqYpOQkTI0Ntwor3U/2ngQEBNCiRQvU0Wpwg17Te2FhYQHAs9hnxKvjUaHCw9ZDOXeqBXtNTGDjRqhXD27cgA4dcPTzo3nz5uz+ezeJNxJ5HvecIlZFsu/FyUaZ6n7SaDRoNBq8vLx48uSJ8lij0ZCQkMCtW7do27ZtTtVVENKnnel05gw4OsoznRwcsnw47bcnTztPwsLClMzB33zzDe7u7tlRY0EQ3hGmpqb88ccfFC5cmPPnz/PJJ5+kOaZG93F6SxQkqBMIiQ4BwDzOnBYtWhAYGEihooWgFzxRP0l1TBcbF8xNzFNlN9fLxWVvDzt3yjNFz56FAQNo1fID+bl7ebsLKktjah48eECRIvpRWnh4eHbURxCybt48WL9enum0ZQuULPlGh9NtqZk4cSLPnz+nQoUKjBgxIjtqKwjCO8bb25vNmzdjbGzMb7/9xurZq0GC0JhQEtRyQlvdbiIzYzmrb1pBxKPIRwCYR5vT6YNO3Lp1C09PTz5f+DlYp5ganiI9Rco0FamynZcsKb+PmprCxo20DHx5rAC4E3wn6y9CDstSUDNz5kw2bdqkPP74449xdHTEw8OD//77L9sqJwgZtn8//O9/8v2ffoJsGO+ifSOJeRijLEy3ePFiMThYEIQsa9q0Kb/88gsAP8/7GZOjJiC9ClDC4sKITYoFoLpbdSDtGUeBkYEQAskrkrlz5w7FihXj0KFDVClTBTA84DjDQQ2Ary8sWABAqdmzcbA3Bw0cOnwoS9f+NmQpqPn111/x9JSbqvbt28f+/fvZs2cPrVq14n/aDxZBeFsePICuXUGjgX79YNiwNz6k8m1JA4u/WYwkSfTq1YtGjRq9eX0FQXinDRo0iLlz5wKgPqiGnXD/mZwBWBvAOFs7U9pRXlohrZaaLVu2wApQv1BTtmxZjh49SsmSJQ2uK6VtedZ2O+l2P1mYWFDYMo2kpJ98AoMGoZIkOsUkAXD26NksXffbkKWgJjg4WAlqdu3aRZcuXWjRogXjxo3j7Nm8e7FCARQTIw8MDguDWrVgyRLIhlH52kF1XIArF69gZ2fHjz/++Ob1FQRBAEaPHs38+fNBBVyAz7p8xu3bt/VaVNJKzvfixQv69evHwrELIQncq7hz8uRJ5XNZu19wVDCJyYnyMSLTbqnxsvdKezaTSiXnr6lbl7ZqeTHLu6dvZ8MrkDOyFNQUKlSIwJf9a3v27OH9l0nNJEkymL9GEHKEJMGAAXD5Mri4yGs6vRzp/6YCIuTsmaoD8j/6tGnTcHV1zZZjC4IgAHz++ee8P+F9MIO7/92lSpUqzP92PkToBzXaFpfQ0FCmT59OiRIlWLNmjRwQNYABswdQqFAh5bhOVk6YG5sjISmDjFPO5nSwcMDGzEZvW5rMzWHLFuo52mEERAZHE/zY8ODl3Jalua6dO3emR48elC5dmufPn9OqVSsALl26RKlSpbK1goKQplmzYPNmeQrin39C0aLZduiAiAA4AFKcRJUqVfjss8+y7diCIAhaDZo3YH/sfjwOexB0KYiDGw6CCo6VOkZ8zXgIgBP7T9BwUUNOnjyJRiO3llSoUAGbD204bXQab0dvvWOqVCo87T25G3YX/3B/itkXS5VMVKVS4WnnyY1nN1LNhDLI3Z0XK+dQruNgrgNnv/yS9mvXZudLkS2yFNTMmzcPb29vAgMDmTVrFjY2crQXHBws3vyFt2PPHv0lEBo2zNbDHz1xFORkmixatEheqVYQBCGbedl7gQMEdQiSV88+DvjDkztP2H1nNwBhhHEcOfMv7kBduFbxmtLXYqilxcvei7thd2m8pnHq8+ncv/Hsxutbal4q1LQN6qLAIzjz22+0794dXjZq5BVZeqc2NTVl7NixqbZrF84ShBx19y507/4qL83LBdeyS3JyMut/WA+AT3MfGjRokK3HFwRB0GpUrBE2ZjZEJ0ZDGaAMWMRaMMlzEnEhcSw+vphwTTg4AsWAQvr7O1s7U8O9Rqrjti7VmoMPDuptq+FWA2dr51dlSrfGz9+PZsWbZaiuLjYu3K1qBI80nAXo0UPOY5OHemhUkiRJGSm4Y8cOWrVqhampqd5yCYa0b98+WyqX3SIjI7G3tyciIgI7O7vcro6QFbGxULcuXLkiZ7w8dEju781GixcvZtiwYWAB3275lq9bf52txxcEQdAVr46Xg5qXrE2tsTS1BECtURMeH57mvnbmdko+m5Qi4iNI0iQpjx0tHTFS6Q+lTS9bsSEeX3jweO5jChkb8zw5GVWFCnDqFLzssckpGf38znBLTceOHQkJCcHZ2VlZLsEQlUolBgsLOUOS5IUpr1wBZ2d5HE02BzRPnjxh0qRJ8oOm4OPtk63HFwRBSMnCxAILE8OTHEyMTLK8JIG9hf1ry2QmoAEoWb4kj40f8yI5mftOTpS8dg2GDJETn+aB9aAyPPtJo9Hg7Oys3E/rJgIaIccsWwZr14KRkbymUw4sVTB+/HjCw8MxLWoKNTMwK0AQBOEd4l3YG15OBD3z2WfyRI3ff5enfecBmZ7SrdFoWLlyJW3btqVixYpUqlSJDh06sHbtWjLYkyUImXfuHGiXJ5gxI1syBqd0/PhxVq9eDUDSB0lgJIIaQRAEXZ52nvJgZeBsZCRo83eNGQMnTuRexV7KVFAjSRLt27dn0KBBBAUFUalSJSpUqMDDhw/p168fnTp1yql6Cu+y58/ho48gMRE6dHi1HEI2UqvVysy9rn26QlF53RUna6dsP5cgCEJ+5WXvBR7y/TNnzsDIkXJGd7UaPv4YQkNztX6ZCmpWr17NkSNHOHDgABcvXuT3339n48aN/Pfff+zfv5+DBw+yNg/OWxfyMY0GevcGf395gbXVq3Ok33b+/PlcvnwZR0dHeo7qCcjfSFIOqhMEQXiXedp7gpt8//Lly0gAy5dD+fLw+DF06yYHOLkkU+/Yv//+OxMnTqRJkyapnmvatClffvkl69evz7bKCQLffw///CNnCt6yBRwcsv0U/v7+TJ48GYAff/yRSONIAGX9FEEQBEHmZe8FhQEjiIqK4vHjx/LMp61b5Z+HD8PixblWv0wFNZcvX+aDDz5I8/lWrVqJVbqF7PPvvzBlinx/yRKoUiXbTyFJEsOGDSM2NpZGjRrRv3//VKvZCoIgCDIvey953vTLfDnXr1+X75QrBytXynnDsjl3WGZkKqgJCwvDxcUlzeddXFx48eLFG1dKEAgIkBM7SRIMGiSvvp0Dtm7dyt9//42pqSm//PILKpVKWWfFy04ENYIgCLrszO2wM7eDl8MNb9y48erJjz+GX37J9lQbmZGpoCY5OTnddPHGxsaoc7EvTSggkpLkgWfPn0P16vIyCDkgIiKCES9nVH355ZeUL18eeLUiruh+EgRBSM3L3ksJapSWmjwiU8skSJJEv379ME8jCktISMiWSgnvuK++kjNU2tvDH39k28rbqU/zFcHBwZQqVYqJEycq25WWGtH9JAiCkIqnnSdXna4C+Tyo6du372vL9OnTJ8uVEQT++UdefRtgxQooUSJHTnPmzBkWLVoEwC+//IKFTuAkxtQIgiCkzcveC14mOdbrfsoDMhXUrFq1KqfqIQgQFATaoHjYMPjwwxw5jVqtZsiQIUiSRO/evWnW7NViblEJUco6K552ovtJEAQhJSWoUcGzZ894+vQpTk55I6eXSMLxjgqPD+evG3+RmJyY21WRqdXywOBnz6BqVZg9O8dONW/ePP777z8cHR2ZM2eO3nParicHCwdszW1zrA6CIAj5laedJ5iBqaO8btTJCycB+P3K7yy/sFxp7c4NIqh5R00+NJnOmzuz5tKa3K6KbNo0OHJEznOweXOOjaO5ffu2Xk6alN8ulEHCopVGEATBoOKFigOQ5CivAD5rmzxk4McTPzJ452CuhF7JtbqJoOYdde3pNb2fuergQTmoAVj6//buOz6qKv//+GsmnTQCoSSkUURARA2KAjZkifIVAbGAu9h1RWRd1K+sigiyFlBBdBEVXRZX+S7oD7EXUEFBYEVEREVpgYQUAwEyIT2T+/vjOsNMCmmTTDJ5Px+PPHLn1s89jtxPzjn3nMVwyilNcpmKigpuu+02iouLGTFiBDfffHOVfdLz1ElYRORkhsQPYdqQacT2MCeB2rtrL9Ay3hxVUtNGOb583qwmBMx5Qv70pxPj0Vx3XZNd6qWXXmL9+vWEhoayePFiLNVMt6BOwiIiJ2e1WJk7Yi43/8H8w/BoxlEKywrJLcoFvPvvp5KaNsgwDGeNhKMPiVdUVMDEiZCdDaedBs8912SXOnDgAH/7298AmDNnDklJSdXul2ZT85OISF2c2fdMAEoOl5B6NBWAsMAwIoMivRaTkpo26FDhIUrs5phCXq2pmTMHPvsMQkLMfjTt2jXJZQzD4M9//jPHjx/n/PPPd87GXR01P4mI1E1yv2Rz4RhsTNsImP92VlcL3lyU1LRBjgc3QE5BDsXlxc0fxKZN8HuHXV54Afr1a7JLvfbaa6xevZqgoCBeffVVrNaav/YtoU1YRKQ1SIhPMLMIO3y2/TPA+7XcSmraoMq1MwdtB5s3AJvN7Edjt5uvcTfRvE4AWVlZ3HPPPQDMnj2bU089tcZ9K4wKjSYsIlJH/v7+BHc031TduONETY03KalpgyonNc3eBDVlCqSmQlKSOUV9E1VVGobBnXfeybFjxxg4cCD33nvvSfc/VHCIUnspFix0C+/WJDGJiPiS9jHtATh4wPzjWEmNNLvKnYNdm6Oa3H/+A6+/DlYrvPGGOb9TE3nttdd49913CQgIYMmSJSedjBVOJHcx4TEE+AU0WVwiIr6ia1xXc+Go+UvNT9LsHA9vCxa3z01u/36YNMlcfvhhGDq0CS+1n7vvvhuARx99lAEDBtR6jJqeRETqJzEp0Vw4Zv7y9r+fSmraIMfDe0CXAW6fm1R5ufn6ts0GgwfDjBlNdim73c4NN9xAfn4+Q4YMYdq0aXU6TqMJi4jUT59efcwFR02Nl1+yUFLTBjke3kPjh7p9blJPPAFffw3h4bBsGdTSFNQY8+fPZ/369YSFhfH666/j5+dXp+M08J6ISP2c0ecMc+H3pCYuIs57waCkps0ptZeSlZ8FwNCEZkpqNm2C2bPN5UWLoHv3JrvU9u3bmT59OgALFiygR48edT5WzU8iIvUzqP8gcyEfOgd1Jti/aebtqyslNW1MZn4mBgZBfkEkx5gDJ6Xb0jEMo2kuWPn17YkTm+Y6QHFxMddffz1lZWWMHj2aW265pV7Hq/lJRKR+esT1gEBzuXN5Z+8Gg5KaNsd1cLnESLOD1/HS4xwrPtY0F6z8+nYTmjFjBjt27KBTp0688sor9R7VUqMJi4jUj8ViISg6CICIwggvR6Okps1xrY0ICQghul000ESdhVesaLbXt7/44gvmzZsHwKuvvkrnzrX/xfDBrg8YuWwkmfmZlJSXkHXcbJZTUiMiUneRXc1/24NsQV6ORElNm1O5NsLx2+P9ajIz4c47zeXp05v09e2cnBz+9Kc/YRgGt912G6NHj67Tcc9ufpZP9nzC2zvfJiM/A4Bg/2BnoiciIrVLTDBr/UOLQr0ciZKaNqdyvxHHb48mNYYBt9wCR4/CwIFN+vp2RUUFN9xwA9nZ2fTr148FCxbU+VjHPaflpTmTvfiIeK9OxiYi0tqMHTQWgKiyKO8GgpKaNqfyGz6O3x4dVfjll+HTTyEoyGx+Cmi60XmfeeYZPv30U4KDg1mxYgWhoXX7S8EwDOc9p+WlaSJLEZEGio8z/93MyMjwciRKatqcymOxOJufbB6qqdmzB+67z1yeMwf69vXMeauxadMmHnroIQD+8Y9/0L9//zofe6jwECX2EsBM9PQ6t4hIw8TFmWPTKKmRZle5RsLR/OSRmprycrjhBigshGHD4PdpCprC4cOHmTBhAna7nQkTJnDrrbfW63jX5jbXmpqECCU1IiL10a2bOQGwkhppVrYSG3klecCJZMajHYWfftocaC8iApYuNd96agJ2u53rrruOtLQ0TjnlFF5++eUGv74N5tg9+47uA9T8JCJSX46k5vjx49hsNq/GoqSmDXE8yNsHtyc8KBw48RA/aDuIvcLe8JN//z3MnGkuP/88JDRdjcfDDz/MZ599Rrt27Xj77beJiKj/2AiuSVyFUcE3Gd8Aan4SEamv0NBQIn8fssPbtTVKatqQ6vqNxITF4Gfxw27YyT6e3bATFxfD9ddDWRlceaXZBNVEVq1axZw5cwBYsmRJvfrRuKpcM1W5BktEROqupTRBKalpQ6qbsNHP6uecgKzBTVCPPAI//gidO5tvPjXRK9G//PILN954IwD33HMP48ePb/C5ahpsUM1PIiL150hqDh486NU4lNS0ITXNbeR4kDdoVOH16+GZZ8zlxYuhU6dGxViT3NxcrrjiCvLz87nwwguZO3duo87nKIuIoBNNVx1COhAWGNao84qItEWqqZFmV9Nryw3uLFxQADfdZA62d/PNMGaMJ8KsorS0lKuvvpo9e/aQmJjIW2+9RUAjx75xlMXguMHOdWp6EhFpGCU10uxqrKlp6KjCDz0E+/ZBfDzUYyTf+jAMgylTprBu3TrCwsJ4//336zSv08mU2kvJyjfneRoaf2L6BnUSFhFpGCU1DbRo0SK6d+9OcHAwAwcOZP369d4OqdWork+N6+d6NT999ZX5lhPAq6+ar3E3gQULFvDKK69gtVpZvnw5p59+eqPPmWHLwMAgyC+I5Jhk53olNSIiDaOkpgFWrFjB1KlTmT59Otu2beOCCy5g5MiRpKV5eDJGH1RhVHDQZnbganTzU2GhObcTwG23QUqKx+J0tXLlSu77fXTiZ555hssvv9wj53Ukb/GR8SS2T3SuV/OTiEjDKKlpgPnz53Prrbdy22230bdvXxYsWEB8fDwvvviit0Nzc6jgELYScwAiwzDYd3QfhmEAUFhWyKb0TWxK30RecZ7Hrplhy6CkvKTG7TkFOZTaS7FgITY81m1bdaMK7z+2v+Zxa6ZPh717IS7uRCdhD1u3bh1//OMfMQyDSZMmMXXq1Aadp6C0oMqr6q7NcK4JnmpqREQaxjFVwm+//UZZWZnX4mg1SU1paSlbt24lpVKtQEpKChs3bqz2mJKSEmw2m9tPU8svyeeUf5zCoFcGAfDa9tfo+XxP5m2aB8CI10cwZMkQhiwZwsDFA53JTmPsObKHhAUJXPXmVTXu40hYYsNjCfBz72TreJgfKjxEUVkRH+/+mO7PdeeBzx6oeqING+C558zlV16B3wdc8qTt27czZswYSktLGTduHAsXLmzwzNnD/z2c7s9151DBIec612a4iKAIIoPMe9Dr3CIiDdOpUycCAgIwDIPs7AaOeeYBrSapOXz4MHa7nS5durit79KlS40F+OSTTxIZGen8iY9v+ofWrtxd5JXk8Wvur+QV5/Hfg/8F4JuMb7BX2NmSscW5796jezlSdKTR19yaudVtVNzqnGwW6vbB7QkNMGe3Trel89+M32POrHQ+R7OTYZi/L7us0bFXlpqaymWXXYbNZuPCCy9k2bJl+Pn5Nehc5RXlfJv5LcXlxfyY86NzvSPBcyRzfxv6N0b1HsWgboMafwMiIm2Q1WolJiYG8G4TVKtJahwq/8VuGEaNf8U/+OCD5OXlOX/S0z0waWMtXPulpNvSnbNfp+Wl8VvBb5RVlGG1WOkY0rHK/o29pqOm5WT7VNfEYrFYTnQWzkt37lslthkzYPdu6NYN5s1rdNyVpaenM3z4cLKzsxkwYADvvvsuwcHBDT5fVn4WdsNsQnObwNLm/hbYgxc8yPvXvU+gX2AjohcRadtawgB8/l67cj1FR0fj5+dXpVYmJyenSu2NQ1BQEEFBQc0RnlNNsz+n204kC93Cu9ElrAu5Rbmk5aVxVsxZHrtmui2d3h17V9nHOUZNDbNQJ0QmsPPwTreYHfNB+Vn9YONGePZZc+fFi6F9+0bFXNnBgwcZNmwYqamp9OzZk48//pj2jbxG5f8WDpVrakREpPH+7//+j3bt2hEdHe21GFpNTU1gYCADBw5kzZo1buvXrFnDkCFDvBRVVa6vRafnpTsfoFn5Wew9shcwH6YNeo26jteszsman8B9rBrH+coryvmt4DcoKjIH1zMMc7C9//mfRsfsKjMzk0suuYS9e/fSo0cP1q1bR2xsbO0H1sKtXFyWaysLERGpv6SkJDp37ozV6r3UotXU1ADce++9XH/99Zx99tkMHjyYxYsXk5aWxqRJk7wdmpNrjcCOnB3OiRINDDYf3AyYD9MuoV2q7O+Ja9Z0vppGE3Zwfa278vlin3sWdu2C2FiYP7/R8brKzMxk2LBh7N69m6SkJNauXevsRd9Y1ZWLrcSmyStFRHxUq0pqxo8fT25uLrNnzyYrK4v+/fvz0UcfkZiYWPvBzcS1RmBjuvtbWV+nfw2YTUBdwrpU2d8T16zpfDWNJuzgqLXYlr2N4vJi5/qC9V+cSGQWL4aoqEbH67B7925SUlLYv38/CQkJrF27loQEzzUJVZfUOGqyooKjCA8K99i1RETE+1pVUgMwefJkJk+e7O0wauT6IN3+23a3bY7PCZEnkprG1tQUlhVyuPBwtdd3KCkvcY7VUltNjWvMAeUw4OF/QEUFXH89eGjwO4Bt27Zx2WWXkZOTwymnnMLq1atJSkry2PmharJnGIaankREfFir6VPTGrjOKQTmKL6uHJ/jI+MbPt9SJZX70FR3vox88/W6YP9gottV34HLkdS4xjzta+i0L9ucedvRSdgDvvzySy6++GJycnI466yz2LBhg8cTGnAvi+OlxzlWfKzWZjgREWm9lNR4UGZ+Jga1D6bn2lE4Mz+T8oryBl+zcnNTdc1Prk1PNb3+Hhfh3o/l1EMw46vfPzz3HHTs2OAYXS1dupSUlBRsNhsXXXQRa9eubfQElTWpnOC59hdSfxoREd+jpMaDHA/MpPZJWC0nirZXh15u+zmanwKsAVQYFWTmZzb6mo5rpOWlVRml+GRj1DgE+wfTOdRMLiwV8PrHwQTZYUP/CJgwocHxOdjtdu6//35uvvlm50jBH3/8MZFNMCIxmNMjOAY27BnVE3B/rV41NSIivkdJjQc5moK6t+/uNr/S0PihzuV2Ae2ICo7CarE6a0dqeg27PtccHDcYMPvYHC0+Wu0+tfUjcdRe3LEVztlXzPEAuHt0ADRwigIHm83GmDFjeOb3eaJmzJjBW2+9RUhISKPOezKOGquIoAj6d+4PuL+urpoaERHfo6TGg1xrAVxrAlyTmoTIBGcTUL1nxz7JNXt37O2saamu2QVqHnjPNbZueTD396GAHvwDbAvMrXGU4rrYunUrycnJfPjhhwQHB7N8+XJmz57d5OMYVDdppWvzk2pqRER8j5IaD3J9kLrWBAyJPzE4oOt6R81JY17rdq15qG62bdd9anuQJ0TEs+hDiCiF48n9WTrErEk5aKv/kNeGYfDcc88xePBg9u7dS0JCAl999RXjx4+v97kawnXUYEe5HMg74LwXJTUiIr5HSY0HuSYPjoem1WKld8feRAVHObc5OGpOPFFT43rNmmpqamt+Gr71KKN3QakVil9aSFxUott91VV2djZjxoxh6tSplJWVceWVV/L9999zzjnn1Os8jVFdTc23md9Sai/FgsWteVBERHyDkhoPck0eHA/S2PBYAvwCnJ/dkprflz/Y9QF3vH8He47sAeDj3R/z+FePu3X4PVRwiGlrprErdxcAn+75lBvfuZHUY6nOcznOt/i7xdyw6gbnj+O8J62dOHKEEc++B8BTF1rpcPYF9W4eMwyDpUuX0q9fP95//30CAwNZuHAhK1euJKrSoH2GYfD010/zzi/vAHDg2AGmrZnWoFohVxm2DO768C6W/7QccC8XRzk4/puIiIhvaXWD77VkrjU1AVbzodknug8AfTv1Zftv252fHevAbBZZ/N1iAF6+4mXu+OAO0m3ppPRM4ZxuZu3Gq9+9ytMbn+Zw4WGWjFnC5I8ms+/oPgBCA0KJi4ijb7R5vh9++4EffvvBLbYQ/5CTJzX330/wkTx2RsOqK/vysMVar7F0UlNTmTRpEqtXrwZg4MCBLFmyhAEDBlS7/8+HfmbaZ9PoGNKRsX3GsmDzAhb8dwFWi5U5f5hT6/Vq8sKWF1j07SLn5z7RfejVoRd+Fj/njN2u/w1ERMR3KKnxEMMwmJcyj7S8NBIjE+kb3ZcVV69gULdBAMxLmcfo3qMZ13ec85gLEi7gP1f9hw92fcCyHcvYd2wfpfZSZ23FvqP7nEmNI4HZd3Qf9go7B44dAGDWRbMY0XMEQf5B3Hjmjfhb/au8/QRwXtx5tAtoV33wn38OS5YAkPv8HN74w2jgRM3Oyd7OstlsPPnkkzz77LOUlJQQHBzM7Nmzueeee/D3r/nr5bif3KJcbCU29h3b57a+oRzHj+0zliv7XMmYPmPwt/rz6cRP2Za9DT+LH1f2vbJR1xARkZZJSY2HWCwWbjnrFrd11552rXM5NjyW606/rsoxE/pPoEtoF5btWEZ6XjoZtgznAH7VzemUbksn63gWdsOOv9Wfhy98GD+rH2CONXNr8q31C7yoCO64w1yePJnzr/ubc5Oz+clWtaamrKyMJUuWMGPGDA4dOgTA8OHDWbRoEb179671sjXNZt7YubAcx/+x/x+55rRrnOuH9xjO8B7DG3VuERFp2ZTUtAAnmyG78nJ6XrqzliYuIs6Z0DTYE0/A3r3mDNxPPum2qbq3qYqLi1m6dClz585l//79APTu3ZtnnnmGUaNG1ThicWWV783xubHTRuiVbRGRtktJTQvgGISvqLyI77O/d6531DoYhuFcLqso49vMbwEPDCD3yy8wd665/PzzEBHhttk12Tp06BBLly7l2WefJSvLnN+qc+fOTJ8+nTvvvJOAgPp1vHWtkfk191dyi3IByMrPosxe1qCOvOUV5c7RmZXUiIi0PUpqWoAg/yC6hHbht4Lf2JC+wbneUetwrPgYx0uPO9c79mnUg9swYNIkKCszZ98eN67KLt3Cu0EaFHxbQPzseEpKSgCIi4tj2rRp3HbbbQ0eFdi1Rubr9K9PhIVBRn4GSe2T6n3OzPxMKowKAqwBzlnQRUSk7VBS00IkRCaYSU3aiaSmpn4mjn0aldS8/jp8+SWEhMDChc6pEAzDYNu2bbz55pu8+eabYL4xTgklJCcnc9dddzFx4kQCAwMbfm3ckxrXe3Zsa0hS4yivuIg4t7m3RESkbVBS00LER8azJXML2ceznesOFR6iqKyoSj8Txz4Nbn7KzYX77jOXZ84kLyqKte+8w+rVq/nkk09ITU117moNtFJxWgXzHprHvVff27DrVWKvsJNhy3B+dr1naPhcWOpPIyLStimpaSFqmpfJdWbpKsc04OFtt9vZPWkS3xw+zH+jovjvm2/y/fTp2O125z4hISFcfvnlXHvttfy78N98sP8DghOD632tmjje3qpJQzsL13XkZBER8U1KalqIyg/iIL8gSuwlbq87O9bVdIxDYWEh6enppKenk5aWRnp6Ort27eKnn37il507KSktNXc8etT8wXyDKSUlhZSUFIYNG0ZYWBgAGz7eAPsb/1aSq5rux3nPDXyt2zn4YS0Td4qIiG9SUuNBmzdvprS0lIqKCgzDqNdPzoEc+OX3ExnQPbo7vxz6hf/35v/j+4zvIdUc6yb1UCqUA+Xwj6x/UGAr4OjRoxw5coSjR4+Sm5vLkSNHThpnCHBW586cN3Ei5557LoMHDyY+vvoEyRMziVfmONdZMWfxTcY3VBgVAJzT7Rw2pG1odE2Nmp9ERNomJTUedMUVV3D48GGPnOuX3zOcl958ybkulVS3fV79+tUajw8LCyMhIYGEhATi4+Pp0aMHp+3cSb9//5ukjh3x+/ln6Nix1jg8MZN4ZY7ko0dUD3PAwXyzf83Q+KGNSmqcM5ar+UlEpE1SUuNBp5xyCh07dsRisZz0x2q1VllXXlHOtuxtYIF2ge3o2K4j6XnpxLSP4Wj5UYqNYi7seSFfZXwF/tAhogOTh0ymQ4cOREVFuf3u1q0bkZGR7gPh7d8P/fqZy/Pm1SmhgaapqXFtJkqITHBLaly315dqakRE2jYlNR60cePGBh9bYVQQ/FgwZRVlDO89nKv6XsVN795Ev+79+PLAl1ABy+5ZRu9/9KaovIhBvQbx9z/9vW4nNwyYMsWcEuGii+CGG+oclyNByLBlYK+wN34EY6rOZr7p4CYABscPBsxxefJL8gkPCq/zOQtKCzhSZDa7NXpQQhERaZU0mEcLYbVYnSMLx0fEO5tQvsn4hvKKcvyt/sSExTjX1+vBvWoVfPghBATAiy86x6Spiy6hXfC3+mM37Ow7uo/CssIqP2X2Muf+hmE419fEdTZzx310Ce1CdLto2ge3d9unslJ7abUx7D6yG4CIoAgigyPrfH8iIuI7VFPTgiREJpB6LJWEyARnDUl+aT5gju7rZ/UjITKBXbm76t7EUlAAU6eay9OmQd++9YrJz+pHXEQc+4/tp/fC6ieqDPYP5r0J7zGi5wguW3YZq/euBuBPp/+JN8a9UWV/12Yix324/j5WfIy0vDT6derndty7v7zLtf/vWkrtpTXGq6YnEZG2SzU1LcjYPmOJDIrkDz3+QFL7JM7seqbbNoAxp44hIiiCET1G1O2kjz8O6emQmAgPPdSguK7sc+VJtxeXF/Pxno+xldicCQ3Ayp0rMQzDbd/CskIOF5qdqeMj4hneYzjtg9s7789Rc1NdH54Pdn1w0oQGYOypY2u7HRER8VGqqWlBpp43lbvPvds5xP/WP2+lsKwQq8VKu4B2AEwZNIXJ50yu2zQAu3bBM8+Yy889B+3aNSiu+ZfO57FLHnO+eu3q5W9f5n/X/C9peWnO8WdCA0IpLCukuLyYw4WH6RTaybn/QdtBAMICw2gf3J6okChyp+U678dR01LdqMJpNjPRefHyF5k4YGKV7a7lJCIibY+SmhbGNVmxWqyEBYaddJ8aGQb85S/mhJUjR8Lo0Y2Kq6ZkoWeHnoDZB8bRD6Znh57kFOSQfTybdFu6W1Lj7CQcEe98O8v1fpw1NbaqNTWORKdXh17VlouIiLRtan7yVatWwerVEBgIzz9fr87B9eH6ynd1fWUqNyM5EpOa+r7UVFNjGIZe2RYRkZNSUuOLCgvhnnvM5fvvh169muxSjpqV7OPZ7Dmyx7mupr4xrjU11Z4vsvrjjhUfo6Cs4KTHiohI26bmJ1/0xBOQlgYJCQ3uHFxX0e2iCfYPpri82DneTEJkAsH+5gSYlWtcaqttcdbU2NKpMCqcTVOO46LbRRMSEOL5GxERkVZPNTW+ZvduePppc3nBggZ3Dq4ri8XiTES2ZGwBKjU/Veob4zpGTXW6hXfDgoVSeymHCg7V+TgRERElNb7EMOCvf4XSUrj0Uhg7tlku62gOcsy4XafmpxrmZwrwCyAmPKbKsepPIyIitVFS40vefRc+/tgcObgJOwdXVjnRcK2pcW1+MgyjTjUurk1QDrX1xREREVFS4ysKC0+MHHz//dC7+tF/m4JromHBQmx4rLMmJjM/0zmNwpGiI87pExxTQpzsfK41NWp+EhGR2iip8RVz5sCBAxAf3+SdgytzTTRiw2MJ8Augc2hnAv0CMTDIzM8ETiQpnUM7OzsSn+x8an4SEZH6UFLjC/buhaeeMpeffRZCQ5v18q6JhmPZarFWqXGpa21Ldc1PjmYsNT+JiEhNlNT4gnvvhZISGDECxo1r9su7dvqtbtmR1NS1X0zlZMheYXdOr6CaGhERqYmSmtZu9Wp47z3w9zfnd2qmzsGuXJOUhIiqtTaOGpfaRhOuctzv+2cdz8Ju2PG3+tM1rKvnAhcREZ+iwfdas7KyEyMHT5kCfft6JYzQwFA6hHTgSNER95qa35Odj3Z/RKBfIF/s/8JtfU0c58g6nsW8jfPIyM8AzDFs/Kx+TXELIiLiA5TUtGYvvQQ//wzR0TBzpldD6RHVgyNFR+gR1cNtHcD6tPWsT1tfZX1NOrXrRFhgGMdLj/O/a/7Xub57VHcPRy0iIr5ESU1rdfgwPPKIufz449C+vVfDmZ8yn0/2fMKlPS91rrum3zX8mPMjhwpPjAwcExbD/5zyPyc9l8Vi4V9j/sW7v77rXOdv9WfSwEmeD1xERHyGxTAMw9tBNBebzUZkZCR5eXlERER4O5zGmTwZXnwRzjgDtm4FPzXLiIiIb6rr81sdhVujH36Al182l597TgmNiIgISmpaH8MwRw6uqIBrroGLLvJ2RCIiIi2CkprWZtUqWLsWgoNPzMYtIiIiSmpalaIiuO8+c3naNEhM9G48IiIiLYiSmtZk/nzYvx/i4sykRkRERJyU1LQWGRnwxBPm8lNPNfv8TiIiIi2dkprW4oEHoLAQhg6FCRO8HY2IiEiLo6SmNdi8Gd54w5zXyUvzO4mIiLR0SmpaOsM4Mb/TzTfDwIHejUdERKSFUlLT0r35pllTExoKjz3m7WhERERaLCU1LVlxsdmXBuBvf4OYGO/GIyIi0oIpqWnJnn/efIW7W7cT49OIiIhItZTUtFSHDpmzb4P5Kne7dt6NR0REpIVTUtNSzZoFNhskJ8PEid6ORkREpMVTUtMS7dx5YhbuefPAqv9MIiIitdHTsiWaNg3sdhgzBi6+2NvRiIiItApKalqazz+HDz4Af39zOgQRERGpEyU1LYndfuItp8mToXdv78YjIiLSiiipaUleew22b4f27eGRR7wdjYiISKuipKalOH4cHn7YXJ4xAzp29G48IiIirYySmpbi6achKwt69IC77vJ2NCIiIq2OkpqWICPDTGrA7BwcFOTdeERERFohJTUtwSOPQFERDB0K48Z5OxoREZFWSUmNt/30Eyxdai4//TRYLF4NR0REpLVqNUlNUlISFovF7ecBxwzWrdkDD0BFhVlDM3iwt6MRERFptfy9HUB9zJ49m9tvv935OSwszIvReMBXX5kD7fn5mZNWioiISIO1qqQmPDycrl27ejsMzzAMczoEgNtvh1NP9W48IiIirVyraX4CmDt3Lh07duTMM8/k8ccfp7S01NshNdzKlfDf/0JoKMyc6e1oREREWr1WU1Pz17/+leTkZKKiovjmm2948MEHSU1N5dVXX63xmJKSEkpKSpyfbTZbc4Rau7IyeOghc/m++8BXap9ERES8yGIYhuGti8+aNYtHH330pPts2bKFs88+u8r6lStXcvXVV3P48GE61jD6bk3nz8vLIyIiomFBe8KiReYAe507w549EB7uvVhERERaOJvNRmRkZK3Pb68mNYcPH+bw4cMn3ScpKYng4OAq6zMyMoiLi2Pz5s2ce+651R5bXU1NfHy8d5Oa/Hzo1QtycmDhQo0eLCIiUou6JjVebX6Kjo4mOjq6Qcdu27YNgJiYmBr3CQoKIqiljc47b56Z0PTqBX/+s7ejERER8Rmtok/Npk2b2Lx5M8OGDSMyMpItW7Zwzz33MHr0aBISErwdXt1lZ8Mzz5jLTzwBAQHejUdERMSHtIqkJigoiBUrVvDoo49SUlJCYmIit99+O9Mcr0S3FrNnQ0EBDBoEV1/t7WhERER8ilf71DS3urbJNYldu6BfP7DbYd06uOii5r2+iIhIK1XX53erGqemVXvoITOhufxyJTQiIiJNQElNc9i82Rxsz2qFOXO8HY2IiIhPUlLT1AwDHnzQXL7hBujf37vxiIiI+CglNU3ts8/MPjSB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fzamTp1qhIaGGvv37/d2aK3WfffdZ6xbt87Yt2+fsXnzZmPUqFFGeHi4s0znzJljREZGGm+//baxY8cO47rrrjNiYmIMm83m5chbtvz8fGPbtm3Gtm3bDMCYP3++sW3bNuPAgQOGYdStXCdNmmTExcUZn332mfHdd98Zl1xyiXHGGWcY5eXl3rqtFudk5Zyfn2/cd999xsaNG43U1FRj7dq1xuDBg41u3bqpnOvpzjvvNCIjI41169YZWVlZzp/CwkLnPvpON15t5dzSvtNKajzghRdeMBITE43AwEAjOTnZ7VU3qb/x48cbMTExRkBAgBEbG2uMGzfO+Omnn5zbKyoqjJkzZxpdu3Y1goKCjAsvvNDYsWOHFyNuHdauXWsAVX5uvPFGwzDqVq5FRUXGlClTjA4dOhghISHGqFGjjLS0NC/cTct1snIuLCw0UlJSjE6dOhkBAQFGQkKCceONN1YpQ5Vz7aorY8D417/+5dxH3+nGq62cW9p32vJ70CIiIiKtmvrUiIiIiE9QUiMiIiI+QUmNiIiI+AQlNSIiIuITlNSIiIiIT1BSIyIiIj5BSY2IiIj4BCU1IiIi4hOU1IiI1+Xk5HDHHXeQkJBAUFAQXbt25dJLL2XTpk2AOdPyO++8490gRaTF8/d2ACIiV111FWVlZbz22mv06NGD3377jc8//5wjR454OzQRaUVUUyMiXnXs2DE2bNjA3LlzGTZsGImJiQwaNIgHH3yQyy+/nKSkJACuvPJKLBaL8zPA+++/z8CBAwkODqZHjx48+uijlJeXO7dbLBZefPFFRo4cSUhICN27d+ett95ybi8tLWXKlCnExMQQHBxMUlISTz75ZHPduoh4mJIaEfGqsLAwwsLCeOeddygpKamyfcuWLQD861//Iisry/n5008/ZeLEidx99938/PPPvPzyyyxdupTHH3/c7fgZM2Zw1VVXsX37diZOnMh1113Hzp07AXj++ed57733ePPNN/n1119544033JImEWldNKGliHjdypUruf322ykqKiI5OZmLLrqICRMmMGDAAMCscVm1ahVjx451HnPhhRcycuRIHnzwQee6N954g2nTppGZmek8btKkSbz44ovOfc477zySk5NZtGgRd999Nz/99BOfffYZFouleW5WRJqMampExOuuuuoqMjMzee+997j00ktZt24dycnJLF26tMZjtm7dyuzZs501PWFhYdx+++1kZWVRWFjo3G/w4MFuxw0ePNhZU3PTTTfx/fffc+qpp3L33XezevXqJrk/EWkeSmpEpEUIDg5mxIgRPPLII2zcuJGbbrqJmTNn1rh/RUUFjz76KN9//73zZ8eOHezevZvg4OCTXstRK5OcnExqaip///vfKSoq4tprr+Xqq6/26H2JSPNRUiMiLVK/fv0oKCgAICAgALvd7rY9OTmZX3/9lV69elX5sVpP/NO2efNmt+M2b95Mnz59nJ8jIiIYP348r7zyCitWrGDlypV660qkldIr3SLiVbm5uVxzzTXccsstDBgwgPDwcL799lueeuopxowZA0BSUhKff/45Q4cOJSgoiKioKB555BFGjRpFfHw811xzDVarlR9++IEdO3bw2GOPOc//1ltvcfbZZ3P++eezbNkyvvnmG/75z38C8OyzzxITE8OZZ56J1WrlrbfeomvXrrRv394bRSEijWWIiHhRcXGx8cADDxjJyclGZGSk0a5dO+PUU081Hn74YaOwsNAwDMN47733jF69ehn+/v5GYmKi89hPPvnEGDJkiBESEmJEREQYgwYNMhYvXuzcDhgvvPCCMWLECCMoKMhITEw0/vOf/zi3L1682DjzzDON0NBQIyIiwhg+fLjx3XffNdu9i4hn6e0nEfFZ1b01JSK+S31qRERExCcoqRERERGfoI7CIuKz1Lou0raopkZERER8gpIaERER8QlKakRERMQnKKkRERERn6CkRkRERHyCkhoRERHxCUpqRERExCcoqRERERGfoKRGREREfML/BzwXrCb0ojAvAAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter6_1_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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559aUKGnT+vSpQsLFixAVVW2b9/O3LlzeeWVVwgICODZZ58F4KabbuKmm24iLy+PDRs2MHXqVO644w7atGlD7969y+zfaDRiMBgwm81l1tk6RdvOV4i6RIIhIWpZSkoKTz75JCEhITz00ENA8Qdx+/bt2bZtG6+//nq52w8bNozPP/+cvXv3uvQB7khUVBT/93//x6+//sq6deuc5hs0aBDTpk1j/vz5TJgwQUtfvHgx2dnZDBo0qErHd5chQ4bg7e3NwYMHyzQh6VXm+lbGVVddxZgxY/jss89Yv349vXv35vrrr+f1118nLCyM6Ohop9v279+fadOmsXDhQh5++GEtfcGCBS4f//rrr+c///kPx48fL9Pc5oyiKHTr1o23336buXPnkpiYWCaPn58f/fv3JzQ0lF9++YUtW7Y4DIaCgoLo2bMn3377LdOnTycgIAAo7hw+f/58WrZsade5XIi6QoIhIWrQzp07tX4cJ0+e5M8//9QmXVyyZIldbctHH33EsGHDGDJkCGPHjqVFixacOXOG3bt3k5iYyKJFiwB45ZVXWLZsGf369eO5556jS5cuZGRksHz5ciZOnEjHjh3LlCMzM5OBAwdyxx130LFjR4KDg9m0aRPLly93WlMCMHjwYIYMGcIzzzxDVlYWffv2Zfv27bz88sv06NGDu+++2/0XrRLatGnDK6+8wvPPP8+hQ4cYOnQoRqORtLQ0/v77b4KCgpgyZQrg+vWtrFdffZWFCxfy4osvsmrVKh5//HEWL15Mv379mDBhAl27dsVqtZKSksKKFSt44okntFFjffv25YknniArK4v4+HjWr1/PvHnzADAYKu7V0LdvXx588EHuvfdeNm/eTL9+/QgKCsJsNrN27Vq6dOnCww8/zI8//sjMmTMZPnw4MTExqKrKt99+S0ZGBoMHDwbgpZde4tixYwwaNIiWLVuSkZHBO++8g4+PD/3793dahqlTpzJ48GAGDhzIk08+ia+vLzNnzmTnzp189dVXNTYPlBCVUoudt4VoMGwjZ2w/vr6+avPmzdX+/furr7/+unry5EmH223btk299dZb1ebNm6s+Pj5qRESEevXVV6sffvihXb6jR4+q48aNUyMiIlQfHx81MjJSvfXWW9W0tDRVVcuO+snNzVXHjx+vdu3aVW3cuLEaEBCgdujQQX355ZfV7Oxsbb+l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HhcMFRQUcNttt2G1Wpk5c2a5eXv16mXX16Vv377ExcXx3nvv8e677zrcZurUqUyZMsWtZa4P2rVrx7x58/jll1+Ijo7m888/Z9OmTdroLID333+f9evXs337dlq1asWyZcu488472bhxoxaEOPPPf/6TPn36MG3aNIYPH86KFSvsmsgAXnrpJa6//npatWrFqFGjMBgMbN++nR07dth1tl60aBGXXXYZV155JV988QV///03s2fPBoqbugICAli+fDktW7bE39+fkJAQl65BZZrJ1q9fz4YNGxg4cCAhISFs2rSJCRMmcOONN5bbrCuEM67UntbF0WRSMyQ8QZ0ZTeaKgoICbr31VpKTk1m5cmWFHaJKMxgMXH755ezfv99pnkmTJpGZman9HD169GKLXS+MHz+eESNGMHr0aHr27El6erpdLdGePXt46qmnmDlzJq1atQKKg6OMjAxefPHFCvffq1cvZs2axXvvvUf37t1ZsWIFL7zwgl2eIUOG8OOPP7Jy5Uouv/xyevXqxX//+19at25tl2/KlCksWLCArl278tlnn/HFF19otVPe3t68++67fPTRR0RGRnLTTTdd7KVxyM/Pj4ULFzJgwAA6d+7MSy+9xAMPPMBXX31VLccTDVhdr3mp6+UTgjo0mkxPURS70WRQEgjt37+f1atX06xZs0rvV1VVrrjiCrp06cKnn37q0jZVGU0mao+j146nkNeTKM+p7FM0n15cM3nDJTfw/e3fA7Dt2m1YVloAuDLzSrwb140K/y9bfknk8UhyfXIZmu9a30Eh3MkjR5OdO3eOAwcOaMvJycls3bqVJk2aEBkZyciRI0lMTOTHH3+kqKhIezhgkyZNtCaYMWPG0KJFC6ZOnQoU1xD06tWL9u3bk5WVxbvvvsvWrVt5//33a/4EhRDiIrjUgboOtUjJaDLhSepMMLR582YGDhyoLU+cOBGAe+65h8mTJ/P998XfgkoP5V69erU2i3BKSgoGQ0nLX0ZGBg8++CCpqamEhITQo0cP/vjjD6644orqPRlRxrBhw7Q5jUp77rnneO6552q4REJ4LmczUNcptj5DEgwJD1BngqEBAwaU20HQlda8NWvW2C2//fbbvP322xdbNOEGs2bNIicnx+G6Jk2auO04dbDVVwi3cPbarqujyWwkGBKeoM4EQ6J+a9GiRW0XQQhRg1x5UKsQdYUEQ0II4WH0AUZhgf2DimuKxWIhISGB+Ph4jEZj2Qy6ZrJDhw5x6NAh4uPjUbYrpK1O49ixY7Rs2RKAY8eOERYWRnp6Oi1btiQgIICcnJyS9Ox0ujzWheYdXJ8BXojKkGBICCE8gKMO1BaLhY0bNhJLLFDcTzIsqPpnN7dYLMTGxmI2mzGZTCQlJZUJiPTlbde+HapV5YqmV/DG6TcA8MILM2bt7wwy7NJKpy/+ZDG3pd7mOPAS4iJ51DxDQgghSmqAEhISyMsvmTHflWfwuUNCQgJmc3HQYjabSUxMLJOnyFo8y7uiKlq/ppDTrk1w6kjL/JYOjyOEO0jNkBBCeABHHajj4+PZ67sX8ouXu/foXiNliY+Px2QyYTabiYyMJC4urkweg3fxd20DBpRGCmqhWlxrdbp4/Xde37GvyT6g5FmTqqpiDDXywgsv8Oqrr5KRmcG/Cv5FM7UZBoOBTl071cj5iYZHgiEhhPBQRqORK664guy12QCENgmtseMmJSWRmJhIXFxcuX2GANSJKiiQvTkbfixO23P9Hpb3WF52O+DHMz/Co8V/3/+/+2l2uhl4wyWfXMKcm+YwKnaUm89INHTSTCbqrLlz5xIaGlojxxo7dqxHzlotGiZ9B2pvr9r5Tms0Ghk0aJDTPjy+3iXPI7QNr/cq8tLSCg2FZbZxxDYqzaAayC7I5tOtrj09QIjKkJoh0aAcPnyY6OhotmzZUmYCT3das2aN3SSien///TeXX355tR1b1E9OZ6DWTzNUhx7U2iqkFQUUAPBQ4UOoBpUOhR209V1bdMWvvV+F+2nk3wgoCajyi/KrobSioZNgSIhq0KdPH62Dqc2LL77IqlWruOyyy2qpVKK+cBr01J1YiADfAC0YGv366DLrn736WZrdXPEzJjdN20T20WytNkwmVhXVQZrJGqgBAwbw2GOP8fjjj2M0GgkPD+fjjz8mOzube++9l+DgYNq2bcuyZcsAKCoq4r777iM6OpqAgAA6dOjAO++8o+0vNzeX2NhYHnzwQS0tOTmZkJAQPvnkE5fKNHfuXKKioggMDOTmm28mPT29TJ4ffviB+Ph4/P39iYmJYcqUKRQW2s+z8sEHHzBs2DACAgKIjo5m0aJF2vro6GgAevTogaIo2qNcbKZPn47JZCIsLIxHH32UgoICl8pemq+vLxEREdpPWFgY33//PePGjatT396F53AaBNTR2CCwY+BFrbexvV9sNUMuPaNNiEqSmqEG7LPPPuPpp5/m77//ZuHChTz88MMsXbqUm2++meeee463336bu+++m5SUFHx8fGjZsiVff/01TZs25a+//uLBBx/EZDJx66234u/vzxdffEHPnj257rrruOGGG7j77rsZOHAgDzzwQIVl2bhxI+PGjeP1119nxIgRLF++nJdfftkuzy+//MJdd93Fu+++y1VXXcXBgwe14Euf98UXX+Q///kP77zzDp9//jm33347l156KZ06deLvv//miiuuYNWqVcTGxmoP+YXi59yZTCZWr17NgQMHGD16NN27d9fKP378eObPn1/ueezatYuoqKgy6d9//z2nT59m7NixFV4LISpkhZzkHFDBmmMtSa9DcXbbN9oS2DGQglNlv1CEDgglqFOQazu68JXdoBb/ITVDojooqryyypWVlUVISAiZmZk0btzYbl1ubi7JyclER0fj7++vpW++bDP5qTXbru0b4ctlm11vfhkwYABFRUXaw1OLiooICQlhxIgRzJs3D4DU1FRMJhPr16+nV69eZfbx6KOPkpaWxjfffKOlvfnmm0ybNo3bb7+dRYsWsWPHDpo2bVphee644w4sFotWEwVw2223sXz5cjIyMgDo168fw4YNY9KkSVqe+fPn8/TTT3PixAmg+Fvk+PHj+eCDD7Q8vXr1Ii4ujpkzZzrtMzR27FjWrFnDwYMH8fIq7uR56623YjAYWLBgAQAnT54kKyur3PNo06YN3t5lv2Ncd911APz8889Ot3X2ehIC4HjWcVq+3RKfQh8WzFlAk+Nln+nXr6CfNqS9vki4PIGzm89SpBRxzcvXcFXUVfxx7x+1XSzhAcr7/C5NaoaqQX5qPvnH634nv65du2p/e3l5ERYWRpcuXbS08PBwoDgIAPjwww+ZNWsWR44cIScnh/z8/DKdkJ944gm+++473nvvPZYtW+ZSIASwe/dubr75Zru03r17s3x5ydDbhIQENm3axL///W8traioiNzcXM6fP09gYKC2Xen9uDIZXWxsrBYIAZhMJnbs2KEtN2/enObNK/84gGPHjvHLL7/w9ddfV3pbIWxszUMdjndwGAj5mnxRDHWoashdLsR20kwmqpMEQ9XAN8K34kx14Jg+Pj52y4qi2KXZ2uqtVitff/01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\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter6_1_2.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"%matplotlib inline\n",
|
||
"\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.preprocessing import PolynomialFeatures\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"steps=250\n",
|
||
"\n",
|
||
"distance=0\n",
|
||
"x=0\n",
|
||
"distance_list=[]\n",
|
||
"steps_list=[]\n",
|
||
"while x<steps:\n",
|
||
" distance+=np.random.randint(-1,2)\n",
|
||
" distance_list.append(distance)\n",
|
||
" x+=1\n",
|
||
" steps_list.append(x)\n",
|
||
"plt.plot(steps_list,distance_list, color='green', label=\"Random Walk Data\")\n",
|
||
"\n",
|
||
"steps_list=np.asarray(steps_list)\n",
|
||
"distance_list=np.asarray(distance_list)\n",
|
||
"\n",
|
||
"X=steps_list[:,np.newaxis]\n",
|
||
"\n",
|
||
"#Polynomial fits\n",
|
||
"\n",
|
||
"#Degree 2\n",
|
||
"poly_features=PolynomialFeatures(degree=2, include_bias=False)\n",
|
||
"X_poly=poly_features.fit_transform(X)\n",
|
||
"\n",
|
||
"lin_reg=LinearRegression()\n",
|
||
"poly_fit=lin_reg.fit(X_poly,distance_list)\n",
|
||
"b=lin_reg.coef_\n",
|
||
"c=lin_reg.intercept_\n",
|
||
"print (\"2nd degree coefficients:\")\n",
|
||
"print (\"zero power: \",c)\n",
|
||
"print (\"first power: \", b[0])\n",
|
||
"print (\"second power: \",b[1])\n",
|
||
"\n",
|
||
"z = np.arange(0, steps, .01)\n",
|
||
"z_mod=b[1]*z**2+b[0]*z+c\n",
|
||
"\n",
|
||
"fit_mod=b[1]*X**2+b[0]*X+c\n",
|
||
"plt.plot(z, z_mod, color='r', label=\"2nd Degree Fit\")\n",
|
||
"plt.title(\"Polynomial Regression\")\n",
|
||
"\n",
|
||
"plt.xlabel(\"Steps\")\n",
|
||
"plt.ylabel(\"Distance\")\n",
|
||
"\n",
|
||
"#Degree 10\n",
|
||
"poly_features10=PolynomialFeatures(degree=10, include_bias=False)\n",
|
||
"X_poly10=poly_features10.fit_transform(X)\n",
|
||
"\n",
|
||
"poly_fit10=lin_reg.fit(X_poly10,distance_list)\n",
|
||
"\n",
|
||
"y_plot=poly_fit10.predict(X_poly10)\n",
|
||
"plt.plot(X, y_plot, color='black', label=\"10th Degree Fit\")\n",
|
||
"\n",
|
||
"plt.legend()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"\n",
|
||
"#Decision Tree Regression\n",
|
||
"from sklearn.tree import DecisionTreeRegressor\n",
|
||
"regr_1=DecisionTreeRegressor(max_depth=2)\n",
|
||
"regr_2=DecisionTreeRegressor(max_depth=5)\n",
|
||
"regr_3=DecisionTreeRegressor(max_depth=7)\n",
|
||
"regr_1.fit(X, distance_list)\n",
|
||
"regr_2.fit(X, distance_list)\n",
|
||
"regr_3.fit(X, distance_list)\n",
|
||
"\n",
|
||
"X_test = np.arange(0.0, steps, 0.01)[:, np.newaxis]\n",
|
||
"y_1 = regr_1.predict(X_test)\n",
|
||
"y_2 = regr_2.predict(X_test)\n",
|
||
"y_3=regr_3.predict(X_test)\n",
|
||
"\n",
|
||
"# Plot the results\n",
|
||
"plt.figure()\n",
|
||
"plt.scatter(X, distance_list, s=2.5, c=\"black\", label=\"data\")\n",
|
||
"plt.plot(X_test, y_1, color=\"red\",\n",
|
||
" label=\"max_depth=2\", linewidth=2)\n",
|
||
"plt.plot(X_test, y_2, color=\"green\", label=\"max_depth=5\", linewidth=2)\n",
|
||
"plt.plot(X_test, y_3, color=\"m\", label=\"max_depth=7\", linewidth=2)\n",
|
||
"\n",
|
||
"plt.xlabel(\"Data\")\n",
|
||
"plt.ylabel(\"Darget\")\n",
|
||
"plt.title(\"Decision Tree Regression\")\n",
|
||
"plt.legend()\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Building a tree, regression\n",
|
||
"\n",
|
||
"There are mainly two steps\n",
|
||
"1. We split the predictor space (the set of possible values $x_1,x_2,\\dots, x_p$) into $J$ distinct and non-non-overlapping regions, $R_1,R_2,\\dots,R_J$. \n",
|
||
"\n",
|
||
"2. For every observation that falls into the region $R_j$ , we make the same prediction, which is simply the mean of the response values for the training observations in $R_j$.\n",
|
||
"\n",
|
||
"How do we construct the regions $R_1,\\dots,R_J$? In theory, the\n",
|
||
"regions could have any shape. However, we choose to divide the\n",
|
||
"predictor space into high-dimensional rectangles, or boxes, for\n",
|
||
"simplicity and for ease of interpretation of the resulting predictive\n",
|
||
"model. The goal is to find boxes $R_1,\\dots,R_J$ that minimize the\n",
|
||
"MSE, given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sum_{j=1}^J\\sum_{i\\in R_j}(y_i-\\overline{y}_{R_j})^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\overline{y}_{R_j}$ is the mean response for the training observations \n",
|
||
"within box $j$. \n",
|
||
"\n",
|
||
"\n",
|
||
"Unfortunately, it is computationally infeasible to consider every\n",
|
||
"possible partition of the feature space into $J$ boxes. The common\n",
|
||
"strategy is to take a top-down approach\n",
|
||
"\n",
|
||
"The approach is top-down because it begins at the top of the tree (all\n",
|
||
"observations belong to a single region) and then successively splits\n",
|
||
"the predictor space; each split is indicated via two new branches\n",
|
||
"further down on the tree. It is greedy because at each step of the\n",
|
||
"tree-building process, the best split is made at that particular step,\n",
|
||
"rather than looking ahead and picking a split that will lead to a\n",
|
||
"better tree in some future step.\n",
|
||
"\n",
|
||
"\n",
|
||
"### Making a tree\n",
|
||
"\n",
|
||
"In order to implement the recursive binary splitting we start by selecting\n",
|
||
"the predictor $x_j$ and a cutpoint $s$ that splits the predictor space into two regions $R_1$ and $R_2$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\left\\{X\\vert x_j < s\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\left\\{X\\vert x_j \\geq s\\right\\},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"so that we obtain the lowest MSE, that is"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sum_{i:x_i\\in R_j}(y_i-\\overline{y}_{R_1})^2+\\sum_{i:x_i\\in R_2}(y_i-\\overline{y}_{R_2})^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which we want to minimize by considering all predictors\n",
|
||
"$x_1,x_2,\\dots,x_p$. We consider also all possible values of $s$ for\n",
|
||
"each predictor. These values could be determined by randomly assigned\n",
|
||
"numbers or by starting at the midpoint and then proceed till we find\n",
|
||
"an optimal value.\n",
|
||
"\n",
|
||
"For any $j$ and $s$, we define the pair of half-planes where\n",
|
||
"$\\overline{y}_{R_1}$ is the mean response for the training\n",
|
||
"observations in $R_1(j,s)$, and $\\overline{y}_{R_2}$ is the mean\n",
|
||
"response for the training observations in $R_2(j,s)$.\n",
|
||
"\n",
|
||
"Finding the values of $j$ and $s$ that minimize the above equation can be\n",
|
||
"done quite quickly, especially when the number of features $p$ is not\n",
|
||
"too large.\n",
|
||
"\n",
|
||
"Next, we repeat the process, looking\n",
|
||
"for the best predictor and best cutpoint in order to split the data\n",
|
||
"further so as to minimize the MSE within each of the resulting\n",
|
||
"regions. However, this time, instead of splitting the entire predictor\n",
|
||
"space, we split one of the two previously identified regions. We now\n",
|
||
"have three regions. Again, we look to split one of these three regions\n",
|
||
"further, so as to minimize the MSE. The process continues until a\n",
|
||
"stopping criterion is reached; for instance, we may continue until no\n",
|
||
"region contains more than five observations.\n",
|
||
"\n",
|
||
"\n",
|
||
"The above procedure is rather straightforward, but leads often to\n",
|
||
"overfitting and unnecessarily large and complicated trees. The basic\n",
|
||
"idea is to grow a large tree $T_0$ and then prune it back in order to\n",
|
||
"obtain a subtree. A smaller tree with fewer splits (fewer regions) can\n",
|
||
"lead to smaller variance and better interpretation at the cost of a\n",
|
||
"little more bias.\n",
|
||
"\n",
|
||
"The so-called Cost complexity pruning algorithm gives us a\n",
|
||
"way to do just this. Rather than considering every possible subtree,\n",
|
||
"we consider a sequence of trees indexed by a nonnegative tuning\n",
|
||
"parameter $\\alpha$.\n",
|
||
"\n",
|
||
"Read more at the following [Scikit-Learn link on pruning](https://scikit-learn.org/stable/auto_examples/tree/plot_cost_complexity_pruning.html#sphx-glr-auto-examples-tree-plot-cost-complexity-pruning-py).\n",
|
||
"\n",
|
||
"\n",
|
||
"For each value of $\\alpha$ there corresponds a subtree $T \\in T_0$ such that"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\sum_{m=1}^{\\overline{T}}\\sum_{i:x_i\\in R_m}(y_i-\\overline{y}_{R_m})^2+\\alpha\\overline{T},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"is as small as possible. Here $\\overline{T}$ is \n",
|
||
"the number of terminal nodes of the tree $T$ , $R_m$ is the\n",
|
||
"rectangle (i.e. the subset of predictor space) corresponding to the $m$-th terminal node.\n",
|
||
"\n",
|
||
"The tuning parameter $\\alpha$ controls a trade-off between the subtree’s\n",
|
||
"complexity and its fit to the training data. When $\\alpha = 0$, then the\n",
|
||
"subtree $T$ will simply equal $T_0$, \n",
|
||
"because then the above equation just measures the\n",
|
||
"training error. \n",
|
||
"However, as $\\alpha$ increases, there is a price to pay for\n",
|
||
"having a tree with many terminal nodes. The above equation will\n",
|
||
"tend to be minimized for a smaller subtree. \n",
|
||
"\n",
|
||
"\n",
|
||
"It turns out that as we increase $\\alpha$ from zero\n",
|
||
"branches get pruned from the tree in a nested and predictable fashion,\n",
|
||
"so obtaining the whole sequence of subtrees as a function of $\\alpha$ is\n",
|
||
"easy. We can select a value of $\\alpha$ using a validation set or using\n",
|
||
"cross-validation. We then return to the full data set and obtain the\n",
|
||
"subtree corresponding to $\\alpha$. \n",
|
||
"\n",
|
||
"\n",
|
||
"### Schematic Regression Procedure\n",
|
||
"\n",
|
||
"Building a Regression Tree\n",
|
||
"\n",
|
||
"1. Use recursive binary splitting to grow a large tree on the training data, stopping only when each terminal node has fewer than some minimum number of observations.\n",
|
||
"\n",
|
||
"2. Apply cost complexity pruning to the large tree in order to obtain a sequence of best subtrees, as a function of $\\alpha$.\n",
|
||
"\n",
|
||
"3. Use for example $K$-fold cross-validation to choose $\\alpha$. Divide the training observations into $K$ folds. For each $k=1,2,\\dots,K$ we: \n",
|
||
"\n",
|
||
" * repeat steps 1 and 2 on all but the $k$-th fold of the training data. \n",
|
||
"\n",
|
||
" * Then we valuate the mean squared prediction error on the data in the left-out $k$-th fold, as a function of $\\alpha$.\n",
|
||
"\n",
|
||
" * Finally we average the results for each value of $\\alpha$, and pick $\\alpha$ to minimize the average error.\n",
|
||
"\n",
|
||
"\n",
|
||
"4. Return the subtree from Step 2 that corresponds to the chosen value of $\\alpha$. \n",
|
||
"\n",
|
||
"!eblock\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## A Classification Tree\n",
|
||
"\n",
|
||
"A classification tree is very similar to a regression tree, except\n",
|
||
"that it is used to predict a qualitative response rather than a\n",
|
||
"quantitative one. Recall that for a regression tree, the predicted\n",
|
||
"response for an observation is given by the mean response of the\n",
|
||
"training observations that belong to the same terminal node. In\n",
|
||
"contrast, for a classification tree, we predict that each observation\n",
|
||
"belongs to the most commonly occurring class of training observations\n",
|
||
"in the region to which it belongs. In interpreting the results of a\n",
|
||
"classification tree, we are often interested not only in the class\n",
|
||
"prediction corresponding to a particular terminal node region, but\n",
|
||
"also in the class proportions among the training observations that\n",
|
||
"fall into that region. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The task of growing a\n",
|
||
"classification tree is quite similar to the task of growing a\n",
|
||
"regression tree. Just as in the regression setting, we use recursive\n",
|
||
"binary splitting to grow a classification tree. However, in the\n",
|
||
"classification setting, the MSE cannot be used as a criterion for making\n",
|
||
"the binary splits. A natural alternative to MSE is the **classification\n",
|
||
"error rate**. Since we plan to assign an observation in a given region\n",
|
||
"to the most commonly occurring error rate class of training\n",
|
||
"observations in that region, the classification error rate is simply\n",
|
||
"the fraction of the training observations in that region that do not\n",
|
||
"belong to the most common class. \n",
|
||
"\n",
|
||
"When building a classification tree, either the Gini index or the\n",
|
||
"entropy are typically used to evaluate the quality of a particular\n",
|
||
"split, since these two approaches are more sensitive to node purity\n",
|
||
"than is the classification error rate. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"If our targets are the outcome of a classification process that takes\n",
|
||
"for example $k=1,2,\\dots,K$ values, the only thing we need to think of\n",
|
||
"is to set up the splitting criteria for each node.\n",
|
||
"\n",
|
||
"We define a PDF $p_{mk}$ that represents the number of observations of\n",
|
||
"a class $k$ in a region $R_m$ with $N_m$ observations. We represent\n",
|
||
"this likelihood function in terms of the proportion $I(y_i=k)$ of\n",
|
||
"observations of this class in the region $R_m$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i=k).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We let $p_{mk}$ represent the majority class of observations in region\n",
|
||
"$m$. The three most common ways of splitting a node are given by\n",
|
||
"\n",
|
||
"* Misclassification error"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"p_{mk} = \\frac{1}{N_m}\\sum_{x_i\\in R_m}I(y_i\\ne k) = 1-p_{mk}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"* Gini index $g$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"g = \\sum_{k=1}^K p_{mk}(1-p_{mk}).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"* Information entropy or just entropy $s$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"s = -\\sum_{k=1}^K p_{mk}\\log{p_{mk}}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Visualizing the Tree, Classification"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" mean radius mean texture mean perimeter mean area mean smoothness \\\n",
|
||
"0 17.99 10.38 122.80 1001.0 0.11840 \n",
|
||
"1 20.57 17.77 132.90 1326.0 0.08474 \n",
|
||
"2 19.69 21.25 130.00 1203.0 0.10960 \n",
|
||
"3 11.42 20.38 77.58 386.1 0.14250 \n",
|
||
"4 20.29 14.34 135.10 1297.0 0.10030 \n",
|
||
".. ... ... ... ... ... \n",
|
||
"564 21.56 22.39 142.00 1479.0 0.11100 \n",
|
||
"565 20.13 28.25 131.20 1261.0 0.09780 \n",
|
||
"566 16.60 28.08 108.30 858.1 0.08455 \n",
|
||
"567 20.60 29.33 140.10 1265.0 0.11780 \n",
|
||
"568 7.76 24.54 47.92 181.0 0.05263 \n",
|
||
"\n",
|
||
" mean compactness mean concavity mean concave points mean symmetry \\\n",
|
||
"0 0.27760 0.30010 0.14710 0.2419 \n",
|
||
"1 0.07864 0.08690 0.07017 0.1812 \n",
|
||
"2 0.15990 0.19740 0.12790 0.2069 \n",
|
||
"3 0.28390 0.24140 0.10520 0.2597 \n",
|
||
"4 0.13280 0.19800 0.10430 0.1809 \n",
|
||
".. ... ... ... ... \n",
|
||
"564 0.11590 0.24390 0.13890 0.1726 \n",
|
||
"565 0.10340 0.14400 0.09791 0.1752 \n",
|
||
"566 0.10230 0.09251 0.05302 0.1590 \n",
|
||
"567 0.27700 0.35140 0.15200 0.2397 \n",
|
||
"568 0.04362 0.00000 0.00000 0.1587 \n",
|
||
"\n",
|
||
" mean fractal dimension ... worst radius worst texture \\\n",
|
||
"0 0.07871 ... 25.380 17.33 \n",
|
||
"1 0.05667 ... 24.990 23.41 \n",
|
||
"2 0.05999 ... 23.570 25.53 \n",
|
||
"3 0.09744 ... 14.910 26.50 \n",
|
||
"4 0.05883 ... 22.540 16.67 \n",
|
||
".. ... ... ... ... \n",
|
||
"564 0.05623 ... 25.450 26.40 \n",
|
||
"565 0.05533 ... 23.690 38.25 \n",
|
||
"566 0.05648 ... 18.980 34.12 \n",
|
||
"567 0.07016 ... 25.740 39.42 \n",
|
||
"568 0.05884 ... 9.456 30.37 \n",
|
||
"\n",
|
||
" worst perimeter worst area worst smoothness worst compactness \\\n",
|
||
"0 184.60 2019.0 0.16220 0.66560 \n",
|
||
"1 158.80 1956.0 0.12380 0.18660 \n",
|
||
"2 152.50 1709.0 0.14440 0.42450 \n",
|
||
"3 98.87 567.7 0.20980 0.86630 \n",
|
||
"4 152.20 1575.0 0.13740 0.20500 \n",
|
||
".. ... ... ... ... \n",
|
||
"564 166.10 2027.0 0.14100 0.21130 \n",
|
||
"565 155.00 1731.0 0.11660 0.19220 \n",
|
||
"566 126.70 1124.0 0.11390 0.30940 \n",
|
||
"567 184.60 1821.0 0.16500 0.86810 \n",
|
||
"568 59.16 268.6 0.08996 0.06444 \n",
|
||
"\n",
|
||
" worst concavity worst concave points worst symmetry \\\n",
|
||
"0 0.7119 0.2654 0.4601 \n",
|
||
"1 0.2416 0.1860 0.2750 \n",
|
||
"2 0.4504 0.2430 0.3613 \n",
|
||
"3 0.6869 0.2575 0.6638 \n",
|
||
"4 0.4000 0.1625 0.2364 \n",
|
||
".. ... ... ... \n",
|
||
"564 0.4107 0.2216 0.2060 \n",
|
||
"565 0.3215 0.1628 0.2572 \n",
|
||
"566 0.3403 0.1418 0.2218 \n",
|
||
"567 0.9387 0.2650 0.4087 \n",
|
||
"568 0.0000 0.0000 0.2871 \n",
|
||
"\n",
|
||
" worst fractal dimension \n",
|
||
"0 0.11890 \n",
|
||
"1 0.08902 \n",
|
||
"2 0.08758 \n",
|
||
"3 0.17300 \n",
|
||
"4 0.07678 \n",
|
||
".. ... \n",
|
||
"564 0.07115 \n",
|
||
"565 0.06637 \n",
|
||
"566 0.07820 \n",
|
||
"567 0.12400 \n",
|
||
"568 0.07039 \n",
|
||
"\n",
|
||
"[569 rows x 30 columns]\n",
|
||
" malignant benign\n",
|
||
"0 1 0\n",
|
||
"1 1 0\n",
|
||
"2 1 0\n",
|
||
"3 1 0\n",
|
||
"4 1 0\n",
|
||
".. ... ...\n",
|
||
"564 1 0\n",
|
||
"565 1 0\n",
|
||
"566 1 0\n",
|
||
"567 1 0\n",
|
||
"568 0 1\n",
|
||
"\n",
|
||
"[569 rows x 2 columns]\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0"
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import os\n",
|
||
"from sklearn.datasets import load_breast_cancer\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.metrics import confusion_matrix\n",
|
||
"from sklearn.tree import export_graphviz\n",
|
||
"\n",
|
||
"from IPython.display import Image \n",
|
||
"from pydot import graph_from_dot_data\n",
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"\n",
|
||
"\n",
|
||
"cancer = load_breast_cancer()\n",
|
||
"X = pd.DataFrame(cancer.data, columns=cancer.feature_names)\n",
|
||
"print(X)\n",
|
||
"y = pd.Categorical.from_codes(cancer.target, cancer.target_names)\n",
|
||
"y = pd.get_dummies(y)\n",
|
||
"print(y)\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)\n",
|
||
"tree_clf = DecisionTreeClassifier(max_depth=5)\n",
|
||
"tree_clf.fit(X_train, y_train)\n",
|
||
"\n",
|
||
"export_graphviz(\n",
|
||
" tree_clf,\n",
|
||
" out_file=\"DataFiles/cancer.dot\",\n",
|
||
" feature_names=cancer.feature_names,\n",
|
||
" class_names=cancer.target_names,\n",
|
||
" rounded=True,\n",
|
||
" filled=True\n",
|
||
")\n",
|
||
"cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'\n",
|
||
"os.system(cmd)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0"
|
||
]
|
||
},
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"from sklearn.model_selection import train_test_split \n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.datasets import make_moons\n",
|
||
"from sklearn.tree import export_graphviz\n",
|
||
"from pydot import graph_from_dot_data\n",
|
||
"import pandas as pd\n",
|
||
"import os\n",
|
||
"\n",
|
||
"np.random.seed(42)\n",
|
||
"X, y = make_moons(n_samples=100, noise=0.25, random_state=53)\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)\n",
|
||
"tree_clf = DecisionTreeClassifier(max_depth=5)\n",
|
||
"tree_clf.fit(X_train, y_train)\n",
|
||
"\n",
|
||
"export_graphviz(\n",
|
||
" tree_clf,\n",
|
||
" out_file=\"DataFiles/moons.dot\",\n",
|
||
" rounded=True,\n",
|
||
" filled=True\n",
|
||
")\n",
|
||
"cmd = 'dot -Tpng DataFiles/moons.dot -o DataFiles/moons.png'\n",
|
||
"os.system(cmd)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Other ways of visualizing the trees\n",
|
||
"\n",
|
||
"**Scikit-Learn** has also another way to visualize the trees which is very useful, here with the Iris data."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[Text(0.5, 0.9166666666666666, 'X[2] <= 2.45\\ngini = 0.667\\nsamples = 150\\nvalue = [50, 50, 50]'),\n",
|
||
" Text(0.4230769230769231, 0.75, 'gini = 0.0\\nsamples = 50\\nvalue = [50, 0, 0]'),\n",
|
||
" Text(0.5769230769230769, 0.75, 'X[3] <= 1.75\\ngini = 0.5\\nsamples = 100\\nvalue = [0, 50, 50]'),\n",
|
||
" Text(0.3076923076923077, 0.5833333333333334, 'X[2] <= 4.95\\ngini = 0.168\\nsamples = 54\\nvalue = [0, 49, 5]'),\n",
|
||
" Text(0.15384615384615385, 0.4166666666666667, 'X[3] <= 1.65\\ngini = 0.041\\nsamples = 48\\nvalue = [0, 47, 1]'),\n",
|
||
" Text(0.07692307692307693, 0.25, 'gini = 0.0\\nsamples = 47\\nvalue = [0, 47, 0]'),\n",
|
||
" Text(0.23076923076923078, 0.25, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 1]'),\n",
|
||
" Text(0.46153846153846156, 0.4166666666666667, 'X[3] <= 1.55\\ngini = 0.444\\nsamples = 6\\nvalue = [0, 2, 4]'),\n",
|
||
" Text(0.38461538461538464, 0.25, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 3]'),\n",
|
||
" Text(0.5384615384615384, 0.25, 'X[2] <= 5.45\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 2, 1]'),\n",
|
||
" Text(0.46153846153846156, 0.08333333333333333, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 2, 0]'),\n",
|
||
" Text(0.6153846153846154, 0.08333333333333333, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 1]'),\n",
|
||
" Text(0.8461538461538461, 0.5833333333333334, 'X[2] <= 4.85\\ngini = 0.043\\nsamples = 46\\nvalue = [0, 1, 45]'),\n",
|
||
" Text(0.7692307692307693, 0.4166666666666667, 'X[1] <= 3.1\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 1, 2]'),\n",
|
||
" Text(0.6923076923076923, 0.25, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 0, 2]'),\n",
|
||
" Text(0.8461538461538461, 0.25, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 1, 0]'),\n",
|
||
" Text(0.9230769230769231, 0.4166666666666667, 'gini = 0.0\\nsamples = 43\\nvalue = [0, 0, 43]')]"
|
||
]
|
||
},
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter6_24_1.png"
|
||
}
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.datasets import load_iris\n",
|
||
"from sklearn import tree\n",
|
||
"X, y = load_iris(return_X_y=True)\n",
|
||
"tree_clf = tree.DecisionTreeClassifier()\n",
|
||
"tree_clf = tree_clf.fit(X, y)\n",
|
||
"# and then plot the tree\n",
|
||
"tree.plot_tree(tree_clf)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Alternatively, the tree can also be exported in textual format with the function exporttext.\n",
|
||
"This method doesn’t require the installation of external libraries and is more compact:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"|--- petal width (cm) <= 0.80\n",
|
||
"| |--- class: 0\n",
|
||
"|--- petal width (cm) > 0.80\n",
|
||
"| |--- petal width (cm) <= 1.75\n",
|
||
"| | |--- class: 1\n",
|
||
"| |--- petal width (cm) > 1.75\n",
|
||
"| | |--- class: 2\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.datasets import load_iris\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.tree import export_text\n",
|
||
"iris = load_iris()\n",
|
||
"decision_tree = DecisionTreeClassifier(random_state=0, max_depth=2)\n",
|
||
"decision_tree = decision_tree.fit(iris.data, iris.target)\n",
|
||
"r = export_text(decision_tree, feature_names=iris['feature_names'])\n",
|
||
"print(r)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Algorithms for Setting up Decision Trees\n",
|
||
"\n",
|
||
"Two algorithms stand out in the set up of decision trees:\n",
|
||
"1. The CART (Classification And Regression Tree) algorithm for both classification and regression\n",
|
||
"\n",
|
||
"2. The ID3 algorithm based on the computation of the information gain for classification\n",
|
||
"\n",
|
||
"We discuss both algorithms with applications here. The popular library\n",
|
||
"**Scikit-Learn** uses the CART algorithm. For classification problems\n",
|
||
"you can use either the **gini** index or the **entropy** to split a tree\n",
|
||
"in two branches.\n",
|
||
"\n",
|
||
"### The CART algorithm for Classification\n",
|
||
"\n",
|
||
"For classification, the CART algorithm splits the data set in two subsets using a single feature $k$ and a threshold $t_k$.\n",
|
||
"This could be for example a threshold set by a number below a certain circumference of a malign tumor.\n",
|
||
"\n",
|
||
"How do we find these two quantities?\n",
|
||
"We search for the pair $(k,t_k)$ that produces the purest subset using for example the **gini** factor $G$.\n",
|
||
"The cost function it tries to minimize is then"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(k,t_k) = \\frac{m_{\\mathrm{left}}}{m}G_{\\mathrm{left}}+ \\frac{m_{\\mathrm{right}}}{m}G_{\\mathrm{right}},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $G_{\\mathrm{left/right}}$ measures the impurity of the left/right subset and $m_{\\mathrm{left/right}}$\n",
|
||
" is the number of instances in the left/right subset\n",
|
||
"\n",
|
||
"Once it has successfully split the training set in two, it splits the subsets using the same logic, then the subsubsets\n",
|
||
"and so on, recursively. It stops recursing once it reaches the maximum depth (defined by the\n",
|
||
"$max\\_depth$ hyperparameter), or if it cannot find a split that will reduce impurity. A few other\n",
|
||
"hyperparameters control additional stopping conditions such as the $min\\_samples\\_split$,\n",
|
||
"$min\\_samples\\_leaf$, $min\\_weight\\_fraction\\_leaf$, and $max\\_leaf\\_nodes$.\n",
|
||
"\n",
|
||
"\n",
|
||
"### The CART algorithm for Regression\n",
|
||
"\n",
|
||
"The CART algorithm for regression works is similar to the one for classification except that instead of trying to split the\n",
|
||
"training set in a way that minimizes say the **gini** or **entropy** impurity, it now tries to split the training set in a way that minimizes our well-known mean-squared error (MSE). The cost function is now"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(k,t_k) = \\frac{m_{\\mathrm{left}}}{m}\\mathrm{MSE}_{\\mathrm{left}}+ \\frac{m_{\\mathrm{right}}}{m}\\mathrm{MSE}_{\\mathrm{right}}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here the MSE for a specific node is defined as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathrm{MSE}_{\\mathrm{node}}=\\frac{1}{m_\\mathrm{node}}\\sum_{i\\in \\mathrm{node}}(\\overline{y}_{\\mathrm{node}}-y_i)^2,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"with"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\overline{y}_{\\mathrm{node}}=\\frac{1}{m_\\mathrm{node}}\\sum_{i\\in \\mathrm{node}}y_i,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"the mean value of all observations in a specific node.\n",
|
||
"\n",
|
||
"Without any regularization, the regression task for decision trees, \n",
|
||
"just like for classification tasks, is prone to overfitting.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"### Computing the Gini index\n",
|
||
"\n",
|
||
"The example we will look at is a classical one in many Machine\n",
|
||
"Learning applications. Based on various meteorological features, we\n",
|
||
"have several so-called attributes which decide whether we at the end\n",
|
||
"will do some outdoor activity like skiing, going for a bike ride etc\n",
|
||
"etc. The table here contains the feautures **outlook**, **temperature**,\n",
|
||
"**humidity** and **wind**. The target or output is whether we ride\n",
|
||
"(True=1) or whether we do something else that day (False=0). The\n",
|
||
"attributes for each feature are then sunny, overcast and rain for the\n",
|
||
"outlook, hot, cold and mild for temperature, high and normal for\n",
|
||
"humidity and weak and strong for wind.\n",
|
||
"\n",
|
||
"The table here summarizes the various attributes and\n",
|
||
"<table border=\"1\">\n",
|
||
"<thead>\n",
|
||
"<tr><th align=\"center\">Day</th> <th align=\"center\">Outlook </th> <th align=\"center\">Temperature</th> <th align=\"center\">Humidity</th> <th align=\"center\"> Wind </th> <th align=\"center\">Ride</th> </tr>\n",
|
||
"</thead>\n",
|
||
"<tbody>\n",
|
||
"<tr><td align=\"center\"> 1 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Hot </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 0 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 2 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Hot </td> <td align=\"center\"> High </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 3 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Hot </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 4 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 5 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 6 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 0 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 7 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 8 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 0 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 9 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Cool </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 10 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Mild </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 11 </td> <td align=\"center\"> Sunny </td> <td align=\"center\"> Mild </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 12 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 13 </td> <td align=\"center\"> Overcast </td> <td align=\"center\"> Hot </td> <td align=\"center\"> Normal </td> <td align=\"center\"> Weak </td> <td align=\"center\"> 1 </td> </tr>\n",
|
||
"<tr><td align=\"center\"> 14 </td> <td align=\"center\"> Rain </td> <td align=\"center\"> Mild </td> <td align=\"center\"> High </td> <td align=\"center\"> Strong </td> <td align=\"center\"> 0 </td> </tr>\n",
|
||
"</tbody>\n",
|
||
"</table>\n",
|
||
"\n",
|
||
"### Simple Python Code to read in Data and perform Classification"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"ename": "FileNotFoundError",
|
||
"evalue": "[Errno 2] No such file or directory: 'DataFiles/rideclass.csv'",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
|
||
"Input \u001b[0;32mIn [6]\u001b[0m, in \u001b[0;36m<cell line: 37>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msave_fig\u001b[39m(fig_id):\n\u001b[1;32m 35\u001b[0m plt\u001b[38;5;241m.\u001b[39msavefig(image_path(fig_id) \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.png\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpng\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 37\u001b[0m infile \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mdata_path\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrideclass.csv\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mr\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 39\u001b[0m \u001b[38;5;66;03m# Read the experimental data with Pandas\u001b[39;00m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mIPython\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdisplay\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m display\n",
|
||
"\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'DataFiles/rideclass.csv'"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.tree import export_graphviz\n",
|
||
"from sklearn.preprocessing import StandardScaler, OneHotEncoder\n",
|
||
"from sklearn.compose import ColumnTransformer\n",
|
||
"from IPython.display import Image \n",
|
||
"from pydot import graph_from_dot_data\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# Where to save the figures and data files\n",
|
||
"PROJECT_ROOT_DIR = \"Results\"\n",
|
||
"FIGURE_ID = \"Results/FigureFiles\"\n",
|
||
"DATA_ID = \"DataFiles/\"\n",
|
||
"\n",
|
||
"if not os.path.exists(PROJECT_ROOT_DIR):\n",
|
||
" os.mkdir(PROJECT_ROOT_DIR)\n",
|
||
"\n",
|
||
"if not os.path.exists(FIGURE_ID):\n",
|
||
" os.makedirs(FIGURE_ID)\n",
|
||
"\n",
|
||
"if not os.path.exists(DATA_ID):\n",
|
||
" os.makedirs(DATA_ID)\n",
|
||
"\n",
|
||
"def image_path(fig_id):\n",
|
||
" return os.path.join(FIGURE_ID, fig_id)\n",
|
||
"\n",
|
||
"def data_path(dat_id):\n",
|
||
" return os.path.join(DATA_ID, dat_id)\n",
|
||
"\n",
|
||
"def save_fig(fig_id):\n",
|
||
" plt.savefig(image_path(fig_id) + \".png\", format='png')\n",
|
||
"\n",
|
||
"infile = open(data_path(\"rideclass.csv\"),'r')\n",
|
||
"\n",
|
||
"# Read the experimental data with Pandas\n",
|
||
"from IPython.display import display\n",
|
||
"ridedata = pd.read_csv(infile,names = ('Outlook','Temperature','Humidity','Wind','Ride'))\n",
|
||
"ridedata = pd.DataFrame(ridedata)\n",
|
||
"\n",
|
||
"# Features and targets\n",
|
||
"X = ridedata.loc[:, ridedata.columns != 'Ride'].values\n",
|
||
"y = ridedata.loc[:, ridedata.columns == 'Ride'].values\n",
|
||
"\n",
|
||
"# Create the encoder.\n",
|
||
"encoder = OneHotEncoder(handle_unknown=\"ignore\")\n",
|
||
"# Assume for simplicity all features are categorical.\n",
|
||
"encoder.fit(X) \n",
|
||
"# Apply the encoder.\n",
|
||
"X = encoder.transform(X)\n",
|
||
"print(X)\n",
|
||
"# Then do a Classification tree\n",
|
||
"tree_clf = DecisionTreeClassifier(max_depth=2)\n",
|
||
"tree_clf.fit(X, y)\n",
|
||
"print(\"Train set accuracy with Decision Tree: {:.2f}\".format(tree_clf.score(X,y)))\n",
|
||
"#transfer to a decision tree graph\n",
|
||
"export_graphviz(\n",
|
||
" tree_clf,\n",
|
||
" out_file=\"DataFiles/ride.dot\",\n",
|
||
" rounded=True,\n",
|
||
" filled=True\n",
|
||
")\n",
|
||
"cmd = 'dot -Tpng DataFiles/cancer.dot -o DataFiles/cancer.png'\n",
|
||
"os.system(cmd)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above functions (gini, entropy and misclassification error) are\n",
|
||
"important components of the so-called CART algorithm. We will discuss\n",
|
||
"this algorithm below after we have discussed the information gain\n",
|
||
"algorithm ID3.\n",
|
||
"\n",
|
||
"In the example here we have converted all our attributes into numerical values $0,1,2$ etc."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Split a dataset based on an attribute and an attribute value\n",
|
||
"def test_split(index, value, dataset):\n",
|
||
"\tleft, right = list(), list()\n",
|
||
"\tfor row in dataset:\n",
|
||
"\t\tif row[index] < value:\n",
|
||
"\t\t\tleft.append(row)\n",
|
||
"\t\telse:\n",
|
||
"\t\t\tright.append(row)\n",
|
||
"\treturn left, right\n",
|
||
" \n",
|
||
"# Calculate the Gini index for a split dataset\n",
|
||
"def gini_index(groups, classes):\n",
|
||
"\t# count all samples at split point\n",
|
||
"\tn_instances = float(sum([len(group) for group in groups]))\n",
|
||
"\t# sum weighted Gini index for each group\n",
|
||
"\tgini = 0.0\n",
|
||
"\tfor group in groups:\n",
|
||
"\t\tsize = float(len(group))\n",
|
||
"\t\t# avoid divide by zero\n",
|
||
"\t\tif size == 0:\n",
|
||
"\t\t\tcontinue\n",
|
||
"\t\tscore = 0.0\n",
|
||
"\t\t# score the group based on the score for each class\n",
|
||
"\t\tfor class_val in classes:\n",
|
||
"\t\t\tp = [row[-1] for row in group].count(class_val) / size\n",
|
||
"\t\t\tscore += p * p\n",
|
||
"\t\t# weight the group score by its relative size\n",
|
||
"\t\tgini += (1.0 - score) * (size / n_instances)\n",
|
||
"\treturn gini\n",
|
||
"\n",
|
||
"# Select the best split point for a dataset\n",
|
||
"def get_split(dataset):\n",
|
||
"\tclass_values = list(set(row[-1] for row in dataset))\n",
|
||
"\tb_index, b_value, b_score, b_groups = 999, 999, 999, None\n",
|
||
"\tfor index in range(len(dataset[0])-1):\n",
|
||
"\t\tfor row in dataset:\n",
|
||
"\t\t\tgroups = test_split(index, row[index], dataset)\n",
|
||
"\t\t\tgini = gini_index(groups, class_values)\n",
|
||
"\t\t\tprint('X%d < %.3f Gini=%.3f' % ((index+1), row[index], gini))\n",
|
||
"\t\t\tif gini < b_score:\n",
|
||
"\t\t\t\tb_index, b_value, b_score, b_groups = index, row[index], gini, groups\n",
|
||
"\treturn {'index':b_index, 'value':b_value, 'groups':b_groups}\n",
|
||
" \n",
|
||
"dataset = [[0,0,0,0,0],\n",
|
||
" [0,0,0,1,1],\n",
|
||
" [1,0,0,0,1],\n",
|
||
" [2,1,0,0,1],\n",
|
||
" [2,2,1,0,1],\n",
|
||
" [2,2,1,1,0],\n",
|
||
" [1,2,1,1,1],\n",
|
||
" [0,1,0,0,0],\n",
|
||
" [0,2,1,0,1],\n",
|
||
" [2,1,1,0,1],\n",
|
||
" [0,1,1,1,1],\n",
|
||
" [1,1,0,1,1],\n",
|
||
" [1,0,1,0,1],\n",
|
||
" [2,1,0,1,0]]\n",
|
||
"\n",
|
||
"split = get_split(dataset)\n",
|
||
"print('Split: [X%d < %.3f]' % ((split['index']+1), split['value']))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Entropy and the ID3 algorithm\n",
|
||
"\n",
|
||
"The ID3 algorithm learns decision trees by constructing\n",
|
||
"them in a top down way, beginning with the question **which attribute should be tested at the root of the tree**?\n",
|
||
"\n",
|
||
"1. Each instance attribute is evaluated using a statistical test to determine how well it alone classifies the training examples.\n",
|
||
"\n",
|
||
"2. The best attribute is selected and used as the test at the root node of the tree.\n",
|
||
"\n",
|
||
"3. A descendant of the root node is then created for each possible value of this attribute.\n",
|
||
"\n",
|
||
"4. Training examples are sorted to the appropriate descendant node.\n",
|
||
"\n",
|
||
"5. The entire process is then repeated using the training examples associated with each descendant node to select the best attribute to test at that point in the tree.\n",
|
||
"\n",
|
||
"6. This forms a greedy search for an acceptable decision tree, in which the algorithm never backtracks to reconsider earlier choices. \n",
|
||
"\n",
|
||
"The ID3 algorithm selects which attribute to test at each node in the\n",
|
||
"tree.\n",
|
||
"\n",
|
||
"We would like to select the attribute that is most useful for classifying\n",
|
||
"examples.\n",
|
||
"\n",
|
||
"What is a good quantitative measure of the worth of an attribute?\n",
|
||
"\n",
|
||
"Information gain measures how well a given attribute separates the\n",
|
||
"training examples according to their target classification.\n",
|
||
"\n",
|
||
"The ID3 algorithm uses this information gain measure to select among the candidate\n",
|
||
"attributes at each step while growing the tree.\n",
|
||
"\n",
|
||
"\n",
|
||
"### Cancer Data again now with Decision Trees and other Methods"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import numpy as np\n",
|
||
"from sklearn.model_selection import train_test_split \n",
|
||
"from sklearn.datasets import load_breast_cancer\n",
|
||
"from sklearn.svm import SVC\n",
|
||
"from sklearn.linear_model import LogisticRegression\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"\n",
|
||
"# Load the data\n",
|
||
"cancer = load_breast_cancer()\n",
|
||
"\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)\n",
|
||
"print(X_train.shape)\n",
|
||
"print(X_test.shape)\n",
|
||
"# Logistic Regression\n",
|
||
"logreg = LogisticRegression(solver='lbfgs')\n",
|
||
"logreg.fit(X_train, y_train)\n",
|
||
"print(\"Test set accuracy with Logistic Regression: {:.2f}\".format(logreg.score(X_test,y_test)))\n",
|
||
"# Support vector machine\n",
|
||
"svm = SVC(gamma='auto', C=100)\n",
|
||
"svm.fit(X_train, y_train)\n",
|
||
"print(\"Test set accuracy with SVM: {:.2f}\".format(svm.score(X_test,y_test)))\n",
|
||
"# Decision Trees\n",
|
||
"deep_tree_clf = DecisionTreeClassifier(max_depth=None)\n",
|
||
"deep_tree_clf.fit(X_train, y_train)\n",
|
||
"print(\"Test set accuracy with Decision Trees: {:.2f}\".format(deep_tree_clf.score(X_test,y_test)))\n",
|
||
"#now scale the data\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"scaler = StandardScaler()\n",
|
||
"scaler.fit(X_train)\n",
|
||
"X_train_scaled = scaler.transform(X_train)\n",
|
||
"X_test_scaled = scaler.transform(X_test)\n",
|
||
"# Logistic Regression\n",
|
||
"logreg.fit(X_train_scaled, y_train)\n",
|
||
"print(\"Test set accuracy Logistic Regression with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n",
|
||
"# Support Vector Machine\n",
|
||
"svm.fit(X_train_scaled, y_train)\n",
|
||
"print(\"Test set accuracy SVM with scaled data: {:.2f}\".format(logreg.score(X_test_scaled,y_test)))\n",
|
||
"# Decision Trees\n",
|
||
"deep_tree_clf.fit(X_train_scaled, y_train)\n",
|
||
"print(\"Test set accuracy with Decision Trees and scaled data: {:.2f}\".format(deep_tree_clf.score(X_test_scaled,y_test)))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Another example, the moons again"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from __future__ import division, print_function, unicode_literals\n",
|
||
"\n",
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import os\n",
|
||
"\n",
|
||
"# to make this notebook's output stable across runs\n",
|
||
"np.random.seed(42)\n",
|
||
"\n",
|
||
"# To plot pretty figures\n",
|
||
"import matplotlib\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from matplotlib.colors import ListedColormap\n",
|
||
"plt.rcParams['axes.labelsize'] = 14\n",
|
||
"plt.rcParams['xtick.labelsize'] = 12\n",
|
||
"plt.rcParams['ytick.labelsize'] = 12\n",
|
||
"\n",
|
||
"\n",
|
||
"from sklearn.svm import SVC\n",
|
||
"from sklearn import datasets\n",
|
||
"from sklearn.tree import DecisionTreeClassifier\n",
|
||
"from sklearn.datasets import make_moons\n",
|
||
"from sklearn.tree import export_graphviz\n",
|
||
"\n",
|
||
"Xm, ym = make_moons(n_samples=100, noise=0.25, random_state=53)\n",
|
||
"\n",
|
||
"deep_tree_clf1 = DecisionTreeClassifier(random_state=42)\n",
|
||
"deep_tree_clf2 = DecisionTreeClassifier(min_samples_leaf=4, random_state=42)\n",
|
||
"deep_tree_clf1.fit(Xm, ym)\n",
|
||
"deep_tree_clf2.fit(Xm, ym)\n",
|
||
"\n",
|
||
"\n",
|
||
"def plot_decision_boundary(clf, X, y, axes=[0, 7.5, 0, 3], iris=True, legend=False, plot_training=True):\n",
|
||
" x1s = np.linspace(axes[0], axes[1], 100)\n",
|
||
" x2s = np.linspace(axes[2], axes[3], 100)\n",
|
||
" x1, x2 = np.meshgrid(x1s, x2s)\n",
|
||
" X_new = np.c_[x1.ravel(), x2.ravel()]\n",
|
||
" y_pred = clf.predict(X_new).reshape(x1.shape)\n",
|
||
" custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])\n",
|
||
" plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)\n",
|
||
" if not iris:\n",
|
||
" custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])\n",
|
||
" plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)\n",
|
||
" if plot_training:\n",
|
||
" plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"yo\", label=\"Iris-Setosa\")\n",
|
||
" plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"bs\", label=\"Iris-Versicolor\")\n",
|
||
" plt.plot(X[:, 0][y==2], X[:, 1][y==2], \"g^\", label=\"Iris-Virginica\")\n",
|
||
" plt.axis(axes)\n",
|
||
" if iris:\n",
|
||
" plt.xlabel(\"Petal length\", fontsize=14)\n",
|
||
" plt.ylabel(\"Petal width\", fontsize=14)\n",
|
||
" else:\n",
|
||
" plt.xlabel(r\"$x_1$\", fontsize=18)\n",
|
||
" plt.ylabel(r\"$x_2$\", fontsize=18, rotation=0)\n",
|
||
" if legend:\n",
|
||
" plt.legend(loc=\"lower right\", fontsize=14)\n",
|
||
"plt.figure(figsize=(11, 4))\n",
|
||
"plt.subplot(121)\n",
|
||
"plot_decision_boundary(deep_tree_clf1, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)\n",
|
||
"plt.title(\"No restrictions\", fontsize=16)\n",
|
||
"plt.subplot(122)\n",
|
||
"plot_decision_boundary(deep_tree_clf2, Xm, ym, axes=[-1.5, 2.5, -1, 1.5], iris=False)\n",
|
||
"plt.title(\"min_samples_leaf = {}\".format(deep_tree_clf2.min_samples_leaf), fontsize=14)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"np.random.seed(6)\n",
|
||
"Xs = np.random.rand(100, 2) - 0.5\n",
|
||
"ys = (Xs[:, 0] > 0).astype(np.float32) * 2\n",
|
||
"\n",
|
||
"angle = np.pi/4\n",
|
||
"rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]])\n",
|
||
"Xsr = Xs.dot(rotation_matrix)\n",
|
||
"\n",
|
||
"tree_clf_s = DecisionTreeClassifier(random_state=42)\n",
|
||
"tree_clf_s.fit(Xs, ys)\n",
|
||
"tree_clf_sr = DecisionTreeClassifier(random_state=42)\n",
|
||
"tree_clf_sr.fit(Xsr, ys)\n",
|
||
"\n",
|
||
"plt.figure(figsize=(11, 4))\n",
|
||
"plt.subplot(121)\n",
|
||
"plot_decision_boundary(tree_clf_s, Xs, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)\n",
|
||
"plt.subplot(122)\n",
|
||
"plot_decision_boundary(tree_clf_sr, Xsr, ys, axes=[-0.7, 0.7, -0.7, 0.7], iris=False)\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Quadratic training set + noise\n",
|
||
"np.random.seed(42)\n",
|
||
"m = 200\n",
|
||
"X = np.random.rand(m, 1)\n",
|
||
"y = 4 * (X - 0.5) ** 2\n",
|
||
"y = y + np.random.randn(m, 1) / 10"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.tree import DecisionTreeRegressor\n",
|
||
"\n",
|
||
"tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)\n",
|
||
"tree_reg.fit(X, y)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.tree import DecisionTreeRegressor\n",
|
||
"\n",
|
||
"tree_reg1 = DecisionTreeRegressor(random_state=42, max_depth=2)\n",
|
||
"tree_reg2 = DecisionTreeRegressor(random_state=42, max_depth=3)\n",
|
||
"tree_reg1.fit(X, y)\n",
|
||
"tree_reg2.fit(X, y)\n",
|
||
"\n",
|
||
"def plot_regression_predictions(tree_reg, X, y, axes=[0, 1, -0.2, 1], ylabel=\"$y$\"):\n",
|
||
" x1 = np.linspace(axes[0], axes[1], 500).reshape(-1, 1)\n",
|
||
" y_pred = tree_reg.predict(x1)\n",
|
||
" plt.axis(axes)\n",
|
||
" plt.xlabel(\"$x_1$\", fontsize=18)\n",
|
||
" if ylabel:\n",
|
||
" plt.ylabel(ylabel, fontsize=18, rotation=0)\n",
|
||
" plt.plot(X, y, \"b.\")\n",
|
||
" plt.plot(x1, y_pred, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
|
||
"\n",
|
||
"plt.figure(figsize=(11, 4))\n",
|
||
"plt.subplot(121)\n",
|
||
"plot_regression_predictions(tree_reg1, X, y)\n",
|
||
"for split, style in ((0.1973, \"k-\"), (0.0917, \"k--\"), (0.7718, \"k--\")):\n",
|
||
" plt.plot([split, split], [-0.2, 1], style, linewidth=2)\n",
|
||
"plt.text(0.21, 0.65, \"Depth=0\", fontsize=15)\n",
|
||
"plt.text(0.01, 0.2, \"Depth=1\", fontsize=13)\n",
|
||
"plt.text(0.65, 0.8, \"Depth=1\", fontsize=13)\n",
|
||
"plt.legend(loc=\"upper center\", fontsize=18)\n",
|
||
"plt.title(\"max_depth=2\", fontsize=14)\n",
|
||
"\n",
|
||
"plt.subplot(122)\n",
|
||
"plot_regression_predictions(tree_reg2, X, y, ylabel=None)\n",
|
||
"for split, style in ((0.1973, \"k-\"), (0.0917, \"k--\"), (0.7718, \"k--\")):\n",
|
||
" plt.plot([split, split], [-0.2, 1], style, linewidth=2)\n",
|
||
"for split in (0.0458, 0.1298, 0.2873, 0.9040):\n",
|
||
" plt.plot([split, split], [-0.2, 1], \"k:\", linewidth=1)\n",
|
||
"plt.text(0.3, 0.5, \"Depth=2\", fontsize=13)\n",
|
||
"plt.title(\"max_depth=3\", fontsize=14)\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"tree_reg1 = DecisionTreeRegressor(random_state=42)\n",
|
||
"tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)\n",
|
||
"tree_reg1.fit(X, y)\n",
|
||
"tree_reg2.fit(X, y)\n",
|
||
"\n",
|
||
"x1 = np.linspace(0, 1, 500).reshape(-1, 1)\n",
|
||
"y_pred1 = tree_reg1.predict(x1)\n",
|
||
"y_pred2 = tree_reg2.predict(x1)\n",
|
||
"\n",
|
||
"plt.figure(figsize=(11, 4))\n",
|
||
"\n",
|
||
"plt.subplot(121)\n",
|
||
"plt.plot(X, y, \"b.\")\n",
|
||
"plt.plot(x1, y_pred1, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
|
||
"plt.axis([0, 1, -0.2, 1.1])\n",
|
||
"plt.xlabel(\"$x_1$\", fontsize=18)\n",
|
||
"plt.ylabel(\"$y$\", fontsize=18, rotation=0)\n",
|
||
"plt.legend(loc=\"upper center\", fontsize=18)\n",
|
||
"plt.title(\"No restrictions\", fontsize=14)\n",
|
||
"\n",
|
||
"plt.subplot(122)\n",
|
||
"plt.plot(X, y, \"b.\")\n",
|
||
"plt.plot(x1, y_pred2, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
|
||
"plt.axis([0, 1, -0.2, 1.1])\n",
|
||
"plt.xlabel(\"$x_1$\", fontsize=18)\n",
|
||
"plt.title(\"min_samples_leaf={}\".format(tree_reg2.min_samples_leaf), fontsize=14)\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Pros and cons of trees, pros\n",
|
||
"\n",
|
||
"* White box, easy to interpret model. Some people believe that decision trees more closely mirror human decision-making than do the regression and classification approaches discussed earlier (think of support vector machines)\n",
|
||
"\n",
|
||
"* Trees are very easy to explain to people. In fact, they are even easier to explain than linear regression!\n",
|
||
"\n",
|
||
"* No feature normalization needed\n",
|
||
"\n",
|
||
"* Tree models can handle both continuous and categorical data (Classification and Regression Trees)\n",
|
||
"\n",
|
||
"* Can model nonlinear relationships\n",
|
||
"\n",
|
||
"* Can model interactions between the different descriptive features\n",
|
||
"\n",
|
||
"* Trees can be displayed graphically, and are easily interpreted even by a non-expert (especially if they are small)\n",
|
||
"\n",
|
||
"### Disadvantages\n",
|
||
"\n",
|
||
"* Unfortunately, trees generally do not have the same level of predictive accuracy as some of the other regression and classification approaches\n",
|
||
"\n",
|
||
"* If continuous features are used the tree may become quite large and hence less interpretable\n",
|
||
"\n",
|
||
"* Decision trees are prone to overfit the training data and hence do not well generalize the data if no stopping criteria or improvements like pruning, boosting or bagging are implemented\n",
|
||
"\n",
|
||
"* Small changes in the data may lead to a completely different tree. This issue can be addressed by using ensemble methods like bagging, boosting or random forests\n",
|
||
"\n",
|
||
"* Unbalanced datasets where some target feature values occur much more frequently than others may lead to biased trees since the frequently occurring feature values are preferred over the less frequently occurring ones. \n",
|
||
"\n",
|
||
"* If the number of features is relatively large (high dimensional) and the number of instances is relatively low, the tree might overfit the data\n",
|
||
"\n",
|
||
"* Features with many levels may be preferred over features with less levels since for them it is *more easy* to split the dataset such that the sub datasets only contain pure target feature values. This issue can be addressed by preferring for instance the information gain ratio as splitting criteria over information gain\n",
|
||
"\n",
|
||
"However, by aggregating many decision trees, using methods like\n",
|
||
"bagging, random forests, and boosting, the predictive performance of\n",
|
||
"trees can be substantially improved."
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"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.9.10"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
} |