{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.ensemble import RandomForestClassifier\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from sklearn.metrics import accuracy_score\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.ensemble import BaggingClassifier\n",
"from sklearn.model_selection import train_test_split, cross_val_score, validation_curve, learning_curve"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" label | \n",
" 1x1 | \n",
" 1x2 | \n",
" 1x3 | \n",
" 1x4 | \n",
" 1x5 | \n",
" 1x6 | \n",
" 1x7 | \n",
" 1x8 | \n",
" 1x9 | \n",
" ... | \n",
" 28x19 | \n",
" 28x20 | \n",
" 28x21 | \n",
" 28x22 | \n",
" 28x23 | \n",
" 28x24 | \n",
" 28x25 | \n",
" 28x26 | \n",
" 28x27 | \n",
" 28x28 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 7 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
5 rows × 785 columns
\n",
"
"
],
"text/plain": [
" label 1x1 1x2 1x3 1x4 1x5 1x6 1x7 1x8 1x9 ... 28x19 28x20 \\\n",
"0 7 0 0 0 0 0 0 0 0 0 ... 0 0 \n",
"1 2 0 0 0 0 0 0 0 0 0 ... 0 0 \n",
"2 1 0 0 0 0 0 0 0 0 0 ... 0 0 \n",
"3 0 0 0 0 0 0 0 0 0 0 ... 0 0 \n",
"4 4 0 0 0 0 0 0 0 0 0 ... 0 0 \n",
"\n",
" 28x21 28x22 28x23 28x24 28x25 28x26 28x27 28x28 \n",
"0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 0 \n",
"\n",
"[5 rows x 785 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mnist = pd.read_csv(\"Datasets/MNIST/mnist_test.csv\")\n",
"mnist.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(10000, 785)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mnist.shape"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 7\n",
"1 2\n",
"2 1\n",
"3 0\n",
"4 4\n",
" ..\n",
"9995 2\n",
"9996 3\n",
"9997 4\n",
"9998 5\n",
"9999 6\n",
"Name: label, Length: 10000, dtype: int64"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mnist_X = mnist.drop(\"label\",1)\n",
"mnist_X\n",
"mnist_y = mnist[\"label\"]\n",
"mnist_y"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([7, 2, 1, ..., 4, 5, 6], dtype=int64)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mnist_y.values"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"X = mnist_X.values\n",
"y = mnist_y.values\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"X train : (8000, 784) -- X test : (2000, 784) \n",
"Y train : (8000,) -- Y test : (2000,)\n"
]
}
],
"source": [
"print(\"X train :\",X_train.shape, \"-- X test :\", X_test.shape\n",
" ,\"\\nY train :\",y_train.shape, \"-- Y test :\", y_test.shape)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(6,6))"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAVQAAADrCAYAAAA2eW6hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOyddVgU2xvHP7OgWKCiomKhci3s9trdgd1x7Y5rt9fuwLhid3djXOvaYICBoqIgKgKCAhLC+f2x11WkYXdn8Tef55mH3TlnznyZmX3n5PtKQggUFBQUFJKPSm4BCgoKCr8KikFVUFBQ0BKKQVVQUFDQEopBVVBQUNASikFVUFBQ0BKKQVVQUFDQEsaJyZw1a1ZhZWWlEyHu7u74+PhI2ihLlzoBHB0dfYQQ2bRRVkq5pqBo/YbyrGqfX+X+J8qgWllZcefOHe2o+ony5ctrrSxd6gSQJOmVtspKKdcUFK3fUJ5V7fOr3P//yyZ/s2YDUamMom3585eUW1qCufPiBdNXbJZbRoz4BwfTtedkVCojSpWqzUNPT7klKSjohf87g9qs2UBOnrQHoGDBMvQaMJ169boD8OrVQzmlJYobTg/JYZVDbhkx8vz9e3Zvn49KpcLZ+TIHDl+QW1KM5M5dKNa0rZcu88TLS49qEsf60+f4a+VWwiMi5Jai4ZWPD4NGL8DF0yPOfB8+fWL96XOEhofrSZn+SFSTP6Vz+sEDzpzZCMCD1+7kymxO5vTp+RIWRvkyz3j8+LrMChPOo2uPWL1knNwyouHh60u/tgPklpEgQkNDYk07t/Uc+7x3c+zYaj0qShheHz8yuWdf3r93Z2Sf9qQyMpJbEu8CAihTqAS//96K4rnzxJrvw6dPlC9RBT+/t5R54Ei5/Pn1qDIqPp8/M3LYAp4+usvlq4cwSZUq2WUmu4a6+vBJatRoT9t2o+nSYxJO7u7JFqUrPL28ESKSQoXKUzx3HjKnTw/A1HnrcHNzlFldwrn85Amb/54tt4wYad+sN/fvR62R3jp9nX03b8qkKGbCvn6NM71kjRI8e+aIf3CwnhQlnGNXb/H+vTvNmw8hvYmJ3HLw9POjdeOe+Pt7c/z4mjjzTpq8Eg+PJ0xaulpWYwpQumg5dmyZw+3bp/ANDNRKmcmuoc4d+ieenq6a70cPruG332LvtM2ZswBD5w6iUUn991f2aVSPKu4vMc+QIcr+47u2Ex4epnc9ScXlyQu+fNHOA6Btbt8+EW3f6dPrcXa+TMbju2lQooQMqqKz59p12vUYEmu6/4cAnj1z5POXL2RKl06PyuImODSUlRPnANB6eBtUktYGxpPMBWcXbtw4Gm++f58+ZZ3dZBo2/IN+HZvpQVnsuL59y5s3bkj/Xb8BPaaydutMcmbKlKxyk21Q5+1az+Mbj/mtrDXPnNzYsHgud++ew9KyIF5ezzX5LCzy4u39mrt3wTJ/HhqtlGcAyCZ37ijfJ8xby8sX9wEoXbquHJISzdppC8mV6ze5ZUSjVq1OREZGRtmXOXN20qXLiIfHExqVKk1kpPx9fpefPGFYy3a88Hwea55z+4/oUVHCufTkCS4ulwHoWbeWvGJQ95ueXn8agAWbdsea79+nT2lVtR4ADbs3jVap0Tfzp9tH+X78+GqK5NvNkElzmD22b9ILFkIkeCtXrpxIKqsPnxSSpBJFilQWXh8/Rkv/r+xE6UmuzuETlwhJUglJUole/aYn+H8B7uhb6zcWbtknQBLlyzeON682r2lcWp09XousWfMIIyNjYWRkLPLmLSb6D58rAoKDNXmyZcsrjIyMRbp0ZmLyovUiJCxMFq2rDp0Q6dNnFIUKVYj1uvUeNFNIkkpUqdIqmk5ta03s/S9btoEARKpUJgnKr+tn1dZ2pJAklahbt1uM10oIIT59+SIyZswmJEkVq0593X8hhLA/cUaAJIQQIjDki5i/cY/Il89GgCSAGO1TQrXqbVBqSu8+CBHJsHlTk12t1gYNGvTi8uW9ALRuM5LFS0bLrChhuN5Sd6/0nzlKZiXfCQ3/ysePbwGoVKk5e46tJ7e5eZQ8gybPYNaovnz5EsjccQNo07YepfPl07vWk+uP8eVLIF2HDY01z5G9azEyMmbIwjFaGajQFocdHXFycgAgbVpTmdVE5cKFHdSs7s+g+VF/RzeP3+TGhXN8+uRLkyb9ZFIXldAvYZqmfnqTNIzt1Z6TWw7x+vVjhIA0ybjnejOovr5vMTPLSvEiBfR1yjhxdDxDWFgI5uY5mLxoqGaAypA56uTEvu3LsbGpSqfa1eSWEyPr9tpFM6YA7VrX48imGty/f1H/ov7jw6dP3L17DoApg7vFms/P7y3W1mXpXPV3fUlLEE6X72s+d+03VkYl3xkwoxfXrh3C2/s1t26d4FbtqH3oQggkSSJv3qLMWjVeJpVRObr2YLR9zs6XNJ+TYwv0Mg/10H8rFtY7HKd64cL6OGW8fPz4HoBWHQbKUlNKCpeO/ktAwAcKFixDepM0csuJQmRkJJGRkRTLlSvGdIEgMjISIdT5pg9fomeFEBwWxrt3L2nefHC8eQsVqqgHRYnjwSW1QTUzzcKwUV1lVqOmQYkS3HO9x45/r9Jv2GyyZLGk37DZmu3yk8cAlCvX0GB+Zy36twbgppsbqw6eoEWLoQQEfMDMLAsA1549S3LZeqmhntvzD1Wr2tKibFl9nC5e1p06C0Dlyi1YuGCkzGoSzuNbLoBEkz5N5ZYShb8X70SlivvdvP/geR4+vIokqVCpVExfrv8uC/MMGShWrCqurrd46+8fY9fTKx8fhBBUaGhYBvXA7dscPboSAFMzcwrnzCmzou/kyJiRTlWq0KlKFf5eFrUWev/1a4QQLLOfKJO66LSpW41JpuZU/q2QpulfrVoblm1dQLu6rVg1cxO/b52TpLJ1blA/h4Rw6dRRZm1ZZhD9UV4fP7J64jwAipUplyKa+gAvP3hz+/ZJChQoRf/mDeWWE4XzJ/fGme7h68uqmVM1383NLUltrP81JaZp0pAvXzFOnVpH09rt6D1lhCbt6Z2nvHrkzps3z5AkSfNDMxT8PnxECPUMimo1WsusJuHMHLUcSZLIkyWL3FI05MyUiVXHD9GtRnWEgJ59p7HSbhzpTdLQ0LYzR3dv4N6r/kmqUeu0yb/x7AUyZzDl9etHtCpXTpenSjD5c1hy//5Fnr17y/pVk+WWk2Amj16Oj88bajVMOT8mUE+lqlqmumbQqlatTnh7v4q1a0DXHD++hoiIryzcvgxJJWm25XNGcvjwcvLmLQrE3ceqb1zfvqV/s8YAFCpUgd0758msKGG06zCGAweWJqiLRd90rV7tv5H5SDbZT9N0oa1eNBYvLzeaVKnLW3//RJers2qC18ePTO89hIiICGrV6qyr0ySZd/7+mPxUS8pmqh45/fD5MwDvAwJYOmMDAEbGRtjZjccsbVr9Cv2P82d2AlC3i+HNlRVCaOafbj5/kfFdeuHt/fq/tEgk6ft7+8KF7bJo/Jm6NjbUtbGJtj9P0TxwWD1XtUaRIjIoi87Za46a2mn9lu1lVpNwLl7YQ9q0GRgy2zBG9xNKs2aDOH58NQsWb2HpzOGJOlYnBjU8IoJGNW3x8HhCvnzF+MvO8KYkVS9SNNq+pk37I0lGHD8e8/rtbHmysWha7KtrdMX+W7fw8TFcj01dhwxn7jj1+v0+DesDaPpUIyO/f+7S03D60WLlv/mEhmJMAfzfq2tKmTPnYPz4P2RWkzBm/70dHx9PsmbNRf3ixeWWkyhGzB3A2bObWT57FF16Nad8gYTPTNJJk//+q1c4O6tXc0z+e5nBjO4BcdaWT5xYqzGmxsapSJ3KhNSpTGjSpB/j5qymRnN5ptGc3uJAREQENjZVaVe5kiwa4qJjh4aYm1vGmm5ubsmd527Y2RnGtJk4McD+08uHzwNgaWmtaUUZOjtWrEaSJGrX7QTAozdvZFaUcOrY2DBqxhKEEEwZPI/PIbE70fkZrddQH3p60qpGIwAmzl/LHw0Nq4l65swGxs+twNcwtXOMp46uUWqko6YtB6BNl0ZUsbaWRePP/HP6AABNOnQyCM9CP2OTOzerju3l9BYHttj/FS19yNSZBvVSjYuw4FBMTAxn7T6Au7sLACYm6QxiYDcxGBkZsWzXYa7sv8KBA4vllpNgBvRuzc41dpw+vR6nlyOpWTR6izYmtG5QVy/fxZs3bgBUb1TJIJw3/My8CT+7l7OTRUdCyZgxG/Xr92Dy6F5yS4mVdpUq0a5SJTyfu3P+/Fbq1etB53Hd1FOQChue34HY2LdtJaNnL5NbRhRKlqrJs2d3sLJKWU1ngN0757Nnl8SjeHykGhp5smThxNVT2OTOw5Lxa6h5ZEWCjtO+QV2k9tGZL18xMhuQl56UzLflhimBM2c2ABvklpFkPnwwvB/+/n2LgEVyy0gUjx5dk1tCsimWKxcfPgVQumh51p06S9/G9eM9RieDUsWKVuHctRMGsWZfQUFBIalkNTWN4p40PrRuUL9N71BQUFD4f0MSQiQ8syR9ALQWRfEn8gkthbvVsU5IOVq1phMUrT+QUu4/pBytv8T9T5RBVVBQUFCInf+7qKcKCgoKukIxqAoKCgpaQjGoCgoKCloiUaP8WbNmFVZWVjoR4u7ujo+Pj1ZWAehSJ4Cjo6OPtjrQU8o1BUXrN5RnVfv8Kvc/UQbVysqKO/9539c25cvHHno6sehSJ4AkSVobPUwp1xQUrd9QnlXt86vcf701+f959EizeX8KYPjEpaw6GD2Gu0J09t+6RXhEBNeePWP83L+pVKkZ4+f+zf5bt+SWFoXg0FCMjIwxMjJm1NSELdVT+DUZMWkpkiRRuXILuaXEiYOzM0PGLsLauiwqlRGSpKJkyVq0bj2K625uiS5P527TN569wLmt59i9Y75mX/78JXnz5ilhYSEMNoA47YaMz+fPdKtZlzRp0hMeHkJQ0CcAbt06SZo06emXNgOzNm5gUKsmMiuFmUs38/vvtoxdMYHmZQwj3M2vwruAAC64POTS3kvYr5iIJKnoO3QWEyb3wSqb1qZvao0b5/8B4ObNY+y+fp2OVarIrOg7c+x38vzec25fPY+LyxUkSdIEE+zUbTw7tsxOctk6Maj3Xr3Cbv5Wdm1eSGhoMD/PdX358oEuTvtLMnzIPEJCgggJCcLauixZsuQkQ4bMAJw/v52QkCDGdeuKza1/E+wRR1d88PhA1SZ1FWOqZcbNWs2WlQs1fgYkSYUkSaxfOQW/d37s27NQZoXRuXnzmObzjeM3DMqgTurfFUmSKF68Or0GTKdg6YKY5zBnQItGyS5bJwbV9e1bNv09Pca0ggXLUKiQdvtLkoOTuztvPvpxYosDNy460HXUIGpXL0e5/Pnllsa/T59y6thGcuYswJID2yhjZYWFmZkmDtaISWWwmzeGwMCPzB25mMJ7FpMjY0bZ9Ab5B9FhYCvZzp8Uzj98yOyhc7l4cZcmusCdF88pYGHBgSvXaV+zKqZp5I0wu2jasCjfK1Vqzq1bxwE4uH8pYHgG9UeWzTasQJiNGvXBwWEjDx5c1H7h4j8P5QnZypUrJ2LDw9dXDB6zUAghxBFHR2FmllXkyFFAmJllFc2aDRRbL10WHr6+4mNQUIzH/1d2ovQkRec3Lj1+LDp3myDMzXMKkKJsxsapRaFCFUTn7hNFcGhotGOBO/rQetTJUYAkZthtiTXPwD/nC2Pj1AIkscHhfJQ0bV7T+LQ+e/dOSJIq1vT40KfWb2y7fEVkz24lVCojoVIZCUlSCZXKSLRpM0pUqdJKSJJKLNlxUKda49N51dVVo0+lMhIT5q0VIWFhYuDIeZp9caGvZzWG82q2hKDP+//ax0fkylVIPPT0TPD/k1CtWhH5MShIFCtWNcoPytnjtRBCiIeenuJrRESyRCZ2i+/GX3z0SJiammsMaI4cBUTz5kPEoNELROnSdQRIwsIin7C0tBaz1myLdry+HtLd168L9erguMmTp6gASbTrMCbKfn0+pF16TIrToB5xdBQrDxwXKw8cF7efP4+WLodB/WaQcuQoIOxPnBFbL10WWy9dFst2HRaZMmUXJqnTiu1XrupUa1w6r7q6irp1uwmVykjkyVNUXHV11fyWQsLCRNasuYVKZSQKF64YaxlyGdThE5doDOrwiUviza/v+z96xkrh4Oyc4P8noVqTJdIvMFAMGr1ASJJKZMliKbwDApIkMD6Rid1iupiBIV/EiMnLhCSpBEhi+MQlMdaWr7q6ii0XL0Wpsb728YmSRx8P6b1Xr0TevMWEmWmWeK/dqkMnBEjC2jpqWfp6SAOCg4WFRT6RM2dBzb7Q8HBx4u5dYWGRT0iSSpib5xT16/cSlpbWAhDZs1sJFw8PvWv9RrNmA0Xdut3EnRcvoqV9M7S7r1+P8Vh9GdTmzYcIlcpIVK/eLtY8RYpUFpKkEsWKVY0x3RBqqIZmUL/VUH9slUiSSjRq1FesOXIqWVqT1Ye6+YgDaxaPx9LSmvO3L5LNzCw5xemU/f/ewH7JVIQQZM+eL1q/TnhEBK5vvWhfuykBAR/+2yuwtR2JhQz/1+Z1h3j9+jGNG/fV+7kTy+K1u/Hx8aRTN3XMKLf371m5Yid288YAkD27FRedrlI4Z04A6tXrzj//7OTFB29scufWu96Oncdz4sRarro+idZXHhoejhCCSpWa06FyZb1r+4bXx4/cv38BANsBnWLNZ9uzF/MmGNb0OUPGw9eX2pXq4+XlRqtWwynfSD2es3ulPc7Olzjdcj0FHtynsrV1kiIcJ8ugOjo4AmBjU03zYzFUIiIiMTJS/7vGxqnpP3wuzx8+BiBNmvS4uTnh5uZERMT3aVxZs+Zm4qIhssTxObZrC2am5vSe0Ufv504sD/99CED+EmrjNH2cHTu3zkWSJH7/3ZZ5G2ZHeT6sCheCf2SRCoDzPfVUmd9/ixqaJTQ8nBFjFyNJEsOXjJNJnZpzD5w1jo07Na0Tb/6AgA889/amoIWFrqWlaG4+f86LF/dp1KgPBw8u0eyf2K8znn5+2G8+RKNSpbG2LsuWk7sSHVcuWQb11LGNAFy6tJsRk0vQvFP9GGOdGwLtqv/O7sotuXp1P15ebtivmASog4j9aERBHfa4YcPe2G2eKesDWrBgGdpUqCDb+ROK9/vXms93Xrzg+GF7ADp2Hcf6ddNImzp1tGOKF69OPRvDiZHk4umB3cLtrF85BQuLfNSxKSarHudLzprPCZm58fbtc649cTVIg2pIo/xtK1YkMpa577nNzflrVG/SZEjL7pX2NKtUg10Xz9CgRIkEl58sg+rn9xZJUhEWFsKKOX+ycp6KRdv24eXmRT6bfJQpUQiAu85PGdy6aXJOlWxM06TBwWEj3p+WMm3aGp4/dMUyXz7CQsJ47HKTe/e+V5k6dRvPkhVjsDCTZwqSf3AwX7+GyXLupBAY6K/pQ7Kbs4VPn3xp2XJYrBOkg/yDMDZOHaOh1QfWv5XjietNbIpV1ezz9fPC2/s1kiRRtWor2e79N74EfkHdFRk/6igZip8jbTGxX2e6t21E7UoN6FKnCTM3rEvwHNVkGdS+Q2ezfuUUzffIyEhGdWkTY97TTftz7NjqGNP0iYVZRtYsjRofvnXrURqDOm/DLkb1aCtruGb7Pcd59eoR5pkT1o1ybus5AIyN5QkxLP0Xy16SJLzfvFX/9Y55Cbnb+/fs2bWARo3k68rYvmcBrZp+5OLFXVH2rz9zloPL99FjUheZlH3H+eZtpARGDP420V9Be+Q2N2fO9lXM7DuOSb3+wGvSTP4a1Tve45L1WrNfMZHIyAjNtu3yZUqVqhVj3hMn1tKgwR/JOZ3Wmbd+NxkyZOLQIXXY4EKFyjPujw6yGtPE4ODsTMuWwzh0aBnlyzfivvMVvWtwe/8eb+/vTf5Tp+x5+taLz5/9MDIyplKlZvgFBrLhzHnKlKlLsTz5GDF5KSdPrtW71m+YpknD+fPbiIj4GmXr07A+p06tS1ErvQ5uUkeYnbRwLd1qVJdZzXcqVWqu+Txi0lIZlSSddpUq8eDBRRo26cms0f0SdIxW2wldqlWlQRt1DdXYOBWduo7j9P17tGgxRJun0Qon791j9shBmrXx6dObMW+H/DVogNyFcpMhQ/wRY+0mruXo0ZXkyJGfafazSW2sc9cM0bDOnp38+UsghODayYsAFLSw4MGDi9ifPMPavavw/vSJvo0b4Op6myHjF7Dkr2FxFyoDLv/FjU+fXt6m/jemrZ6KuXn8LRQ/v3dkyWLJuMHy16p/Ra67ueFwagvW1gl7yWq946VeqxoAfP0azq7t85kxYBrHjq0CIEce/U+RiY1Tu84TGOgPQNq0GVh/9hS2WnYhllQ6V/2d7Nmt+Bz4EU8/v2jplx4/pkv3iRw/rn4BLDu0g2ZlyuhbpoZ1e5ZTuHBF/vlnJ38fPc1RJyeOOjlx78I9erfuh02evBQoUIqle/YZpDEF+Gu0HQB16nSVWYmaOjY2TFi2HCEEZ11cYszTsfN4fHw8qVy5OelN5F0e+yO7r1+Pspbf0JiyeANLdx6KN99DT09mDJlHcPBntp3cFW9+0MFa/srW1jRtOpATJ9YAcP36EQDq1evBCrvxcR2qV9YunaT5bNt2iEE5b/iGm5sTjWvaki1bnij77907z8eP7zE3z0G9Bt1oXKqUTArVFM6Zk+OXjtCgSgMG2zYD1AtGfuzXu3z7PJaZM8slMU7+ffqU0yfVTeea7WvJK+YH6lYvT4sWQ7h85ib1i0efEXHm1GayZMnFhCWGM4oOsGzkXLklxMrfR08ze0w/9ZzpzrbR0j18fdl24Axndhzl4cMrmJtbsnTPPiolcPqU1g2qaZo02G2cRlAHf5ydL+Pr+4bcuQvj4LBR26dKMh+DgggPV4+iFy1aGft1U2VWFJ0xS+diN2EWLi4x94uqVCr6jJzM/MmD9KwsZgpaWHD97iUmT17F7s2L6dB9FJJKbVB7D2tvsMYU4OZtFwID/ZEkCZN0JnLL0VAqb15mrRzN78VK4/vWl9WLxgLqqWlXbz7g0ycf+g6dFW0+rZz8XDvdde2awVVWhIhk17Z5IARCwPOnD8icOQcODps0MyusrcvSsv0AZswaTG5z8wSXrZNON6ts2bhwYTtLdhzk7rm7zFo4XBenSTL7L1/TfJ68bpFBNZe+0b95Q+pWLE2zmi1wdb0dJa1T1/HYVC3GpAGG0Tz9hoVZRuxXTMR+xUS5pSQKv7d+SJJEoUIVDMKv7I8Uz52HSpWasd1+PpdOHqHz8EEsnTSWjx/fU7duNwaMjH0VlZwMn7jEoOaffmNAi0aku3CRM5sdcDi5FV9fL6yty2p8oZrnMKdFt4ZUKlhQ/yul4mNUl9bQpbUuT5Ekpv4xgCxZcnLz0V2DnAj9Devs2Xny5KbcMn55nK+o/fPa9uwls5KYOXt2S5Tvk/ob7gBUxypV6JjA+bNy0b12TbrXrgkk3ZF0bOh/WNgA6DN6IsapjQ3amCroj5rta/H69UNK1SwptxSFFM7/pUGd+Wf8E3QV/n8Y1aW1ujWloJBMpIQubwOQJOkDoLUoij+RT2gp3K2OdULK0ao1naBo/YGUcv8h5Wj9Je5/ogyqgoKCgkLsKB4VFBQUFLSEYlAVFBQUtESiBqWyZs0qrKysdCLE3d0dHx8frbjM0aVOAEdHRx9t9feklGsKitZvKM+q9vlV7n+iDKqVlRV37tzRjqqfKK/FdfS61AkgSZLWOrtTyjUFRes3lGdV+/wq919p8isoKChoCcWgGiAfg4K47uZGz77T6dl3utxyFAyAmjU7YGRkjJGRMdmy5aFVK8Nazg1gaWnNUScnuWXIimJQDYyPQUFMn21P1UKF2bphJls3zMTWdiRv/f3llpYsmjcfxLJdh+WWkSLZ+e81jZOcfsNmcermJXpP6yGzqqg88fLi7dvntCibcpxzx8S2y1fIlMnivygIqv8iUag0AT7jQ+sGdff16/TsO53s2a2QJInixaszbpZhOG5OCUyevhq7eaOj7DtyZAWlC5dm66XLMqlKPteuHebVI13OX08+Dz096TtkNldcXeWWEoXBzVrj7+9N3brdWL5wNOULFDC4qALbd56UW0KSWbn/GK1aDSdTJgt61KpF5sw56DdsNqsPn+CmmxsdO48jMjIyQWVpdenpyw/edKlWHSEEOXMWoECBUnh5ubFo2jDZ3MxtOvcP/Zs01rjrA3XY6Hr1epDbOjejJ/zB+Vt3yZLd3CAijOYupHbCLUkS3XtP4bfyv7Fg7Ag+fPCgX4NGOI2ezV+TByTJE46c+Pm9k1tCrNx58YKVc7dycI8dnz9/5Nj+9ew8f5wXHm/5LV8uahYtKqu+T598ABg6f6gsURkSwsmde+WWkGj6D5/LlrWzCAsLQQhBgQIlqV69PfsPLo0SOr5U7VK8fN4sYYV+i1aZkK1cuXIiNjx8fYWNTTWRK1chseXiJeEdECCEEOLxmzeiWLGq4mtEhLDbd1Tcfv5cRERGRjv+v7ITpSchOmet2SZAinVLlcpEgCRUKiNRtmwDseXCRXHTzS3W/1Ool5bd0YVWIYSoVauzkCSVaNZssGbfvps3RebMOYQkqYQkqUSrViNESFhYnBq1fU1j0vozt58/Fy4eHjGmgST+PnraYLQKIcTXiAhx1dVVZMuWN9pzkSFDZgGSKFu2gfgaEaEzrQnRKUkq0bBh73jzxYQun9VvPH7zRgAiZ86CSdIohDz3P0sWSwGSaNp0gDh5754IDg2NMd9dd3cRGPIlQVq19rqb9Zc9jx5dIyjkS5TwwEUsLdlxcgebz/7DsPatAAgIDsI0jX58kI7u3QHj1Kl45eKOpXUuAEKCQzi3Xx1JwM3NCV/ft0RGRuLkdJYedc5iYpKW/qNmsXyO/v05Xry4E0lSMX7x91AhbStWxPjsceYOmsbt26c4cmQFHdpFcvjwcr3ri4tL1+6SzjQdNrljDnWTJ092PSuKm5ETl2E3/3v3ipmpOYFB/kRGRmrC4zx/fpeIyEiMVPIMN7zy8UGSJLpMNKw+0x9ZNFvtPL6Jbc8Y0486OfH6pRf3LtyjRY+F2WcAACAASURBVO8mBtPPWq5cIxwcNlG7Y704o16Uzpcv4YVqw+oP/HO+kCSVqFSpWaxvAzOzrEKSVKJ161Expuv7rR8TgSFfRIdO4zS1lKHjFseYDx2+9Xv0mSYkSSWcPV4LIYSYu26XsNt3VLN17z1VU1OND32+9X0/fxY5chSIVpv7RqZM2Q1G69eICNGwYW+hUhmJYsWqijMPHoixM1eJAgVKR6ml1qjRXuda43tW23UYI4oVqxpnnrjQ5bP6jSZN+gtA2O0/FmvapIXrxBFHR5EzZ0FRpkz9aPnkqKGCJLr2nBxvvsRo1UoN9fWTlwD0nzUq1jyhIUEANB3QVBun1AnpTdIwds4A9uxaQIYMmeg9qK3eNZSoWQI2wHXnJwSFhDJtcK8o/b8/svrwSdrVqUY2MzM9q4zOtWfPePfuZYw1Oe9PAVSrpv9rGRszlm3izJmNFChQioEzxtGifCVCw0Ki5MmfvwSrdyyWSeF3Ll7Yw4hZhhujKS6OOjlpwoXPGt0HgLVl6skaQvxn8pew0mp5yW7HfPryhTNn1FV+K8uYm3RfwsIICw8lffqMVCpaKLmn1CkH9p4FIDDQn1079D9y2aNlAxZv30/bGr9jkioVJibpYs07pHVz8uXIzYq9R/n05YseVUbn+tnYV6Ws23WcSo0r61FN7ISGh7Nm7gwAXry4z9B2LQkNCyFTJguGT1xMuXINAGjXZ0CsXRf6RAjBud0n6T98LnXqdEWlMkKSJFQqIxZu3kd4RITcEmNl7RR7AOz2R4+AuvLAcX3LiUb69Ga0b99Aq2VqpWMoIuJrrGmh4eHsvaqO4dSu6wiDeEjjYtkMdZ+aqWlmRgzSf7yerKamjOxsS+b06SmdLx/LDuyjdu3OseYPCQliREdbKpWtw79Pn+pR6XeCQ0PZtnIpmTJZ0KHTOOrU6UqVKq00E9GnDOxOSHBI/AXpAZVKRd686lH7NGnSY2aWhSFjF/LY3RXbro1wcb5MmdJ1GTPUMOJ1SZLEpUu7Wb9yCpcu7dbEvpIkifG9OzF14Xq5JZLTSv2bfvfy+0yOJ15enDy5ljJl6jOkTQJHyPXIx6AgChQozcegYK64umq2oNBkPqfJ7ZcIDg0VefIUFZKkEuPn/h0lze39ezFuzhpNn9+Fhw+T1C+R2C2pfahCCE3/Wd+hs+PIo/t+qR8J+/pVvA/wF+8D/MVNNzdx+/lz8T7AX/TsO12kS2emub7Vq7cT511cNMfpq1/KOyBAc91UKiNRqFAFUadOV81mYpJOmKROKxZt2x/r/6jPPrT3Af5iyY6D4sazZ5p9foGBomHD3gIkcfv581iP1bbW+O5/tmx5hampuahRo4NYvueI2HrpsggKCRFbL10WKpWRUKmMxMoDx2M9Xh/P6rdRfrU5UfNj3+mPlClTP8bZAPruQ91y8VKMs35sbKpFGdGPCZ32oaZNnZqzN89T7reizJswkAyZ0vPM0Y1A/0Bu3zrFhw8emGbIjKmZOUUsLZN7Op3i+FLdF5w2bQZ6D2svsxo1nn5+5DY3x8IsI4DmL8Am+2m07N+MCV2H4Op6i6tXDzBjkIo6l3brVWM6k9Tkz18CX583PHjxhHxZs0ZJt7S8zqdPPuxcas+fXdvoVVtMWJhlZORPMdk3HDil6boqX6CAHLJipG3XQfh/CGDntjlR9nerUZ3pViVwd3fmzbM3MqlTU8TSkjJl6nP37tloaTny59B8XnngOHfvnmXSwnX6lBcjNnnz0LRpf/IVVd/rt8/f4uJyhYcP/6VTuzHs2rcwadGQtWn1Q8LCxFEnR+Hg7KzZd/v5cyFJKrHx7IUkW/3EbkmpofYZPEuAJPLmLRbrSPU30FMNddmuw8IkdVqhUhmJI46OcWo6ee+eMDIyjjL6L8fI6c/M27BbqANDxI2cWsuWbaCpoczbsFuvWuPT+dfKraJQoQoiKCQkWlqWLJZCklRiwry1sR6vr2dVCCEmLVynqal+2+z2HxN2+49pvsf2HBvCsyqEEE/fvhUgiVlrtsWaJy6tWp1cZ5IqFc3LlKV+8eKafU/fqvtVGpUvo81TaRW7fUfZsHoqANvOHJBtzuHPDO/YklF/LUMIQUQ8S98eOD5BCMMLZxPwIUBuCXFy//VrXF3Vobrr1OnCqB6GMxsBYMrgbri5OdH7j+l8Dvnev/fozRs+fnyPJEmY5zSXUeF3Zo3uQ+9BM6PsG9q2OUPbNqdMmfo8fvPGYOagxsSeGzdoUduWChUaM7BrqySVoXPLcWr9KV2fIlnsuXGDiX/01BijGkWKyKwoKqP+Gxgb3ro77TqM4c6LF1HSpy7dSOHCFZk26A+DNKiGzLN372j6e32Cgj5haVkQu63zSGVkJLesaFhY5GPv7oX06z2DrZcus/bYGeqUq4aFRT4Gj1nA6O6G8xJYv2oyQghy5iyo2dd70EycnBwMrsvvS5h6OuKnL18YMGIeveo04MmTm/y1fi7mGTIkqUydLgx+9OYNRw/+DUCWJArUJd6fAvijbkOCgz8D0L33FJkVRSerqSm5cxfG2/sVB/Yt4dCBZahU33/0X7+GR8lfqlQtPStMuVy658KbN88AQbtegymWK5fckmJk69kjdK/fkr27F7J390KEEEiSxOn796K0Bg2JJrY92bBa/Xt66+7JUScng6qd+gUGMnfJFrxfe3P+9G7evHmGSeo0DJ+0hEYlSya5XJ0a1Hvur/j82Q/A4Jw6RERGsnLDAY0xLVGiBvZrJsusKmZev37Eoq37ObZhP66uN/H2fh0tT7lyDanRtDFDB3eUQWHsOF64ibr7zPD4s4O69p86dRoatqsts5rYqV+8ODvOHWX2sHlcvLiLSpWaU6tlY4M1pqCuqQKcPLQZgEI5csSRW3+ER0QwZcE6Fk8djkqlIiwsFJVKRZnSdVm4fRl1bWySVb5OrZzfW19APd/P0Dh29y4zR/XRfB/w19goHmYMjdHd2zK6e1tefvDGLzAI+2W7SWeWjgIl8/N7+RIUtbQknYmJ3DKjERTkD2gtVJDW8A8O5tMn9fNpZpaNTOkN7xn9kTo2NtQ5vw3YJreUBLN+1WRYZViVlCGjFmC/YhIAxsapKFWqFiOXTKVHnVpaKV+nBnVou5ZIkkSbDobnXdy2vNpVX4UKjdlxdAO/GcgbND7yZ7MgfzZYu3yC3FISxNWrB+SWECNL7fcwYvJShgztREELC7nlKOiJtcsn6PS3o1ODKkTCnLLKQbZsecifvwRbD69LMcZUQXvMGNFLbgkKvyCG1bGpR7y9Ddt7vIKCQspDSsxUG0mSPgC6skT5hJbih+tYJ6QcrVrTCYrWH0gp9x9SjtZf4v4nyqAqKCgoKMSOYSwJUlBQUPgFUAyqgoKCgpZI1KBU1qxZhZWVlU6EuLu74+Pjo5UJi7rUCeDo6Oijrf6elHJNQdH6DeVZ1T6/yv1PlEG1srLizp3YPbMnh/Lly2utLF3qBJAkSWud3SnlmoKi9RvKs6p9fpX7/3/f5A+PiMD++BkqVGjCqoMnsD9+BvvjZ/D5/FluaQoKAOTPXxKVygj/4GC5pSjEg9YNatmyDThw+7a2i9UZIeHhDGjRBEfHMwxt24IBLZowoEUThg9OmYHRDIG8eYsxaYH8ToTjwsXTA0lSIUnSf3/VW/uOY7Hbd5RIA5r9otYosenwGbml/HKULFmLSpWa8eiNdpx0a92gPnlyg5yZMmm7WK3iHxzMsbtOcebZs3MhmTJZcNQp7nwKUXFwdsbD4wkerh5R9r/y8cHCIh+DRi+QSVl0vhtTSbPt37uY4R1smblya7w+aPVFxozqCAiju7WTWUnMePj6MmXxBipVavZfEEGV5m/jxv34++hpuSXGye3bp1izQjtRLrRqUCMiI0mdOg15zKM6vB00ar42T5NsRo9ZQuca9Vhz5BQmxsbY2o6IlicyMpJPn3wNOqqkIWI3cQ0AeQrnibI/UkTi4+PJw9uOcsiKRo6MmTA1jd0x84zhf+D69q0eFcXOoNnjKFasKiqVES8/eMstJxpdWw9m9ph+3LlzOsrLSZIkHBw28menDnJLjJWOQ/ohhMDvnZ9WytOqQV194Dh3XJ3JkyVLlP3GqQ3Di5N/cDB9Bs9i2/rZBAUFcOPYDVIbG9N8UHMKF66IJEUfuJvQZZDedXr4+kb5vnTnIRo16hPt7b/v5k29a4uPa9cOA5C3aN4o+4+cuyaHnFjJamrK9ovqJnSqVKlp2nQgmTJFdZJy6Ng/ckiLRt8mDRg2fxKSJDF1rJ3ccqLx8eM7hIgkc+bszFyzleLFq2NjU43MmbMjhNC4yDRUYvrdJxWtGlS3u8+xzp492v4CpQwj6NnwYfPZuGYa4eFqT93Ojte4//o1PevW4vHj69jaDqfXgOmUL99Ic4ynpyvrT5/Tq87pU1YDasM6x34no7u1486dU3TqNp4hYxcyeMwCtYPhLQ561RUffoGB+Pm9o02bkfRv3jBKmstVF4QQlKleRSZ10Vk+ZhkAVaq04tixldx8dJcBo773nW9cuJgPnz7JJS8Kb9y8iIj4yuH9q+SWEo3BsyfQuftEdl08w8R+nXnw4CJrD67H2rqspqZqqNSuUxEhBLu2zdNOgdoKfDVh3lqRK1ehGNMaN+4nDt25E+ux8QW+Suz2s861x05rQi3/uBUpUllc+yGU8I84vnypyVeuXMMoaego8NmaI6c0YaFVKiMxZOwi8dDTM0Z9AcHBQpJUYsjYRXq5pjFd1x/xDggQWbPmFrPX7ogxvVjR34UkqcRbf3/ZtQohhLPHayFJKjF6xspoaSYm6TT3/q+VW3WqNaHB5EZMXiZUKiORIUPmBOX/hq6e1dj4c7qdsLYuJ1QqI81z/PfR0/EeJ2eQvs7dJghJUokSJWomKL9Ow0iDOtSJ3azx9PtzRrS0m25unD27mZMn12rjVEkiLDQ82r7MmbOz8dg2qlhbx3hMSPj3Y5ycoofH1QVud90oWLAMHYf0o3vbRuQ2j72PzyxtWoSI1FrfT3Ip/ltJfH296NmucYzpHp5PAMiRMWOM6fpmx/aTlC5VhwEDog/0lC/fSNN18czpmb6lxYjH4+hRGgyRJTOGI4Q6RIsQgk7dxtPkd+3OMdUF2qpFJ7vJHx4Rgf3qvQgRyegR3aKlF7CwIFOm6N0A+mRo2xbR9lWr1jZWYwrQq1kXXUqKkUXThvDgwUUm9uscpzH9hiTJP404ODSUpk0H4O39GiEElpkzx5jv8+ePCGEYU5EuPX7MVrtF/Gk3PUbn0h2G95BBVdxcuaJ21B0UFMDstTtkVhM7PzbzJUnC4eRWqpT63aBH+ss3qoAQguDgT3z68iVZZSX7F/kxKJDlc0ZRsWKzGKdLZTMzo0qVlsk9jdb5e8tfcktINoZgoN5/CuDUKfWcU0mSsLUdyT+PHvHPo0e4vX+vyWdIfWnrF+zk7dsXdKlWVW4pCWazwxGqVWuDEJH8e+Sy3HJi5enT24yatpycOQsihMDX14s3b54xsGUTtv5zSW55MdLbthHW1mV58eI+N58/T1ZZyTaoaVObUKlSM+7fv8CAEfPw9IveBC1VszQPPT01m9zz+woVKh/rXNns2a1IkyY9bm7f55+2bjNSX9IShSEYKGOVEalTp9F8P3JkBXVsilO3eAmqFC9Pw4a9KVbsdwDq1u0ql0wNHz594uyp7XLLSDSNS5WiUr2aSJIKJyfDGoz8mUXThnDjwXUcnB8weMwCTa119YRFckuLEbO0aUmTJj1CCK44JG/mTLL7UE3TpOH8pX1sOOLA83vPqVa2BiYm6QA0fSmfPvkya3QfbGyq0bRjJ6aN6S1rQLmYmsrzN+7B5YoLHz5EnZCeLp0pbUa10Ze0RCGEoEKjCrJqyJMlC0t27+P8tvO4uFwhNDSYV68eAeDr68XZs5sRQpA2bQa6T+kTT2m6JzwiIsaosQraJbe5ObnNzak/vzgeY3uSN2s2bt06yRz7nUzs11luedGwti6Li8sVnt9/kaxytDIold4kDcPat4D2sHxO9NpcixZDWb99FhZm8gxItGo1nCNHVmi+u7reihLbPjYqVGjMlkP2FLG01KW8JFOiRA1GdGoltwwGtWrCoFZNYk3v3G0it2840K1GdT2qSj558xZl0dI/5ZaR4pk/fxMAS3YcMIjnNSbKNyrP4cPw3PVBssrR26iGXMYUoHHvRvFn+oHMmbNToUJjdh/faLDG1MPXl4ZtDXMp4s8E+PlRt2lbuWVEw8XTI8b9rrefAlClanNZn9ufObR1IwBhYSEGs4orLjx8fek9aCarF40jS5acNKghb2sqPoQQ3Lp1Mlll6CVIX51OdfVxmlgp+psVhQqV5+nT+N15ZcuWhyUHdhj8gMWF+85kzhHziLqh4eJyhTy/WcktIxq1Slem94hJzJ88iE3n/uG9u3oQbd3yKVhZFWfCPP2vkouL9OnNAAgI+MAxh6sU7mG4L9Trbm50a9SeFy/uI4TAx0c7zkd0iTYGTvVWQ73/Wr5+q+qFC7P95C4sLPLGmS9VqtQsO7zL4I0pwJ/t9T+tKykcuH2b168fUbZeGbmlAJA9Y0bNIKOf3zuW/jUKC4t8DGzalIn9ujCxXxfCw8PoPmIkJfPkiac0/dKgjeHV8mPC1nYk9UqV48WL+0iSRKNG8vedx4d6xVRksmfO6MWgtm1Yg2fv3unjVLFSvkABjv57jkKFYp5kXLlyC8bMtqNTFcNZGhkXvr5vDbJz/2dePfUAJAoXjPtlpi+MVCoqN6+s+f71azg+Pp6EhYdq9o2dvYpJg6PPqVaIHf/gYI2/icOHl/HlSyCWlgVZffgEp07Zyy0vXqpYW2s8jyUHvRhUCzMz/mzXSx+nipOKBQuy4eg2pi1X90XVrt2ZtSdOs/bEabYcXMOs0Yb/JgV1c8oQpkwlhOIlfwOgbP78Miv5zsiurfn3qWus6bPH9SOVUfyDlvqmbL0ylCvXkHTpzChVrqjccqIwefpqzp7drHGJ2KhRH248uBHNp4Mh06BBr2TXUPXSh5ra2JhXrx7q41TxUrVQIaoWKsS0oYa3GiYhePj60q5WU8zNc8gtJUE0KFECIQzDr+g3jFQqqlhbExmZslwzdqxShY63kzdooisKli5IhQqNuXHjmNxSkszp0+uB9ckqQ/61iwqJ4rGXF15ebtjYpKwpSAq/NiM726ZoY6otFIOaApEkiR2HVsstQ0FB4SekxPQZSJL0AdBaFMWfyCe0FO5Wxzoh5WjVmk5QtP5ASrn/kHK0/hL3P1EGVUFBQUEhdpQmv4KCgoKWUAyqgoKCgpZQDKqCgoKClkjUPNSsWbMKKysrnQhxd3fHx8dHK7PVdakTwNHR0UdbHegp5ZqCovUbyrOqfX6V+58og2plZcWdO/E7GEkK5ctrL+6MLnUCSJKktdHDlHJNQdH6DeVZ1T6/yv3/v23yyx014FfGyd2dUVNXULlyC/LnL6lZjmhqao6Ds7Pc8hT0wFkXF5o2HYAkqTikwxeGttj57zXy5CnKEy+vZJWjNYM6f+OeKMG58ucvyfi5f3PdzU1bp9AqjRv1ZsOZ8wnK+8rHR8dqfh1KlKhJ5UJFWDZrJLduneDVq4capxNBQQE0LVsec/OccstMUfgFBpI/f0mKFq3CvpvJC9Gha5zc3alcuQUtKlTh5Em1U5Q1Ew17EcpDT0/GduiFp6crf6/em6yytGJQ69btxtSBPQFJs7m7uzB/4iA2LN2tjVNonbNnt+Du4p6gvPPnbdStmBjIkSM/hQtXZMXeozGmOzg7M3bmaiwtrVGpjMiWLQ9XXGN3+KEP7PYd5fHja3z9Gk7OnAXoNWA6Z50f4Pv5E76fP/HXyi1ERHzF39+bqUv1f01TKmlTpyZnzoI8fXobuzGL5ZYTK+EREdQoXpqbN4+TNm0GsmRRvzjDwpIXSVTX3H/1mjdv1OHCl88elayykm1Qd1+/zrVrhwkLC6VIkUrUrduVY06OzNuwC4At9jNZuvNQck8jG9suX2GD3TS9n3fl0T18+ODB6K7tMTPLEmUzNTWnZcXfWTx9GO/fuyNJEn5+b7l9Rz4HNIu27mfeiD9p3Lg/kxbac/+JExtWT6GujQ2Z06cnc/r09OvanN9+KwdAeGi43jXuv3WLDp3G0b33VFbsPUqHTuM03RHftoIFS9O991SDalmlTZ1a4wznzZtnfAkLk1lRdNw/fKBenc4IIZi3YRc3H91l8ORZcstKEOsmr9JaWcn2NlWjSBHq1+9JYOBH1u1eoolz/vFzIKD2NxngE5Dc08jGjWM3CAsLjT+jlmlbsSJfTxxkzfjlXL26P0rat+CHhsKyXYeZOXQgnz/7sch+EoVzxtyktzDLSIUqDXj2zFHPCsHt/Xum9RzJo8fXkSSJ7ZvAxCQd5uY5KVCgNC9f3gfU3vC3b5rNob0refDiCfmzWehda1y8fPmAo05OdKhcOf7MesLTz49mtVvj9swRl9cvsc6ePUp6nvzWMinTP8k2qJaZM3P0qF3sJzBORYZMGZJ7Gq2SmKbxVQf53KV1rFKFRqdK8fTtbHwDA3l4/xk1qn73fN++bks8PJ4AULp0XXIV1H/8qwWb9jKxbxfy5CnKoWsXYzWmcjOq7yweP7kRZd+JOzeoY2MTLa+lpTXv3r3kxKWbDGnbXF8SUyxv/PzoNKQ/Pdo3Ibe5ebT0MX/1k0FV0kiXzjR5BQghEryVK1dOxMcRR0eRIUNmAZIASSzfcyTeY4QQ4r+yE6UnKTr9AgNFgQKlRMOGvePVZLf/mABJdOo6Icp+4I4+tMaHSmUkVCojUaZM/RjTtXlNY9Pq4esrLj1+LELCwuLVu/3KVSFJKmFqaq5XrZKkEpKkEvXqdReXHj+OV2fatKZCklTijZ9fjOn6elZ/ZNe1a0KlMhKSpBLNmg1M0DFCyPesOnu8FgULlhFde05OUH59PKsxMXDkPI2tAkl06DQuWVq16mD6S1gY7apU1TSRs2fPR4WyxbR5imQzsO9MXrx4wPpjO+PNu2/FNj0oShqLtn7vBvjW+S8H3+Kvx8ezd+8Y1rIdqVKlZuy85XpQ9p1y5RrS9c/+DO/YMkH5v3wJpHO38VhmNpwgiCapUmFkZMzXr+E8e+aIf3AwmdKlk1tWrKxetgtT08wsXj5abimx8unLF5yuXY2yr+uYDskqU2vTph56emKVp1CU/sb371/RvnZz7PbFPFKtb9adOsvJ4+sAqFiwQJx5P3z6ZLCRGv0CA5kxWN2MGjZxMfY7F8qsKH4mjVjCx4/v6Tt8JpMHddXruW/fPplgYxoUGoKRkRENejbQsarEYVu+PPnzlwTg2TNHPn8x3JFzTz8/9m1ZSZmKNQwqDPfP3H/9mps3T2i1TK0Z1PCICLy9o0c29fR0ZXgHWy48lDcEis/nz9iNm83nzx8BSG+SJs78zh4ePHp0DYCuf7bXub6EEhQaQv2abQgO/oSxcSqadKhrcAMnP+MfHMz+vYspXrw6w0fp15gmls7tx9K06UB61Kklt5QUy+RxKwgK8qdmh5pyS0kUmTJZkMU0eX2oWmvyp02dmmLFfgdg6NzJZMisHohaPW4x168foUu9FmxxOEyDEiW0dcpE8drXF2fnywA0bPhHoo41lKZfUGgINau24u7dc0iSxDS7DdQvXlxuWXHiHxxM/94zSJ06DcMWTOa3HIYbC8vx5UtOn16Hwz0nuaXEiLqfLhJDXuDo/SmAe7cv88eQqSnupVS8eHWqWCdvRoLWDGrhnDl5+PBqtP0Z7NKyYXpOjh//m16NWnPs37OU1aEziJjY+s8lFg6bCoCVVXFWbZ1DpBAEBAdr8pgYGxP69SsZ06VD9cOUpIYN/6BkXvlDIPsFBlK/Zhvu3j2n+VEZehjpb8Z0355FbL10ia7Vq8ktKU7uuj4nPDzMoCK0/sj3ObOGM2XuZ/p1n4q392sGDusYax7/4GBmL9rEqb27cXG5okd1cdNhRPIDd+r8VdeqXDmOHVtNgwa98PJ6TsvqjXF8+VLXp43CqHadNTfO3d0F6+w5MFIZYZ7BVLPZFKlA8UKlMVIZUbJkLbo3tAVg+PyhUQysHCzffYRsGTNx7955zY/q9nPDmXgO8OjNGx54eNB3yGxsbUdSvXo7zDOYcuXSAW65PTNoYxoRGcnSnYfo10Qd8rhM8d+xti5L7dpdZFYWlUKFKsotIU6CQ0O5ceMox/49i03u3FHSBo6cR8aM2ZAkFUUK2FC+QTnZjWkec3MKFCgFgIlJWoICgpJdpl7CSAPUsK2Ng8MmPD1due/2knJ6rAUMmz6XaUN7ApArlzVZs+YmXbqM/N6wLiVrqLsgGpQtzecvX7jx9Blb/lqHs/NlihWtQnkDqK1sWfB9JUehQhVo378fpfPlk1HRdz4GBbH3wlVGdmhHSEj0B/Ldu5eM7DGObQdXY5VN7UXulY8PY4cupH6P+vRpVE/fkqPg9fEj/btP4cSJNZp9L16oJ/lLkmE1rZ8+vSW3hDgZPWEZSw7siPLbPnX/Pn8NmMaNG0cpW7Y+Ddq1Zu74/jKq/E54RAShoepWamjoF45v2s+4P5I3yq83g2o3fYq+ThWN8QM6U6G6+k1UwMKCnJkyYZY2bbR8OTJm5LccOTib7ywAZSrWJpuZmV61/sxbf3/u378AqBdJDPprAkPbtZBV0zfsj59h3YzlODqeibI/VarUZMiQmapV23DmzHr+/fcgJQteoEXrgdTrVo/Ley9RsmYJ8ubKHkvJ+qNJ7TY8eHBJ871atTbYbV9ENlNTjI0My6Aach+qh68v+7atYvWScbh4enDs1FVObz/M9etHSJsmAws372FYF1tSG+vN5MRLehMTzMyyaNbxawVdTJb9hl9goNh9/broPWimZuKsmWkWccTRMVGTZRO7JWeyvBBCvPbxEXfd3UVAcHCM6ehpsvRbf38xBJ3cOAAAIABJREFUw26LZgJ/n8GzEvV/6HKydFBIiEidOo1m0vy3LX36jGLmqm2afDPstoj06TNq0tOkySDatBmlV61xMXb2arHp3D+iYsWmImPGbMLx5ct4j5HrWR0ydpGQJJVQqYzEax+fBB2jr2d1+MQlAiQxfOISkTVrbgGSMDIyFtWrtxMHb9+OV6cc9/+lt7coUKC0xjZVq9Y23mPi06r118V1NzeEENhN38jzZw+4ffuUJs3Kqjh/LppDi7JltX1arZInSxbyZMkitwz+6DSWM2c2AJA5c3aGjusus6LvnHv4kMiffMqmTmXC41fPo1y7qUO606tTU7q2HgzAtNVTYlzuKRfzJw7E/vgZbt06ScGCpfU+YJoYLPIa5vS4sK9fObhNPb97+Zw/AahUqSmD5o+he80ackqLE4FAXePXHlozqOERETx//55qhYtE+6EBzF67nQGdW2CewbDW9Rsqn7584ckPa89tOw6iZJ48MiqKSouyZRk5dSmRkZE8+NcR6+JFmD59QIwTufNkycKlS4bpxhHghfNLJEmiaFHDcTiSknBwdtb4lJi5ait5iuSmZeWKBr2SCyB/Ngs6DxrK7DF9AahQu3qyy9SaQU1lZEQRS0siIr5qq8j/a8zSpsXIKBX58tkwYeVC+jYxrJU7AAumDJJbglYpXrWU3BLiZMrgbkwZ3E1uGdFoVqaM1mt6+mLW6D7MGt1Ha+UZTg+xQjSePTP80BG/AkUrFaFChcZ07NxYbikKKRzFoCr839OjTi163KwltwyFXwBJCJHwzJL0AdBaFMWfyCe0FO5Wxzoh5WjVmk5QtP5ASrn/kHK0/hL3P1EGVUFBQUEhdgxvhrCCgoJCCkUxqAoKCgpaQjGoCgoKCloiUaP8WbNmFVY6Wkni7u6Oj4+PVtw66VIngKOjo4+2OtBTyjUFRes3lGdV+/wy91/b62OTiiGt5Y8PDCRIX3zItT5e0WoYOoVQntXYWH/6nMiZs6AARPXq7cTJe/e0olVnTf42bf7koaenropXSAFcd3Njjv1O5tjHHxBR37h/+KDxLWtrOxIXTw+5Jf0SqFRGNG8+hM8hIXJLiZOP7z/i5aX2O3L67Db+PXubDBkysXDzvmSVqzODevfuOeZMWhN/RoVflvuP3Ni4YBGTBxjWckn3Dx9oWK2pxvv9kSMruPdSl1NBk4+t7UgqVWpGl+4TWbrzEA7OzprNUCouz729kSSJkyf/5pijYYaR+cbo7m01n9OZmDBxaDdGTF/EiilTk1Wuzgxq4zZdcThpuGGYUwJjZ66OM9yFJKmoW9ewjNWPDGjRiCMXj5IliyWefn5yy9EwfvhivLzcGDBiDqlSpQbAftIKmVXFjoevL7dvn+T27VPs3rGAP7u2pXHpMjQuXYZGpUrTu+1A/j56Wm6ZFLT47g1r9bjF+AUGyqgmcaQzMaF3jxYYGRklqxydGdTSdUrrqmit8MrHh4Wb91G7dhdNTSVv3mKER0TILU3Dl8AvQNz99Feu7OOsi4t+BCUBm9y5yZmzIG8MyKCampsyf9t2Vi8ZR9OmA0mdyoSwsC98CQuTW1qMPPbywsvLjVl/byMi4iuvPngzc81WZq7Zyqy/tzF6xRR2Ld7MTTfDCYtz/foRth0/L7eMRJE/mwV/bVpFRAze8hKKztbypzdLT2TkVz6HhGCaJu6QzfrE9e1b1qzczdolUzUhO0xM0mKSOi0eHk9Yseswf3ZtI7NKNSf3x1/DT5MmPebp0+tBTdK47ubG8+d3qZTMaJLaZN3KSZrP23fNpVZ1V27dOsn5hw9pVqaMjMpi58eWSp4sWaIHaFw4yiCusbFxKr5+DQfgweUH0LGlzIoSR37LHKw9eppBrZok6Xid1VA7V/0dP793XHnyRFenSBTP3r2jS49JVCxcguVz/iRr1tzqsLFVWmJ/5hR3nrpQoEApIsINo4bq8/lzjDGavrHq4AkAsmXLq9f4XInl6WtPvnwx3Kbf+UcPuXNH/uZyfAgR9xLxthUNI4Bf6dJ1NZ+PH9jArefPZVSTeKoXLsyZTUl/Hv5vvE39liMHuaxzseLwfsr8VjBGZ80TVy9i08zVjO3VXgaFUbn69CleXjE/jD37TmfL+r8AaNurrz5lJRj/4GA6th6Gi8tlXvt8kFtOrCz9cwmgjiVlqLXTJWOWyy0hwZy9uA+rXAUICPiAj48nrao35IHrXbKamsotLUH4/xBaPinofKXUk4cvdH2KBLNgyiB61KkVq+d7/w/+5P+tmH5FxcJ+u0Mx7h8xeRnbN80GwMzUnEED5Df+MTF5+mrOnt1MxYrNyG1uLrecGHFyd8fZWR2g7/NnX47ddUr2D0oXODhsQpIkVv81g5Ila2k2Q8QsbVr6jPwekPPdu5cc/vemjIoSx6n796lmm3TP/To3qGnSG07/aXx4uXkxZFIPuWUAEBkRvWN86c5D/L1oEhH/DZyVLdeQfFmz6ltavHj4+rJq4VgqVGj8v/bOPC6K+o3j71kRUNNUUFE0kCPvCzU8wjO8QFPL1DTR8izLo7wrNe/U0PLINDVPzDMxrzwQFVDzAgUPEhQEQUBEEFDZ7++PjVXkkGN3Z+k379drXuzMfGfmw8zss9/j+T4Pu3b9ILecXIlPTiY+PgqAy5d9eLdpc4Z6FM1tRh9kOo3D82Z/QkI0G46fyP0gGZk5aShOTs8zTCybPFdGNQWnfZumhT5WbwZV4xsnMDU31dcldErqkyf8tWsnze3t5ZYCQN2WdXnttfLa9Zv37jFtqAfp6anabdY2xtd3GhEfj1v797CwqMqsNfPklpMnFcuU4e2336N8+efuPrt2epKUmprHUYbFPzQUSZIYPXEhAYEBBAb6EBjoQ0CgP19+MBB/IxrZz6SUqSmmpub//hCos6TpNiZW7z/M3F+2ZHHp85q/FacijEnorQ/VLygEkKhmZXw1qJzwXL+DoCBfVHn4fRqSrz8dyMWjF9m1y5P5a7z47ovh2QZ3Og0xvjxTCxas48qVk8z+eSOu9etzNTKSuw8eAHDy8FkkCYSAW5f/oYJVRZZ9/5VsWpvWrImv7+/4h4Zy7kIwa+cuITDwBC2bubLPZxc1K8mfZXTZd2txcenDj/PHZ9levWJF4uOjOH7sLC2NYHT/ZapVt//XM0GVpy+1HEQmJDB2xFz2eWsmHs0dX5LPps6jRafmeHsvRyUV3idZr4NSFhZVaVenjj4vUWTOhIbyXjs3bS0lMCLCaLKL9hrbi0ePEpgyTOMiY25ehnfe8WDfvhUARpmid8WiSdr+Pq9lvxAVdZMHD2IATdNVkqQsf+U0qJm0dHCgpYMD/bu0o6VTO0JC/El98lRuWQB4TOhPXWvrHPcZm6F6kU6DO7Frh6d2/cmzZ5iaGMcYeL8ewwgPv0JaWgrpT58y84d1LP1uAt9Pe0TdOi2LdG69Nfn3/eyNJJWgtJmZvi6hE5wdHOjacxBXr54GoG+nD5AkFY6OzWRWBgNd3ubw4XUIoUYINampj7h165LcsrLw1cxlODo2o0QJE1SqErz1VjemLfqFdQd3curMAeLi7pKR8YyMjGeo1RnZ/hoLoTExzJ7/K5GR13njjTpGkQL5570HmTN6jtEO6uXFsK6uTFv0i3a9zdu9ZFTznG0BAZw+vZuDAUcAMCtZkpoNayKEwN6+MQ8SY4hNeljo8+uvye+3hwoVqujr9DrjaUYG1y5fok6dFkxePo+MDDWrvvbE6e235ZaWIx279yY42A8bG/m9Ebp0Gao1+JKkolo1ewICvOWWVWDWHTnOki+/IyjIF4Cdx72pVqGCzKpgxdfzqVDBKsd9EfHxCCFo38E4/E9zwr6RnfZzSEgAVyMjqVe9uoyKwKGKxiZFJz4k7P59bgaHM22oB9bWjuw94U3i48e4uvRk5tpF9Gxa8MEpvY7yN29pfH18LzNm0mJOndpJ94EfMah9W4a8056AgL2sWDRRbmk5cv3iVUDT/JebTHceSVJpB02KEwvXb6dyZRtGublpjamb2wijmCgRER9PQkI0nQf0yHGfW/v3GD1xoVH2n2bi0aEdjRq1AyA5+QFL5v8mqx6ABjVq4OzsRu+WbXi3aXO+HPi+phvNdx91ra1p5ehIa9eufOjSnrZt+7LR92SBIpHppYb6OD0dITJo16+dPk6vM2KTHnLm+FHc3Ucyd/IIueXkiwoWmljBbv0GyqwEZv+smRrbvsNbRv3Fzo2vRwzi6dPn8/c/n7yIhd99LqOi59SwsKBCBSsSorPGQPAPDWXm6PlcuXKS/T67ZFKXf9p3f1c7yn/B3xeYlvcBesbUxIRt+9Yxb/YaHJs58nGvLrxmbk7JF4KiLFs4gepvVmej50985t4TL9+j1K+ev3EVvRhUn5AQEhLu0aSWcbgg5ca0qcu4d+8WP279iRKq4pENJipSM1HCvLT8/r3Z5pMXM140pqMnLmTRrC+yfLHkxtGxKV6rf2LM6P5s3HmIcwfOcfjwWlJTk+nSZWix6Fv1GNqTpXM0HgqdPzCOGBk2lpb8vGRyrvtVksTU4R8W6v3Wi0G9fC4EgGZ2dq8oKR+Hg4LY7bWCMTPn0/rNN+WWk28yHdEVdIOVVU32njpME1tbo/tRnfD9p7g7e/GGpSWSpEIINV26DOPdUb0Z2aOL3PLyRe2qVfl68WoWTRtLe7dWcsvRO3oxqFOG9WfKsP76OLXOGOTaA4/Rk/nmM+ONJ5oTe47u4KOexjl/v7hhTF4GOdHSwaHY/4CalSzJzLFDmDl2iNxSDIJxOIbJQPPmXZk9tXj0m76Io5VVsRxJV1D4f+D/1qB6e6+QW4KCgsJ/DOlVcRazFJak+4C+ku/YCB2lu9WzTig+WnWmExStL1Bcnj8UH63/iedfIIOqoKCgoJA7xjWsqaCgoFCMUQyqgoKCgo4o0KCUpaWlsLW11YuQ8PBw4uLidBI+R586Ac6fPx+nq/6e4nJPQdGaifKu6p7/yvMvkEG1tbXl77//1o2ql2jWTHfRnfSpE0CSJJ11dheXewqK1kyUd1X3/Feev9LkV1BQUNARikEthlyPjsbOrhElS5qx/5JxxUdV0C9/37pF/wFTsLdvwpqDR+SWo+Xew4fUr++CvX1juaXIyv+VQf1m8a+vDBx9OCjIQGoKz8rl2wgPv0Kffl/SrfH/9wtsKB6lpfHXlSuyaljlfYgub7kQFxvF9LVLGdrlHVn1ZHLv4UPeae1OcLAfHd2MMwtvTiSlpnItKoonz54x5+dNVKlii0pVokg5xXQ6U+rJs2eMm+JJA5cGDO/eOUt+pvlrvDj9hy8hIQH4njsqSwDflfO+1abjyI2ujZuwfPc+ow0+ceDyZX5epAmBtmq1fBk6/4mN5dJtTfeczw5fjuzdka2MWp2BrW0Dhs8eyXvNmxtaYqHJUKvZcfYsF45dJOjUJXx9tyGEYPqy1bjWr28wHQcDA/H6aRcZzzK4F3mHkBB/RkycwZyJxhXLYeaMlQQH+wHwy49TZVaTfzYeOMYXfd6lXbv++PhsBTRpZWYtXMuU8R5UfO21Ap9TpwZ19d5DrFw8GRZDv+RH2jQST549Y+rwAdpy9x4+lMWgxsdHIUl5V8qFEBxad8hoDar3bwdJT0+lceP2lDWXL4Rfb9e+2qDMuSGE4ObN8/z113pC7kZSq2pVA6krGEevXuVNKytqWFgQdj+WHh36cOXKSUBgZWXH0DHTqVjVgolDDFv7Gu7ej7KvVcCyUnXe+cCdGcunGV1ktMiEBE4c2gtA2bLGH07wRcKCwgA4fnwLkiQxYPBU+ozuSc9mbxEfHc/alQWvsOjMoHpfvMCMEaMAzY19sXYaFJE14vWe3cdwGvexri6dbyRJk4HRPzQ014DIkiRx7tx+IhO+Mbp4k/PXeLHScwqvvVaezfs2yKolMPBEgZLEffbRJI4ckVfzywTfvcvwvl9w+vRuLC2tKVfOksTEGJ48SeO998fjNsKNLs2aULV8+VefTMckPn5MTEwYi7evo4+zs8Gvn19cW7tx/fpZAHr0HimzmoKxbN4k7edZKzcwbvD7lDLVpL2/H3mvUOfUmUFdPG4h8fF3AXiv32jKlSqVa9n4qHhdXbZACKEGVHmm3hVCcPfuTUKioozKoD5OT+fAxj1IksSkBT/mmgnTUHhu2cW+X7NHjF+2Yb7288ETZ/l2xCckJycaUlq+cXfpRliYps88Lu4uDx7co1o1R45dPEijN96QVZv/zZs8e2YcmVfz4tq1M0iSRJkyrzNu+idyyykQT56kARq7UL5yea0xrV3LmT//XMWSrZ0Y279nwU4qhMj30rRpU/EyD1JSRPPm3YQkqbTLrdgYIYQQ6U+fimU794mGDdtl2X8+LCzbef49d4H0FESnEEKAJCRJJeas2pzjfiGEkCSVAEkcDgoSBy5fFqMnLsrhPPytb60v4uzcXYz6coGws2skLt2+/crymejynuZXqxBC3IqNEaO+XKC935KkEiF37xqV1tatewuQRNOmncWViIh8/V/60JqbTo+h0wVI4veAACGE5rt0JSJCxD96JIIi7gjvCxdEhlr9Sq36flczn3GFClbZ9m30PSnatx8gypevkuX7L0kq0bp1bzH26yV6uad53dcXUalKCJWqhJi3emuW7Sv/OKDdlxN5aS1yDfWfmBj+/vtglm1ee45SzqIcy6bN1jYHMnFxeZ/aMvWlaRLKSbzZOPf8R5IkYW/fBCEE04dNxaF2IwMqzJnAQB/Onv2TVfsOyF5zyo2b9+6x3+cMsz8fTWrqIx4/fpRlv9eOw1Szq8pw984yKXzO3gsXCAz0oWfPMezYudjoIvUD2L2QMXTlHwdY/OU0/vnnElWr2hEdrUmD065df4bPHU3/lkXLJa8PEpKT+WHMd1y6dBSAt95y4816jaloVYHgc4H4ntiGn98eADxnjTG4vtCY54PTk4f2y7KvWvXKhT9xUa3+J5/Oyvbrk7m8WEPJXLb4+RXY6hd00UUNVZJUokGDtiIiPj6H8xi2hgqSaNOmr0hOS82y/UZ0dJ7HGepXf/GmncLRsdkrn7+ZWWkxZf4q4RMcLB6kpMiiVQghqlevLUASaU+e5Hn/csMQ7+pvPicESKLfh5NFiRImwt39M7F895/iN58TIiw2VoTFxooOHQYKExNTMWv5xly16vtdzXzGQz+bnWX7kOEztM/d3X1UtuNm/Lhe2Nk1FpKk0vk9zeu+ZuJ386ZW38v8cf58rvtepbXIP802dW3yXbZVq5701vEUs4KQWUPNDf/QUG0ZBwcn9vvsMop+VEmSGDj5E8qYmROb9JBho+fg4OBE51ad+e2Yj9zyiAm7R2johVeWe/IkjflTRtG+Xn3GfLHAAMqyc/nOHR48iMbU1Ixr0dF8t2wDn371PTVrNsTV1YMfNhtHJtG29epSv74Lfqf2ciHsFt7ey/i0ZzcGtW2DbaVK2FaqxNGjG5m68Ge++ewjDly+LKve08f+zLJ+N/yO9rPHN4OzlZ/+uQcDPhutb1m58qunV5724FW2IjeKbFC7dXs732VNTUthVrJkUS9ZaJo374oQgmkjBnI4KEi7jJ64CAcHJ1q/WUv7S7N81zqjMKY7zp7FtKQZ1lU18S1mzPiZx0kp1K3bmvDwK0wbJH8aFyGet3Q+6DeBcd8uQa3OQAg1anUGanUGAzymUq2a/b/l1Gz4dRazV2wyuFavLQdISUkCoFWdBkz/fDBeaz15+jSdM2f28eXA95n7yxaD63oZG0tLgoJOcPv2VRrWyD2F8Vcj+1Or1lt4uPYwoLrs3LsXVqjj7Ozk6VLz3rGGqlXt6NZtuE7PW+Q+1BIqFSVLmlKypBm9+nzO7u0/afep1WpSU5OfX8zEtKiXKxKz1sxjQIfLxMdH0aVRYyRJQgiR5S+AvX0TnO2NIwX2gs9m0Kp1b+2MqBU/aFw9HqSkYFF2BVFRofx66CifdO4om8bPP+1L9w8012/h4JBjKuaN62Zx9Go/BnXqqe0DvHPtTrZy+ubQ7zsBePIknQGDJ9NjuDtNbGywsbTkamQkP8xdxw9TJyDUaqaNHGhwfQWlrLk5Q6dOYMonAzgTGopzLt4r+ubp03QuhIfjlEOEp01zN/P+nrdyPG7s/Jl6VpYz9+9H4OY2QuepkIpcQ21sY0N6eirJyYlsXDeL5ORE7fL4cRKDh03XVp8/GC9vHvdODRpw/34EVyLucCjwMgcvX8L/xnUyMp6hVmeQkfEMgCETxufp9mVIhFBTq1H22Tkp6ekIIRj15XxZjSlADQsLXGrV4tbd6Dzz2nesV4/FOzZgaqqZkHAj0PDTfC9cOIwQaoRQs3bVdHo2bYqNpSUA9apX59cV3xAfH83XowbxKC3N4PoKg0U1C1QqFTaVdJZBJN+kP31CndotSEl5SDO755WQQ4d+Ra3OYOr3q/D3/4PSpcuxbMfz5JJ+N2+y+JvxlDSTr5LVvl/OU3d/+XY1AJtOnSzwOfU6vPkoLQ2fv3Zq17d8v16fl8s3da2tca1fH9f69bP9ogsh8Fr2i0zKsiNJKi4FBPDT9r1kqNUApD99yqFzFzExKYnbAFeZFWrYfOo0o9/tzZNnz3It89sxH4Z3dtf6/7n2czOUvHwT+O8kFFdXD8qYmcmsJn9smLMGSVJh9frrBr+2qYkJe312a9cHDv6aC+Hh2vXZXw3lt7/24uzcnQkffUjbtn2ZtXwjvV06kZqazDD3TgbXnIljXdsct2e2oHKqbb8KvWY9DYqI4Pbtq9r1qjXyP4AlF5Ik0fn9PnLL0NK6kys/zvuKM329+cv9U7qP7M6RjUfZvm0Rgz75xmiCo6SnppOS8hDXjgMxMdH0kzfr2IpGbRvx67crAY37V3JyIqVLl6V27Rb0dG8no+LsePn7M7bXh1hYVOXrHydlme0nB2ohCLl7l3rVq+e6P+bhQ4KDT9O4cQcDq3tOzUqVWLptNz9PX8CWDfPYs2MZ1tZv0nfE8/59504umJuX4dChXzl5cgd1arfg1OUAWe/xpu+30X2rU7btly4dpUOHAdhVLoT7lC5dEV6malX7LG4zO86ezbWsIVxR8oMkqcTsnzflWQYDuk0lp6VmmxiR6aoSFhub57GGdEU5HxYm7O2bvNJtTpJUomfPsbJqfZH7SUliwdptom3bfsLExFSAJH7581CexxjqXb2flCTKl68inmVk5Li/d+/xwsKimnBx6SOSUlNzLGPId3WV90FRq9ZbubpROjg0FaPGzRc/bd8rUtLSshxr6OffocNA0bHjRyLmYaIQQoi7CQli86nTwtm5u6hdu4UIjYnJ9Vi9OvbnxoK124iOvlUo1wM5Kay7hL4oY2bO2b8PcyAwkJlDJ5KUlIClpTWj5n6FrQx9ZrnhZGvLhaDTeHw4laSkOBISorh06RiguZdWVjVxdu4OwMr1M2TReD06Wlsj+v2PowT7BeN7bBeRkdcBKFu2An0GjmVYN/maoS9iWbYsn02bzbLfven4thPWFSpy+sYNbodFcXDdn/j57WHgiAnMm/4ppY2ge2K4e2cGd+nI7bg4lv24Ndv+L8YOwL4wtT49sHabJ3ZVrGjZJIg6dVpw8eIRradCcGREoXXqzaDGRcZlWbe0rI7tv53/xkzmL40xYVayJD2bNqXnxaNyS8mTcqVKsXu3J4mPH/MgJZlLt+/wT3A4SfFJdHF3oZWjo6z6mjrW4cmTNIQQZGQ8w8ysNCYmJWnTpg9dP+pFj64ussdIeJlvxw7G9o3aTEmMxcysNImJsZiZmtOmbV/2n/GVbVQ/N0xNTHC0smLp3HFyS8mTzIHI8PAgwsICtZWomjUbFikqmt4M6sJvP2PR9M8B6N17LFu8FmBqotcuW52gVmfILaHYU750acqXLk3NSpVBxokcL2OsQVrywtTEhKioULll/CfJ9OrRJXq1cJroTgoKCgr/HxhfVAgFBQWFYopUkP5CSZLuAzpLS/sSNkJH+cP1rBOKj1ad6QRF6wsUl+cPxUfrf+L5F8igKigoKCjkjtLkV1BQUNARikFVUFBQ0BEFGuW3tLQUtoWY35ofwsPDiYuL04lHvT51Apw/fz5OV/09xeWegqI1E+Vd1T3/ledfIINqa2vL33//rRtVL9FMh/6K+tQJIEmSzjq7i8s9BUVrJsq7qnv+K89fafIrKCj8X+LuPooSJUxQqUrg5jaS0zduFPmcOjOonlt2o1LlHgvT2Flz8IhRzeFXUHiZ0zducDw4mOPBwXJL+U/g1LE5JUpoGukHD67h3Vbtmbc6ewyCgqATgxr14AGbf1iFJEmE3Y/Ns6zH0OlYWzuycP12XVxaZyydMIvMQB4K+iclPY2vZi6TW0ax4FFaGjN/+o329RvSsX4DOtZvQN26rahXtzX16rbmoyHfsNXfn4Tk5FefTM9IkooGDdrStetwnJq4Mmz0HJZs3aON5WtMfDfuYybM/okqVWwBePAghq9HfsTNe/cKfU6dTD39OyyMixePAPAsI/cbdyUygo1rZyNJEr8vX8eEwcYTd/TKFV+M3aDevHeP01evsX/1fp6mPwXg+5WTcLSykllZ/lmxZz8PYh7w+4o1xMVFsmi6fhO1efn7079VK8ZM/UG7rYV7C/oZYerl3HDv7IGv7/YsLaiQkADtenCIP5t/m4u9fRMOnt4vW0SnTSdP8fPeA5iWMuWv3/4iJSWR7ZuWsn0TbPFczYY9q6ldrZos2nJjzsRhVLWzIvZOLLeD77Bp3RxmTl7GpvWzC3U+nc/ltypfPtd9S+dv0H7uNcz48/UYCzvPnePHrxZx/vwhUlKSsnyxTExN2Lx5nlEHnolOTOSTDycRGOhDUlIcJUqU5IftW6lQoZzerx2wLwCApXPHa7ctnQv9XyiTaWyN0dDuu3gRX19Na65xow60cdNkOXB5tzUxd+9TzqIcB9YcwPfYLkJDLzBx1AJtQuDAAAAJtklEQVR27lwsi9bfF25j715NTrkh77TPsm+V96E8bYOcjH5fE1byUVoaZSuWZfnCCVR+ozI/fPdFwU+mi6Ctf5w/L1SqEkKlKpFrUNaYh4miQYO2QpJUQqUqIbwvXMh30NaCLoUJMA0IU1Pz/JY1WNDew0FBwtTUXBukt2bNhsLJqZMYM81TlCnzugBJePn753isXEGbhRDiyJUrYqufnxj15QJRtmxFIUkq0bv3ePHH+fPiflKSOB8WZhCtW/38BJDvxdm5+yv/N0O+q8O/mCskSSWaNH5H3E1IyLVc3/6ThCSpxJtvNs+y3ZDvqoND4QO7y/muvowkqUTTpp2zBcHOj1adVGtmDpvyyjIJySlcvXoKgJPXQmSPjfkivXppYjcOH1u4ar4+mLrgF+ZPGYUQgt8D/Onj7JytzOXT5/Dx2cr2RdtxXV+fiq+9JoPSrFSubIMQmgyybdr2oZOHKysWxWcrZ1m2rEH09GvZkn4i7+nVXv7+LBk3jzNnvDlzxlvbAtjq5yd7jbVGLU0K6fdHDaFahQrZ9l++c4dOzdtw/74mF1aDBi4G1feijoiIEFmurQ8uXjxCfHJygQN3G8xt6uSlK9rPlQz0Zcovhw+vBcDC2kJmJRoWbdjBvMkjEULQtm3fHI0pQEiIHyDYudOT7+avMazIHLgQHs7gzyfhF3SW04Fn2LF9EcPdO8st65X0a9mSgIC9bPXzy7I9s7tATr7+dCBCCJZ+M5UzoVnjon740VQa29gSG3sHIQTt2vVnwYpJsuhs9MYbuLp6EBGf/cdzxJh5MigqOI/S0hg9cREALi59qFKIpIdFrqHuvXCB8HBNOuBy5XKPyD+yezcAOnQYYFR9KfPXeJGamkypUmUZP6yv3HIAiLwegSRJNGzYlv2H1mfbfyUygvD7ccTG3gH+TdHtIW8G0dM3brBj4wHa93IpVoNkL9KvZUvw86N/q1ZyS8lCkybvcPHiET7u4UHAhaPcio3lUugtvDYvQJIkqlWzp1vvwcyf+4WsrRTbuvZs+eMIkz7O+j0KOndWJkW5M3jYDA7t24hrtwG8bvk6ZqXNOLJ7F4GBJ3BwcGK1l2ehxiWKbFAjwqNJTNS4StWp05Jho+dk2f9Wt+bY2zxPK1Gzdi3KmpsX9bI6IzU5FSEEw8fNpFypUnLLycLTJ+nsPHOWJna2VC5XjjVef3Jg424CA3149ChBW65377E01eP0xfxw6cpNju3dg+esMbLqKCr9WrbUDlgtnTueJXPkT+Wx//h22r7lSsi1ABrXa8n9+3d49OgBFSta8dHICUye+LEsKaRfpl7resTeyeo2uXzXn/zzz0WZFOVOWkoasbG32bx+rraLCsDCwpo/fb0LXSkoskHN7IwFCAjYS0DA3iz71yxXI0mqLOWNCY37kTCKL04mDk6OmJiUJORaAIPatsXcvAyWltW5e/dGloefiVOnppiVLCmTWg19Xdsw7eMhXLp9m8Y2xp8uPL94+fvL3o+6dtuf2kpLWFggAFWq2BAcGmQU/eaZDHPvhHU1e774+H3Kly4NwKmdp/5tSRkXa9fNpKp9Vby3/kZ8fBRJSZoceO69PilSC6vIfahv1KxGxYpW2myhmUvp0mWxs2uEnV1jSpV6Lcs+YyEpNZVfFs7E2PxPR7/nztzVG7UOx+npj7l79wY1atRm5Ni5rDtylO+W/QZovlijBrwro1oNd+LjcXLqRL/OH+Ds7M75sDC5JekEOftRN5zwxc1tJNNGDNT2k2YuHl9MNCpjClBCpSIm5jbTZ69CLQSP0tIIvOiLxoHCuChtZobnrDGEhl7g5p2bfDxqJgD7dv9apPMW2aD2cHIiLu4uGRnPsizJyYmEhl7gn38usnzvHwBMW7iK1cumFfWSOqOX+3Di46P51rNoN1EffOXRh+jofxBCjVqdgVqdwe3bV1npORmPDu04vvMQDRu25dbta1QoU0ZuuTjZ2nLs2CauXTvDm3WbMLjHYB6lpcktq0g4O3c3aMulR4/PqVSpBipVCVSqEgzv1AUzs9LEP0oiJS0Vzy27MDcvgyRJfD/tM4PpKgjRiQ8o83oZhgybQUJyMs1bu2JMFZYvZ/zE9jNnsmyzLFuWD0a+i6lpKeLj7xbp/AbxBp82aJghLlNgMvt2xg03jsGo/HI9OpqLF48wa80ao8jH/jKb1s+hWjV70p8+Nar+8oLSomP7VxfSIXYN7Ni3L0q7bluzAW+/9zbDh8zg+rVzWrdD0LRMjBGr119n7qTh2vU6LeuA/A4ogGaW3qpF3zBy5DXttgvh4fw4Zz3+vvt58iS1yC1ogxjUF/tZjY2uXYdRxgiNUl6sXL6NxMRY+rzzttxScmX8gvlGN8iXH8ZO89R+buHewqDXXjJnHE/Sn7Jx1XySkxO5fv0sXw58P1u5KlVsOHT2hEG1FXcy1Gr2rNhOamoypiYm3I6Lw3PJJnasX0lUVCiSJFGq1GsMGjm1SNfRu0Gdt3orcXGRlC5dlpoN7fR9uXxzLSqKlJQkqlSvRskSxStK1sPYhwBULif/yG5OvPFGHT7p3dWop8PmRuYUVWfn7rIMRq1YNJFxXw1i/QZvYu/E4nf8gGaHECBJdP2gH5PGDaJSOf1P29UFp3aflFsCAJEJCRw9uhGAmpWrZKmJOjt3p1Pfd+ns9naRJxzp/Y1/nPSYjIxnPHv2lOQHj/R9uXxzNOAicXGRcssoMMeDg9mxdanR1vi7dBnKnTshHAoMpG8Lw9bwdMlYz1fP/tMXjlZWzJmY2U1mPGMOhaGGYw0sLa1fXVDPVC1fHheXPpw8+TzK3cAh0+g5sju9dBjcWu8G9d1e7VkxtzKdunjw+FGqvi+Xbwa7dWR+9VpyyygwMz+dRUrKQ8zN5R+IepkMtZrDh9dhbe1Averyf4kKSosWPbSf5XaV+q9gU9+WBw8KHw5PV5iamODjsxUoWrzTV6F3g9rMzo74+KhXFzQwZczMi93c434fTubEiW1YWzsyZ8MqueVkI0OtJjn1sVEOlL2KsdM8OXPGGzA+X+nizL2we1hYFL8f18KipEApRvQd/z7NmnVh7ubVeHRoJ7ecbJiamBRLY6qgPzxnjSEmJlxuGQZDMajFiF7NmnHu3H4GtW0jt5T/HEvmjDNqbxSF4oFUkBdIkqT7gM6yKL6EjdBRuls964Tio1VnOkHR+gLF5flD8dH6n3j+BTKoCgoKCgq5ozT5FRQUFHSEYlAVFBQUdIRiUBUUFBR0hGJQFRQUFHSEYlAVFBQUdIRiUBUUFBR0hGJQFRQUFHSEYlAVFBQUdIRiUBUUFBR0xP8AJBCSrpgw01cAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for digit_num in range(0,64):\n",
" plt.subplot(8,8,digit_num+1)\n",
" grid_data = mnist_X.iloc[digit_num].values.reshape(28,28)\n",
" plt.imshow(grid_data, interpolation = \"none\", cmap = \"bone_r\")\n",
" plt.xticks([])\n",
" plt.yticks([])"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "multiclass format is not supported",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmetrics\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mroc_auc_score\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[0mroc_value\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mroc_auc_score\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my_train\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrf_probs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[1;31m#sizes = range(1000, 6666, 1000)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mE:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\metrics\\ranking.py\u001b[0m in \u001b[0;36mroc_auc_score\u001b[1;34m(y_true, y_score, average, sample_weight, max_fpr)\u001b[0m\n\u001b[0;32m 353\u001b[0m return _average_binary_score(\n\u001b[0;32m 354\u001b[0m \u001b[0m_binary_roc_auc_score\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_true\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_score\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maverage\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 355\u001b[1;33m sample_weight=sample_weight)\n\u001b[0m\u001b[0;32m 356\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 357\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mE:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\metrics\\base.py\u001b[0m in \u001b[0;36m_average_binary_score\u001b[1;34m(binary_metric, y_true, y_score, average, sample_weight)\u001b[0m\n\u001b[0;32m 71\u001b[0m \u001b[0my_type\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtype_of_target\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my_true\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 72\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0my_type\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32min\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m\"binary\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"multilabel-indicator\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 73\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"{0} format is not supported\"\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my_type\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 74\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 75\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0my_type\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"binary\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mValueError\u001b[0m: multiclass format is not supported"
]
}
],
"source": [
"model = RandomForestClassifier(n_estimators=10, max_depth=10)\n",
"model.fit(X_train,y_train)\n",
"\n",
"pred = model.predict(X_test)\n",
"\n",
"rf_probs = model.predict_proba(X_test)[:, 1]\n",
"\n",
"from sklearn.metrics import roc_auc_score\n",
"\n",
"#sizes = range(1000, 6666, 1000)\n",
"#train_size, train_score, val_score = learning_curve(rf_lrn, X, y, train_sizes=sizes, cv=3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# MILAN POLLUTION RF REGRESSOR"
]
},
{
"cell_type": "code",
"execution_count": 170,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" stazione_id | \n",
" data | \n",
" inquinante | \n",
" valore | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 3 | \n",
" 2019/01/03 | \n",
" NO2 | \n",
" 51.0 | \n",
"
\n",
" \n",
" 1 | \n",
" 3 | \n",
" 2019/01/03 | \n",
" CO_8h | \n",
" 1.2 | \n",
"
\n",
" \n",
" 2 | \n",
" 4 | \n",
" 2019/01/03 | \n",
" PM10 | \n",
" 29.0 | \n",
"
\n",
" \n",
" 3 | \n",
" 4 | \n",
" 2019/01/03 | \n",
" NO2 | \n",
" 139.0 | \n",
"
\n",
" \n",
" 4 | \n",
" 4 | \n",
" 2019/01/03 | \n",
" CO_8h | \n",
" 1.3 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" stazione_id data inquinante valore\n",
"0 3 2019/01/03 NO2 51.0\n",
"1 3 2019/01/03 CO_8h 1.2\n",
"2 4 2019/01/03 PM10 29.0\n",
"3 4 2019/01/03 NO2 139.0\n",
"4 4 2019/01/03 CO_8h 1.3"
]
},
"execution_count": 170,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset = pd.read_csv(\"Datasets/RilevazioneQA/qaria_2019.csv\")\n",
"dataset.head()"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(6162, 4)"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset.shape"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 NO2\n",
"1 CO_8h\n",
"2 PM10\n",
"3 NO2\n",
"4 CO_8h\n",
" ... \n",
"6157 NO2\n",
"6158 O3\n",
"6159 NO2\n",
"6160 CO_8h\n",
"6161 C6H6\n",
"Name: inquinante, Length: 6162, dtype: object"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset[\"inquinante\"]"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"stazione_id int64\n",
"data object\n",
"inquinante object\n",
"valore float64\n",
"dtype: object"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset.dtypes\n"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" stazione_id | \n",
" valore | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 6162.000000 | \n",
" 4488.000000 | \n",
"
\n",
" \n",
" mean | \n",
" 4.615385 | \n",
" 35.406009 | \n",
"
\n",
" \n",
" std | \n",
" 2.167715 | \n",
" 39.452066 | \n",
"
\n",
" \n",
" min | \n",
" 1.000000 | \n",
" 0.250000 | \n",
"
\n",
" \n",
" 25% | \n",
" 2.000000 | \n",
" 2.100000 | \n",
"
\n",
" \n",
" 50% | \n",
" 4.500000 | \n",
" 21.000000 | \n",
"
\n",
" \n",
" 75% | \n",
" 6.000000 | \n",
" 60.000000 | \n",
"
\n",
" \n",
" max | \n",
" 8.000000 | \n",
" 234.000000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" stazione_id valore\n",
"count 6162.000000 4488.000000\n",
"mean 4.615385 35.406009\n",
"std 2.167715 39.452066\n",
"min 1.000000 0.250000\n",
"25% 2.000000 2.100000\n",
"50% 4.500000 21.000000\n",
"75% 6.000000 60.000000\n",
"max 8.000000 234.000000"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset.describe()"
]
},
{
"cell_type": "code",
"execution_count": 171,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" stazione_id | \n",
" data | \n",
" inquinante | \n",
" valore | \n",
"
\n",
" \n",
" \n",
" \n",
" 2 | \n",
" 4 | \n",
" 2019/01/03 | \n",
" PM10 | \n",
" 29.0 | \n",
"
\n",
" \n",
" 9 | \n",
" 2 | \n",
" 2019/01/03 | \n",
" PM10 | \n",
" 20.0 | \n",
"
\n",
" \n",
" 15 | \n",
" 6 | \n",
" 2019/01/03 | \n",
" PM10 | \n",
" 24.0 | \n",
"
\n",
" \n",
" 20 | \n",
" 7 | \n",
" 2019/01/03 | \n",
" PM10 | \n",
" 32.0 | \n",
"
\n",
" \n",
" 29 | \n",
" 4 | \n",
" 2019/01/04 | \n",
" PM10 | \n",
" 25.0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 6120 | \n",
" 2 | \n",
" 2019/12/30 | \n",
" PM10 | \n",
" 59.0 | \n",
"
\n",
" \n",
" 6125 | \n",
" 6 | \n",
" 2019/12/30 | \n",
" PM10 | \n",
" 69.0 | \n",
"
\n",
" \n",
" 6139 | \n",
" 4 | \n",
" 2019/12/31 | \n",
" PM10 | \n",
" 57.0 | \n",
"
\n",
" \n",
" 6146 | \n",
" 2 | \n",
" 2019/12/31 | \n",
" PM10 | \n",
" 51.0 | \n",
"
\n",
" \n",
" 6151 | \n",
" 6 | \n",
" 2019/12/31 | \n",
" PM10 | \n",
" 59.0 | \n",
"
\n",
" \n",
"
\n",
"
900 rows × 4 columns
\n",
"
"
],
"text/plain": [
" stazione_id data inquinante valore\n",
"2 4 2019/01/03 PM10 29.0\n",
"9 2 2019/01/03 PM10 20.0\n",
"15 6 2019/01/03 PM10 24.0\n",
"20 7 2019/01/03 PM10 32.0\n",
"29 4 2019/01/04 PM10 25.0\n",
"... ... ... ... ...\n",
"6120 2 2019/12/30 PM10 59.0\n",
"6125 6 2019/12/30 PM10 69.0\n",
"6139 4 2019/12/31 PM10 57.0\n",
"6146 2 2019/12/31 PM10 51.0\n",
"6151 6 2019/12/31 PM10 59.0\n",
"\n",
"[900 rows x 4 columns]"
]
},
"execution_count": 171,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"indexName = dataset[ dataset[\"inquinante\"]!=\"PM10\"].index\n",
"indexName\n",
"dataset.drop(indexName, inplace=True)\n",
"dataset = dataset.dropna()\n",
"dataset.describe()\n",
"dataset"
]
},
{
"cell_type": "code",
"execution_count": 186,
"metadata": {},
"outputs": [],
"source": [
"y = dataset.iloc[:, 3].values\n",
"lenght = [i for i in range(1,len(y)+1)]\n",
"dataset[\"n\"] = lenght\n",
"dataset\n",
"x = dataset.iloc[:,4:5]\n",
"X = x"
]
},
{
"cell_type": "code",
"execution_count": 187,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.ensemble import RandomForestRegressor\n",
"regressor = RandomForestRegressor(n_estimators=10, random_state=0)"
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,\n",
" max_features='auto', max_leaf_nodes=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=1, min_samples_split=2,\n",
" min_weight_fraction_leaf=0.0, n_estimators=10,\n",
" n_jobs=None, oob_score=False, random_state=0, verbose=0,\n",
" warm_start=False)"
]
},
"execution_count": 188,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"regressor.fit(x,y)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 211,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The predicted value of PM10 at time 1000000 is [57.2]\n"
]
}
],
"source": [
"# Step 4 - Predict\n",
"time = 1000000\n",
"y_pred = regressor.predict([[time]])\n",
"print('The predicted value of PM10 at time ',time,' is ',y_pred)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}