From 3fdad71f0e8c177c2bbfe963dbaa9a523b28affa Mon Sep 17 00:00:00 2001 From: hemanishah00 <67570889+hemanishah00@users.noreply.github.com> Date: Tue, 19 Apr 2022 10:52:21 +0530 Subject: [PATCH] uploaded file for approach B --- approchBModel.ipynb | 3144 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3144 insertions(+) create mode 100644 approchBModel.ipynb diff --git a/approchBModel.ipynb b/approchBModel.ipynb new file mode 100644 index 0000000..de761b5 --- /dev/null +++ b/approchBModel.ipynb @@ -0,0 +1,3144 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "approchBModel", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "Approach B:\n", + "![image.png](data:image/png;base64,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nMe2rq4uli1blvf2zc3NsXDhwmhsbGy13q9fvz0GlAAAAAi+AACA/+foo4+O7t2756zX19fHypUrC1BRcnTp0iUGDRqUs75kyZJoamrKWd+6dWssX748Z722tjY6dux4SGoEAABIAsEXAAAQERGlpaV5O74iIubPn2/c4UFo165d1NbWRnl5eav1hQsXxvr163Nu//rrr+eMOTzxxBOjX79+h7ROAACAYif4AgAAWvTv3z969OiRs75gwYJ47bXXClBRchx77LFRU1PTam3t2rU5nV07d+6MV155Jef+AwcOjM6dOx/SGgEAAIqd4AsAAGjRvXv3GDBgQM765s2bY86cOfH2228XoKpk6NixY9TW1uasL168uNV3eW3atCnq6+tb3aa8vDxqa2ujXTtv4QAAAPbGuyYAAKBFx44d4+STT47S0tKcY3Pnzo358+dHNpstQGXJ0L9//6iqqmq1tnz58tiwYUPL/37ttddi2bJlrW4zYMCA6Nmz52GpEQAAoJgJvgAAgFYGDhyYM5IvIqKxsTEefvjhWLJkSQGqOjQymUy0b98+Z/3NN988JPt17tw557Fdt25dS9DV1NSU9/GtqamJo4466pDUBAAAkCSCLwAAoJWysrIYPXp0lJeX5xzbuHFj/OpXv4q1a9cWoLK216FDh+jSpUvOelNT0yHpbMtkMlFTUxOVlZWt1pctWxaNjY2xefPmWLFiRatjvXv3zjt+EgAAgFyCLwAAIMeJJ54Yp512Wt5j9fX1MW3atHjttdcOc1Vtr127dtGhQ4ec9TVr1hyy7zPr3r17VFdXt1pbvXp1bNq0KVavXp0z5vDEE0+MioqKQ1ILAABA0gi+AACAHO3atYszzzwzTj755LzH6+vr45577olZs2bFjh07DnN1bad9+/bRtWvXnPWlS5fG6tWrD8meJSUlMWjQoFZrq1atitdffz2WL1/ear20tDQGDx4cJSUlh6QWAACApBF8AQAAeXXu3DkuvPDC6Nu3b97jDQ0NMWPGjLjrrrviL3/5y0F1SGWz2di0aVP89a9/jVmzZsU777zzns91oE444YQoLS1ttbZ58+aYOXNmbNmy5ZDtWVVV1WrtL3/5SyxdurTVWr9+/aJXr16HpAYAAIAk8rFBAABgjyorK+Pyyy+P//3f/80JZXZZsWJF/PSnP42ysrIYNGhQDB48OI477rjo0qVLdOrUKdq3b99y23feeSd27NgRW7dujfXr17eM9lu2bFk0NDRERMTo0aMPy7Xt0r179+jXr1/U1dW1Wp83b15kMpn45Cc/Gd26dct732w2G9lsNtq1O7DPFHbu3Dlqampa7fnSSy/l3K6mpiY6d+58QOcGAABIM8EXAACwVz179oyJEyfGjBkzYu7cuXu8XUNDQ7z44ovx4osvHsbqDl55eXkMGzYsJ/iKiJg7d27U1dXFoEGDom/fvpHJZCIiorGxMVauXBlr1qyJiRMnxoABAw5oz0wmEzU1NTFnzpxYu3Zt3tv06NEjqqqqWvYEAABg3wRfAADAPlVUVMTEiRPj2Wefjccee6ylOysphg0bFsuXL485c+bkHGtsbIx58+bFvHnz2nTP7t27R3V19R6DrwEDBkT37t3bdE8AAICk8x1fAADAfunYsWOcddZZcd1118Vpp52W871Yxaxjx45xwQUXxNChQw/bniUlJTF48OA9Po61tbXRsWPHw1YPAABAEuj4AgAADkhFRUWMHz8+zj333HjhhRfiz3/+c6xevfqgzzto0KD4wAc+EIMHD46SksP/VqVz584xYcKE6N+//2HrauvTp09UVVXljJDs27dv9OnT55DvDwAAkDSCLwAA4IBlMpmoqKiIj3zkIzFmzJjYsmVLrFq1KlauXBn19fXR0NAQK1eujMbGxlb369mzZ1RUVERZWVkcd9xxUVlZGZWVlVFRUREdOnQ4oBrGjh0bY8eObcvLaulqGzFiRCxZsiReeeWVWLlyZSxfvrzlNv369YuKioro379/DBgwII477rg2rSEiorq6Orp27drm5wUAAEg6wRcAAHBQMplMlJeXR3l5edTU1BS6nDbRqVOnqK2tjdra2kO6z7p161qFahERpaWlUV1dHe3amUwPAABwoLyTAgAAKIDm5uaYP39+bN68udV6VVVV9OrVq0BVAQAAFDfBFwAAQAG8+eabsXDhwpz12traKCsrK0BFAAAAxU/wBQAAUACvvvpq1NfXt1qrrKyMfv36FagiAACA4if4AgAAOMwaGhpi/vz5OevV1dXRvXv3AlQEAACQDIIvAACAw2zFihVRV1fXaq20tDQGDx4cJSUlBaoKAACg+Am+AAAADqOGhoaYM2dONDY2tlqvqamJPn36FKgqAACAZBB8AQAAHCbNzc3x7LPP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nj3jlVdeiSeffPKgzjNnzpz44x//GD179myjyjhQGzdujKVLl8YzzzwTmzdvLnQ50KaS9Pr2QJUUugAAAIBC0PEFALwXZ5xxRjQ1NcXTTz8dl112WRx99NEHfI5t27bFr3/96/jUpz4VTU1Nh6BK9kdFRUUMGDAgRo4cGeXl5YUuB2gjOr6OELvS10wms8f/DBs2LC666KL41re+FcuXL49sNlvosoEi0NTUFM8//3zcdNNNMWbMmOjWrVvL75Xq6uoYP3583HXXXbFgwQKfcj8CvfrqqzFy5Mi4//77C10Kh8G0adP2+lqgW7duMWbMmLj++uvjkUceScUnEnfu3BlTp06Niy++ONatW1fockiYfMFXWz0XHmzHje4KSJ738nthwYIFMWLEiPjkJz8Za9euPYTVAQeiW7ducfHFF8djjz0W8+fPf0/nmD9/fsycOTPOP//8ePvtt9u4QvZXjx49Yvr06XHdddflfW0IB6OpqSmeeeaZuOGGG+KMM86I8vLylvf3I0eOjMmTJ8esWbNi+/bthS41cXR8HWEuv/zyGDx4cN5jO3bsiGeffTa+8pWvxLXXXhtXXnll3HzzzdGrV6/DXCVQDBobG2P69Onxn//5nzFv3ryoqqqKkSNHxtixY1tus2XLlnjuuefixhtvjC984QsxadKkuPPOO6Nz584FrJx3e+ONN+K5556LD37wg3HRRRdFaWlpoUviEDv22GNj4sSJUVFRkXNs586d8dJLL8WDDz4YU6dOjYqKirj66qvji1/8YvTo0aMA1R56O3bsiCVLlsTs2bNj2bJlib1OCiPfqEMdX8CRoq6uLq666qro1atXfP/734/KyspCl3RE+MMf/hCzZ8+Om266qdClkHKjR4+O2traePjhh+PUU089oNBk586d8fDDD8ewYcNi6NChce+99x7CSoHDrbm5OZ588sm44YYb4vnnn4+Kior4wAc+EFdffXV069YttmzZEn/+85/jZz/7Wdx5551x8sknxw033BCXXHJJlJTsPbLJZrPxH//xH3HOOefE6NGjD9MVFR/B1xHm3HPPjQkTJuz1Nps3b4577703vv71r8eGDRu8AAZybNy4MW666aa45557Yvz48fHjH/84hg4dmvcPfBF/G7Ewa9asaGhoEHodYXr27BkjRoyIUaNGCb1SomfPnnHllVdGVVXVHm/T3Nwcr7zyStx+++1x1113xSOPPBLf/e53Y+TIkYex0sOjY8eOMXDgwDjzzDOjf//+hS6HhDHqEDhSvfrqq/GFL3whunfvHt/5zne853+Xv/zlL4UuASIiorKyMs4777x48MEH44orrjig16pvvPFGzJkzJy655JK8H3h7t7q6urj00kvjuuuu2+ffDHeZNm1a3HfffTFt2rTo1q1bq2MbNmyICRMmxBVXXBGXXnppbNu2Lf7v//4v7rvvvnjmmWdiy5YtMWLEiLjgggviH/7hH+KEE05ouW9jY2PMnDkzfvjDH8bvf//72LhxY1RVVcXYsWPjyiuvjCFDhkQmk9mvGpubm+OPf/xj/PCHP4ynnnoq6urqonPnzjF69Oi46KKL4lOf+lRO7fls27Ytnn/++ZgxY0b86U9/iueeey4iYr/r2vV4jB49WqBOm9i+fXvcdttt8dWvfjXGjh0bTzzxRJxxxhnRsWPHnNs2NTXFnDlz4rbbbovx48fHvHnz4oYbbtjr+NTNmzfH/Pnz45xzzjmUl1H0jDosQuXl5fHFL34x7rrrrnjyySfj/vvvN/YQaLF27dq4+uqr4/77748f//jH8dOf/jSGDRu2x9ArIuLoo4+OCy64ID796U8fxkrZHyeddFLMmTMnLrvsskKXwhGkXbt2MXjw4Lj33ntjxowZERExfvz4mD17doEra3vt27eP6667LqZPn67bizaX77nR2F+g0Orr6+Paa6+NDh06xLe//e3o3bt3oUs6Yrz99tuxePHiQpcBEfG31xFjx46NzZs3x5NPPnlA950zZ06sWrUqPvzhDx+i6vbtrbfeivr6+pg4cWJ87Wtfi5NPPjluvPHGuPXWW+PDH/5w/OAHP4iPfvSj8Yc//CEiIlatWhUTJ06MCRMmREVFRVx//fVx6623xiWXXBIzZ86M008/PX7605/u14eINm7cGP/8z/8cH/vYx6KxsTGuuOKKuPXWW+PGG2+MHj16xL/+67/G6NGjY8aMGXv9m+fjjz8eJ5xwQnz84x+PRYsWxUUXXRSPP/54/O53v4urr746XnjhhTj99NPjG9/4hu9R47BoamqKO++8M775zW/GlClTYsaMGXH22WfnDb0iIkpKSuL000+Phx56KO68886466674u67797rv9d169bFsmXLDtUlJIaOryKVyWTivPPOi7PPPjuefvrpmDRpUhxzzDGFLgsosF1PsI8++mh873vfi/Hjx+/3p62A4pPJZOIjH/lI/M///E9cddVVMXXq1KiqqjIGGfaTji/gSLNq1aqYPHlyRER85zvfib59+xa4oiPL6tWrY968eV7rcMQ48cQT45xzzolHHnkkLr744ujates+77Nt27b49a9/Heecc06ceOKJsXXr1sNQaa65c+fGzJkz45RTTon77rsvp8Pki1/8YlxzzTXx1a9+NW6//fb42te+Ft27d4+FCxfmfCDtxhtvjNtuuy3+/d//PWpra2P48OF73Ldr165x0003xTvvvJP3XBERK1eujBtuuCH+8R//MUpKSuLCCy/Me66ampr45je/Geeff3707Nmz1bGPfOQj8fnPfz5uv/32uOOOO+K0006LM844Y38fHnhPHnroobj55pvjxhtvjC9/+cv7HFu4S2lpaXz+85+PhoaGuPnmm6O6ujo+8YlP5Nxu1/QX3c/7puOriHXp0iWGDBkSy5Yt2+OXvTc3N0d9fX1897vfjU984hPRr1+/yGQyUV5eHuedd17ce++9sW3btr3uM23atFZfrL1hw4b47//+77jwwgujW7dukclkolu3bjFu3LiYMWNGNDY27lf9GzZsiLvvvjvOOuusli/129t/pkyZknOOpqameOWVV+K2226Lc88996Dq2Zfm5uaYM2dOTJ48Oaqrq1sex7PPPjtuu+22WLFixT7PUVdXF0OHDo1nnnkmIv7WIv6LX/wizjvvvJYvNxw2bFjL8T3VcNVVV7XUsOtaH3300Ta7VorXs88+Gz/60Y/i+uuvj3Hjxh2S0GvFihVx2223xdlnn93y77Zfv34xadKkmD179gF9Un7X74F3n2vYsGHx9a9/fZ8/U/l+np544om44oorWn4+MplMnHXWWfHNb35zj78nD9X5dnnzzTfjkUceiSuuuCKGDRvWcp5hw4bFTTfdFMuXL9+vuqZNm7Zf+5FOw4cPj3/5l3+JRx55JB544IF9doIf7ueTg/29MWXKlFavRaCtFFvwNX369Hj/+98f8+fP3+/7bNq0KT796U/H5MmT8/5sb9u2Le6///4YN25cy2vpfv36xaWXXtrq98H+/vE9m83GggUL4stf/nLL896u9x4///nP9/ne42BeLx/sc+7uGhsb49FHH41LL7205X3Urt+V999//z6vZZddI6UnT54cI0eObKmruro6Jk+eHC+99NJ+T/DY9fpk0qRJrWq68MILWz2+xx9//AFdK0eGtWvXxjXXXBPbt2+PO+64Y79/7trivWpbmT17dvTr1y/+67/+K++n1d/rz+mDDz4YI0aMiIEDB8ZTTz0VX/nKV3L+ZnD11VfH9u3bc+7blj+DsLvS0tL4+Mc/Hs8880z89a9/3a/7zJ8/P2bOnBkf//jHCzrO/p577ok+ffrE9ddfn3esWu/eveNrX/tarFmzJsaNGxcRETfffHPeoOqoo46Kz33uc3HSSSfFr371q72+nrrlllti1apVMWXKlD1OdOjTp09MnTo1Tj/99Ljjjjti1apVeW93/PHHx6RJk3JCr11KS0vj6quvjhEjRsQvf/nL2LFjxx7rgoP1+uuvx7333ht/93d/F1dcccV+h167lJSUxOc+97k499xz4+67747XX3+95djWrVvjxhtvjAEDBrQEYh/+8Idzngv39bejtvpbV8TB/11h98xh3bp1ceutt7Z6D/H3f//3B1TTuwm+ilgmk4n27dtHU1NT3ieULVu2xGc/+9no169ffPvb344+ffrELbfcEjNnzoyf/OQn0bdv37j++utj7NixUVdXt9e9Ghsb4+23344ZM2bE6NGj4/bbb4+ampqWtuYvf/nLsX379rj44otj4sSJsXbt2j2eK5vNxqxZs2L06NHx8MMPx2c/+9n405/+FE8//XRMnz69ZdTaySefHNOnT4/XXnst1q9fH9dee22r86xatSrOO++8qK2tjfvvvz+GDBkSP/jBD2LmzJlx1113RUlJSXzmM5/ZZz37Y82aNTFp0qQYNWpUvPDCCzFhwoSWFuxBgwbFPffcE6ecckp897vf3e/W6W3btsWXvvSl+NznPhd9+/ZtaSc/++yz885vX7duXVx11VUxatSoWLNmTVxzzTXxu9/9ruVax40bFxMnTtzjiwGSb9u2bfGjH/0oTjjhhJgwYcIBP8HuS1NTU/zkJz+JU045JaZPnx4jRoxo+Xf72c9+NpYuXRpnnXVWfOlLX9rnH4Ky2WzL75NvfOMbccopp8RPfvKTePzxx+Oiiy6KBx98ME455ZT4+c9/vs8/iDc0NMSrr74al1xySVx22WWxc+fOljEJt956a1RXV/9/7N17XM3Z/j/w11ajm6Qol6JESqSSiJJcxq3G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AVy6dAkHDhzAvn37EBsbK3rf2dkZjo6OWLx4MQYNGgQzMzMllpaIiIiINJm4wJcqr/h68eIFfv/9d1y5cgW2trZYuXIlfH19ubcXERERERHRaxj4oganra0Nd3d3uLu7K7soRERERNSIiUt1qMorvnx9feHr66vsYhAREREREak07vFFRERERESNkrqlOiQiIiIiIqLaMfBFRERERESNkrgVX6qc6pCIiIiIiIhqx8AXERERERE1SlzxRUREREREpHkY+CIiIiIiokaJgS8iIiIiIiLNw8AXERERERE1Skx1SEREREREpHkY+CIiIiIiokaJK76IiIiIiIg0DwNfRERERETUKHHFFxERERERkeZh4IuIiIiIiBolrvgiIiIiIiLSPAx8ERERERFRo8TAFxERERERkeZh4IuIiIiIiBolpjokIiIiIiLSPAx8ERERERFRo8TjuaD4AAAgAElEQVQVX0RERERERJqHgS8iIiIiImqUxK34YuCLiIiIiIhIvTHwRUREREREjZK4FV9MdUhERERERKTeGPgiIiIiIqJGiakOiYiIiIiINA8DX0RERERE1CiJS3XIFV9ERERERETqjYEvIiIiIiJqlLjii4iIiIiISPMw8EVERERERI2SuBVfDHwRERERERGpNwa+iIiIiIioURK34oupDomIiIiIiNQbA19ERERERNQoMdUhERERERGR5mHgi4iIiIiIGiWmOiQiIiIiItI8DHwREREREVGjxFSHREREREREmoeBLyIiIiIiapS44ouIiIiIiEjzMPBFRERERESNEld8ERERERERaR4GvoiIiIiIqFESF/jiii8iIiIiIiL1xsAXERERERE1Skx1SEREREREpHkY+CIiIiIiokaJqQ6JiIiIiIg0DwNfRERERETUKHHFFxERERERkeZh4IuIiIiIiBol7vFFRERERESkeRj4IiIiIiKiRompDomIiIiIiDQPA19ERERERNQoMdUhERERERGR5mHgi4iIiIiIGiWu+CIiIiIiItI8DHwREREREVGjxD2+iIiIiIiINA8DX0RERERE1Cgx1SEREREREZHmYeCLiIiIiIgaJaY6JCIiIiIi0jwMfBERERERUaPEFV9ERERERESah4EvIiIiIiJqlLjii4iIiIiISPMw8EVERERERI2SuMAXV3wRERERERGpNwa+iIiI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R0dHDoQRNULS2nRzc3NERESwTSdSUW5ubmL3+5Lm5MmTsLOzU2CpiEgV1DbGz329NBP3+JKBuFyg3NeLiN7Gm3sIcP8fIvXHek2kftLT0+Hk5FRtvy/WXSISt98X9/UiUn112e+L+3oRNT7ixvi5r5fmYqpDGcyYMQN+fn6i/z99+nQGvYjorYSGhsLS0lL0/7n/D5H6Y70mUj/iUpux7hJRZGRktZRIe/bs4X2BSA3Iut8X9/UiapzeHOMfMGAAx/g1mGDfvn1c8SWjqhkjrw9qEdWmS5cucHFxUfjnREZGIisrS+GfQ/J148YNmJqawtTUVNlFoTpo2rQpxo0bJ7frHT9+vNpqA1JvrNeqrUWLFhgxYoSyiyFSWlqK//73v8ouRqOXl5eH+Ph42Nvb81lfw7m7u6NDhw4K/Yxnz57h6NGjCv0Mahhs09WDl5cX2rZt+9bXycjIwIULF+RQIlK2EydOIDg4WOx7+vr62Lp1K/T19Ru4VPSmcePGoWnTpsouRr2EhYWhqKhI2cWgesrLy0NeXh7s7e2VXRSSgYmJCYYNG1bn87Tz8vIUUBzNVNUo8m9GddGlS5cG+yz+NtVPVSea/3bqxdzcXO7X5G9Ac7BeqzZV3LCYvxXV0KtXLwD89yD54O9IM7BNb3z4b60ZevXqhdjYWKSlpdV4b/bs2SguLkZxcbESSkaahPcL9WZqasp/QzVhYmJSr/OY6pCIiIiIiIiIiIg0xuzZs2sMlg4fPhydO3dWUomIiKghMfBFREREREREREREGkNPTw++vr5wcHCAnp4eBgwYoFLpromISLG0lV0AIiIiIiIiIiIiInkyNzeHr6+vsotBRERKwBVfREREREREREREREREpBEY+CIiIiIiIiIiIiIiIiKNwMAXERERERERERERERERaQQGvoiIiIiIiIiIiIiIiEgjMPBFREREREREREREREREGoGBLyIiIiIiIiIiIiIiItIIDHwRERERERERERERERGRRmDgi4iIiIiIiIiIiIiIiDQCA19ERERERERERERERESkERj4IiIiIiIiIiIiIiIiIo3AwBcRERERERERERERERFpBAa+iIiIiIiIiIiIiIiISCMw8EVEREREREREREREREQagYEvIiIiIiIiIiIiIiIi0ggMfBEREREREREREREREZFGYOCLiIiIiIiIiIiIiIiINAIDX0RERERERERERERERKQRGPgiIiIiIiIiIiIiIiIijcDAFxEREREREREREREREWkEBr6IiIiIiIiIiIiIiIhIIzDwRURERERERERERERERBqBgS8iIiIiIiIiIiIiIiLSCAx8ERERERERERERERERkUZg4IuIiIiIiIiIiIiIiIg0AgNfUty9exd+fn6Ij49XdlGISE5yc3Px7bffIjw8XNlFIaI6YrtM1LiFh4fj22+/RW5urrKLQkRywnpNpH5evnyJAwcOYPv27SguLlZ2cYhIhbEPT8rEwBcRERERERERERERERFpBG1lfbBQKERBQQGuXr2KW7du4d69eygpKQEAmJmZwdTUFJaWlrCxsYGFhQWaNm2qrKKqtJcvX+LQoUOIiYmRy/Xc3d0xduxYvPPOO3K5HjU+RUVFuH79OlJTU5GRkYH8/HwAgImJCUxNTdGhQwd07twZHTp0gL6+vpJLq7ri4+MRHBwsl2uZm5tjxowZMDMzk8v1SHOx/soH6y+pIz6by0dxcTF+/fVXpKamyuV6I0eOxLBhw+RyLWp8KisrkZ6ejhs3biAtLQ3p6emi96ysrGBiYoLOnTvDxsYGrVq1QpMmnBcrDus1NTTWXfm4e/cuAgIC5HY9Pz8/WFtby+16RPLAPrx8sA+vmZQS+Hr27BnOnTuHP//8E6WlpbCwsICdnR3atWuHsrIyPHz4EHl5ebh+/ToAQF9fH0OHDoWnpye0tLSUUWSV1qxZM9jZ2Ul8v6KiAg8fPgTwqvJJ+xs2a9ZM7uWjxqGsrAwXLlxAeHg4SkpKYGZmBnNzc7i5uQEAHjx4gIKCApw6dQqnTp2Cjo4O3Nzc4OPjw8EzMXR0dKTWawDIz89Hbm4urKysoKurK/E4PT093jtJKtZf+WL9JXXDZ3P5EQgEMDY2lnoPePnyJTIzM2FgYABTU1MIBAKJx+rp6SmimKThhEIhHj58iOPHj+P69evQ0dGBhYUFPDw8YGxsjIKCAuTk5CA1NRUJCQkAgHbt2uGDDz5Ap06dlFx61cN6TQ2FdVe+3nnnnVqfyZ89e4bMzExYWFjUOh7GCeKkStiHly/24TVTgwe+8vLycPDgQdy7dw/9+/eHp6cnmjdvLvbBsKSkBPfu3cPly5fRsmVL/mjEeOeddzBy5Eipx1TNUAOAadOmwcDAoCGKRo3Is2fPEBoairi4OLi6umLYsGFo1aqV2HpdVlaG+/fvIzExESYmJnx4lMDBwQEODg5SjwkPD8fx48cxevRozjyjemP9lT/WX1InfDaXL319fUycOFHqMbm5uQgKCoKVlRUzLZDcCYVCXL16FaGhodDW1sbUqVPRo0cPsYNcVSs9q1aVtGjRQgklVn2s19QQWHflr3379vjkk0+kHlO1ymPgwIHo1atXA5WM6O2wDy9/7MNrpgYNfL148QLh4eHIzc3FjBkz0LVrV6kzofT19dGtWzd069atAUtJRHVRWVmJyMhIXL16FZMmTULv3r2lplpo2rQpOnfujM6dOzdgKYlIHNZfosaNz+ZEmicrKwvHjh1D27Zt8cEHH8DExETisQKBACYmJvDw8ICHh0cDlpKI3sS6S0SyYB+eSHYNmgj4/v37uHr1KlxcXGBnZye1Y01E6iE3NxdXr15Fjx494OTkxPziRGqE9ZeoceOzOZFmqaysRGJiIgoLC+Hp6Sl14JyIVAfrLhHJin14Itk1aO24d+8eSktL0bVrV1ZMIg2RmZmJnJwc2NraSs1xS0Sqh/WXqHHjszmRZnn+/DkyMjJgZWUFCwsLZReHiGTEuktEsmIfnkh2DZbq8OXLl3jy5AnMzc1haGgot+vevXsXAQEBmDp1ap3y8dbnvKo8yleuXEFqaioyMjJQWloKExMTWFpaokePHrC3t9eoG094eDju3r0r2htMKBTi9u3biI6Oxq1bt1BSUiJKezNmzBiJm4EKhUJkZ2fj0qVLSEtLQ2ZmJgDAysoK9vb2cHV1hbGxcZ1mGldWViI9PR1//fUX7ty5g9zcXOjo6Ij+LZycnOT6WyPxHj9+DABo2bKl3K758uVLHDp0CI8fP67TvnT1Pa+oqAjJycm4du0a7t27J/pdd+zYEd27d4eDg4NG/Zaq7n9+fn6ivMT5+fmIiorC9evXkZubC+BV/awtd3FRURESExNx9epV0T3RzMwMnTp1Qu/evWFlZVWnwVRF3CtIMkXU36p9JVu2bFmnPS7qc15jbJflVX8VUddYf9WLJjybVz0LJiYm4s6dO6LfnIWFBTp16gQnJ6c6t0OqrOo5B4DoPlleXo7r16/j4sWLuHv3ruge6OTkhBEjRkjcvFwRz9F8Nle+4uJiFBUVwcrKCjo6OnK7Luu14qh6vX7x4gWuX7+Oy5cvi/pJVc9ZvXv3ho2NDfeLkQNF1d2q/atef25U1HkvX77EnTt3kJCQgHv37lV7JrW1tYWzszPatGmjMc+BVfv6DRo0SHR/e/bsGWJjY3HlypVq967BgwejZ8+eEq+liHrGuqu52IdXP+zDK0+DBb60tLSgr6+PoqIilJaWNtTHyk15eTkuXLiAsLAwaGlpwdzcHB4eHtDS0kJmZiYyMjJw5coVmJmZ4f3339fIdDFlZWUICwvD+fPnYWZmhg4dOgB4VUl0dHQkPoA/ffoUx44dQ2xsLPT19dGlSxc4OTmhsrIS9+7dw5kzZ3DmzBn4+PigX79+0Nau/WeZk5ODw4cP4/r16zAxMUHnzp3Rp08flJaW4u7duzh48CDOnj2L0aNHw9HRUeP+LVRJVbCzpKREySWpO6FQiKSkJBw+fBjFxcWwsLBAz5490bx5czx48AA5OTn4/fffcfToUYwdOxa9evXSmE52FaFQiCtXruCPP/4AAJibm4tSawiFQonBw/Lycly8eBHHjx9HSUkJOnfujAEDBkBHRwc5OTm4efMmLl68CFdXV4waNQrNmzevtSyKuFeQdOpcf9ku17/+KqKusf6qH3V/Nn/69CmOHDmCuLg4mJmZoXXr1ujRoweePn2KrKwsxMbG4vz58+jRowfGjh2rkWmjioqKcPDgQSQmJsLCwgIdO3YEAFRUVEBXV1fi4IMinqP5bK4adHR0oKenh+LiYpSXl6vdoCbrterU66p+0rFjx5CbmwsLCwv07dsX+vr6KCgowK1bt7Bjxw7Y2dnh/fffR+vWreX+t2hM1L3u5uTk4L///S9SU1NhYWEBCwsL9O7dG3l5ecjJyUF4eDjCw8Ph4eEBb29v6OvrK7vIcnfnzh2EhITgyZMnsLCwgJ2dHYBXASgjIyOx5yiinrHuaj724dUb+/ANq8FK3KRJExgbG+Pp06d4+PAh2rdv31Af/daqNg68dOkSJkyYAEdHxxoPIpWVlbh16xaOHDmCPXv24MMPP0TPnj01poJWVlYiKioKt2/fxieffIIuXbrIFAB48uQJ/vjjD9y5cwcTJkyAq6trjQBZYWEhwsLC8J///AdlZWUYNGiQ1GtnZWVh//79eP78OWbPng17e/tqlU8oFCInJweHDh3Cvn37UFFRoVH/FqqmVav/3969BVd13nfj/0lICCQhjIQOCCHEyQgwYBt8AnyI3UDs2I49duK2iZNpms60007TmU5vO/92Ju1VLnLRTNOLzjtx0yZuUmLHYBsb28Q2tsPJCB84ROIojABzkIRAEqD3gr/01kZYewttsffi87mz2XtrIdZ3refZ32etNTkiLj0nZP78+TlTDPX19cXWrVvj17/+dTzwwANx5513XraipK+vLw4ePBhr1qyJn/3sZ9He3j7k/plrmpubY+3atfHlL385li1bltKqmvPnz8frr78eL7zwQixbtixWrlwZkyZN+sxrent7Y+PGjbFmzZo4d+5cPPXUU1+4wjQTxwqGlqv5dV6+ZDj5zUTW5Dc35fLYvP/L8YsXL8bf/u3fxrRp0y7L9rlz52Ljxo3x0ksvxf/5P/8nvvnNbybqy53u7u546aWX4ty5c1f8HQwmE+NoY/PsMW7cuJg0aVIcOHAgTp8+HePHj7/Wm5Qyuc6eXPf19cWWLVvi2Wefjblz58Z3v/vdy67UuXjxYmzfvj2ef/75+NnPfpa4f4vRlsvZPXLkSDz33HNRVVUVf//3fx/l5eWX7Vvt7e3x+uuvx2uvvRanT58ecm6Ya/qL55tuuim+9KUvpbToMxM5k93rgzl8bjOHH12jurWzZs2K6urq2LhxY7S1tY3mj74q27Zti3fffTeeeuqpWLp06aCrb/Lz86OxsTG+853vRE1NTaxfv37gUsVcd+bMmdiyZUvs2LEjnn766WhsbExpR+/p6Yl169ZFa2tr/Omf/mksX7580KvCbrjhhvjGN74RK1asiA0bNsTevXuv+JkdHR2xZs2aiIj43ve+F4sWLbqscc7Ly4uampr41re+FTfeeGOsX78+jh07lubfmlRNmTIl5s6dG5s2bYqWlpZrvTkpa25ujhdffDEee+yxuPfeewc92eTl5UV9fX1861vfioULF8aGDRvi97///TXY2sxoaWmJdevWxVe+8pX40pe+lNIJt38F2SuvvBKPPPJIfP3rX7+s9IqIKCwsjHvuuSeeeuqp2L17d7z77rtx8eLFQT8zE8cKUpOr+b3ez8sRw8tvJrImv7ktF8fmPT098eKLL0ZExB/90R9FfX39oJPhcePGxZe+9KV46qmn4siRI/H6669HT0/PaG9uRpw4cSLefvvtOH36dPzxH//xFX8Hn5eJcbSxeXYpKiqK2bNnR1tbW7z55ps5s8/LdXblurm5OdasWRO33XZbPP300zFlypTLtiU/Pz9uueWW+OY3vxkdHR2xYcOG6O3tHcbfnIjczW5nZ2c899xzMW3atPjGN74RFRUVg+63ZWVl8cgjj8QjjzwSO3bsiI0bN15xbphrDh06FK+88kosXLgwvvrVr6ZUekVkJmeye30wh89d5vCjb1SLr+rq6rj77rvjyJEj8fOf/zwOHDgQfX19o7kJw/LRRx/F8uXLY9asWUO+trq6Or785S/H8ePHY8uWLYk4mR89ejReffXVuPvuu6Ompibl93388cfx1ltvxcqVK4f83Y0dOzaWL18e48ePj/fee2/QgV5fX19s3rw5du/eHQ899NCQq1ImTJgQK1asiOPHj8fmzZsT8W+RjcrKyuKee+6Jc+fOxS9+8Yv48MMPcyLXu3fvjvnz56d0q48JEybEypUro6CgIDZv3pwzE5GhbNiwIcrLy2PRokUpr6A5ceLEwC1mVqxY8YUleF5eXixYsCAWLVoUmzZtuuKAZaSPFaQuV/N7vZ+XI4aX30xkTX5zWy6OzY8dOxZHjx6NL3/5y0OuFs/Ly4vFixfHsmXLYuvWrbFv375R2srMamlpiU2bNsU999xzxdsnfV4mxtHG5tlp0aJFsXTp0njrrbfiueeei87Ozmu9SUOS6+zJdVdXV2zYsCEqKipi5cqVV3ycQb+ZM2fGkiVLYvPmzTn5hVg2ycXs9j8L5v777x9yX8nPz49ly5bFzTffHFu2bEnMl9mbN2+Os2fPxh133JHybcAykTPZvX6Yw+cuc/jRN6rFV15eXixfvjyefPLJOHLkSPzwhz+MZ555JlpaWrJ6J66uro558+alvFPOmjUr5s6dG7t3745Tp05leOsyr7u7O2bMmBHz589P+Xdw9uzZ2Lp1a8ydOzcWLFiQ0vuqqqqisbExWlpa4vjx45f9+cmTJ2P79u1x8803p/yA1fr6+pg7d240NzdHR0dHSu8hfQsWLIhvf/vbERHxb//2b/Gv//qv8dFHH2X1yqGioqK46aabUh6c1tbWxsKFC+Pjjz/OmVXxqbjrrruGHBT/bzt27IgjR47E7bffntLqlHHjxsXChQujra0tmpubL/vzTBwrSE8u5vd6Py/3Sye/mcia/Oa+XB2bz5s3L6ZMmZLSawsKCuKWW26JoqKi+PDDD+PChQsZ3rrM6+7ujvnz56c8Ho7IzDja2Dw7FRcXxxNPPBErVqyIt956K37wgx/ESy+9FCdOnMjqL8bkOjty3dLSEk1NTbF06dKUCrj8/PxYuHBhFBUVxe7du7P63JHtcjW7jY2Ng94BZDDFxcVx6623RltbW+zcuTPDWzY6Ojo64vbbb0/5Sq+IzORMdq8v5vC5yxx+dI36jRnz8/Pj9ttvj7/7u7+Lu+++Oz744IP40Y9+FP/8z/8cL7/8crS1tWXdSX3KlCkpr7qKuHQynzVrVuzduzdOnjyZwS0bPTNnzkzrPtPHjx+PlpaWqK+vH3jw4lAKCgpi2rRpcezYsThx4sRlf3748OHYu3dvTJ8+PeWDxPjx46O2tjaOHj0a7e3tKW8/6cnLy4t58+bF97///XjooYfiwIED8ZOf/CT+6Z/+KVavXh0HDhzIuoFUbW3twL2RU1FQUBA33nhjtLe3x5EjRzK4ZaOnoaEhKisrU3792bNnY+/evTFt2rS07gNeU1MzkMPPfzGRiWMF6cnF/Dovp5/fTGRNfpMhF8fmtbW1aS3aqKqqipkzZ8Ynn3wSZ8+ezeCWjZ5Zs2al9YDpTIyjjc2zV3FxcTz55JPxV3/1V/wqaS4AACAASURBVFFfXx8vvvhi/MM//EP8+Mc/jk2bNmVl6SjX1z7XFy5ciD179kRlZWXU19envB0VFRUxZcqUOHbsWHR3d6f8Pi6Xi9mtr69P65kv06ZNixkzZsSRI0dy7sqBwUyfPj3q6upSfn0mcia71x9z+NxkDj/6Uh9VjbDy8vJ48sknY9WqVfH+++/Hpk2bYu3atbF27dqYNWtWLF++PBYuXJjW4DdTKisro6ioKK339K9WO3HiREqXcWa72tratB4m2NbWFu3t7dHQ0JDWIKiioiIiYtAGubW1NcrKytI6kefl5UVlZWW0t7fH6dOnc+rB7bmotLQ0Vq1aFffee298+OGH8e6778Ybb7wRb7zxRtTW1sayZcvi1ltvjZKSkmu9qTF58uS0t6O8vDwqKyvj+PHj0dfXl/MP2Kyurk7pqq1+HR0dcezYsZgzZ07KJ8iIS/tFWVlZnDp1Knp6ej5TomfiWMHw5FJ+nZfTz28msia/yZJLY/NUrwrpV1RUFJWVlfHhhx/GmTNn0jqHZaPKysq0Js0RmRlHG5tnt7y8vJgzZ07Mnj07jhw5Eu+++240NTXFf/zHf0RRUdHAbaunT5+eFWNaub72uT537lwcOXIkpk6dmvIVPBGX/i0mT54chw8fjrNnz6a1YJbL5VJ2Kysro7y8PK33lJSUxOTJk+PEiRPR09OTFeOKq1FVVZXW8ScTOZPd65c5fG4xhx9916z46jdhwoS4++67Y8WKFXHixInYvHlzvPvuu/HTn/40qqqq4itf+UosXrw4rZVPI62wsDCtnSHi0gmkqKgo55rQwZSVlUVxcXFa7/n0008jItJ+X7/Przbp7e2N06dPx4QJE9I+UPY7d+7csN5H+saNGxdLliyJW2+9NTo6OmL79u2xcePG+OUvfxlr166NVatWxbJly67pIHfs2LFp53rs2LExbty46OjoiPPnzw/6MM5cUlpamtbvoLOzM1pbW2Px4sUxZsyYtH/euXPnLlt1NNLHCq5eLuT3ej8vR6Sf30xkTX6TKVfG5unIz8+PoqKiOHz4cJw5cyZDWzV6SktL05o0Z2IcbWyeO/Ly8mLKlCnx+OOPx6OPPhr79++PjRs3RlNTU2zatCkWLFgQDz30UEydOvWafoku19c+12fOnImOjo6oqKgY1jG+p6cnzp8/P6xt4XK5kN2xY8emva/0Z7ezszO6urpyvrQuKSlJ63eQiZzJLubwucEcfvRd8+KrX15eXlRUVMSqVavi/vvvj+3bt8fLL78cP/3pT+Pee++Nhx9++JoFNN0VLBGXdqDJkyfHxYsXc/7KkHQH0729vQO3TfjRj340ItvQ29sbp06ditbW1vjBD34wIp9J5uXl5UVZWVncfffdsXz58tizZ0+88MILsXr16ti7d288+eSTQz7AOlMmTJiQ9qBw/PjxUVJSMpDrXJfuJOP06dMREQNXAKSrsbHxM/+diWMFIyeb83u9n5cj0stvps7L8pts2To2r62tHdaq1f4V0Ek4f/d/CZCqTIyjjc1z05gxY2LmzJkxc+bMaG9vjw0bNsSbb74Z//Iv/xJf//rX45Zbbrkm50e5zo5cd3V1xfHjx6O1tTXefvvttN8/derUEdkOLpet2S0tLU37y9PCwsIoKyuLvr6+RGS3uLg4rUWhmciZ7NLPHD67mcOPvqwpvv63wsLCWLp0adx4443x/PPPx4YNG6KsrCzuv//+tNvhkXA1wRrulSGbN2+OZ5555gtf8/3vfz+th9+Opr6+vigrK4vbbrttWC3y52910dfXFxcuXIjq6uq45ZZbhnWlTTrPc2Lk5efnx9y5c6OhoSHWrVsXr776apSWlsbXvva1a/LFWX5+/rCzffLkyejt7U17u1taWoY8uTz99NOxdOnSYW1XpvU/n2vp0qVp344m4lJx+PmycaSPFWRGtuX3WpyXcz2/mcia/F4/smlsnpeXd1XHgOE8I6C3tzdWr179hV8mNTY2xre//e2suJXM52ViHG1snvvKysri4YcfjgULFsQvf/nL+M1vfhNlZWUxe/bsUd8WuU5fJjJ48eLF6O7ujvnz5w/rllIFBQVpXbXG8CQlu8O9WvPMmTPx05/+NHbu3HnF1yxfvjwef/zxrLxDSyZyJrsMxhzeHN4cPkuLr35lZWXx6KOPRldXV/zud7+Lm266KWpqaq71ZqVlOFeVRFwahD7yyCNDfnY2mzBhQtx5551RVVU1Yp85adKkuOeee7Jy8kFqioqKYtWqVXHmzJnYtGlTLF68OG688cZrvVlpmTRp0rAG0RMmTBgy17nwJdC8efNGdGCQiWMFmZGE/A73vJyE/GYia/J7fUnC2DydZ1/0y8/Pj1mzZn3hStXBFndkm0yMo43Nc1teXl7MnDkzHnvssXjmmWfid7/7XdTX1+fcM3fkemQz2NDQEH/wB38wYp/HyEtCdod7pWdBQUEsWrQo5syZc8XXTJo06Zosmk9HJnImuwzGHN4cfjQ+M1tl9yguLk2wFyxYEM8++2wcOnTomkyu++9/mY7+S42He1VJQ0NDNDQ0pP2+bFBYWBgTJ06Mjo6OEbv359ixY6OioiIOHz4c3d3dJtc5buzYsXHLLbfEO++8E3v37r0mJ93Tp09Hb29vWgXW2bNn48yZM1FRUTGsXFdWVub0QLT/i4HOzs4R+bxMHCvIvGzI77U4L+dyfjORNfm9fl3rsXlra2t0dnamPVHrvyJkOPkfM2ZMLFmyJO33ZYtMjKONzZNl+vTpMXfu3Dh06FCcOnVq1L8Ikev0ZSKDpaWlMXXq1Ojq6ooLFy4M65m+jK5rnd2Ojo44c+ZMWvtf/622hnu1WFFRUSxfvjzt92WLTORMdhmKOXzuMYcfGdm9BOL/19++DickV5LOvYR7e3vj4sWLaX1+Z2dndHd3D+sepklQWloa7e3tA88EulpjxoyJ4uLi+PTTTxPx8GIurTCorKwcKKBGQl9fX8pZ7enpSTvXZ8+eHXiIdLav/syEcePGRWVlZZw8eXLgtodXa6SPFYyOTOU31XOz83L6MpE1+b1+ZcPYPB0XLlyIzs7OYa8uz3WZGEcbmydLYWFh3HDDDQMF1EiR68zJRAaLiopi/PjxcerUqejp6RmRzySzrnV2e3p64vz582l99vnz56Ozs3NYzwdLgkzkTHZJhTl87jGHv3o5UXz1G8lLlY8cOZLya0+dOpXWQaGvry9aW1ujqKgoKisrh7N5OW/KlClRVFQUra2tI/LA0vz8/KipqYn29vZoa2sbgS0kW4zkwynPnj0bx44dS+m1J0+ejHPnzqX1+W1tbdHe3h41NTU5/1DN4Zg4cWJMnjw52tra0v7dXclIHysYXSOZg/b29jhx4kRKr3VeTl8msia/XKux+fHjx9P67HPnzkVbW1tMmjQp628VngmZGEcbmydTUVGRXOeITGSwuLg4qqur49ixY9HR0TEin8noGMnsXrx4MeV9ajj7SkdHRxw7diwqKyujqKhoOJuY0zKRM9klHebwucMc/uplffHV19cXhw8fjojBH6BWUlIStbW1aa047e3tjdbW1pRff/jw4bSa0I6Ojmhubo6GhobrtpWurq6OmTNnxp49e6K9vX1EPrO+vj6mTp0aO3fuHLEv3bl2jh07NjDg/fztBgsKCmLChAkDt05I1aeffhoHDx5M6bUHDx5M67jR09MTu3fvjurq6px7mONIKS4ujhkzZkRLS0vKv+ehZOJYQeZ9UX4LCwtj0qRJ8emnn6a14vDw4cMpF9fOy+nLRNbk9/qUDWPz1tbWtCbOra2t0dLSEnV1ddftw9szMY42Nk+O/hKptrY2ysrKLvtzuc5OI53BwsLCmDlzZrS2tkZzc/N18YVYrhsqu/3Pv0v1i+mIS4tJDx06lPLr9+3bl9a+0tLSEq2trTFt2rRhPTc712UiZ7JLKszhc485/NXL+uLr+PHjsW3btpg+ffqgk+vS0tKYOHFiHDp0KLq6ulL6zE8++SQ+/vjjlLehtbU1Pv7445ROHn19fbF79+7YtWtXzJs377pcfRZx6QvyxYsXx549e2Lz5s1pX846mMmTJ8f8+fOjqakpPvrooxHYSq6Vzs7O2Lx5c5SVlcWMGTMu+/O8vLyorKyM1tbW+OSTT1L6zPPnz0dTU1PK96nt7u6OpqamlG/NsG/fvvj444+jsbEx6x9+mSl5eXmxcOHCuOGGG+Ltt98ekdtpZOJYQWYNld/+QfPhw4dTXr3d1dUVO3bsSHkbnJfTl4msye/1KRvG5h9//HHK44Oenp7YunVrFBUVxYIFC7L+YfeZkolxtLF5cuzcuTN27doV9fX1g355LtfZKRMZnDNnTsyZMyfeeeedtK/CY/QNld0JEybE1KlT48CBAynPe1taWqKlpSWtbeh/3t5Q2tvbo6mpKaZPnx5z5sxJ+WckTSZyJrt8EXP43GQOf/WyeoR4+vTpeOGFF2L//v2xZMmSQRve4uLimDt3buzatSuam5uH/MyOjo5Yt25dWitebrrppnjzzTdT+vwjR47Eb3/725gzZ07ceuut1+Xt0CL+3xfkixYtipdffjm2bdt21atO8vPz44477oiampr4zW9+E7///e9HaGsZTd3d3fHyyy9HU1NTLFmyJKZOnTro62bMmBHTp0+PrVu3DjnB7uvri+3bt8fGjRtT3o7Gxsb44IMPYvv27UPum6dPn47f/va3MX78+Ljzzjuvy+d79aupqYk77rgjmpqa4sUXX7zqe4hn4lhB5qSS37y8vGhsbIyIiG3btg05yb548WJs3Lgx3n///ZS3w3k5fZnImvxef7JhbF5dXR0VFRWxbt26IW/n09fXF01NTbF169a44447Ytq0aSn9jCTKxDja2Dz39fX1xe9///t48cUXo6SkJJYuXTroOFeus1MmMjhx4sRYtmxZHDlyJJ577jm3TctSqWa3vLw8Zs+eHTt27Bi4WvuLtLW1xSuvvJLyYtL6+vq4ePFirF+/fsh54fnz5+O9996LDz/8MO66667r9gqOiMzkTHa5EnP43GUOf/XGPPjgg//faPygY8eOxZo1ayLi0sC5sLDwijtuV1dXbN26NX7+859Hc3Nz3HvvvfHAAw8MeiLPy8uLiRMnxt69e2Pbtm1RWloaVVVVl636unjxYuzevTv+67/+K06fPh333HNPHDx4MBYsWBC1tbWDbsfJkyejpaUlHnvssbhw4UK88cYbUVxcHJWVlTFmzJjPvPb8+fPxwQcfxC9+8Ys4f/58PP7441lzO7Te3t7Yvn17REQsXrw4xo4dm/J7m5ubo62tLW6++ea0Hxo8duzYqKuri/3798c777wT3d3dA/cSHUxXV1fs2rUrduzYEdOmTbvsdxxx6TYbVVVV8dFHH8V7770XBQUFUVNTM+i+0dfXFx0dHdHU1BT79u2L+vr6tLZ/pNTX119xHxtJ+/btG/VnLJw5cyaef/75OHv2bBQXF8fYsWOvmOuenp7YuXNn/Od//mc0NTXFzTffHA8//HCMHz9+0NePHz8+ent74/XXX49Tp07FtGnTBn1te3t7vPLKK7F27dq45ZZboqqqKnp7e6+4r585cybef//9WLlyZdxwww3x0ksvDdwj//P7UV9fX7S0tMSzzz4bBw8ejK997WsxZ86crDnpNjc3x549e+LOO+8cuI1FKk6ePBnvvfdeLF68OO19My8vL+rq6qKnpyfefPPNOHz4cFRWVkZZWdmgv5cLFy7EwYMH45133ony8vJBH2CciWNFppWVlcX8+fNH7PP27NmT1oKMkZDJ/JaWlkZnZ2e8/vrrcf78+airq7ssj319fXHixIlYvXp1bNy4Me65554oLCyMkpKSmDdv3qD/rkk5L0dcm/xmImu5mN+KioqsWmV84cKF2LJly6j/3Fwcmzc3N0dhYWGsXLkympqaYufOnVc8B505cybWr18fa9asiXnz5sVDDz2UNbdD6x+L3HDDDVc83g3m4sWLsXPnzjh79mzaY/qIzIyjc3Fs3tjYGBMnTszoz+jp6Ylt27Zl9GcM5v33348tW7ZEUVFRjB8//oqLtfrPwa+88kr8+te/HjhPzp07d9DjgFwPLUm5rq6ujjFjxsTvfve72LVrV1RUVER5efmg+0b/86DefvvtKCoqyni2rmTBggUjckXA6dOnY9euXSOwRenJVHbz8/OjpKQk3n///di1a1dMnjw5KioqLnttb29vbNu2Lf77v/87xo0bF0uWLImWlpYrjlP799spU6bEXXfdFW+++Wa0trbG1KlTY/z48Zd9/smTJ+OFF16I9evXx7333hv33Xdf1iwmPXz4cDQ1NaU9tu7PfE1NTcyePTvtn5uJnOVidpcuXXpN5gMjYffu3Slf7ThSzOGvLXP4azeHnzx58rCOtaN2punr64t9+/bF22+/PfD/GhoaLhuonjhxIo4ePRoREVVVVfHtb387Fi9e/IUnxfLy8njiiSfiV7/6VTzzzDOxZs2aqK2tjfr6+uju7o4DBw5Ea2trdHV1xcyZM+M73/lOjB07Npqamobc7v7bOjzyyCNRUlISzz77bPzqV78auBolPz8/WltbY//+/XHixImYOXNmPPHEE1FXVzfM31SyVFVVxZ/8yZ/EmjVr4tVXX41XX3016urqoqqqKmpra+Ps2bPR2toanZ2dA/eRvvfee7/wM2fNmhXf+9734rnnnovVq1fH6tWro6GhIaqrq6OqqipOnjwZx48f/8y+9Oijj2b873q9OnbsWLz55psD/11XVxelpaWfec3//vctLi6Oxx9/PJYtW/aFE7u8vLxYtmxZnDt3LtavXx9btmyJhoaGqKurixtuuCEOHz4cR48ejUOHDkVRUVE88MADcf/998drr7025K0ZCgsLY8KECdHY2BgTJkyI1atXx9q1a2P69OnR0NAQRUVFcfTo0di7d28cPXp04FjU2NiYNaXXtTR27Nh49NFHo7KyMtauXRs//OEPo7y8PGpqaqKuri4KCgri4MGD0dXVFYcOHYru7u5oaGiI22677YqfmYljBUPLVH4LCgpi5cqV0dvbG6+99lq8/fbbUVdXN5CvgwcPRltbWxw9ejSKi4vjySefjEWLFsXzzz8/5DY7L1+dTGRNfnNTro7NS0pKYurUqfH000/H6tWr44c//GFUVVXFjBkzoqqqKrq7u2Pfvn2xf//+6O7ujhUrVsRXv/rVQRdeXI8yMY42Ns8e58+fj3Xr1sW6desi4tJ5e+rUqZ/5guLChQsD+Yu4VBg89NBDMXXq1C8c58p19hrpDObn58f9998fFRUVsWbNmvjxj388sC/V19fH+PHj4/Dhw9HR0THwb15cXDxwtQDpy2R2p02bFt/4xjfif/7nf+LHP/5xVFVVRV1dXdTW1sapU6fik08+GZizLVq0KB5//PE4depUvPrqq0Nud2lpadx4443xne98J371q1/FP/7jPw6M+SdNmhRdXV3R3Nwc+/bti6KionjooYfi/vvvvy6f7fV5mciZ7F4fzOGvP+bwwzdqxVdVVVX89V//dezbty8OHjwY+/fvj46Ojti5c+dnXtfQ0BArVqyIhQsXxqxZs1I+IdbV1cVf/MVfxI4dO2LLli3R0tISH3zwwcBn3nbbbbFo0aJoaGiIgoKC6OzsvOzAMJiJEyfG+PHjo7CwMFatWhW33357bN26NXbu3Bnr16+P7u7uqKqqijlz5sSSJUti1qxZWbNyJVuUlZXFH/7hH8YDDzwQO3bsiJ07d8aHH34YW7dujYgYCNayZcti3rx5MWnSpCHLherq6vizP/uzOHToUOzYsSN27doV77333sCfNzQ0xIwZM+LBBx+M2bNnX7f3g820kpKS+N73vjeQ6QMHDsTp06dj7969n7k9Ql1dXdxxxx0xf/78aGxsTHllZv/qz5tvvjneeeed2LNnT7z11lsRcWnyXVtbG3fddVcsXLhwYIVSeXn5kMVXaWlplJSURH5+ftx+++2xYMGC2L59e3zwwQfx1ltvRVdXV5SXl8f06dPjwQcfjJtuuint1ZdJV1BQEHfffXfceuutsXPnztixY0fs379/4PkC/UXYAw88EI2NjVFXVzfkqpBMHCu4skznt38wfNttt8W7774bzc3NsX79+oiIgQn3V77ylWhsbIySkpLo6+uLCRMmDHlbDuflq5eJrMlv7snVsfmkSZNizJgxUV5eHt/97ndj//79sXXr1mhubh4YCzY0NMR9990XS5YsiaqqKvva52RiHG1snh2WLFkSs2fPjubm5mhtbY3W1tbPlB0Rl87P9fX1MXPmzFi0aFHU1NSknBG5zl4jncG8vLy4+eabY/78+bFnz57Yvn177N27d2As1/9l+vLly6OxsTHq6+vNl65CJrObl5cX8+bNi7/5m7+JrVu3RlNT08AYraioKOrq6uK+++6LhQsXRl1dXeTl5UVvb29KVyX0P/u6rq4u/vIv/zKam5tjy5YtsXv37jh69GgUFRXF9OnT49FHH41bb701rSskrgeZyJnsJps5/PXLHH548n70ox8l90aOkAWWL18eS5YsyfjPeeONN1JaUQlcvalTp8YTTzwxYp+3du1az0aBUTJnzpx48MEHr/VmDOju7o6f/OQn13oz4Lrx2GOPZfw2i52dnfHv//7vGf0ZwP/z9a9/fURuh7V///547rnnRmCLgFT8+Z//ec4Wby+88MKQi66BkTF37txYtWpV2u/LH/olAAAAAAAAkP0UXwAAAAAAACSC4gsAAAAAAIBEUHwBAAAAAACQCIovAAAAAAAAEkHxBQAAAAAAQCIovgAAAAAAAEgExRcAAAAAAACJoPgCAAAAAAAgERRfAAAAAAAAJILiCwAAAAAAgERQfAEAAAAAAJAIii8AAAAAAAASQfEFAAAAAABAIii+AAAAAAAASATFFwAAAAAAAImg+AIAAAAAACARFF8AAAAAAAAkguILAAAAAACARFB8AQAAAAAAkAiK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)" + ], + "metadata": { + "id": "iQu8IcsyLK4A" + } + }, + { + "cell_type": "markdown", + "source": [ + "Through this model we ensure that the highest importance is given to the city in which the house is located in. From our analysis we know that the highest importance is given to features which represent city like mumbai, kolkata, etc. This model also considers the fact that a house cannot be in 2 cities at once. for example, any record cannot contain Bangalore=1 and Chennai=1 as well (unless it is a mistake in which case the decision tree will traverse to sub-tree under the 'Other' branch).
\n", + "So in this approach we divided the training data according to city. We will then train 6 decision trees for all the cities present in the training data. We also train a 7th decision tree on the whole training dataset so that if the test dataset contains a record of a house in a new city(city which is not in training) then the model can still predict for that record.
\n", + "We then aggregated all our results into a list and then found our mean squared error and R2 score for train data as well as test data.
" + ], + "metadata": { + "id": "bUY98fKhQHTL" + } + }, + { + "cell_type": "markdown", + "source": [ + "Link to the drive folder: https://drive.google.com/drive/folders/1t6IG7zAGIDNgaQNLrAoFvepRxSAwpxgW?usp=sharing
\n", + "Share Notebook: https://colab.research.google.com/drive/1My3X3WBL8g13ekUkVt6MAVcUhF_ZyS1U?usp=sharing" + ], + "metadata": { + "id": "_EiRxqFOEipa" + } + }, + { + "cell_type": "code", + "source": [ + "import warnings\n", + "warnings.filterwarnings(\"ignore\", category=UserWarning) " + ], + "metadata": { + "id": "6ktS8GzlHa8h" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!pip install eli5" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JJMd3ApwhuDv", + "outputId": "2d9d1914-b2f8-4b10-883b-73e74e603cf7" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: eli5 in /usr/local/lib/python3.7/dist-packages (0.11.0)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from eli5) (1.15.0)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.7/dist-packages (from eli5) (2.11.3)\n", + "Requirement already satisfied: graphviz in /usr/local/lib/python3.7/dist-packages (from eli5) (0.10.1)\n", + "Requirement already satisfied: attrs>16.0.0 in /usr/local/lib/python3.7/dist-packages (from eli5) (21.4.0)\n", + "Requirement already satisfied: scikit-learn>=0.20 in /usr/local/lib/python3.7/dist-packages (from eli5) (1.0.2)\n", + "Requirement already satisfied: tabulate>=0.7.7 in /usr/local/lib/python3.7/dist-packages (from eli5) (0.8.9)\n", + "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (from eli5) (1.4.1)\n", + "Requirement already satisfied: numpy>=1.9.0 in /usr/local/lib/python3.7/dist-packages (from eli5) (1.21.5)\n", + "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.20->eli5) (1.1.0)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.20->eli5) (3.1.0)\n", + "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from jinja2->eli5) (2.0.1)\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "O8xMVZzL9Zu1" + }, + "outputs": [], + "source": [ + "#importing files\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.metrics import mean_squared_error,r2_score \n", + "from sklearn.tree import DecisionTreeRegressor\n", + "from sklearn.model_selection import GridSearchCV\n", + "import eli5\n", + "from sklearn import tree\n", + "from eli5.sklearn import PermutationImportance" + ] + }, + { + "cell_type": "code", + "source": [ + "#importing train and test datasets\n", + "df_train = pd.read_csv('/content/drive/MyDrive/DS_2_project_models/train.csv')\n", + "df_test = pd.read_csv('/content/drive/MyDrive/DS_2_project_models/test.csv')\n", + "rs = 12" + ], + "metadata": { + "id": "zyuoRxP0-tSu" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "####Our Model" + ], + "metadata": { + "id": "S7T5jfpUOVc8" + } + }, + { + "cell_type": "code", + "source": [ + "#dropping unnecessary column\n", + "df_train.drop(\"Unnamed: 0\",axis=1,inplace=True)\n", + "df_test.drop(\"Unnamed: 0\",axis=1,inplace=True)\n", + "\n", + "#dividing the training data into cities \n", + "df_Banglore_train = df_train[df_train['Bangalore']==1]\n", + "df_Chennai_train = df_train[df_train['Chennai']==1]\n", + "df_Delhi_train = df_train[df_train['Delhi']==1]\n", + "df_Hyderabad_train = df_train[df_train['Hyderabad']==1]\n", + "df_Kolkata_train = df_train[df_train['Kolkata']==1]\n", + "df_Mumbai_train = df_train[df_train['Mumbai']==1]\n", + "\n", + "#dividing the whole dataset between X_train and y_train\n", + "X_train = df_train.drop('Price',axis=1)\n", + "y_train = df_train['Price']" + ], + "metadata": { + "id": "oO4uSQkYOoJM" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#Defining a function fit_city_dt which takes training data and returns a decision tree, standardscaler object and scaled X_train\n", + "def fit_city_dt(df_train):\n", + " X_train = df_train.drop([\"Price\"],axis=1)\n", + " y_train = df_train['Price']\n", + " scaler = StandardScaler()\n", + " X_train_std = scaler.fit_transform(X_train)\n", + " dt = DecisionTreeRegressor(random_state=11)\n", + " params_dt = {\n", + " 'max_depth' : np.arange(1,100)\n", + " }\n", + " grid_dt = GridSearchCV(estimator=dt,scoring='neg_mean_squared_error',param_grid=params_dt,cv=5)\n", + " grid_dt.fit(X_train_std,y_train)\n", + "\n", + " #Finding the permutation importance for each decision tree after dropping cities from the dataset\n", + " perm = PermutationImportance(grid_dt, n_iter=10)\n", + " perm.fit(X_train,y_train)\n", + " \n", + " return (grid_dt.best_estimator_,scaler,X_train_std,perm)" + ], + "metadata": { + "id": "QfA_KR2NPZTW" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#creating dictionaries of decision trees, scaler object and scaled X_train for each city\n", + "dt = {}\n", + "sc = {}\n", + "scaled_train = {}\n", + "perm = {}\n", + "dt['Bangalore'],sc['Bangalore'],scaled_train['Bangalore'],perm['Bangalore'] = fit_city_dt(df_Banglore_train)\n", + "dt['Chennai'],sc['Chennai'],scaled_train['Chennai'],perm['Chennai'] = fit_city_dt(df_Chennai_train)\n", + "dt['Delhi'],sc['Delhi'],scaled_train['Delhi'],perm['Delhi'] = fit_city_dt(df_Delhi_train)\n", + "dt['Hyderabad'],sc['Hyderabad'],scaled_train['Hyderabad'],perm['Hyderabad'] = fit_city_dt(df_Hyderabad_train)\n", + "dt['Kolkata'],sc['Kolkata'],scaled_train['Kolkata'],perm['Kolkata'] = fit_city_dt(df_Kolkata_train)\n", + "dt['Mumbai'],sc['Mumbai'],scaled_train['Mumbai'],perm['Mumbai'] = fit_city_dt(df_Mumbai_train)\n", + "dt['Other'],sc['Other'],scaled_train['Other'],perm['Other'] = fit_city_dt(df_train)" + ], + "metadata": { + "id": "YIJEXSTbPcur" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# categorizing test data into various cities We are storing the indexes in a dictionary with key as city name\n", + "X_test = df_test.drop('Price',axis=1)\n", + "y_test = df_test['Price']\n", + "city_ind = {}\n", + "city_ind['Banglore'] = []\n", + "city_ind['Chennai'] = []\n", + "city_ind['Delhi'] = []\n", + "city_ind['Hyderabad'] = []\n", + "city_ind['Kolkata'] = []\n", + "city_ind['Mumbai'] = []\n", + "city_ind['Other'] = []\n", + "for i in range(X_test.shape[0]):\n", + " if X_test.iloc[i]['Bangalore'] == 1 and X_test.iloc[i]['Chennai'] == 0 and X_test.iloc[i]['Delhi'] == 0 and X_test.iloc[i]['Hyderabad'] == 0 and X_test.iloc[i]['Kolkata'] == 0 and X_test.iloc[i]['Mumbai'] == 0:\n", + " city_ind['Banglore'].append(i)\n", + " elif X_test.iloc[i]['Bangalore'] == 0 and X_test.iloc[i]['Chennai'] == 1 and X_test.iloc[i]['Delhi'] == 0 and X_test.iloc[i]['Hyderabad'] == 0 and X_test.iloc[i]['Kolkata'] == 0 and X_test.iloc[i]['Mumbai'] == 0:\n", + " city_ind['Chennai'].append(i)\n", + " elif X_test.iloc[i]['Bangalore'] == 0 and X_test.iloc[i]['Chennai'] == 0 and X_test.iloc[i]['Delhi'] == 1 and X_test.iloc[i]['Hyderabad'] == 0 and X_test.iloc[i]['Kolkata'] == 0 and X_test.iloc[i]['Mumbai'] == 0:\n", + " city_ind['Delhi'].append(i)\n", + " elif X_test.iloc[i]['Bangalore'] == 0 and X_test.iloc[i]['Chennai'] == 0 and X_test.iloc[i]['Delhi'] == 0 and X_test.iloc[i]['Hyderabad'] == 1 and X_test.iloc[i]['Kolkata'] == 0 and X_test.iloc[i]['Mumbai'] == 0:\n", + " city_ind['Hyderabad'].append(i)\n", + " elif X_test.iloc[i]['Bangalore'] == 0 and X_test.iloc[i]['Chennai'] == 0 and X_test.iloc[i]['Delhi'] == 0 and X_test.iloc[i]['Hyderabad'] == 0 and X_test.iloc[i]['Kolkata'] == 1 and X_test.iloc[i]['Mumbai'] == 0:\n", + " city_ind['Kolkata'].append(i)\n", + " elif X_test.iloc[i]['Bangalore'] == 0 and X_test.iloc[i]['Chennai'] == 0 and X_test.iloc[i]['Delhi'] == 0 and X_test.iloc[i]['Hyderabad'] == 0 and X_test.iloc[i]['Kolkata'] == 0 and X_test.iloc[i]['Mumbai'] == 1:\n", + " city_ind['Mumbai'].append(i)\n", + " else:\n", + " city_ind['Other'].append(i)" + ], + "metadata": { + "id": "2jzCyKy1QGke" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# defining a function pred which will predict on the train data and return a list y_train_pred\n", + "def pred(X_train):\n", + "\n", + " #predicting\n", + " if len(city_ind['Banglore'])>0 : y_train_Banglore_pred = dt['Bangalore'].predict(scaled_train['Bangalore'])\n", + " if len(city_ind['Chennai'])>0 : y_train_Chennai_pred = dt['Chennai'].predict(scaled_train['Chennai'])\n", + " if len(city_ind['Delhi'])>0 : y_train_Delhi_pred = dt['Delhi'].predict(scaled_train['Delhi'])\n", + " if len(city_ind['Hyderabad'])>0 : y_train_Hyderabad_pred = dt['Hyderabad'].predict(scaled_train['Hyderabad'])\n", + " if len(city_ind['Kolkata'])>0 : y_train_Kolkata_pred = dt['Kolkata'].predict(scaled_train['Kolkata'])\n", + " if len(city_ind['Mumbai'])>0 : y_train_Mumbai_pred = dt['Mumbai'].predict(scaled_train['Mumbai'])\n", + " if len(city_ind['Other'])>0 : y_train_Other_pred = dt['Other'].predict(scaled_train['Other'])\n", + "\n", + " #creating y_pred_train\n", + " y_pred_train = ['a']*X_train.shape[0]\n", + " ptr_Banglore = 0\n", + " ptr_Chennai = 0\n", + " ptr_Delhi = 0\n", + " ptr_Hyderabad = 0\n", + " ptr_Kolkata = 0\n", + " ptr_Mumbai = 0\n", + " ptr_Other = 0\n", + " for i in range(len(X_train)):\n", + " if i in df_Banglore_train.index:\n", + " y_pred_train[i] = y_train_Banglore_pred[ptr_Banglore]\n", + " ptr_Banglore = ptr_Banglore + 1\n", + " elif i in df_Chennai_train.index:\n", + " y_pred_train[i] = y_train_Chennai_pred[ptr_Chennai]\n", + " ptr_Chennai = ptr_Chennai + 1\n", + " elif i in df_Delhi_train.index:\n", + " y_pred_train[i] = y_train_Delhi_pred[ptr_Delhi]\n", + " ptr_Delhi = ptr_Delhi + 1\n", + " elif i in df_Hyderabad_train.index:\n", + " y_pred_train[i] = y_train_Hyderabad_pred[ptr_Hyderabad]\n", + " ptr_Hyderabad = ptr_Hyderabad + 1\n", + " elif i in df_Kolkata_train.index:\n", + " y_pred_train[i] = y_train_Kolkata_pred[ptr_Kolkata]\n", + " ptr_Kolkata = ptr_Kolkata + 1\n", + " elif i in df_Mumbai_train.index:\n", + " y_pred_train[i] = y_train_Mumbai_pred[ptr_Mumbai]\n", + " ptr_Mumbai = ptr_Mumbai + 1\n", + " else:\n", + " y_pred[i] = y_train_Other_pred[ptr_Other]\n", + " ptr_Other = ptr_Other + 1\n", + " return y_pred_train" + ], + "metadata": { + "id": "aoUfucd17rHd" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#defining a function scale_pred which first scales the data according to the city and then predicts on the scaled data. This function returns a list y_pred\n", + "def scale_pred(X_test):\n", + " #scaling data\n", + " if len(city_ind['Banglore'])>0 : X_test_Banglore_std = sc['Bangalore'].transform(X_test.loc[city_ind['Banglore']])\n", + " if len(city_ind['Chennai'])>0 : X_test_Chennai_std = sc['Chennai'].transform(X_test.loc[city_ind['Chennai']])\n", + " if len(city_ind['Delhi'])>0 : X_test_Delhi_std = sc['Delhi'].transform(X_test.loc[city_ind['Delhi']])\n", + " if len(city_ind['Hyderabad'])>0 : X_test_Hyderabad_std = sc['Hyderabad'].transform(X_test.loc[city_ind['Hyderabad']])\n", + " if len(city_ind['Kolkata'])>0 : X_test_Kolkata_std = sc['Kolkata'].transform(X_test.loc[city_ind['Kolkata']])\n", + " if len(city_ind['Mumbai'])>0 : X_test_Mumbai_std = sc['Mumbai'].transform(X_test.loc[city_ind['Mumbai']])\n", + " if len(city_ind['Other'])>0 : X_test_Other_std = sc['Other'].transform(X_test.loc[city_ind['Other']])\n", + "\n", + " #predicting\n", + " if len(city_ind['Banglore'])>0 : X_test_Banglore_pred = dt['Bangalore'].predict(X_test_Banglore_std)\n", + " if len(city_ind['Chennai'])>0 : X_test_Chennai_pred = dt['Chennai'].predict(X_test_Chennai_std)\n", + " if len(city_ind['Delhi'])>0 : X_test_Delhi_pred = dt['Delhi'].predict(X_test_Delhi_std)\n", + " if len(city_ind['Hyderabad'])>0 : X_test_Hyderabad_pred = dt['Hyderabad'].predict(X_test_Hyderabad_std)\n", + " if len(city_ind['Kolkata'])>0 : X_test_Kolkata_pred = dt['Kolkata'].predict(X_test_Kolkata_std)\n", + " if len(city_ind['Mumbai'])>0 : X_test_Mumbai_pred = dt['Mumbai'].predict(X_test_Mumbai_std)\n", + " if len(city_ind['Other'])>0 : X_test_Other_pred = dt['Other'].predict(X_test_Other_std)\n", + "\n", + " #creating y_pred\n", + " X_test_std = ['a']*X_test.shape[0]\n", + " y_pred = ['a']*X_test.shape[0]\n", + " ptr_Banglore = 0\n", + " ptr_Chennai = 0\n", + " ptr_Delhi = 0\n", + " ptr_Hyderabad = 0\n", + " ptr_Kolkata = 0\n", + " ptr_Mumbai = 0\n", + " ptr_Other = 0\n", + " for i in range(len(X_test)):\n", + " if i in city_ind['Banglore']:\n", + " X_test_std[i] = X_test_Banglore_std[ptr_Banglore]\n", + " y_pred[i] = X_test_Banglore_pred[ptr_Banglore]\n", + " ptr_Banglore = ptr_Banglore + 1\n", + " elif i in city_ind['Chennai']:\n", + " X_test_std[i] = X_test_Chennai_std[ptr_Chennai]\n", + " y_pred[i] = X_test_Chennai_pred[ptr_Chennai]\n", + " ptr_Chennai = ptr_Chennai + 1\n", + " elif i in city_ind['Delhi']:\n", + " X_test_std[i] = X_test_Delhi_std[ptr_Delhi]\n", + " y_pred[i] = X_test_Delhi_pred[ptr_Delhi]\n", + " ptr_Delhi = ptr_Delhi + 1\n", + " elif i in city_ind['Hyderabad']:\n", + " X_test_std[i] = X_test_Hyderabad_std[ptr_Hyderabad]\n", + " y_pred[i] = X_test_Hyderabad_pred[ptr_Hyderabad]\n", + " ptr_Hyderabad = ptr_Hyderabad + 1\n", + " elif i in city_ind['Kolkata']:\n", + " X_test_std[i] = X_test_Kolkata_std[ptr_Kolkata]\n", + " y_pred[i] = X_test_Kolkata_pred[ptr_Kolkata]\n", + " ptr_Kolkata = ptr_Kolkata + 1\n", + " elif i in city_ind['Mumbai']:\n", + " X_test_std[i] = X_test_Mumbai_std[ptr_Mumbai]\n", + " y_pred[i] = X_test_Mumbai_pred[ptr_Mumbai]\n", + " ptr_Mumbai = ptr_Mumbai + 1\n", + " else:\n", + " X_test_std[i] = X_test_Other_std[ptr_Other]\n", + " y_pred[i] = X_test_Other_pred[ptr_Other]\n", + " ptr_Other = ptr_Other + 1\n", + " return y_pred" + ], + "metadata": { + "id": "KGNtlrvzYvy1" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Having a look at our final results.\n", + "y_pred = scale_pred(X_test)\n", + "y_pred_train = pred(X_train)\n", + "\n", + "print(\"The Mean Squared Error for our Model on training data is : \",round(mean_squared_error(y_train,y_pred_train),2))\n", + "print(\"The R2 Score for our Model on test data is : \",round(r2_score(y_train,y_pred_train),2))\n", + "print()\n", + "\n", + "print(\"The Mean Squared Error for our Model on train data is : \",round(mean_squared_error(y_test,y_pred),2))\n", + "print(\"The R2 Score for our Model on test data is : \",round(r2_score(y_test,y_pred),2))" + ], + "metadata": { + "id": "CnpdfhRorj1j", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "65fbbffa-c4eb-4ce8-e19d-8c4d1c648592" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The Mean Squared Error for our Model on training data is : 0.42\n", + "The R2 Score for our Model on test data is : 0.38\n", + "\n", + "The Mean Squared Error for our Model on train data is : 0.45\n", + "The R2 Score for our Model on test data is : 0.33\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "####Feature Importance and permutation Importance" + ], + "metadata": { + "id": "F7n26wIGJXfc" + } + }, + { + "cell_type": "code", + "source": [ + "eli5.show_weights(perm['Bangalore'], feature_names=X_train.columns.tolist())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 399 + }, + "id": "TM9zzPLIh4qT", + "outputId": "6ecfad5d-0774-411f-918a-76841bee35c6" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
WeightFeature
\n", + " 0.2295\n", + " \n", + " ± 0.0088\n", + " \n", + " \n", + " IndoorGames\n", + "
\n", + " 0.1238\n", + " \n", + " ± 0.0340\n", + " \n", + " \n", + " JoggingTrack\n", + "
\n", + " 0.0145\n", + " \n", + " ± 0.0471\n", + " \n", + " \n", + " No. of Bedrooms\n", + "
\n", + " 0.0049\n", + " \n", + " ± 0.0029\n", + " \n", + " \n", + " LandscapedGardens\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " RainWaterHarvesting\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Cafeteria\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " StaffQuarter\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " CarParking\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " PowerBackup\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " 24X7Security\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " School\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ClubHouse\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " WashingMachine\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ShoppingMall\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Resale\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ATM\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Gymnasium\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SportsFacility\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MultipurposeRoom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " HQLI\n", + "
\n", + " … 26 more …\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "execution_count": 154 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"Top 10 features for Bangalore\")\n", + "print()\n", + "for i in X_train.columns[np.flip(np.argsort(dt['Bangalore'].feature_importances_))][:10]:\n", + " print(i)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GI-ZiOfK5F2A", + "outputId": "dcaa3f63-77e1-4989-aeaa-679c748c7897" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Top 10 features for Bangalore\n", + "\n", + "Area\n", + "JoggingTrack\n", + "Intercom\n", + "No. of Bedrooms\n", + "Resale\n", + "Gasconnection\n", + "VaastuCompliant\n", + "LiftAvailable\n", + "SwimmingPool\n", + "IndoorGames\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "eli5.show_weights(perm['Chennai'], feature_names=X_train.columns.tolist())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 399 + }, + "id": "j4xM5iTTozla", + "outputId": "c5c25c9d-b686-486d-864e-9a6af7fd1ba1" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
WeightFeature
\n", + " 0.5013\n", + " \n", + " ± 0.0219\n", + " \n", + " \n", + " CarParking\n", + "
\n", + " 0.4831\n", + " \n", + " ± 0.0357\n", + " \n", + " \n", + " 24X7Security\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " RainWaterHarvesting\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " StaffQuarter\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " PowerBackup\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " School\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ClubHouse\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ATM\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MultipurposeRoom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Intercom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " No. of Bedrooms\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " IndoorGames\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Resale\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MaintenanceStaff\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SportsFacility\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SwimmingPool\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ShoppingMall\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " JoggingTrack\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Cafeteria\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " HQLI\n", + "
\n", + " … 26 more …\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "execution_count": 142 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"Top 10 features for Chennai\")\n", + "print()\n", + "for i in X_train.columns[np.flip(np.argsort(dt['Chennai'].feature_importances_))][:10]:\n", + " print(i)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "dp-IGBO36ctI", + "outputId": "aaa4f4da-d184-4ace-bd83-7f1afb60661c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Top 10 features for Chennai\n", + "\n", + "Area\n", + "CarParking\n", + "24X7Security\n", + "LiftAvailable\n", + "Children'splayarea\n", + "IndoorGames\n", + "VaastuCompliant\n", + "ClubHouse\n", + "No. of Bedrooms\n", + "DiningTable\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "eli5.show_weights(perm['Delhi'], feature_names=X_train.columns.tolist())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 399 + }, + "id": "HUjyJgLvo6hZ", + "outputId": "4f880294-76c0-42b7-9a43-f65c08bdcc84" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
WeightFeature
\n", + " 0.0705\n", + " \n", + " ± 0.0051\n", + " \n", + " \n", + " Gasconnection\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Cafeteria\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " StaffQuarter\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " CarParking\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " PowerBackup\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " 24X7Security\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " School\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ClubHouse\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ATM\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SwimmingPool\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " No. of Bedrooms\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ShoppingMall\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Resale\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MaintenanceStaff\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Gymnasium\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SportsFacility\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Intercom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " JoggingTrack\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MultipurposeRoom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " HQLI\n", + "
\n", + " … 26 more …\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "execution_count": 144 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"Top 10 features for Delhi\")\n", + "print()\n", + "for i in X_train.columns[np.flip(np.argsort(dt['Delhi'].feature_importances_))][:10]:\n", + " print(i)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "h6aSCBZHFQyT", + "outputId": "d221c7c6-17f4-4930-89e0-ede85bcaa0b5" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Top 10 features for Delhi\n", + "\n", + "Area\n", + "No. of Bedrooms\n", + "Resale\n", + "Children'splayarea\n", + "LiftAvailable\n", + "Gasconnection\n", + "CarParking\n", + "24X7Security\n", + "SportsFacility\n", + "PowerBackup\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "eli5.show_weights(perm['Hyderabad'], feature_names=X_train.columns.tolist())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 399 + }, + "id": "ao2w8Td9pFxk", + "outputId": "09651894-aa9d-4e98-b29d-3182a5f38aa6" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
WeightFeature
\n", + " 0.0104\n", + " \n", + " ± 0.0044\n", + " \n", + " \n", + " No. of Bedrooms\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " JoggingTrack\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Cafeteria\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " StaffQuarter\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " CarParking\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " PowerBackup\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " 24X7Security\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " School\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ClubHouse\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " WashingMachine\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ShoppingMall\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Resale\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MaintenanceStaff\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ATM\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SwimmingPool\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SportsFacility\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " RainWaterHarvesting\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " IndoorGames\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MultipurposeRoom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " HQLI\n", + "
\n", + " … 26 more …\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "execution_count": 146 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"Top 10 features for Hyderabad\")\n", + "print()\n", + "for i in X_train.columns[np.flip(np.argsort(dt['Hyderabad'].feature_importances_))][:10]:\n", + " print(i)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8JF0mFts6w6h", + "outputId": "103c751e-d93a-432c-ed2f-441a50049425" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Top 10 features for Hyderabad\n", + "\n", + "Area\n", + "SwimmingPool\n", + "No. of Bedrooms\n", + "LandscapedGardens\n", + "IndoorGames\n", + "Intercom\n", + "Resale\n", + "ClubHouse\n", + "Cafeteria\n", + "StaffQuarter\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "eli5.show_weights(perm['Kolkata'], feature_names=X_train.columns.tolist())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 399 + }, + "id": "HaB_6rwopXUu", + "outputId": "e4b7170f-8436-4a8e-b585-2f829e47648a" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
WeightFeature
\n", + " 0.0246\n", + " \n", + " ± 0.0090\n", + " \n", + " \n", + " No. of Bedrooms\n", + "
\n", + " 0.0030\n", + " \n", + " ± 0.0054\n", + " \n", + " \n", + " Resale\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MultipurposeRoom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Cafeteria\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " StaffQuarter\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " CarParking\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " PowerBackup\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " 24X7Security\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " School\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ClubHouse\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ShoppingMall\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Intercom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MaintenanceStaff\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Gymnasium\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ATM\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " JoggingTrack\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SportsFacility\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " IndoorGames\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " WashingMachine\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " HQLI\n", + "
\n", + " … 26 more …\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "execution_count": 148 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"Top 10 features for Kolkata\")\n", + "print()\n", + "for i in X_train.columns[np.flip(np.argsort(dt['Kolkata'].feature_importances_))][:10]:\n", + " print(i)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Xs_FJyuf7T4l", + "outputId": "720df86d-8a69-4d44-9b07-62dc3376965d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Top 10 features for Kolkata\n", + "\n", + "Area\n", + "No. of Bedrooms\n", + "Resale\n", + "LandscapedGardens\n", + "SportsFacility\n", + "Cafeteria\n", + "StaffQuarter\n", + "CarParking\n", + "PowerBackup\n", + "24X7Security\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "eli5.show_weights(perm['Mumbai'], feature_names=X_train.columns.tolist())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 399 + }, + "id": "NwKtFgs5phxh", + "outputId": "96dd8883-bc51-42ea-8ae8-3cf70fc9f614" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
WeightFeature
\n", + " 0.0052\n", + " \n", + " ± 0.0006\n", + " \n", + " \n", + " No. of Bedrooms\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " RainWaterHarvesting\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Cafeteria\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " StaffQuarter\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " CarParking\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " PowerBackup\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " 24X7Security\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " School\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ClubHouse\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SportsFacility\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " WashingMachine\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " IndoorGames\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Resale\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MaintenanceStaff\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ATM\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SwimmingPool\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ShoppingMall\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " JoggingTrack\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MultipurposeRoom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " HQLI\n", + "
\n", + " … 26 more …\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "execution_count": 150 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"Top 10 features for Mumbai\")\n", + "print()\n", + "for i in X_train.columns[np.flip(np.argsort(dt['Mumbai'].feature_importances_))][:10]:\n", + " print(i)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "m_PpkIqI7ZKd", + "outputId": "0c37523f-94ef-4611-c141-02e56607d1d2" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Top 10 features for Mumbai\n", + "\n", + "No. of Bedrooms\n", + "Area\n", + "CarParking\n", + "RainWaterHarvesting\n", + "Resale\n", + "Gasconnection\n", + "Intercom\n", + "AC\n", + "BED\n", + "LiftAvailable\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "eli5.show_weights(perm['Other'], feature_names=X_train.columns.tolist())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 399 + }, + "id": "-nCrXoZ5jfVk", + "outputId": "ca922b3f-7e57-4666-90ce-a7dd423d6b24" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
WeightFeature
\n", + " 0.5649\n", + " \n", + " ± 0.0158\n", + " \n", + " \n", + " CarParking\n", + "
\n", + " 0.5023\n", + " \n", + " ± 0.0119\n", + " \n", + " \n", + " No. of Bedrooms\n", + "
\n", + " 0.1167\n", + " \n", + " ± 0.0041\n", + " \n", + " \n", + " Delhi\n", + "
\n", + " 0.0663\n", + " \n", + " ± 0.0071\n", + " \n", + " \n", + " Resale\n", + "
\n", + " 0.0408\n", + " \n", + " ± 0.0245\n", + " \n", + " \n", + " Intercom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SwimmingPool\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Cafeteria\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " StaffQuarter\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MaintenanceStaff\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " PowerBackup\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " SportsFacility\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " HQLI\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ATM\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " Gymnasium\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " MultipurposeRoom\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " LandscapedGardens\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " ClubHouse\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " RainWaterHarvesting\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " School\n", + "
\n", + " 0\n", + " \n", + " ± 0.0000\n", + " \n", + " \n", + " 24X7Security\n", + "
\n", + " … 26 more …\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "execution_count": 157 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"Top 10 features for Other\")\n", + "print()\n", + "for i in X_train.columns[np.flip(np.argsort(dt['Other'].feature_importances_))][:10]:\n", + " print(i)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fine155VjvW6", + "outputId": "f6351c17-981a-41fd-bd57-1c0d36fcfc17" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Top 10 features for Other\n", + "\n", + "Area\n", + "Mumbai\n", + "No. of Bedrooms\n", + "Delhi\n", + "Kolkata\n", + "Resale\n", + "CarParking\n", + "Intercom\n", + "LiftAvailable\n", + "JoggingTrack\n" + ] + } + ] + } + ] +} \ No newline at end of file