{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Build a Model Factory\n", "\n", "A model factory is a system or set of procedures that automatically generate predictive models with little to no human intervention. Model factories can have multiple layers of complexity, called modules. One module may train models while others can deploy or retrain models. In this example of a model factory, you set up projects and start them in a _parallel_ loop. This allows you to start all projects simultaneously, without unexpected errors.\n", "\n", "Consider a scenario where you have 20,000 SKUs and you need to do sales forecasting for each one of them. Or, you may have multiple types of customers and you are trying to predict which types will churn.\n", "\n", "* Can one model handle the high dimensionality that comes with these problems?\n", "* Is a single model family able to address the scope of these problems?\n", "* Is one preprocessing method sufficient?\n", "\n", "In this example, use DataRobot to build a single project with the readmitted dataset to predict the probability that a hospital patient may be readmitted after discharge. Then, you will build multiple projects with the `admission id` feature as the target and find the best model for unique value for `admission id`. Lastly, you will prepare the selected models for deployment." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Import Libraries" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from time import sleep\n", "\n", "from dask import compute, delayed # For parallelization\n", "import datarobot as dr # Requires version >2.19\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import seaborn as sns\n", "\n", "sns.set(style=\"whitegrid\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Import data\n", "\n", "Download the sample dataset [here](10k-diabetes.csv)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "data_path = \"https://docs.datarobot.com/en/docs/api/guide/python/10k-diabetes.csv\"\n", "\n", "df = pd.read_csv(data_path)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "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", "
racegenderageweightadmission_type_iddischarge_disposition_idadmission_source_idtime_in_hospitalpayer_codemedical_specialty...glipizide_metforminglimepiride_pioglitazonemetformin_rosiglitazonemetformin_pioglitazonechangediabetesMedreadmitteddiag_1_descdiag_2_descdiag_3_desc
0CaucasianFemale[50-60)?ElectiveDischarged to homePhysician Referral1CPSurgery-Neuro...NoNoNoNoNoNoFalseSpinal stenosis in cervical regionSpinal stenosis in cervical regionEffusion of joint, site unspecified
1CaucasianFemale[20-30)[50-75)UrgentDischarged to homePhysician Referral2UN?...NoNoNoNoNoNoFalseFirst-degree perineal laceration, unspecified ...Diabetes mellitus of mother, complicating preg...Sideroblastic anemia
2CaucasianMale[80-90)?Not AvailableDischarged/transferred to home with home healt...NaN7MCFamily/GeneralPractice...NoNoNoNoNoYesTruePneumococcal pneumonia [Streptococcus pneumoni...Congestive heart failure, unspecifiedHyperosmolality and/or hypernatremia
3AfricanAmericanFemale[50-60)?EmergencyDischarged to homeTransfer from another health care facility4UN?...NoNoNoNoNoYesFalseCellulitis and abscess of faceStreptococcus infection in conditions classifi...Diabetes mellitus without mention of complicat...
4AfricanAmericanFemale[50-60)?EmergencyDischarged to homeEmergency Room5?Psychiatry...NoNoNoNoChYesFalseBipolar I disorder, single manic episode, unsp...Diabetes mellitus without mention of complicat...Depressive type psychosis
\n", "

5 rows × 51 columns

\n", "
" ], "text/plain": [ " race gender age weight admission_type_id \\\n", "0 Caucasian Female [50-60) ? Elective \n", "1 Caucasian Female [20-30) [50-75) Urgent \n", "2 Caucasian Male [80-90) ? Not Available \n", "3 AfricanAmerican Female [50-60) ? Emergency \n", "4 AfricanAmerican Female [50-60) ? Emergency \n", "\n", " discharge_disposition_id \\\n", "0 Discharged to home \n", "1 Discharged to home \n", "2 Discharged/transferred to home with home healt... \n", "3 Discharged to home \n", "4 Discharged to home \n", "\n", " admission_source_id time_in_hospital payer_code \\\n", "0 Physician Referral 1 CP \n", "1 Physician Referral 2 UN \n", "2 NaN 7 MC \n", "3 Transfer from another health care facility 4 UN \n", "4 Emergency Room 5 ? \n", "\n", " medical_specialty ... glipizide_metformin glimepiride_pioglitazone \\\n", "0 Surgery-Neuro ... No No \n", "1 ? ... No No \n", "2 Family/GeneralPractice ... No No \n", "3 ? ... No No \n", "4 Psychiatry ... No No \n", "\n", " metformin_rosiglitazone metformin_pioglitazone change diabetesMed \\\n", "0 No No No No \n", "1 No No No No \n", "2 No No No Yes \n", "3 No No No Yes \n", "4 No No Ch Yes \n", "\n", " readmitted diag_1_desc \\\n", "0 False Spinal stenosis in cervical region \n", "1 False First-degree perineal laceration, unspecified ... \n", "2 True Pneumococcal pneumonia [Streptococcus pneumoni... \n", "3 False Cellulitis and abscess of face \n", "4 False Bipolar I disorder, single manic episode, unsp... \n", "\n", " diag_2_desc \\\n", "0 Spinal stenosis in cervical region \n", "1 Diabetes mellitus of mother, complicating preg... \n", "2 Congestive heart failure, unspecified \n", "3 Streptococcus infection in conditions classifi... \n", "4 Diabetes mellitus without mention of complicat... \n", "\n", " diag_3_desc \n", "0 Effusion of joint, site unspecified \n", "1 Sideroblastic anemia \n", "2 Hyperosmolality and/or hypernatremia \n", "3 Diabetes mellitus without mention of complicat... \n", "4 Depressive type psychosis \n", "\n", "[5 rows x 51 columns]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Display the data\n", "df.head()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Connect to DataRobot\n", "\n", "DataRobot recommends providing a configuration file containing your credentials (endpoint and API Key) to connect to DataRobot." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# If the config file is not in the default location described in the API Quickstart guide, '~/.config/datarobot/drconfig.yaml', then you will need to call\n", "# dr.Client(config_path='path-to-drconfig.yaml')" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Create a project\n", "Create a Datarobot project and initiate Autopilot using data from all patients in the dataset." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "original_proj = dr.Project.start(\n", " df, # Pandas dataframe with data\n", " project_name=\"Readmissions\", # Name of the project\n", " target=\"readmitted\", # Target of the project\n", " metric=\"LogLoss\", # Optimization metric (Default is LogLoss)\n", " worker_count=-1,\n", ") # Amount of workers to use (-1 means every worker available)\n", "\n", "original_proj.wait_for_autopilot(\n", " verbosity=1\n", ") # Wait for Autopilot to finish. You can set verbosity to 0 if you do not wish to see progress updates" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Get the best-performing model from the project" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Choose the most accurate model\n", "best_model = original_proj.get_models()[0]\n", "\n", "print(best_model) # Print the most accurate model's name\n", "best_model.metrics[\"LogLoss\"][\"crossValidation\"] # Print the crossValidation score" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Model insight functions\n", "Use the functions below to plot the ROC curve and Feature Impact for a model." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [] }, "outputs": [], "source": [ "def plot_roc_curve(datarobot_model):\n", " \"\"\"This function plots a roc curve.\n", " Input:\n", " datarobot_model: \n", " \"\"\"\n", " roc = datarobot_model.get_roc_curve(\"crossValidation\")\n", " roc_df = pd.DataFrame(roc.roc_points)\n", " auc_score = datarobot_model.metrics[\"AUC\"][\"crossValidation\"]\n", " plt.plot(\n", " roc_df[\"false_positive_rate\"],\n", " roc_df[\"true_positive_rate\"],\n", " \"b\",\n", " label=\"AUC = %0.2f\" % auc_score,\n", " )\n", " plt.legend(loc=\"lower right\")\n", " plt.plot([0, 1], [0, 1], \"r--\")\n", " plt.xlim([0, 1])\n", " plt.ylim([0, 1])\n", " plt.ylabel(\"True Positive Rate\")\n", " plt.xlabel(\"False Positive Rate\")\n", " plt.show()\n", "\n", "\n", "def plot_feature_impact(datarobot_model, title=None):\n", " \"\"\"This function plots feature impact\n", " Input:\n", " datarobot_model: \n", " title : --> title of graph\n", " \"\"\"\n", " # Get feature impact\n", " feature_impacts = datarobot_model.get_or_request_feature_impact()\n", "\n", " # Sort feature impact based on normalised impact\n", " feature_impacts.sort(key=lambda x: x[\"impactNormalized\"], reverse=True)\n", "\n", " fi_df = pd.DataFrame(feature_impacts) # Save feature impact in pandas dataframe\n", " fig, ax = plt.subplots(figsize=(14, 5))\n", " b = sns.barplot(x=\"featureName\", y=\"impactNormalized\", data=fi_df[0:5], color=\"b\")\n", " b.axes.set_title(\"Feature Impact\" if not title else title, fontsize=20)\n", "\n", "\n", "def wait_for_autopilot(proj, wait=120):\n", " total_wait = 0\n", " while proj.get_status()[\"autopilot_done\"] == False:\n", " sleep(wait)\n", " total_wait += wait\n", " total_jobs = len(proj.get_all_jobs())\n", " print(\n", " \"Autopilot still running! {} jobs running and in queue. Total wait time {}s\".format(\n", " total_jobs, total_wait\n", " )\n", " )" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Visualize the ROC Curve" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAENCAYAAAD+CUlOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABJa0lEQVR4nO3dd3xN9x/H8Vf2HrIRYgshdilKKTVjjxqlLWpWq0XVrBpttb9qiw6qLa1W0dToQGt0USNmIkQSkQTZkT3uOL8/UkFLL5F7T8bn+Xh4PNyRc9854nxyzvl+P18zRVEUhBBCiP9grnYAIYQQZZ8UCyGEEAZJsRBCCGGQFAshhBAGSbEQQghhkBQLIYQQBhm9WGRnZ9O3b1/i4+P/9Vp4eDiDBw+mR48ezJs3D61Wa+w4QgghSsCoxeL06dOMGDGCmJiYO74+a9YsFixYwJ49e1AUhS1bthgzjhBCiBIyarHYsmULixYtwsvL61+vXblyhfz8fJo3bw7AoEGD2L17tzHjCCGEKCFLY2582bJld30tKSkJT0/P4seenp4kJibe03b1ej05OTlYWVlhZmb2wDmFEKIyUBQFjUaDg4MD5ub3d65g1GLxX+7UZeReD/w5OTlERESUdiQhhKgUGjRogJOT0319jWrFwtvbm5SUlOLHycnJd7xcdSdWVlZA0TdsbW1tlHzlSWhoKE2aNFE7Rpkg++Im2Rc3ldV9oSgKaZn5xFzLJC4hi6T0PBLTc0lOzyU3/+aAH3NzM7yq2FPV3R5PN3vcnG3wcLGjqocjHi62WFjc+SwhPyERRVGwq+qDNieH/KxsYlKSi4+h90O1YlG9enVsbGwICQmhVatWbN++nU6dOt3T1944A7G2tsbGxsaYMcsN2Q83yb64SfbFTWrvC61Oz5WkbC4nZBKXmE1k/HUi465zPbsAAHMz8HKzx8fdgWYNq1LNw4Gq7g5U93LEx90By7sUhDtRdDqubN9J7Nff4Ny4EU1eW4SNjQ2WDg6Qklyiy/cmLxYTJkxg+vTpNG3alLfffpv58+eTk5ND48aNGTNmjKnjCCFEqdHq9FxLySEpPZektFwS03JJSs8jLjGL+KQstLqiy+9mZuDr5URLfy/q13Clfg1XaldzwdrK4oEz5FyK4eKqNeREReP+cFvqTJzwwNsEExWL/fv3F/993bp1xX/39/dn27ZtpogghBClTq9XiLmWyemLyZy+mExYdCr5hbri1y0tzPB0taeqpwOt/L2oVdUZv6rOVPd0LJXC8E/XT53m3GvLsHRyouHLM/Fo/3CpbVu1y1BCCFEe5RVoOXkhiSNhCYScTyQjuxCA6p6OdG1dg4Z+bni72ePtZk8VZ1sszI0/YlOXl4eFnR3OAY2pNqAf1Qf2x+o+b2AbIsVCCCH+Q3ZuIRfjrhMZf53QqFTORKag1elxsLOitb83Lf09CazniYerncmz6fLyuPzFV6QdO0bz91ZiaW9HrTGjjfJZUiyEEOIW6Vn5nLyQxMkLyVyITedaSk7xa9U9HenbsTYPNfahUW23+7rpXOo5T54i6oOPKEhOoWrvXhh7ypkUCyFEpaTR6kjNyCc1I5+U63lcTsjkxIUkouIzAHBxtKZRLTe6talZfBPa0V79ofq6ggKiP1pH0v4D2FWvRtPXl+LcyN/onyvFQghRKaRn5RNxOZ1TEcn8ceYq17MKbnvd3NwMf78qPNmrES39vahTzQVzE9xvuF/m1tYUpqXhO2QQNYYPxdxEc82kWAghKpy0zHyir2Rw6WoGUVcyCI1MJCOnqPO1hbkZbZv4UKuqC56utri72OHhWvTHzqZsHhIL09OJ2fAlfqNHYuPhTuNF8zG7z3YdD6ps7hkhhLgPmTmFhJxP5EhYAmHRqbedNXi72VPdzZrBXevQoGYV6vq6YGtdPg59iqKQfOAgl9Z/jq6gAPe2bbDxcDd5oQApFkKIcio9K5/fTl7h8NlrhF9KRa9AFScbWjb0oq6vC3WquVCrmguOdlZ/d4qop3bk+5KfmETUBx9x/dRpnBs3ou7Uydj7VlctjxQLIUS5UaDRcTQ0gf0hcZy4kIRer1CrqjNDH2vAQwE+1PN1LZP3GUoiftu3ZJ6/QJ1nx+PTq4cqZxO3kmIhhCizNFodEbHXCY1OITQylfDLaRQU6vBwsWVwl3p0aVWDGt6lO/lMTbnx8aBXsK9ZA78xo/EdOhjbe2ywamxSLIQQZYaiKFxJzubE+SRCzicRGp1KoaaofUatqs50b1OTdk2q0qSeh0lmRpuKXqvlync7iNu8BeeAxjR5bRFWTk6lPgv7QUixEEKo5kZxOB+TzvnLaZyKSCYxLRcomgD3eNuaBNbzoHFtd1wcK2YH3eyoaCJXrSHnUgzuHdpT59lxake6IykWQgiTys3X8OfpqxwOvcb5mHSycot6KznYWRFQ251BXerRsqEXPu4OKic1vuunThO2eClWLs74vzIb93Zt1Y50V1IshBBGl1+o5dylNPYfi+Nw6DUKNTp83O1p18QH/1puNKrlRnVPxwpzc9oQbW4elvZFjf98Bw+k+oB+WDo6qh3rP0mxEEKUqutZBRwJSyA+KYv4pGziErNISs9FUcDRzorH2tQo6s5as0qJFuEpz7S5eVz+4kvSj4cUN/7zGz1S7Vj3RIqFEKJUxCVmseO3KPYfj0Oj1WNlaU51T0ca1qzCY21qUre6Cy0aemJlWfrrOJQH6SdOFjX+S0mlat/emJWzsygpFkKIEtFodUTFZxAek8api8mcOJ+EtaU5XVvXoE+H2tT0ca5QI5ZKSldQQNSHa0k+cBA7X1+avrEMZ/+Gase6b1IshBD3TKPV88Ofl/jz9BUi4zPQ6vQA+LjbM/LxhvTuULvCjloqKXNrazQZGfgOG0KNYUMwt7JSO1KJSLEQQtyTY+cS+GRHKFdTcmhQ05V+j9TBv5Yb/n5VqOJsq3a8MqUgNY3LG77Ab8zoosZ/C+aqPgP7QUmxEELclaIohEWnsnX/RU6cT6K6pwOLxrejdSNvtaOVSYqikPTLPi59tgFFo8X94XaqNf4rbVIshBD/kleg5WBIHD8eiiHmWiYOdlY8ExRA3451sLIs/wc+Y8hPSCByzUdknDmLc0Bj6k2bjF21amrHKjVSLIQQxWITMvnpUAz7jseRV6ClTnUXnhvWnE4tqpebtt5qiQ/eTvbFSOpMehafHt0rxNnEreRfX4hKrkCj49i5BH46FMOZyBQsLczp2LwafTrUrpRzIe5HbmwcoGBfsya1xoymxtAh2Hh6qB3LKKRYCFEJ5RdqCTmfxKHTVzkWnkBegQ6vKnaM6d2Ix9v6yYgmA/QaDVeCtxO3ZVtx4z9LR8cyPwv7QUixEKIS0OsVLl3N4PTFFE5HJhMWnUpBoQ5nB2s6tfClQ2A1Aut7yryIe5B1MZLI1R+QG3MZj0c6UHt82Wz8V9qkWAhRQWl1CkfPJfD7ySuEnE8qbtjn6+VY1Oq7aVWa1HHHwqJiXVs3pvSTpzj32jKsXV3xnzsH97Zt1I5kMlIshKhAtDo9oVEp/H7qKr+dvEp+4RUc7ax4KMCHZvU9aVbfA3cXO7Vjljva3Fws7e1xaRKA75BBVO/fD0vHit8V91ZSLIQo57JzCzl+PomjYQmcOJ9ITr4WW2sL6lezY+BjTWnewEuGu5aQNjeXyxu+IO34CVqsWomlvT1+o0aoHUsVUiyEKId0eoVTEUnsPXKZI6EJ6PQKro42tA+sxkMBPjRv4EnY2dO0auyjdtRyK+14CFEffExhejrVgvpgZlE5GyDeIMVCiHKkUKPj2wOR7D1ymZTreTg7WBP0SB06NKtGgxpVKs16EMakKyggas1HJP/6G/Y1a+D/8kycGjZQO5bqpFgIUQ5cuprBL0dj2Xcslpx8LU3qujOuXwBtA6rKJaZSZm5tjTY7mxojhuM7eGC5bfxX2qRYCFEG6XR6zl9O58SFonsRMdcysbQwp22ADz3a+dGioZfaESuUgtRUYj7fSK0xT2Lj6UGj+a9UuBnYD0qKhRBlhKIonLyQzN4jlzkVkUROvhZzM2jo58bEgU3p1MIXZwdrtWNWKIqikPjzL8R8thFFq8WjQ3tsPD2kUNyBFAshVKYoCiHnk9i89wIXYtOp4lR0o7qVvzfN6nvgaC8FwhjyriUQteZDMs6G4twkoKjxX9Wqascqs6RYCKGi6CsZrN56iotx1/GqYsfUIc14rE1NuQ9hAle+2052VDR1p07Cu3s36YFlgFGLxa5du/jwww/RaDQ89dRTjBo16rbXw8LCWLhwIRqNhqpVq/LWW2/h7OxszEhClAl6vcLO36PY8EM4zg5WPDesOV1b18BSZlMbVc7lWAAc/P5u/DdsKDYe7iqnKh+M9pOZmJjIypUr+eqrr9ixYwfffPMNkZGRt71n2bJlTJ8+nZ07d1K7dm3Wr19vrDhClBnJ6Xm8uu4w63eG0bqRF6tmduXxtn5SKIxI0emI/fobTr84i5hPPwfA0tFRCsV9MNqZxaFDh2jXrh2urq4A9OjRg927dzNt2rTi9+j1enJycgDIy8vDxcXFWHGEUF1OnoZt+y+y87coMDNjypBm9GznJ5c/jCwr4iKFa9cTl5yCZ+dO1B7/tNqRyiWjFYukpCQ8PT2LH3t5eXHmzJnb3jNnzhyefvppli9fjp2dHVu2bLmvzwgNDS2VrBVBSEiI2hHKjLK2L/IL9ZyKzuG3sCxyC/Q0rWXPY82ccbVO5cSJVKN+dlnbF6ami4pG89U34OSI1RPDyGpQjzMXL6odq1wyWrFQFOVfz936G1R+fj7z5s1jw4YNBAYG8tlnn/Hyyy+zdu3ae/6MJk2aYGMjffdDQkJo1aqV2jHKhLKyL3R6hTMXk9l3LI7DZxMo1OoJrOfB00EB1PN1NUmGsrIv1KDNycHSwQF9YCDxeoWkmr60bt9e7ViqKygoKPEv2UYrFt7e3hw/frz4cVJSEl5eNycSRUREYGNjQ2BgIADDhw/nvffeM1YcIUzmSOg11u4IJSktFwc7K7o9VJPH2tSkfg1XueRkZNqcHGI+30j6iVPFjf9qPjGM5Ep+hlUajFYs2rdvz6pVq0hLS8POzo69e/eyZMmS4tf9/PxISEggOjqaOnXqsG/fPpo2bWqsOEIYXXpWPmu/O8sfp6/i5+PE7Cdb0zbAB2uryt2AzlTSjh4j6sO1FF6/TvX+QZW+8V9pM+qZxYwZMxgzZgwajYYhQ4YQGBjIhAkTmD59Ok2bNuX111/nhRdeQFEU3N3dWb58ubHiCGE0Op2evUdj+eLHc+QV6Bjd059BXerLXAkT0RUUELlqDSm//4m9X038576MU/16aseqcIw6zyIoKIigoKDbnlu3bl3x3zt37kznzp2NGUEIo1EUhWPhiXz+fRhxidkE1HFn6pBm1PB2UjtapWJubY0uL5+aI5+g+qAB0vjPSGQGtxD3SadXOH4uge2/RREalUo1DwfmPtWGdk2qyj0JEylITuHSZxuo/fQYbDw9ixr/yb43KikWQtyjjOwC9h65zE+HY0hOz8PN2ZZJA5vS4+FaMqHORBS9noQ9P3N5wxcoej2enTth4+kphcIEpFgI8R/0eoXTF4s6wf4Veg2tTiGwngfj+jWhbYCPFAkTyrt6lcg1H5EZGoZLs0DqTZ2Erbe32rEqDSkWQtxBfoGWXX9Es/uvyySl5eJkb0Xv9rXp+XAtuSehkivbd5Fz6RL1npuC12Nd5WzCxKRYCHELRVH488xV1u8IJSUjn8B6Hozt3Yh2TarKEFgV5MTEAGY41PIravw3fCg27m5qx6qUpFgI8berKdms2XqaM5Ep1K7mzMzRrQmoI43m1KDXaIjbso0r336HS9MmBCxeiKWjA5aODmpHq7SkWAgBnI1KYflnR1GASYMC6flwLSzM5TKHGrIuRHBx1Rry4uLxfLQztcdJ47+yQIqFqPT2H49j1ZaT+Lg7sGh8O3zc5bdXtaSfOMm515Zh7e5O44XzqNKqpdqRxN+kWIhKKy4xi4+Cz3AmMoXAeh68MraNLGGqEm12DpaODrg0bULNEcOpGtQXS3s7tWOJW0ixEJVOfqGWLb9E8N3BSGysLRnXL4A+HepIew4VaLOzufTZBq6fPF3U+M/BgRrDh6odS9yBFAtRaSiKwl+h1/hkZxhJabl0bV2Dp/sG4Ookbe7VkHr4CFEfr0WTkUn1gf0xs5TDUVkm/zqiUrh8LZO1289yJjKFmj5OLJ/SgaZ1PdSOVSnpCgq4+N4qUv88jEPt2jReMA/HunXUjiUMMFgscnJyePvtt4mOjua9997jnXfe4eWXX8bBQW4CirIvKS2XrfsvsvfIZextLJk4sCm9Hq6Fhcy8Vo25tTX6Qg1+T46i2oB+mMsZRblg8F9p6dKleHl5kZqaio2NDdnZ2SxcuJD//e9/psgnRIkkpOawdd9F9h2LxcwMej1ci5E9/HF2kBvYaihITubS+s+pPe6posZ/8+bIDOxyxmCxCA8P5/XXX+fXX3/Fzs6Ot99+m759+5oimxD3LSdfx4ffnmbPX5cxMzOj58O1GNylPp5VZGSNGhS9noSf9hCz8UsAvC7FSOO/cspgsTA3v/10XafT/es5IdRWqNGx6/dovt6bgEYHPdr5MbxbA9xdpEioJTf+ClFrPiTzXDiuzZtRd8okbL29DH+hKJMMFos2bdrw1ltvkZ+fz++//86mTZt46KGHTJFNCIM0Wj37jsWydV8ESel51K9my4zR7aXZXxlwdef35MbGUf/5aXh2eVTOJso5g8Vi5syZrF27FicnJ1auXMkjjzzC1KlTTZFNiLvSaHX8fDSWrfsuknI9jwY1XXluWHN0WXFSKFSUHX0JM3MzHGrVotaY0dQcMQzrKlXUjiVKgcFi8euvvzJ16tTbCsT27dsZMGCAMXMJcVfnY9J4d/MJriTn4O9XheeGNqdFw6Lr4CEhcWrHq5T0hYXEfbOV+ODtuAY2LW78BzJqsqK4a7HYv38/Wq2WFStWoCgKiqIAoNVqWblypRQLYXIarY6v9lwg+MBF3F3tWDS+Ha38veTyhsoyw88TuWoNeVeu4vVYV2o/M1btSMII7loswsPD+euvv0hNTWXjxo03v8DSknHjxpkknBA3xCVmseKL48Rcy6T7QzUZ378J9rZWaseq9G40/rPx9KDxqwuo0qK52pGEkdy1WNy49LRp0yZGjRplykxC3OZASBwfbDuNtZUFC8e1pU1jH7UjVXra7GwsHR2LGv+NGkG1vr2xsJORZxWZwXsWQ4cO5eeffyYnJwcoGjobGxvLjBkzjB5OVG75hVrWbQ9l75HLBNRxZ9boVjIUVmWarCxiPt3A9dOnabHq3aLGf0MHqx1LmIDBYjFjxgzi4uJITk6mcePGnD59WobOCqOLiE3nna9CuJKcw9DH6jOqh7+06FBZyqHDRH/8CZrMTHwHD8TcSi4DVib3NIN77969vPrqqzz99NMoisLixYtNkU1UQlqdni2/RPDNLxG4OduydFJ7mtX3VDtWpaYrKODiyvdJPfwXDnVq03jRfBzr1FY7ljAxg8XCy8sLS0tLatWqRUREBL169SIvL88U2UQlE5uQycqvTxAZn8GjrXyZODAQRzv57VVt5tbWKHodfmNGU31AP8wsLNSOJFRgsFjY29uza9cu/P392bJlC3Xq1OH69esmiCYqC51eYcevUXy5Oxxba0teHtOajs2qqx2rUstPTOLS+s+oPf5pbL288H/lZRmiXMkZvAi8cOFCwsPD6dChA+bm5owePVqGzopSk56Vz/yP/uSz78No5e/FmtldpFCoSNHpuLrrB05On8H102fIvRwLIIVCGD6zqFWrFrNnzwbg3XffBSAyMtKooUTlcP5yGq9/fozsPA3PD2/BY21qyEFJRblx8USu/oCs8xdwbdmCelMmYuMp94tEkbsWi/j4eFauXImrqyszZ87Ezs6O7OxsVq1axaZNmwgNDTVlTlGBaLR6fjp8ic92heHuYsfb0x+hdjUXtWNVete+/4G8K1eo/8JzeD7aWQq3uM1di8XcuXNp0KABSUlJfPzxx3Ts2JEZM2bg7OzMJ598YsqMooLIydOw+3AMO3+PJi0zn5b+Xswc1Qone1mQSC3ZUdGYmZvjULsWfmNGU2PEcKxdXdWOJcqguxaLhIQENm7cSH5+PoMGDWLLli089dRTPPPMM1jKMojiPiiKwo+HYtjwwznyCrQ0q+/B88NbFDf/E6anKyggbvMWrmzfebPxnyyVLP7DXY/69vb2ANja2pKRkcGKFSvo2LGjyYKJiuFyQiYffnuGsOhUAuq4M75/E+r5uqodq1LLCDtH5OoPyb96Fa9uj1H76TFqRxLlwD2dIri7u0uhEPclr0DLNz9fYPuvUdjbWjJtaHO6P1QTc3M5k1BTesiJosZ/Xl4ELF6Ia/NmakcS5cRdi8WtlwcsSjgJZ9euXXz44YdoNBqeeuqpfzUkjI6OZtGiRWRkZODp6ck777yDi4vc6CzPFEXh91NX+HRXGKkZ+XR/qCZj+zTGxdFG7WiVmiYzCytnJ1yaBeL35Ciq9u2Nha2t2rFEOXLXYnHhwgVatmwJQH5+fvHfFUXBzMyMEydO/OeGExMTWblyJcHBwVhbW/PEE0/Qtm1b6tWrV7ydyZMnM2/ePDp16sTbb7/N2rVrmTVrVml9b8LEriRns3rrKUKjUqnr68KcMW3wr+WmdqxKTZOZxaX1n5Fx5mxR4z9HB3yHDFI7liiH7losfv755wfa8KFDh2jXrh2uf4+s6NGjB7t372batGkAhIWFYW9vT6dOnQCYNGkSmZmZD/SZQj2xCZnM/fBPdDqFKYMDebxdLSzkkpNqFEVBF3aOk++tRpudg++QQZjbyKgzUXJ3LRbVqz/YLNqkpCQ8b5nQ4+XlxZkzZ4ofx8bG4uHhwcsvv8y5c+do0KABCxYseKDPFOqIS8xi3keHMDcz443pHfH1kjWw1aTLzyfinXfRHDmGY726BLy2CIdatdSOJco5o42BvbEM661uvQ+i1Wo5evQoX375JU2bNuXdd9/ljTfe4I033rjnz5CJgTeFhISo8rlXUgv5+tcUFOCpxzxJjIsgUeVlsNXaF2WFoihoMjKw7NYVTbuHOJ+aCqmpasdSXWX/uXhQRisW3t7eHD9+vPhxUlISXl5exY89PT3x8/OjadOmAPTt25fp06ff12c0adIEGxu5cRoSEkKrVq1M+pm5+Ro27T7P93/EU8XZlteefZiaPs4mzXAnauyLsiA/IYFL6z+n9oRnsPXyQmnVihMnTlTKfXEnlfXn4p8KCgpK/Eu20VaTad++PYcPHyYtLY28vDz27t1bfH8CoEWLFqSlpXH+/HkA9u/fT0BAgLHiiFJ0PDyRqW8dYNcf0fR8uBZrZnUtE4WiMlJ0Oq7u/J6T018k42woubFFp3Uy2VGUNoNnFsnJycybN4/Lly+zadMmXn75ZV5//fXbzhLuxNvbmxkzZjBmzBg0Gg1DhgwhMDCQCRMmMH36dJo2bcqaNWuYP38+eXl5+Pj4sGLFilL7xkTp0+r0bPjhHNt/jaKGtxNvTn2ERrVltJNacmNjubjqA7IjLlKldSvqTp6IjYe72rFEBWWwWCxevJhu3brx5Zdf4uLigr+/P/Pnz2ft2rUGNx4UFERQUNBtz61bt674782aNWPbtm0liC1MLSk9lxVfHOfC5XR6t6/FuH5NsLaSRXDUdO2Hn8i/lkCDF1/Ao1NHOZsQRmXwMtSVK1cYNmwY5ubmWFlZMWvWLK5du2aKbKKMiIy/zgvv/EpsQhazn2zN5MHNpFCoJOtiJNnRlwDwGzOaFqvfw7PzI1IohNEZPLMwMzNDr9cXP87Ozr7tsajYzsek8eq6wzjYWfHaxEeo7umodqRKSVdQQOxXm7m683tcmwUS8OoCafwnTMpgsXj88ceZOXMmWVlZbN68ma1bt9KrVy9TZBMqOxuZwmvr/6KKsy3LJnXAs4qd2pEqpYyzoUSu+ZD8awl4P96NWk9J4z9hegaLxaRJk9i+fTt6vZ5Dhw4xfPhwhg4daopsQiV6vcL2X6PY+OM5qnk6snRSe9ycpY+QGm40/rP18SZgyau4BjZVO5KopAwWi82bN9O3b18GDBhggjhCbelZ+by7+SQnzifxcNOqPDesuSxOpAJNZiZWzs5Fjf/GPknVPr2wkDlFQkUGb3AfPXqUbt268corr3Dq1CkTRBJqibmWyQvvHORsZAqTBwfyytg2UihMTJORwYX/vcvJ6S+izc7B3NIS30EDpFAI1Rk8s3jnnXfIyMjg+++/Z+nSpRQUFDBkyBDGjh1rinzCRCLjr7Pw40NYWVrwv+c7yZrYJqYoCim//0n0uvXocnPxHTpYGv+JMuWeZnC7uLgwfPhwJk6ciJ2d3W1zJUT5d/5yGvM//BNbG0vemNpRCoWJ6fLzCV/2BhH/W4mttzfN3nmLmk8Mw9zKSu1oQhQzeGYRFhZGcHAwu3fvpnHjxowfP56uXbuaIpswgePhiby58RhVnGxZOrk9XlXs1Y5U6Zjb2GBuaUmtZ8ZSrW8fzEq42JgQxmSwWEydOpXBgwezdetWqlWrZopMwkR+OnSJj4LPULu6CwvHtZMRTyaUd+0al9Z/Rp0J47H19qLhyzNlYp0o0wwWi4MHD5oghjClAo2OL38KZ/uvUbRu5M3sJ1tjZ2O0BsTiFopOx9VdPxC76WvMLC3Ji4/H1ttLCoUo8+56hBgxYgRff/01LVq0uO0H+V6XVRVl0/HwRD7+7gwJqbn0bl+LZwc0xcLCaM2HxS1yYi4TufoDsi9GUqVNa+pOfhYbd2n8J8qHuxaL9957D4Dvv//+X6/daWEjUbblFWh5b/NJ/jxzlep/T7RrVt/T8BeKUpOwew8FSUk0mPkiHh3by9mEKFfuWixutCBftGgRn3zyyW2vDRs2jC1bthg3mSg1sQmZvLHxOPFJWYzu6c+gLvWxspSzCVPIiriImaUFjnXq4DdmNDVHPoGVs6z9IcqfuxaL6dOnc+nSJeLi4m5rM67VajE3lwNNebH/eBwffHsaW2sLFk94mBYN/3sdElE6dAUFxG76mqu7fsC1eTMCFs3H0l5Gmony667FYvbs2Vy5coUFCxawYMGC4uctLCyoX7++ScKJktPp9KzdfpYfD8XQpK47M0e1wt1FGgGawvUzZ4la8yH5CYn49OqB35jRakcS4oHdtVj4+vri6+vLnj175NpqOZOTp2HFF8c5cSGJgY/WY2zvRnIT20TSjocQvmQ5tlV9aLLsNVyayFLBomIwOBqqZcuWMhqqHElOz+PVTw5zJSmbaUOb06Odn9qRKgVNRgZWLi64Nm9GrafH4tOrh/RzEhVKiUZDibKpUKNj2edHSLmex+JnH5bRTiZQeD2DS5+sJyM0jJar38PS0ZHqA/qpHUuIUnfXaxM3RkO5ubmRnJxM9erV+eWXX1i9erVcliqj1m4/S1R8Bi+NbCWFwsgURSHp4G+cnPY8qYePULV3L8zlTEJUYAan7b7yyivUqFEDc3NzNm7cyIABA1iwYAHr1683RT5xj/Yfj2XPX5cZ+lh9HgrwUTtOhabLz+fCiv+RHnICp4YNqDdtCvY1a6gdSwijMnjXMy4ujpdeeokDBw4wcOBAnnvuOa5fv26CaOJexacUsGbraQLreTCqh7/acSo8cxsbzG1tqT3+GZq+vlQKhagUDBYLjUYDwB9//EG7du3Q6XTk5uYaPZi4N4lpuXz9WypuLrbMfrK1jHoykryrVzn32lLyExMxMzOj4awXqRYkHWJF5WHwMlTLli3p3bs3FhYWtGzZkrFjx9K+fXtTZBMG5OZreG39X+h0CgvHtcPFUa6ZlzZFp+PKjl3Eff0NZlaW5F25iq23t9y3E5WOwWKxYMECTp48ib+/P+bm5owbN45OnTqZIpv4D3kFWhZ/8hdXkrIZ9ag7Nbyd1I5U4eRciuHiqg/IiYrCre1D1Jk4ARt3N7VjCaEKg8XCwsKCpKQkvv32WzQaDR06dJB2HyrL/7tQnL+czqzRrbDTJqgdqUJK2LOXwpQUGs5+Cff2D8vZhKjUDBaL9evXs3PnTgYOHIiiKHz++eckJCQwefJkU+QT/1Cg0bHk0yOEX0rlpVGt6NisOiEhUixKS+b5C5hbWeFY90bjvxFYOctZmxAGi8X27dv5+uuvcXR0BGDIkCEMGzZMioUKdDo9b31xnLNRKbw4oiWdWviqHanC0OXlcXnT11z7/keqtGxO44XS+E+IW93T8mg3CgWAk5MTlpayqpqpKYrCR9+d5UhYAhMHNuXRVjJcs7RcP3WayDUfUZCUhE/vnvg9KY3/hPgngzcfqlevzoYNG9BoNGg0Gj7//HNZi1sFW36JYPfhGAZ3qUffjnXUjlNhpB0PIWzRa5hZWtJk+RLqTpyApb105xXinwyeIixevJiZM2eyYsUKAJo1a8bbb79t9GDipv3H4/hy93m6tPJlbJ/GasepEAqvX8fa1RXX5s2oPe5pfHo+jrm1tdqxhCizDBYLb29vvvjiC/Ly8tDr9Tg4OJgil/jb6YvJrNpyksB6Hjw3rIWMyHlAhenpRK9dT2Z4eHHjv2r9+qodS4gy766XoWJiYhg8eDAtW7ZkypQp5ObmSqEwscj467z++VGqeTryylMPyVKoD0BRFJL2H+TktBdIO3acan37YG5rq3YsIcqNux59XnvtNQYOHMjWrVvx8/MrvgwlTONASBwvr/4DOxtLFo1rh6OdldqRyi1dfj7nXlvGxfdWYedbnebvvo3vkEGYy0ANIe7ZXf+3pKSkMHp00aiQmTNn0r9/f5OFqsy0Oj2f7gpj1+/RNKnrzuwnW1PFSX4DfhDmNjZYOthT59lx+PTqiZlMKhXivt31f82tw2MtLCxKNFx2165d9O7dm+7du7Np06a7vu/gwYN07dr1vrdf0eQXalny6RF2/R5N/051WTKxvRSKEsqNv0LYq0vIT0goavw380Wq9ukthUKIErprBVAU5bbH93tjNTExkZUrVxIcHIy1tTVPPPEEbdu2pV69ere9LyUlhTfffPO+tl0R5RVoWbL+CKHRKbIc6gNQdDritwUTu3kLFjY25F29hq2PrO8hxIO6a7FISEhg6dKld308f/78/9zwoUOHaNeuHa6urgD06NGD3bt3M23atNveN3/+fKZNm8b//ve/kuSvELLzNCxed5iIuOu8OLIVj7aUmdklkR0dTeH6z7mckIj7w+2oM3E81lWqqB1LiArhrsVi1KhR//nYkKSkJDw9by7t6eXlxZkzZ257z8aNG2ncuDHNmjW7r23fEBoaWqKvK0sycrRsOphCSqaWIR3ccFISCQlJvO/thISEGCFd+aL5cTdKVjZWQweR08ifs9HRakdSnfxc3CT74sHctVj88wzgfv3zMhbcfikrIiKCvXv3FjcmLIkmTZpgU47XPY6+ksH7n/xFfiEsfvZhmjfwKtF2QkJCaNWqVSmnKx8yw88XNf6rVxdto8acOhFC644d1Y5VJlTmn4t/kn1RpKCgoMS/ZBvtbp+3tzcpKSnFj5OSkvDyunkw3L17N8nJyQwePJhnn32WpKQkRo4caaw4ZU5YdCpz1vyOuRm8Oe2REheKykqbm0f02k84+8p8Yr/aDIClvR1mdtKqQwhjMNpA8/bt27Nq1SrS0tKws7Nj7969LFmypPj16dOnM336dADi4+MZM2YMX331lbHilClXU7JZ9tkR3JxtWTa5A+4ucoC7H+knThL1wUcUpKRStU8v/EZXnl8yhFCLUc8sZsyYwZgxYxgwYAB9+/YlMDCQCRMmcPbsWWN9bJmXnVvIa5/8BZixcHw7KRT3Ke3Ycc4tXoq5jQ1NX19KnQnjsJCzCSGMzuCZhV6v59NPP+XixYssWLCATZs2MX78eCzuYaH6oKAggoKCbntu3bp1/3qfr68v+/fvv4/Y5VNuvoalnx0lMS2PpZPaU83D0fAXCQAK09KxdquCa4vm1B7/DD49ukvjPyFMyGCxWLFiBWlpacVnA7///jvJyckGh86K2yWl5fLa+r+IT8rmxZEtCajjrnakcqEwLZ3otevIDL9AyzV/N/4L6qN2LCEqHYPF4vDhw3z33XcMGjQIR0dHPv30U2n9cZ8uXE5j6adH0ej0LH72YZrV9zT8RZVcUeO/A1xa/zn6wkJqjhgul5uEUJHBYmFpaYn5LS0SrK2tZaW8+/DL0ct88O0Z3F1sWT6uAzW8ZT1nQ3R5eZx/4y2unzqNc+NG1J06GXvf6mrHEqJSM3jUb9CgAZs2bUKn0xEdHc3nn3+Ov7+/KbKVaxqtnnXbz/LT4Ria1fdg1ujWuDiW3zkhpmRua4ulsxN1Jk7Ap+fj0s9JiDLA4P/CefPmERYWRmpqKiNGjCAnJ4e5c+eaIlu5lZuvYd6Hf/LT38ugLp7wsBQKA3Lj4glduPhm47+XZlC1t3SIFaKsMHhm4ejoyPLly02RpULQaPUs//woEbHpzH6yNY80l8sn/0Wv1XIleDtx32zFws6W/IREafwnRBlksFjc2jzwVjIa6t/0eoX3Np/k9MUUXniihRQKA7KjoolctYacSzG4d2hPnWfHY+3qonYsIcQdGCwWN7rGAmg0Gv744w9atGhhzEzl1uafL/DryXjG9G7EY21qqh2nzEvat5/C6xn4vzIb93Zt1Y4jhPgPBovFPxsKTpw4kYkTJxotUHl1LSWHrfsieLSlL0O61lc7TpmVEXYOc2trnOrXw+/JUdQcOQJLR1nbXYiy7r7vHtrb25OUlGSMLOXaZ9+HYWlhztNBAfe9UFRloM3NJeqjdYTOXUDc5i0AWNjZSaEQopwweGaxZMmS4oOfoiiEhYVRp04dowcrT0KjUjh89hqje/rj5izLoP5TesgJIj/4mMLUVKoG9cVv9Ai1Iwkh7pPBYlHlHyuN9evXj379+hktUHmTk6dh9dZTeLjY0r9zXbXjlDlpx44TvvR17Gr4EvjmcpwaNlA7khCiBAwWi9jYWFasWGGKLOWOTq/w9qYQElJzWTa5A7bWMrMdis5AC9PSsHF3p0rLFtR5djzej3fD3MpK7WhCiBIyeM/iwoULd1z1TsCm3eEcD0/k2YFNpTHg3wpS0zi//E1OvzgbTVYWZhYWVO3TSwqFEOWcwV+FPTw86NOnD82aNcPB4ebNyMo+z+J4eCJb912kRzs/ej1cS+04qlMUhaRf9nHpsw0oGi01Rz6Bpb292rGEEKXkrsWisLAQa2trWrRoIfMq/iEuMYt3N5+gpo8TEwc2rfSjn3R5eYQvf5OMM2dxbhJAvWmTsataVe1YQohSdNdiMXz4cL777rt/zbOo7K4mZzP/oz8xMzPjlbFtsLI0vAhURWdua4u1WxXqTp6I9+PdpJ+TEBXQXf9Xy32Kf8vO07Bo3WG0OoWlk9rj61V5243nxsYSuuBV8q4VNf5rMON56RArRAV21zOLgoICzp07d9eiERAQYLRQZZGiKLz79QmS0/N4fUpH/Hyc1Y6kCr1GU9T4b8s2LOzsKEhMxK6qNP4ToqK7a7GIi4vjueeeu2OxMDMzY9++fUYNVtYEH4jkSFgCE/o3oVFtN7XjqCLrYiSRq9aQezkWj04dqTP+GaxcpPGfEJXBXYtFvXr12L59uwmjlF2RcdfZ+FM4HZtVI+iRyjt7PfnAQbTZ2TSaNwe3h9qoHUcIYUIyi8wAvV7ho+AzODtYM21o80o38injbCjmNjY4Nahf1Phv1AgsHaSfkxCVzV3vRrZu3dqUOcqsfcdiuRCbztN9A3CwqzwTy7Q5OUR+8BGh8xcR981W4O/Gf1IohKiU7npmUdkn3QFk5xay4cdzNKrlRpdWvmrHMZm0Y8eJ+vBjCtOvU21AP2qOfELtSEIIlcllqP+wfmcYWbkaJg0KrDSXn1KPHOP88jew96uJ/5zZODWQtTmEEFIs7irkfCK/HItl6GP1qVO9Yo/4URSFwtQ0bDzccWvdkjqTJuDd7THp5ySEKCYzqO4gJ0/D6i2nqOHtxIjHG6odx6gKUlIJX/Y6p1+cdbPxX6+eUiiEELeRM4t/UBSFD789Q1pmPisqcDsPRa8n8edfiPn8CxStlpqjR0rjPyHEXUmx+IcfD8Xw68l4Rvf0p6FfxZx8p8vL49zS18kMDcOlaRPqTp0ss7CFEP9JisUtImLT+WTHWVo38mboYxV3RTdzW1tsPDyoO3US3t27VZqb90KIkpN7Fn8r1OhY8cVx3JxteXFkS8zNK9YBNCfmMmfnLSTv2rW/G/9Nx+fx7lIohBD3RM4s/vbjoUskpuWyZOLDONlbqx2n1Og1GuK3fkv8tmAsHR0oSE6RtSaEEPdNigVFrce3/BJBiwaeNG/gpXacUpN1IYLI1R+QGxuH56OdqD3uGaycK29bdSFEyUmxALbtiyArV8PYPo3VjlKqkn/9HW1OLo0WzMWtdSu14wghyjGj3rPYtWsXvXv3pnv37mzatOlfr//yyy/079+ffv36MWXKFDIyMowZ545SM/LY9Xs0j7bypa6vq8k/v7RdP3OWrIiLAPg9OZIWq9+VQiGEeGBGKxaJiYmsXLmSr776ih07dvDNN98QGRlZ/Hp2djavvvoqa9euZefOnTRs2JBVq1YZK85dbdt/Ea1eYVQPf5N/dmnSZucQufpDwha8StyWWxr/ydwJIUQpMFqxOHToEO3atcPV1RV7e3t69OjB7t27i1/XaDS8+uqreHt7A9CwYUOuXbtmrDh3lHI9jz1/Xeax1jXwcS+/3VR1FyI4+dwLJO7bT/VBA2g46yW1IwkhKhijFYukpCQ8PT2LH3t5eZGYmFj8uEqVKnTr1g2A/Px81q5dW/zYVLbsi0CvVxjevfy29Eg9cgzNN9uwdHYicMXr1Br7JBY2NmrHEkJUMEa7wX235Vj/KSsriylTpuDv78/AgQPv6zNCQ0NLnC85Q8Puw4m0qudA/KVw4i+VeFMmpygKZGZi5uKCYg6WfXqia96MiMwMCAlRO57qQmQfFJN9cZPsiwdjtGLh7e3N8ePHix8nJSXh5XX7sNSkpCTGjRtHu3btmDt37n1/RpMmTbAp4W/Riz/5CzsbS14Y/QgujuXnN/GC5BSiPvyY7MhIWqx5HysnJ0LMzWnVSm5iQ9EBQfZFEdkXN8m+KFJQUFDiX7KNdhmqffv2HD58mLS0NPLy8ti7dy+dOnUqfl2n0zFp0iR69erFvHnzTDqT+OSFJI6HJzK8W4NyUygUvZ5rP+3mxLTnyQgNw3foELl5LYQwGaOeWcyYMYMxY8ag0WgYMmQIgYGBTJgwgenTp5OQkMC5c+fQ6XTs2bMHKDpTWLZsmbEiFftqz3m83OwJeqSO0T+rNOjy8ji3ZDmZYedwaRZIvamTsP17YIAQQpiCUSflBQUFERQUdNtz69atA6Bp06acP3/emB9/R3GJWZy/nM4zQQHlpv24ua0ttt7eeHXtgtdjXaSfkxDC5CpdI8F9x2IxNzfj0ZZle03tnEsxnH1lfnHjv/rPT8O7W1cpFEIIVVSqdh86nZ4DIXG09vemirOt2nHuSK/RELdlG1e+/Q5LR0dp/CeEKBMqVbH4KzSBtMwCHmtTQ+0od5R5/gKRqz4gLz4ezy6PUvuZp6TxnxCiTKg0xUKn0/PFT+HU8HakbUDZXBUu5bc/0Bfk03jRfKq0bKF2HCGEKFZpisUvx+K4kpzN3KcewsKi7NyquX7qNBZ2djg1bIDfmFF/r4Vtp3YsIYS4Tdk5ahpRgUbH13vP4+9XhXZNysZZhTY7m4vvryFs0WvEbwsGwMLWVgqFEKJMqhRnFr+fjCc1I5/pw1uUidFEqYf/IurjdWgyMvEdMogaw4eqHUkIIf5ThS8WiqKw47do/HycaNHA0/AXGFnqkaOcf+MtHGrXpvGCeTjWLR8TA4UQlVuFLxZnIlOIuZbJc8Oaq3ZWoSgKBcnJ2Hp54da6FXWnTsar66OYW1b43S+EqCAq/NFq+69RuDhaqzYJLz8piagPPiYnOrq48Z/P46ZtxS6EEA+qQheLsOhUjocnMrqXP9ZWpm3toej1JPy0h5iNXwJQa8woLB3K7wJLQojKrcIWC71e4ZOdobi72NK/U12TfrYuL49zry0j81w4ri2aU3fKRGz/0Z5dCCHKkwpbLA6eiCcy7jozRrTE1to036aiKJiZmRU1/qtWFe/uj+HZ5dEyMQJLCCEeRIWcZ6HR6vjip3Dq1XA12b2K7Ohozr48j7yrV4sa/z03Fa+u0iFWCFExVMgzi71/XSbleh7PD2+OublxD9b6wkJiN2/hync7sHJxpjAtHbtq1Yz6mUKUBxqNhvj4ePLz89WOgqWlJeHh4WrHMBkLCwtcXV3x8PDA3Lx0zgkqXLEo1OjYsu8iAXXcaVbfuPMqMs+Fc3HVB+RfvYrXY12p/cxYLB0djfqZQpQX8fHxODk5UatWLdXPsHNycnCoJANMFEVBo9GQmJhIfHw8NWvWLJXtVrjLULv/iiEtM5+RPRoa/Qc05dBhFK2WgMULqT99qhQKIW6Rn5+Pu7u76oWisjEzM8Pa2prq1auTk5NTatutUGcWiqLwwx+XaFzbjcB6xjmrSD9xEgt7e5z9G+I3eiR+o0ZgYSf9nIS4EykU6imty0/F2yvVraks5lomV1NyeLRV6a9XocnKIuLdVZxbvJQr334HFDX+k0IhhKgMKlSx2HcsDgtzMx5uUrory6X8eZiTU58n5bff8R06mIazXizV7QshTCciIoKGDRuyZ8+e4ueefPJJjhw5ctv75syZQ3BwUUdoRVH47LPP6N+/P/3792fgwIH88MMPJc5QWFjIrFmz6NWrFwMHDiQqKupf71m9enXx5/Xv35/AwEDWr19f/Hp2djZ9+/YlPj6+xDnuR4W5DJVXoOWXo5fpEFgNVyebUttu6l9HuLDibRzq1qHxqwtwrFO71LYthDC94OBgevTowebNm+nRo8c9fc3KlSs5d+4cX375JU5OTiQkJDB69GiqVKlC+/bt7zvDF198gZ2dHT/99BPHjh1jzpw5bN269bb3TJs2jWnTpgFw6NAhVqxYwejRowE4ffo08+fPJyYm5r4/u6QqTLHYfyyWnHwtfTs+eBdXRVEoSErC1tsbtzatqffcFLy6PIqZhWlbhgghSpdWq2Xnzp1s2rSJJ554gtjYWIOjhXJyctiwYQM//PADTk5Fyxz7+PjwzjvvYPePy9DXrl1j0qRJ/9rGpk2bcLxlAMzBgwd5/vnnAWjTpg3p6elcvXqVancYdl9YWMjixYtZsWIFNjZFvwhv2bKFRYsWMXv27PvbAQ+gQhQLnb6oDXnDmlXwr1XlgbaVn5hI5JqPyLkUQ8s172Pl7IR3t8dKKakQldP+47H8fDTWKNvu/lBNura+t+GhBw8epFq1atSuXZtu3bqxefNmgwfc6OhoHBwc8PW9fYJvYGDgv95btWpVduzYYTBHUlISnp43B+F4enqSkJBwx2KxY8cOGjZsSLNmzYqfW7ZsmcHPKG0VolgcCb3GtdQcxvZpXOLRF4pOx7Uff+LyF19hZm6O39jRWDpWjnHZQlQWwcHB9O3bF4DevXszc+ZMXnjhhTseNxRFwdzcHHNzcxRFuaft3+uZxZ3cbfTS5s2bmT9//j19vjFViGKx/dcovN3sade0ZDe2tbl5nHt1CVkXLlClVQvqTp6EjadHKacUovLq2vref/s3ltTUVH777TdCQ0PZuHEjiqKQmZnJ3r17cXFxISsr61/vd3Z2pm7duuTn5//rMtEPP/xASkoKY8eOLX7uXs8svLy8SE5Oxs/PD4Dk5GS87tBsNDExkfT0dFq0aFHSb7vUlPvRUBnZBYTHpNGjnR8W99na48ZvC5b2dtj71aD+jOdptGCeFAohKqCdO3fSrl07fvvtN/bv38+BAweYNGkS33zzDe3atWP79u1otVoAoqKiCA0NpXnz5tja2jJq1CheffVVsrOzgaLZ6e+88w5165aso3Xnzp2Li8rx48exsbG54yWokydP0rJlyxJ+x6Wr3J9ZXLqaAUCDGvd3ryI7MorotZ9Q//nnsKtejXpTJxsjnhCijAgODmbGjBm3PTdy5Eg++eQTFixYQFxcHP3798fc3BwbGxv+97//4ebmBsCMGTNYvXo1w4YNw9LSEgsLC1566SU6duxYoixPPvkkCxcupE+fPlhbW7NixQoAzp49y/vvv8+6desAiIuLw8fH5wG+69JjptzrxbgypKCggNDQUJo0acKPh+P4dFcYXy7uiYuj4SGzuoIC4jZv4cr2nVi5uNBw5gxcmgSYILXxhISE0KpVK7VjlAmyL25Se1+Eh4fTqFEj1T7/VpWpN9St/vlvcOux88bIqntVrs8sdDo9vxyLxdfL8Z4KRUZYGJGrPyT/6jW8u3ej1lNj5Ca2EELcg3JdLE5dTCY2IYs5Y9rc0/tTDx9F0ekIeG0Rrs3+PexNCCHEnZXrYvFXaAJVnGz+cxRU2vEQLB0ccG7kj9+TI/EbPQILW1sTphRCiPKvXBeLMxdTeKRFjTuOgtJkZnLpk89I/vU33No+hHMjfyzu8xqdEOLB3FhqWJieXq8v1e2V62Kh0+v/tWyqoiik/HGIS+s+QZudQ40nhuE7ZJBKCYWovGxtbUlNTZU1LUzs1sWPSvOmfrkuFq5ONtTzdb3tubS/jhLx9js41qtLwGuv4lDLT5VsQlR2vr6+xMfHk5ycrHYUCgsLsba2VjuGyVhaWuLi4oKHR+nNGSvXxaKGtxNmZmYoikJ+QiJ2VX1we6g19Z+fhmfnTtL4TwgVWVlZUbt22ejSHBIScltvJXH/jDqDe9euXfTu3Zvu3buzadOmf70eHh7O4MGD6dGjB/PmzSuePXmvfL0cyU9IIGzhYs7MfgVNZhZmFhZ4de0ihUIIIUqR0YpFYmIiK1eu5KuvvmLHjh188803REZG3vaeWbNmsWDBAvbs2YOiKGzZsuW+PqNGfCgnn5tB9sVI/EaPkDkTQghhJEa7DHXo0CHatWuHq6srAD169GD37t3Fi3lcuXKF/Px8mjdvDsCgQYN4//33GTlypMFt35h0bnHyME5t2+A3eiTWVapQqNEY5XspDwoKCtSOUGbIvrhJ9sVNsi+K7t0A99xF91ZGKxb/7Nfu5eXFmTNn7vq6p6cniYmJ97Rtzd9FweaZMRQAEVeuwJUrpRO8nAoNDVU7Qpkh++Im2Rc3yb64SaPRYHuf882MVizuVLluHT5n6PX/4uDgQIMGDbCyspIheUIIcY9uDKstyZBaoxULb29vjh8/Xvw4KSnptn7t3t7epKSkFD++Wz/3OzE3Ny9e3lAIIcS9u98zihuMdoO7ffv2HD58mLS0NPLy8ti7dy+dOnUqfr169erY2NgQEhICwPbt2297XQghRNlh1Bblu3bt4uOPP0aj0TBkyBAmTJjAhAkTmD59Ok2bNuX8+fPMnz+fnJwcGjduzOuvv16pJs4IIUR5US7XsxBCCGFa5X5ZVSGEEMYnxUIIIYRBUiyEEEIYJMVCCCGEQWW+WBi7GWF5Ymhf/PLLL/Tv359+/foxZcoUMjIyVEhpGob2xQ0HDx6ka9euJkxmeob2RXR0NE8++ST9+vVj3LhxlfrnIiwsjMGDB9OvXz8mTpxIZmamCilNIzs7m759+xIfH/+v10p03FTKsISEBKVLly5Kenq6kpOTowQFBSkXL1687T19+vRRTp48qSiKorzyyivKpk2bVEhqfIb2RVZWltKhQwclISFBURRFeffdd5UlS5aoFdeo7uXnQlEUJTk5WenZs6fSpUsXFVKahqF9odfrlccff1z59ddfFUVRlLfeektZsWKFWnGN6l5+LkaMGKEcPHhQURRFef3115V33nlHjahGd+rUKaVv375KQECAEhcX96/XS3LcLNNnFrc2I7S3ty9uRnjDnZoR3vp6RWJoX2g0Gl599VW8vb0BaNiwIdeuXVMrrlEZ2hc3zJ8/v7hxZUVlaF+EhYVhb29fPOF10qRJjBo1Sq24RnUvPxd6vZ6cnBwA8vLySjybuazbsmULixYtumNXjJIeN8t0sbhTM8Jbmw0+SDPC8sbQvqhSpQrdunUDID8/n7Vr1xY/rmgM7QuAjRs30rhx4wq/4I2hfREbG4uHhwcvv/wyQUFBLFq0CHt7ezWiGt29/FzMmTOHefPm0bFjRw4dOsQTTzxh6pgmsWzZMlq3bn3H10p63CzTxUIxYjPC8uZev9esrCwmTJiAv78/AwcONEU0kzO0LyIiIti7dy9TpkwxZSxVGNoXWq2Wo0ePMnr0aHbt2kWNGjV44403TBnRZAzti/z8fObNm8eGDRv4448/GDlyJC+//LIpI5YJJT1ululi8c9mg6XZjLC8MbQvbjw3cuRI/P39WbZsmakjmoyhfbF7926Sk5MZPHgwzz77bPF+qYgM7QtPT0/8/Pxo2rQpAH379r1tqYCKxNC+iIiIwMbGhsDAQACGDx/O0aNHTZ5TbSU9bpbpYiHNCG8ytC90Oh2TJk2iV69ezJs3r8KeYYHhfTF9+nT27NnDjh07WLt2LV5eXnz11VcqJjYeQ/uiRYsWpKWlcf78eQD2799PQECAWnGNytC+8PPzIyEhgejoaAD27dtXXEQrkxIfN0vt9ruR7Ny5U+nTp4/y+OOPK2vXrlUURVHGjx+vnDlzRlEURQkPD1cGDx6s9OzZU3nxxReVgoICNeMa1X/ti7179yoNGzZU+vXrV/xn7ty5Kic2HkM/FzfExcVV6NFQimJ4X5w6dUoZPHiw0rt3b+WZZ55RUlJS1IxrVIb2xcGDB5WgoCClb9++ytixY5XY2Fg14xpdly5dikdDPehxUxoJCiGEMKhMX4YSQghRNkixEEIIYZAUCyGEEAZJsRBCCGGQFAshhBAGWaodQIgbGjZsSIMGDTA3v/k7TJMmTf5zgmFwcDB79uzh448/fuDPX7VqFZs2bcLb2xszMzN0Oh3u7u4sWrSI2rVr3/f2EhMTef7559m8eTNxcXGsWLGCVatW3fb8g4qPj6d79+40aNCg+Lnc3Fx8fHxYvnw5NWrU+M+vX716Nf7+/hW2NYwoPVIsRJmyYcMG3NzcVPv83r17s3DhwuLHX3zxBS+99BLBwcH3vS1vb+/ignD16lUuXbr0r+dLg62tLTt27Ch+rCgKS5cuZeXKlbzzzjv/+bVHjhyhXr16pZZFVFxyGUqUC9u2bWPo0KEMGDCALl263HFG9t69exk4cCCDBg1i6NChHDt2DCjqlzVnzhwGDRpEUFAQy5cvv+d1Tx5++OHig3xCQgKTJk0iKCiIvn378sknnwBF/ZcWLVpEUFAQgwYNYvr06eTk5BAfH0+LFi3Q6XTMnz+f2NhYxo0bV/y8Xq+nc+fOnD17tvjzZsyYUfy9ffjhhwwcOJD+/fszZcqUe26SWVBQQHJyMi4uLgBcunSJp59+muHDh9OlSxcmT55MQUEBmzZtIjQ0lBUrVvDzzz9TWFjI8uXLGThwIP369WPOnDlkZ2ff02eKik+KhShTxo4dS//+/Yv/pKamkpOTw9atW1m7di3bt29n5cqVvPXWW//62hUrVrBo0SKCg4N5/vnnOXLkCADLly8nICCA4OBgtm/fTnp6Op999pnBLFqtlm3bttG2bVsAZs6cSdu2bdm1axdff/01O3fu5IcffuDUqVMcPXqUnTt3EhwcTI0aNbhw4ULxdiwsLFi6dCk1a9Zk/fr1xc+bm5szePBgvvvuOwAyMjI4dOgQQUFBbN++nYiICLZu3cqOHTvo3Lkz8+fPv2PO/Px8+vfvT1BQEO3bt2fgwIHUrl2bmTNnAkXtqgcMGMA333zD3r17iY+P5+DBg4waNYomTZowe/Zsunfvztq1a7GwsCA4OJidO3fi5eXF22+/fY//cqKik8tQoky522Wojz76iF9//ZWYmBjOnz9Pbm7uv97Tp08fpk2bRufOnenQoQMTJkwAilbLO3v2LNu2bQOKDq538+OPPxb3zNFoNAQEBLBkyRJyc3M5ceIEn376KQBOTk4MGjSI3377jXnz5mFhYcHQoUPp2LEjPXr0IDAw8I4rlP3T4MGDGTJkCHPmzOH777+nS5cuODk5ceDAAc6ePcvgwYOBonUY8vLy7riNWy9D/f7778yaNYsOHTrg4OAAwKxZs/jzzz9Zt24dMTExJCUl3XH/HTx4kKysLA4dOlT8/bu7uxv8HkTlIMVClHkJCQkMHz6cYcOG0apVK3r27MmBAwf+9b4ZM2YwZMgQ/vjjD4KDg1m7di3BwcHo9Xree+896tatC0BmZuZdGy3+857FDdnZ2f9q7azX69FqtTg7O7Njxw5OnDjBX3/9xQsvvMCYMWPu6aZx9erVady4MQcPHiQ4OJi5c+cWb3v8+PHF3XILCwvvaTnURx55hKeffpoXX3yRn376CScnJ1588UV0Oh29evXi0Ucf5dq1a3dsU63X65k7dy6dO3cGICcnh4KCAoOfKSoHuQwlyrzQ0FDc3NyYMmUKjzzySHGh0Ol0xe/RarV07dqV3NxcRowYwaJFi4iKikKr1dKxY0c+//xzFEWhsLCQyZMn8+WXX95XBkdHR5o1a1a8rnNWVhbbt2+nffv2HDhwgKeeeooWLVrw3HPPMWDAgOIurzdYWFig0WjuuO1hw4axbt068vPzadWqFQAdO3Zk27ZtxfcM3nvvPWbPnn1PWZ955hmcnZ15//33Afjjjz+YOnUqvXv3xszMjNOnTxfvOwsLi+L7Nx07dmTTpk0UFhai1+tZsGCBwRvkovKQMwtR5nXo0IFt27bRs2dP7OzsCAwMxM3NjcuXLxe/x9LSkrlz5zJz5kwsLS0xMzNj+fLlWFtbM2/ePJYtW0ZQUBAajYb27dszfvz4+87x9ttv89prrxEcHExhYWHxDW29Xs9vv/1G3759sbe3x8XFhSVLltz2tfXr18fCwoIhQ4awcuXK217r2rUrixcvLr5sBjB06FASExMZNmwYZmZmVK1a9Z4XLbKysmLBggWMHz+eoUOHMmPGDKZOnYqLiwt2dna0adOG2NhYALp06cKbb76JRqNhypQpvPnmmwwcOBCdTkejRo2YM2fOfe8nUTFJ11khhBAGyWUoIYQQBkmxEEIIYZAUCyGEEAZJsRBCCGGQFAshhBAGSbEQQghhkBQLIYQQBkmxEEIIYdD/AY5XSjmHwFPHAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_roc_curve(best_model)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Plot Feature Impact" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0IAAAFUCAYAAAAJTozbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABC8klEQVR4nO3deZhO9f/H8ddtVoNpLDNTofJTjSxjJEwSUXZjGZM0DNXXpCRShAbJkvWLLNkqITuDkLGmzTJIGHsJUWYwGdvsc35/uOZ8jVm6Lfeg83xc11zXnP19zv25z31e91lum2EYhgAAAADAQgrc6QIAAAAAIL8RhAAAAABYDkEIAAAAgOUQhAAAAABYDkEIAAAAgOUQhAAAAABYDkEIAP4FIiMj5efn949/69evd3gtycnJ+uKLLxy+nJsVFhYmPz8/nTx58k6Xctv9+OOP2rNnz50uAwDuCc53ugAAwO1TvXp1Va9ePdfhZcqUcXgN7du31++//67XXnvN4cvC/8ydO1cfffSRJk2adKdLAYB7AkEIAP5FqlevrrfffvuO1nDu3Lk7unyrYrsDwI3h0jgAAAAAlkMQAgCLMgxD8+bNU6tWreTv769q1arpjTfe0P79+7ONe/nyZU2aNEktWrRQlSpVVKlSJTVo0EAjR47UlStXJEknT56Un5+fTp06pYsXL8rPz099+vSR9L/7ci5cuJBlvpnTdOnSxezXp08f+fn5ac+ePWrSpIkqVaqktm3byjAMSdLx48fVs2dP1axZUxUrVlTjxo01depUpaam3vS2CAsLU/369XXq1Cl1795dTz31lJ566il169ZN8fHxunDhgvr3768aNWqoevXqeuONN7LdY+Tn56eePXtq69atCgkJkb+/v+rVq6exY8cqOTk52zK//fZbderUSYGBgapQoYICAwPVpUsXHThwINu4J0+eVEREhGrXrq3KlSuradOm+uKLL8x1DgsL08SJEyVJb731lvz8/G56WwCAVXBpHABYVO/evbV8+XI99thjatu2rRITE7V69Wq1bdtWU6dO1dNPPy1JSktL06uvvqo9e/aoVq1aqlWrli5fvqyNGzfq888/18mTJzV+/Hh5enqqa9eumjlzppKTk/X666/riSeeuOn63nzzTVWqVEnPPPOMPDw8ZLPZtG/fPnXs2FFJSUlq0KCBHnzwQe3YsUNjxozR9u3bNXXqVDk5Od3U8i5duqSXX35Z999/v9q0aaOdO3dqzZo1+vvvv3X58mWlpKSoVatWOnLkiL799lvFxcVpyZIlstls5jwOHTqkTp06qUqVKmrXrp22bt2qKVOm6JdfftGMGTNUoMDV7x+/+uorDR48WA899JCaNWsmFxcX7d27Vxs2bNDWrVsVFRUlHx8fSdLhw4cVFhamhIQEPffccypTpoyio6M1YsQIHTp0SCNGjFCrVq0kSdHR0WrSpIn+7//+76a3OwBYBUEIAP5FoqOjNWHChByHtWrVSqVKlZIkrV69WsuXL1ezZs00YsQIOTtf/Th4/fXXFRISot69e2v9+vVydXXVmjVrtHv3br3xxhvq0aOHOb+ePXuqYcOGWr9+vRITE+Xp6am3335bS5cu1YULF275XqUnn3wyy7oYhqE+ffooJSVF8+fPV8WKFc1hw4YN05dffqn58+erXbt2N7W8+Ph41a9fXxMmTJDNZlNaWprq16+v6OhoValSRfPnz5erq6ukq2dgoqOjdfToUZUtW9acx+HDh9WuXTsNGDBA0tUQ+c4772jdunVatmyZgoODlZKSorFjx+qRRx7R0qVL5eHhYU4/cOBAzZs3T99++61eeuklSdJHH32khIQEjR8/Xg0aNDC3RadOnbRs2TJ16NBBwcHBOnXqlKKjo9W0aVO98MILN7UNAMBKuDQOAP5FoqOjNXHixBz/Tp06ZY63ePFiSVJERIQZgiSpdOnSatu2rWJjY7V582ZJUvny5TVkyBB17Ngxy7IKFy6s8uXLKz09XQkJCbd9XTIP+jPt3r1bhw8fVkhISJYQJEndu3eXi4uLIiMjb2mZHTp0MM/wODs7q1KlSpKuBp/MECRJlStXlqRsl8d5eHioe/fuZrezs7Pef/99SdKKFSskSenp6Ro8eLCGDh2aJQRJMp/4l/ngg9OnT2vHjh2qWbNmlu1hs9n07rvvqmvXrlnqAgDYjzNCAPAv0rVrV7vOxOzbt09ubm6aM2dOtmG///67JOnAgQPmpVhlypRRcnKydu/erd9//10nTpzQvn37FB0dLenqwf3tlnn26tqaJenEiRM5nvUqVKiQDh06JMMwslyudiMefvjhLN2ZQeX6Wtzc3CQp231Jfn5+uu+++7L0e+ihh+Tl5aWDBw9KkgoWLKgmTZpIurqtf/vtN504cUJHjhzRli1bJEkZGRmSrl5qJ0kBAQHZaq1QoYIqVKhww+sIALiKIAQAFnTx4kWlpaWZN9jnJPMsT0ZGhqZOnaoZM2aY/YoXL64qVaqoZMmS+u2338wHGdxO7u7uWbozH7Twww8/6Icffsh1usuXL6tw4cI3tcyCBQvm2N/esy6+vr459i9RooSOHz9udm/fvl3Dhg0zw52bm5vKlSunChUq6K+//jK3Z+b2vtn1AQDkjiAEABbk4eGhQoUKadOmTf847hdffKFx48apevXqCg8P1xNPPCFvb29JUqdOnfTbb7/ZvdzMMx2ZkpKSbqhmSRo6dKhCQkLsni4/5fR0OOlqiCtatKgk6dSpU+rUqZPc3d01ePBgVa1aVY888oicnJz0zTffaP369eZ0met8+fLlbPPMyMhQSkpKtsAIALAP9wgBgAX5+fnp9OnTOnPmTLZhmzZt0tixY81LuVauXCknJydNnjxZtWvXNkOQYRg6evSo+X9eMs+oJCYmZul/4sSJG6pZkmJiYrINS01N1fDhwzV79my75+cIMTEx2cLeqVOnFBcXZ95XtH79eiUlJalbt25q06aNypYtaz7pLjNUZm7PzHXes2dPtmXt2rVLAQEBmjx5siTd9OWAAGBVBCEAsKBWrVrJMAwNHjxYKSkpZv+4uDh9+OGHmjZtmgoVKiTp6mVb6enpio+PzzKPSZMmmQ9gSEtLM/u7uLhk6ZakMmXKSLr62zmZkpOT9fnnn9tdc7Vq1VSqVCktXrxYu3btyjJs2rRpmjFjhnmp2Z1y5swZffbZZ2Z3ZkCTpNatW0v63/1FZ8+ezTLtwYMHNWvWLEn/256lS5dWlSpV9OOPP2a5HDAjI0PTp0+XYRh65plnJMl86MW1rycAIHdcGgcAFhQcHKyNGzdqzZo1OnTokJ599lmlpaVp9erVOn/+vN577z2VLl1aktS8eXP98ssvevnll9W4cWO5uLho27Zt2rdvn4oXL65z587p/Pnz5rx9fHx07Ngx9ezZU7Vq1VLLli0VEhKiuXPn6uOPP9bu3btVtGhRbdiwQUWKFMn25LTcODk5acSIEQoPD1f79u31/PPPq3Tp0oqJidHWrVtVqlQpvfvuu47YXHbz8PDQ2LFjtW3bNpUtW1ZbtmzR4cOH1aJFC9WtW1eSVLduXf33v//V1KlTdfToUT300EM6fvy4vv32WxUpUkSSsmzPjz76SO3bt1fnzp31wgsvqGTJktq6dav279+vDh06yN/fX9L/7k+aPHmyDhw4oK5du5qhCwCQHWeEAMCCbDabxo8fr4iICBUsWFCLFi3S6tWr9eijj2rSpEl6/fXXzXFDQ0PVv39/eXl5adGiRVqxYoUKFSqkMWPGaNCgQZKk7777zhy/V69eeuyxxxQVFaXly5dLksqVK6dp06apYsWKWr16tb7++ms9/fTT+vLLL2/oB1CfeuopLVq0SI0aNdKOHTs0a9Ys/fnnnwoLC9OCBQvMHyG9Ux566CF9+umnOnPmjObPn6/09HR98MEHGjFihDmOr6+vZsyYocDAQG3dulVz587V77//rrCwMK1evVpeXl764Ycfslwet2jRIjVu3FjR0dGaPXu2EhMT1bdvX/Xt29ecb5MmTdS4cWP98ccfmjt3bpbHpQMAsrMZjnjUDwAAFuPn56dy5cqZ4Q8AcHfjjBAAAAAAyyEIAQAAALAcghAAAAAAy7kn7xHKyMjQ5cuX5eLiwu8mAAAAAMjGMAylpqaqUKFCKlAg+/mfe/Lx2ZcvX9bhw4fvdBkAAAAA7nKPP/64+fME17ong5CLi4ukqyuV+WvlAAAAAJApJSVFhw8fNrPD9e7JIJR5OZyrqys/FgcAAAAgV7ndSsPDEgAAAABYDkEIAAAAgOUQhAAAAABYDkEIAAAAgOUQhAAAAABYDkEIAAAAgOUQhAAAAABYjsOD0KVLl9SsWTOdPHky27ADBw6odevWatiwoSIiIpSWlubocgAAAADAsUFo9+7devnll3Xs2LEch/fq1Uv9+/fXmjVrZBiGFi5c6MhyAAAAAECSg4PQwoUL9eGHH8rHxyfbsFOnTikpKUkBAQGSpODgYEVFRTmyHAAAAACQJDk7cuZDhw7NdVhcXJy8vb3Nbm9vb8XGxt7Q/GNiYm66tieeqCAPD/ebnh73nitXknTgwL47XQYAAADuAg4NQnkxDCNbP5vNdkPzqFixotzc3G66htD359z0tLj3zB3ZTlWrVr3TZQAAACAfJCcn53ni5I49Nc7X11dnz541u8+cOZPjJXQAAAAAcLvdsSBUsmRJubm5aefOnZKkZcuWqXbt2neqHAAAAAAWku9BKDw8XHv37pUkjR49WsOGDVPjxo2VmJioDh065Hc5AAAAACwoX+4R2rhxo/n/9OnTzf/LlSunxYsX50cJAAAAAGC6Y5fGAQAAAMCdQhACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACWQxACAAAAYDkEIQAAAACW49AgtGLFCjVp0kT169fXnDlzsg3ft2+fWrdurebNm6tz5866cOGCI8sBAAAAAEkODEKxsbEaO3as5s6dq+XLl2vBggX69ddfs4wzdOhQdevWTV9//bXKlCmjzz//3FHlAAAAAIDJYUFo8+bNCgwMlJeXlzw8PNSwYUNFRUVlGScjI0OXL1+WJCUmJsrd3d1R5QAAAACAydlRM46Li5O3t7fZ7ePjoz179mQZp0+fPnr11Vf18ccfq2DBglq4cOENLSMmJuam66tatepNT4t7186dO+90CQAAALgLOCwIGYaRrZ/NZjP/T0pKUkREhGbOnCl/f3/NmDFDvXv31rRp0+xeRsWKFeXm5nZb6oU1EIABAACsITk5Oc8TJw67NM7X11dnz541u+Pi4uTj42N2Hz58WG5ubvL395ckvfTSS4qOjnZUOQAAAABgclgQqlmzprZs2aL4+HglJiZq7dq1ql27tjn84Ycf1unTp3X06FFJ0oYNG1SpUiVHlQMAAAAAJoddGufr66sePXqoQ4cOSk1NVUhIiPz9/RUeHq5u3bqpUqVKGjZsmN555x0ZhqHixYvr448/dlQ5AAAAAGByWBCSpKCgIAUFBWXpN336dPP/OnXqqE6dOo4sAQAAAACycegPqgIAAADA3YggBOSDlNT0O10C8hmvOQAAdzeHXhoH4CpXFyeFvj/nTpeBfDR3ZLs7XQIAAMgDZ4QAAAAAWA5BCAAAAIDlEIQAAAAAWA5BCAAAAIDlEIQAAAAAWA5BCAAAAIDlEIQAAAAAWA5BCAAAAIDlEIQAAAAAWA5BCAAAAIDlEIQAAAAAWA5BCAAAAIDlEIQAAAAAWA5BCAAAAIDlEIQAAAAAWA5BCAAAAIDlEIQAAAAAWA5BCAAAAIDlOOc1sF69erLZbLkO37Bhw20vCABwa1JS0+Xq4nSny0A+4jUHgBuXZxAaP368JGnu3LlycXHRSy+9JCcnJ0VGRio1NTVfCgQA3BhXFyeFvj/nTpeBfDR3ZLs7XQIA3HPyDEIVK1aUJB05ckSLFi0y+/ft21chISGOrQwAAAAAHMSue4QuXLig+Ph4szs2NlaXLl1yWFEAAAAA4Eh5nhHK1LFjRwUFBalWrVoyDEM//fSTevXq5ejaAAAAAMAh7ApCoaGhevLJJ7VlyxbZbDZ16tRJjz/+uKNrAwAAAACHsPvx2ceOHdP58+fVpk0bHT582JE1AQAAAIBD2RWEpk2bpnnz5ikqKkrJycmaOHGiJk2a5OjaAAAAAMAh7ApCq1at0vTp01WwYEEVLVpUCxcu1MqVKx1dGwAAAAA4hF1ByNnZWa6urma3p6ennJ3tur0IAAAAAO46dqWZBx54QJs2bZLNZlNKSoo+//xzlSxZ0tG1AQAAAIBD2BWE+vfvr/fff1+HDh1SQECAKleurNGjRzu6NgAAAABwCLuCkK+vr2bOnKnExESlp6ercOHCOnPmjKNrAwAAAACHsOseobp162rnzp0qWLCgChcuLEl6/fXXHVoYAAAAADiKXUEoNTVV77//vr755huzn2EYDisKAAAAABzJriDk7e2tmTNnasKECZo+fbokyWazObQwAAAAAHAUu5+BXapUKc2ZM0dvvvmmTp06xeOzAQAAANyz7DojlHkZXLFixTRz5kz99ddfiomJcWhhAAAAAOAodp3WmTJlivm/u7u7Pv30U0VFRTmsKAAAAABwpDyD0PTp0xUeHq7PPvssx+FNmzZ1SFEAAAAA4Eh5BqEiRYpIkry8vPKjFgAAAADIF3kGobZt20qSunbtmi/FAAAAAEB+yDMIValSJc/HZP/88895znzFihWaPHmyUlNT9corr6hdu3ZZhh89elQffvihEhIS5O3trTFjxui+++67gfIBAAAA4MblGYRWrlx50zOOjY3V2LFjFRkZKVdXV7Vt21Y1atTQo48+Kunqk+jefPNNRUREqHbt2ho9erSmTZumXr163fQyAQAAAMAeeQahkiVLmv/v379fV65ckWEYSk9P14kTJ9SmTZtcp928ebMCAwPN+4saNmyoqKgo8zK7ffv2ycPDQ7Vr15YkvfHGG7pw4cKtrg8AAAAA/CO7Hp/dr18/bdiwQUlJSfL19dWJEydUtWrVPINQXFycvL29zW4fHx/t2bPH7D5x4oRKlCih3r17a//+/Xr88cfVv3//Gyr+Vn7LqGrVqjc9Le5dO3fuvCPLpb1ZE+0N+elOtTcAuFfZFYQ2b96sDRs26KOPPtJbb72l06dPa/r06XlOk/kjrNe69n6jtLQ0RUdH66uvvlKlSpU0btw4DR8+XMOHD7e7+IoVK8rNzc3u8QEOEJGfaG/IT7Q3AMgqOTk5zxMnBeyZibe3tzw8PPR///d/Onz4sKpXr66///47z2l8fX119uxZszsuLk4+Pj5Z5vnwww+rUqVKkqRmzZplOWMEAAAAAI5iVxBycXHR9u3bVbZsWX3//fe6ePHiPwahmjVrasuWLYqPj1diYqLWrl1r3g8kXX0iXXx8vA4ePChJ2rhxoypUqHALqwIAAAAA9rErCPXs2VPz589XnTp1dODAAQUGBqp58+Z5TuPr66sePXqoQ4cOatmypZo1ayZ/f3+Fh4dr7969cnd316RJk9SvXz81bdpU27ZtU58+fW7LSgEAAABAXuy6RyggIEABAQGSpEWLFunChQvy9PT8x+mCgoIUFBSUpd+19xZVrlxZixcvvoFyAQAAAODW2RWEjhw5otmzZyshISFL/08++cQhRQEAAACAI9kVhN555x3VqlVLfn5+jq4HAAAAABzOriDk7u6uvn37OroWAAAAAMgXdj0soXr16vruu++Unp7u6HoAAAAAwOHsOiNUvHhxde7c2fxBVMMwZLPZdODAAYcWBwAAAACOYFcQmj17thYuXKjSpUs7uh4AAAAAcDi7glCxYsXk7+/v6FoAAAAAIF/YFYQCAwPVrVs3NWjQQK6urmb/Bg0aOKwwAAAAAHAUu4JQTEyMJGnBggVmP5vNRhACAAAAcE+yKwg1atRI7dq1c3QtAAAAAJAv7Hp89rx58xxdBwAAAADkG7vOCJUpU0b9+vXTU089JQ8PD7M/l8YBAAAAuBfZFYTOnz+v8+fP6/jx42Y/7hECAAAAcK+y+3eEJCktLU2GYcjFxcWhRQEAAACAI9l1j9C5c+fUqVMnBQQEyN/fXx06dFBsbKyjawMAAAAAh7ArCA0aNEgBAQHavHmzNm/erKeeekoDBw50cGkAAAAA4Bh2BaFjx46pa9eu8vT0VNGiRdWtWzedOHHC0bUBAAAAgEPYFYTS0tKUnJxsdicmJspmszmsKAAAAABwJLseltCkSRO98sorCg4OliRFRkaqYcOGDi0MAAAAABzFriD01ltv6f7779cPP/ygjIwMBQcHKyQkxNG1AQAAAIBD2BWEJKl169Zq3bq1I2sBAAAAgHyRZxCqV69ervcC2Ww2rV+/3iFFAQAAAIAj5RmExo8fn63fjh07NGbMGO4RAgAAAHDPyjMIVaxY0fw/IyND48eP17x58zRkyBA1b97c4cUBAAAAgCPYdY/QqVOn9N5770mSFi9erNKlSzu0KAAAAABwpH/8HaGvv/5awcHBCgwM1Jw5cwhBAAAAAO55eZ4R6tWrl9auXasePXqoWrVqOnjwYJbhFSpUcGhxAAAAAOAIeQahnTt3qnjx4po1a5ZmzZqVZZjNZtOGDRscWhwAAAAAOEKeQWjjxo2Srj4ooUCBrFfRnT9/3mFFAQAAAIAj/eM9QpJy/CHV0NDQ214MAAAAAOSHPM8IdezYUXv37lVSUpKefPJJs396errKly/v8OIAAAAAwBHyDEKTJk3S+fPn9cEHH2jYsGH/m8jZWd7e3g4vDgAAAAAcIc9L4woXLqxSpUrp008/1cqVK1WyZElJ0meffaakpKR8KRAAAAAAbje77hHq27ev+XAET09P2Ww29e/f35F1AQAAAIDD2BWEjh07pt69e0uSihQpog8++EBHjhxxaGEAAAAA4Ch2BaG0tDRdunTJ7L58+bIMw3BYUQAAAADgSHk+LCFTy5Yt9eKLL6pRo0ay2Wxat26dgoODHV0bAAAAADiEXUGoc+fOevTRR7VlyxY5OzurZ8+eqlOnjqNrAwAAAACHsCsISdLzzz+v559/XpJkGIaOHTumRx55xFF1AQAAAIDD2BWE5s2bp1GjRikxMdHsV6xYMf30008OKwwAAAAAHMWuIDR9+nTNmDFDkydP1jvvvKNvv/1Wp0+fdnRtAAAAAOAQdj01zsvLS5UrV9YTTzyhc+fO6c0339TevXsdXRsAAAAAOIRdQcjZ2VkJCQl6+OGHtWfPHklXH6H9T1asWKEmTZqofv36mjNnTq7jbdq0SfXq1bOzZAAAAAC4NXZdGtemTRt17txZU6ZMUcuWLbVu3TqVLVs2z2liY2M1duxYRUZGytXVVW3btlWNGjX06KOPZhnv7NmzGjFixM2vAQAAAADcILvOCIWEhOiLL76Ql5eXFixYoC5dumjMmDF5TrN582YFBgbKy8tLHh4eatiwoaKiorKN169fP3Xt2vXmqgcAAACAm2DXGaH09HQtXbpUP/74o5ycnFS3bl25u7vnOU1cXJy8vb3Nbh8fH/OyukyzZs1S+fLlVbly5ZsoHQAAAABujl1BaPDgwfrtt9/UokULGYahJUuW6MSJE+rRo0eu0xiGka2fzWYz/z98+LDWrl2rL7/88qafQBcTE3NT00lS1apVb3pa3Lt27tx5R5ZLe7Mm2hvy051qbwBwr7IrCG3evFmrVq2Si4uLJKl58+Zq3rx5nkHI19dXO3bsMLvj4uLk4+NjdkdFRenMmTNq3bq1UlNTFRcXp9DQUM2dO9fu4itWrCg3Nze7xwc4QER+or0hP9HeACCr5OTkPE+c2HWPUNGiRZWenm5222w2eXp65jlNzZo1tWXLFsXHxysxMVFr165V7dq1zeHdunXTmjVrtHz5ck2bNk0+Pj43FIIAAAAA4GbZdUbo//7v/xQaGqrg4GA5OTnpm2++UdGiRTVjxgxJ0quvvpptGl9fX/Xo0UMdOnRQamqqQkJC5O/vr/DwcHXr1k2VKlW6vWsCAAAAAHayKwhJkp+fn/bt2ydJKlWqlKSr9/nkJSgoSEFBQVn6TZ8+Pdt4pUqV0saNG+0tBQAAAABuiV1BaNiwYY6uAwAAAADyjV1BaNu2bZo2bZoSEhKy9F+8eLFDigIAAPeOlNR0ubo43ekykI94zfFvYFcQ6tevn8LCwvTQQw85uh4AAHCPcXVxUuj7c+50GchHc0e2u9MlALfMriBUvHhxdejQwdG1AAAAAEC+sCsI1atXT3PmzNGzzz4rZ+f/TfLggw86rDAAAAAAcBS7glB8fLzGjBmjggULmv1sNpt+/vlnhxUGAAAAAI5iVxCKiorSjz/+qBIlSji6HgAAACBXPKjBehz1mtt9j1CxYsVu+8IBAACAG8HDOazHUQ/nsCsIVapUSaGhoapbt65cXV3N/q+++qpDigIAAAAAR7IrCCUnJ6tMmTI6duyYg8sBAAAAAMfLMwh1795dn3zyiWJiYvKrHgAAAABwuDyDUHh4uCSpf//++VIMAAAAAOSHPINQxYoVJUnVq1fPl2IAAAAAID8UuNMFAAAAAEB+IwgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAsByHBqEVK1aoSZMmql+/vubMmZNt+Pr169WiRQs1b95cXbp0UUJCgiPLAQAAAABJDgxCsbGxGjt2rObOnavly5drwYIF+vXXX83hly5d0sCBAzVt2jR9/fXX8vPz04QJExxVDgAAAACYHBaENm/erMDAQHl5ecnDw0MNGzZUVFSUOTw1NVUDBw6Ur6+vJMnPz09//fWXo8oBAAAAAJOzo2YcFxcnb29vs9vHx0d79uwxu4sWLaoXXnhBkpSUlKRp06YpLCzshpYRExNz0/VVrVr1pqfFvWvnzp13ZLm0N2uivSE/3an2JtHmrIp9HPKTI9qbw4KQYRjZ+tlstmz9Ll68qC5duqhcuXJq1arVDS2jYsWKcnNzu+kaYT3sPJGfaG/IT7Q35DfaHPLTzbS35OTkPE+cOOzSOF9fX509e9bsjouLk4+PT5Zx4uLiFBoaqnLlymno0KGOKgUAAAAAsnBYEKpZs6a2bNmi+Ph4JSYmau3atapdu7Y5PD09XW+88YYaN26siIiIHM8WAQAAAIAjOOzSOF9fX/Xo0UMdOnRQamqqQkJC5O/vr/DwcHXr1k2nT5/W/v37lZ6erjVr1ki6eqkbZ4YAAAAAOJrDgpAkBQUFKSgoKEu/6dOnS5IqVaqkgwcPOnLxAAAAAJAjh/6gKgAAAADcjQhCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAcghCAAAAACyHIAQAAADAchwahFasWKEmTZqofv36mjNnTrbhBw4cUOvWrdWwYUNFREQoLS3NkeUAAAAAgCQHBqHY2FiNHTtWc+fO1fLly7VgwQL9+uuvWcbp1auX+vfvrzVr1sgwDC1cuNBR5QAAAACAydlRM968ebMCAwPl5eUlSWrYsKGioqLUtWtXSdKpU6eUlJSkgIAASVJwcLDGjx+v0NDQf5y3YRiSpJSUlFuq0dPD5Zamx70lOTn5ji6f9mYttDfkpzvd3iTanNXc6TZHe7OWm21vmVkhMztcz2FBKC4uTt7e3ma3j4+P9uzZk+twb29vxcbG2jXv1NRUSdLhw4dvqcbwoLK3ND3uLTExMXd0+bQ3a6G9IT/d6fYm0eas5k63Odqbtdxqe0tNTZW7u3u2/g4LQjklL5vNZvfwvBQqVEiPP/64XFxc7J4GAAAAgHUYhqHU1FQVKlQox+EOC0K+vr7asWOH2R0XFycfH58sw8+ePWt2nzlzJsvwvBQoUEBFihS5fcUCAAAA+NfJ6UxQJoc9LKFmzZrasmWL4uPjlZiYqLVr16p27drm8JIlS8rNzU07d+6UJC1btizLcAAAAABwFJuR291Dt8GKFSs0depUpaamKiQkROHh4QoPD1e3bt1UqVIlHTx4UP369dPly5dVvnx5DRs2TK6uro4qBwAAAAAkOTgIAQAAAMDdyKE/qAoAAAAAdyOCEAAAAADLIQgBAAAAsByCEAAAAADLIQgBAAAAt6hPnz6KjIzMcxw/P798qubWRUZGqk+fPne6DIciCF2nT58+mjJlisLDw2942rCwMG3bts0BVd2azLr27t2riIgIhy8vIiJCe/fu1cWLF9WlSxdJUmxs7E1t07zktj4nT55UvXr1buuyrMJRbXjevHmaN2/ebZ3nxo0bNWPGjFue/4IFC7Ry5crbWRpysW3bNoWFhUn6337iRtlzoOFI4eHhio2NzXX4tetI27p5EyZM0IQJE+we/2bakyP2S3ez3NbXCge7QG6c73QBdyMfHx9Nnz79Tpdx21WqVEmVKlVy+HKGDh0q6WogOXjwoCTJ19f3tm/T/Fof3LqXX375ts9z3759t2X+u3btUvXq1W9HSbgBmfuJe82N7MdoW/nnZtqTI/ZLdzOrrW+mbdu2aerUqXJ3d9dvv/0mPz8/9ejRQ//5z3+0ceNGSTJD99tvv61nnnlGdevW1Y4dO+Tt7a3Q0FDNnj1bp0+f1vDhw+1+T48dO1ZbtmxRQkKCihYtqgkTJsjb21uS1L9/f+3Zs0dFixbVxx9/rAcffDDX+fTp00c2m02HDx/WpUuX9Oabb6ply5aaMGGCfvnlF/31119q166datasqQEDBuj8+fPy8PBQRESE/P39derUKfXt21fx8fFyd3fXkCFDVK5cOS1btkwzZ85URkaGKlSooA8//FBubm5atmyZJk+erMKFC6tkyZLy8PCQJNWrV0+zZs1SqVKltG3bNk2cOFGzZ89WWFiY7rvvPh05ckTjxo3TmTNnNH78eKWlpalUqVIaPHiwihYtqhEjRuinn36Sk5OTnn/+eXXt2vVWXtbbxvJByDAMDR8+XJs2bZKPj4/S09NVvXp11atXTxs3btSKFSv02WefycnJSaVKldKoUaPk6uqq0aNHa/369XJyctJLL72kjh07SpIWLVqkESNGKCEhQREREapXr54OHz6swYMH68qVK4qPj9err76qDh06ZGvE1apVU58+fZSenq6nnnpK33//vdatW6ezZ89qwIABOn36tGw2m9577z3VrFkz13VKSUlRRESEYmJiVLJkSf3999+SlKXhzpgxQ0uXLlWBAgXk7++vQYMGKTIyUmvXrlVCQoLOnTununXrmm/AKVOm6Ouvv5aTk5OeeeYZ9erVS4mJiXr33Xd19uxZSdJbb72l559/XmFhYeratatmzJihuLg4vfXWW+rbt686dOigjRs36uzZs4qIiNCff/4pZ2dn9ejRQ7Vr19aECRMUGxur48eP69SpU3rxxRf15ptv5rqe167P/v37zbND5cqVu13N467mqJ37woULNXz4cBmGob59+6pGjRq6fPmyBg0apCNHjig9PV3h4eFq1qyZIiMjtXTpUp0/f15169bVu+++m2Ot19ZRq1YtNWzYUDt37pSTk5PGjRun0qVLq169eqpXr5527NghSfr4449Vvnx5RUdHa+zYsUpKSlJCQoJ69eqlxx57TPPnz5ckPfjgg/rzzz/N+X///fc57oTr1aun5s2b68cff1RiYqJGjBihCxcuaOPGjdq6dau8vb317LPPOu4Fu4dt27ZNU6ZMkWEYOnHihBo2bKgiRYpo/fr1kqRp06Zp//79OW73H3/8UcOGDZObm5vKlCljzjNzP1G9evUc96c5ve6NGzf+x1pTU1P1wQcf6MiRI5Kk0NBQtWnTJteDidzadnJysj766CPt3LlTLi4u6tKli5o0aWIeDHh5eemDDz5QbGys4uLi9NRTT2nkyJFmHZs3bzbblqenpyIiIrRhwwYVLlxYJ0+eVOfOnbVq1arb/ErdG9LS0jRw4EAdOXJEZ8+eVZkyZTRx4kR99dVXWrhwoYoWLSpPT0/5+/tLkl37rsz29PDDD6tnz566cuWKChQooH79+ikgICDHg7Br90vffvutxo0bp4yMDJUuXVqDBg1SiRIlctxvVKxYMdd1y+mYwc3NLcfP0L/++sv8XJSy7icDAwNVoUIFnT17VosXL9a4ceOyvUeOHz+ugQMH6vz583J3d1f//v1Vvnz5XGu7dv65Hez+W+3atUurV6+Wj4+P2rRpox9//DHXcc+ePavnnntOQ4YMUVhYmNavX6+5c+dq6dKlmjlzpl1B6Pjx4zp69Kjmz5+vAgUK6P3339eKFSv02muvSZKqVaumwYMHa86cORo6dKgmTZqU5/xiY2M1f/58nTt3TsHBwXrmmWckXT3e++abbyRJISEhev3119WgQQP98ssv6t69u9asWaOPPvpIDRs2VLt27fTdd99p8uTJ6tq1qxYuXKj58+fLzc1N//3vf/X555+rdevWGj16tJYtWyYvLy917tzZrrbh5+eniRMnKj4+Xn369NGsWbN03333af78+Ro9erS6dOmi77//XqtWrVJycrIiIiKUnJwsNze3f5y3o1n+0rg1a9Zo//79WrlypT755BOdOHEiy/Bx48bpiy++UGRkpMqUKaOjR48qKipKP//8s1asWKFFixYpMjJSZ86ckSR5enoqMjJS/fr1Mxv2okWL1KVLFy1ZskSzZs3S2LFjzflnNuJ27dqpT58+6t69u5YvX67SpUsrPT1d0tVvulq3bq3IyEhNnjxZAwYM0KVLl3Jdp9mzZ0uSVq9erX79+mVbp7S0NE2dOlVLlixRZGSkbDabealHTEyMJkyYoJUrV2r37t1at26dvvvuO23cuNE86D1+/Ljmz5+vdevWqWTJkoqMjNSoUaPMA9hM/fr1k4+PT7Y3+ODBgxUYGKgVK1Zo/Pjx+uCDD8wwdejQIX3++edatGiRpk2bpgsXLtj1Ovbu3Vu9evXS0qVLVapUKbum+TfYtWuXBgwYoNWrV+vPP/+0a+ceFRUlSebO/e2339bMmTPN8Tw8PLR06VINHz5c77//vlJSUjR58mRVqFBBkZGRmjNnjqZMmaI//vhD0tUd9NKlS3MNQdc7c+aMnn76aS1btkzVqlXTnDlzzGFeXl5atmyZunXrpt69e0uSvvrqKw0ZMkRLly7V0KFD9emnn+rRRx9V27Zt1bZtW7Vu3dqcPj4+3tyhL1u2TLVq1dLo0aOzzH/x4sVq27atpk6dqpo1a6pevXrq1q0bIegf7N69W8OGDdOqVas0f/58FStWTJGRkfLz89P8+fNz3O4pKSnq06ePxo8fr8jISLm7u2ebb27705xed3vs2rVLCQkJWrZsmWbMmKGff/7ZHJZ5MDFz5kyNHDlSZ86cybVtz549W1euXNHq1as1Y8YMTZo0SSkpKea8Nm3apCeeeEILFizQmjVr9Msvv2Q5S3lt23rhhReyvPeWLVumFi1a3OxLcc/btWuXXFxctGDBAq1bt07JycmaNWuWlixZoqVLl2rGjBk6ffq0Ob69+y5JWrx4sZ577jlFRkaqV69e2rlzp06dOqXvv/9eX3/9tebPn69jx44pOTnZnObcuXMaMGCAJk2apBUrVujJJ5/UoEGDzOHX7zfyktMxQ26foXn5+++/9frrr2v58uVav359ju+Raz/3Bg8erB49eti1/WNjYzV69GjNmTNHCxYs0OXLl+2a7l722GOP6f7771eBAgVUtmxZJSQk5Dl+7dq1JUklS5ZUYGCgpKtfutl7TPLwww+rd+/eWrRokYYPH65ffvlFV65ckSS5u7urefPmkqQWLVooOjr6H+cXHBwsFxcX3X///XryySe1c+dOSTK/LLh8+bJOnDihBg0aSJICAgJ033336ejRo9q+fbu5v6lTp44++eQTbdu2TcePH1ebNm3UokULbdiwQUePHtWuXbtUpUoVlShRQs7OzgoKCrJrfTPr2L17txnwW7RooTlz5uj48ePy9fWVm5ub2rZtqy+//FLvvPPOXRGCJM4IKTo6Wg0aNJCLi4uKFStmNv5MdevW1csvv6znn39eDRs21BNPPKFFixapcePGcnV1laurq5YvX26O/8ILL0iSHn30UfNMTJ8+ffTDDz9o6tSpOnTokPlmkP7XeM6fP69Tp06pTp06kqTWrVtr1qxZkq5+s3j06FGNHz9e0tUg88cff+iJJ57IdZ1eeuklSdIjjzyiKlWqZBnu7OysKlWqKCQkRM8//7zatWsnX19fSVdPfZYoUUKS1KRJE23dulVubm5q2rSpeRDTunVrLVu2TD179tSYMWMUGxur5557Tm+99ZZd23zr1q0aMmSIJKl06dKqXLmydu/eLUmqUaOGXF1dVbx4cXl5eenixYvy9PTMc37x8fGKi4szz5IFBwdryZIldtVyr8vcuUu64Z171apVJWXfuYeEhEi6ematWLFiOnr0qDZv3qykpCRzu165csX8xr18+fJydr6xXUlm6HjssceyBOg2bdpIutoO+/Tpo/j4eI0aNUrffvutoqKitHv37jw/tK/dCUtSRkaG7rvvvhyXu3bt2huq2eoef/xxPfDAA5KkokWL6umnn5Z0tf1s3Lgxx+1+6NAh+fj4qGzZspKkVq1a6ZNPPsky3+3bt+e4P72R1/1ajz32mH7//Xf95z//Ue3atdWzZ09zWE4HE7m17e3bt6tNmzYqUKCAvL29s529adasmfbs2aMvv/xSR48e1fnz57Ps26/XunVrTZgwQSEhIVq5cmW2A3grqVatmry8vDRnzhwdPXpUx44dU40aNVSnTh0VKlRIktSoUSNlZGSY09iz75Kkp59+Wm+//bYOHDigOnXqqH379nJycjIPwurWrZvtIGzPnj3y9/c3v0R76aWXNG3aNHP4jew3cjpm+Prrr3P8DM38vM9N5cqVJeX8Hrl8+bJiYmLUt29fc/wrV67o77//VtGiRfOc77UHu5IUFBSkrVu35jnNve7a19tms0m6ekVQprS0tCyfY66urub/Tk5ON7y8mJgYvffee3rllVfUsGFDFShQwFxegQL/OwdhGIZdn5/X1pCRkWFOk9mmDMPIsj6Z/dLT07PM3zAM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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_feature_impact(best_model)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Build a better model\n", "\n", "Use the `admission_type` feature as a splitting point to create multiple projects." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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48aN2rBhgxISErRy5UodPHhQS5cuVUxMjCRp+fLlF60rISFBAQEB8vX11a5du/Tzzz/LYrEoICDAceC6bt06PfrooyosLNRXX32lJUuWKCkpSY8++qg+/fTTSmssKyvT0qVL9d5772nVqlUaPXq0PvroI8f0Ro0aaeXKlZozZ45efvnlCsNZTp48qTfffFMfffSREhMT1aNHD8XGxv7u7XatutR+MTs7W7169XK8D1999ZU+/fRTjR8/Xv/zP/8jSZfdr910001KSUlRz5499fLLL2vevHlKTEyUxfJ/93673PLHjh3Tp59+qoULF2ru3LmSpLffflu33367UlJSNHfuXP3lL39Rv379lJqaqvz8fNntdq1evVohISFXY9PVipo+6JWkvn37au3atY7HycnJFXq9t23bpqFDh2rgwIHy8/NTSkqKpHP7gldeeUVhYWHy9/dXYmKipHPDs1588UUNHjxYffr00X/9139JkkpLSzV79mxHYPzv//5vSZLdbtfs2bPl7++v4cOH65dffvld26g+qGw/+9133ykjI0MrVqxQYmKiMjMztWrVKvn6+mrLli2Szp1537dvn0pLS/Xdd985vvdOnDih4cOHa9WqVbr99tu1YMECFRUV6YUXXtCUKVO0atUqDRkyRC+88ILj+dq2bau1a9fqnnvu0fHjx9WtWzclJibqgQceqDPDzq75O03WV+WnTi9l8+bNKigocPSmnD17Vj/99JPS0tL02GOPqUGDBnJ3d9eaNWsuuQ5fX1/NmDFDeXl5SkpKktVqVX5+vjIyMvTKK6845jt79qxycnL0xz/+seZeIJSZmank5GRZLBaNHz9egYGBioiI0JdffukI1uUHVm+88Yby8vI0ZMgQdejQQZL0v//7v0pKSpKzs7MCAgI0dOhQxcTEKDIyUgsWLKjNl3bNcHNz04wZMxw76XJbtmxRUFCQbrjhBklSWFiYEhMTLzk84eTJk/r+++81Y8YM3XDDDerdu7cjoIeEhOj111/XsGHDlJSUpOeff15ubm568803tWbNGh04cEDfffed7rnnnkrX3aBBAy1YsEAbNmzQ/v37tW3bNjVo8H99HYMGDZIktWvXTs2aNdO+ffsc09LT03X06FFFRkZKOhfemzZt+vs22jXscvvF8i9rT09PdenSRZJ022236fTp05fdr0ly3J14z549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v9SGDRu0adMm3XDDDVq8eLGmTJmiHj16SJJiYmJ099136/Tp0/rpp5+UnZ2tEydOqF27dpo1a5bc3NyUmZmp1157TUePHlVxcbGCgoIuumX3hd59913l5OTo1Vdf1Q8//KAZM2bIyclJ9913X6W3FAeA2saQEgCoQenp6crKytKyZcuUnJysgQMH6sMPP9Rrr72mDh06aM2aNYqJidH+/fsdyxQVFcnd3V2rV6/W0KFDFRMTo8mTJys5OVl5eXlav359heeIj49Xy5YttXLlSn3yySc6ePCgzpw5c8n287300kt66KGHtHr1an322WdatWqV1qxZI0n69ddf1aNHD61YsUIvvfSS5s2bd9nX2qdPH/n5+WnkyJGKiIjQ0KFDtXz5ckly1F1+u+f09HS98847SklJkcVi0YIFCyRJUVFRCgsLU0JCglasWKHNmzcrOTm5Stu6qKhIzz33nKKjo5WYmKiHHnpIBQUFVVoWAK4mergBoAZ16tRJTZs21dKlS/Xrr79q69ataty4sTIyMjRx4kRJ526E9NBDD1VYzt/fX5J0++23q02bNmrevLkkqWXLlsrNza0wb8+ePfXkk0/q6NGj6t69u1588UU1adLkku3lzp49q7///e/629/+Jklq0qSJQkND9e2336pDhw5ycXGRr6+vJKl9+/Y6derUFb320NBQLViwQCdPnpTNZlOvXr104403SpICAgJ0yy23SJIGDRqk119/XePHj1daWppyc3P19ttvO2rcvXv3ZXvWy+3Zs0cWi0XdunWTJAUHB+vVV1+9opoB4GogcANADfrmm280a9YsjRo1So888ojuuOMOrVq1Sk5OTjr/PmMWS8Xdr4uLS6X/r8z999+v9evXKzU1VVu2bNHgwYO1YMECde7cudL2cmVlZbrwXmdlZWUqKSlxPG+DBudOfDo5OV3xa7/xxhsVEBCgVatWafXq1Zo6dapjmrOzc4XnbNCggaOepUuX6g9/+IMk6eTJk3J1da3S8124TaWLtysAXAsYUgIANWjTpk3q3bu3wsPDdd999+mrr75SaWmpevbsqWXLlkmSjhw5oq1bt1b7OWJjYxUXF6dHH31UkydP1l133aUDBw5csr2cm5ubOnTo4LiqyJkzZ5SYmKju3btXuxZnZ2dHYJekiIgILV68WHa7Xffff7+jff369Tpz5ozKysoUHx+v3r17y83NTR07dtSiRYskSadPn9bQoUMvGkJzKW3atJHdbtfGjRsdz3Hh2QAAuBYQuAGgBg0ZMkRpaWmyWq3685//rFatWunQoUOaMmWK9u7dq8DAQE2ePFnt2rWr9nOMGDFCu3fvVnBwsMLCwtSyZUsFBwdfsv18sbGxSk1NldVq1aBBg9S3b1+FhoZWuxYfHx8tWbJE77//viSpXbt2atq0qYYMGVJhvltuuUWjR49WYGCgmjRp4vhhZGxsrNLT02W1WjV48GAFBwerf//+VXpuFxcXLViwQG+//bZCQkL05Zdf6uabb672awEAU5zsF56PAwCgmn755RcNHz5cNpvNMUzk/KuKAMD1iMFuAIBLWrVqlT766KNKp1mtVj3xxBOOx2+//bbi4+M1efJkR9iujry8PEVERFQ6rXHjxvr000+rvW4AqA30cAMAAAAGMYYbAAAAMIjADQAAABhE4AYAAAAMInADAAAABhG4AQAAAIP+HwiOoGFvhE1dAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(12, 5))\n", "c = sns.countplot(x=\"admission_type_id\", data=df)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Create a mini model factory\n", "Often when DataRobot needs to set up Automated Feature Discovery (AFD), it may take a while to perform Exploratory Data Analysis (EDA). You can save time when running multiple projects by initiating all of them in parallel. Use Python's dask module to do so." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def run_dr_factory(segment_num):\n", " try:\n", " temp_project = dr.Project.start(\n", " df.loc[df[\"admission_type_id\"] == segment_num],\n", " project_name=\"Readmission_%s\" % segment_num,\n", " target=\"readmitted\",\n", " metric=\"LogLoss\",\n", " worker_count=10,\n", " )\n", " return temp_project\n", " except: # Catching the case when dataset has fewer than 20 rows.\n", " return f\"There was an error in segment {segment_num}.\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "delayed_dr_projects = []\n", "\n", "# Create one project for each customer type\n", "for value in df[\"admission_type_id\"].unique():\n", " temp = delayed(run_dr_factory)(value)\n", " delayed_dr_projects.append(temp)\n", "\n", "projects = compute(delayed_dr_projects)[0]\n", "# Filter to the projects that did not throw errors\n", "projects_filtered = [project for project in projects if not isinstance(project, str)]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Get the best-performing model for each admission type\n", "\n", "Even though accuracy changes may be insignificant for this dataset, in applicable cases a model factory can produce measurable value. This concept becomes increasingly important with a higher cardinality in your data. For example, consider if your business owns a variety of products, and you build a model factory to produce a model for each product. DataRobot saves you large amounts of time by having handling the evaluation of accuracy for separate set of models built for each product." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "best_models = {} # To save models\n", "for key, project in enumerate(projects_filtered):\n", " best_models[key] = projects_filtered[key].get_models()[0]\n", " print(\"--------------------------------\")\n", " print(\"Best model for admission type id: %s\" % project)\n", " print(best_models[key])\n", " print(best_models[key].metrics[\"LogLoss\"][\"crossValidation\"])\n", " print(\"--------------------------------\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Generate Feature Impact\n", "Observe the differences in Feature Impact outlined below, which could lead to actionable insights." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for key, project in enumerate(projects_filtered):\n", " plot_feature_impact(\n", " best_models[key], title=\"Feature Impact for admission type id: %s\" % project\n", " )" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Deploy the most accurate models\n", "\n", "After identifying the best-performing models, you can deploy them and use DataRobot's REST API to make HTTP requests with the deployment ID and return predictions. Once deployed, access monitoring capabilities such as:\n", "\n", "- [Service health](https://docs.datarobot.com/en/docs/mlops/monitor/service-health.html)\n", "- [Prediction accuracy](https://docs.datarobot.com/en/docs/mlops/monitor/deploy-accuracy.html)\n", "- [Model retraining](https://docs.datarobot.com/en/docs/release/public-preview/mlops-preview/retraining.html)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "prediction_server = dr.PredictionServer.list()[0]\n", "\n", "for key in best_models:\n", " temp_deployment = dr.Deployment.create_from_learning_model(\n", " best_models[key].id,\n", " label=\"Readmissions_admission_type: %s\" % key,\n", " description=\"Test deployment\",\n", " default_prediction_server_id=prediction_server.id,\n", " )" ] } ], "metadata": { "interpreter": { "hash": "5a4311377f5226a828a5cde154732629640e6acbf54e690b215f88f159641733" }, "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.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }