Files
concrete/docs/user/advanced_examples/PoissonRegression.ipynb
Jeremy Bradley-Silverio Donato cb660d89f9 docs: Update PoissonRegression.ipynb
2022-01-06 19:14:10 +01:00

889 lines
225 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "b760a0f6",
"metadata": {},
"source": [
"# Poisson Regression\n",
"\n",
"This tutorial shows how to train several Generalized Linear Models (GLM) with scikit-learn, quantize them and run them in FHE using Concrete Numpy. We make use of strong quantization to ensure the accumulator of the linear part does not overflow when computing in FHE (7-bit accumulator). We show that conversion to FHE does not degrade performance with respect to the quantized model working on values in the clear."
]
},
{
"cell_type": "markdown",
"id": "253288cf",
"metadata": {},
"source": [
"### Import libraries\n",
"\n",
"We import scikit-learn libraries and Concrete Numpy quantization tools:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "6200ab62",
"metadata": {},
"outputs": [],
"source": [
"from copy import deepcopy\n",
"import numpy as np\n",
"\n",
"from sklearn.linear_model import PoissonRegressor\n",
"from sklearn.datasets import fetch_openml\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.decomposition import PCA\n",
"from tqdm import tqdm\n",
"\n",
"from concrete.quantization import QuantizedLinear, QuantizedArray, QuantizedModule\n",
"from concrete.quantization.quantized_activations import QuantizedActivation\n"
]
},
{
"cell_type": "markdown",
"id": "f43e2387",
"metadata": {},
"source": [
"And finally we import some helpers for visualization:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "d104c8df",
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import matplotlib.pyplot as plt\n",
"from IPython.display import display"
]
},
{
"cell_type": "markdown",
"id": "53e676b8",
"metadata": {},
"source": [
"### Insurance claims dataset\n",
"\n",
"In this tutorial, we show how to build a regression model that predicts the frequency of incidents in an insurance setting.\n",
"\n",
"We download a data set from OpenML that contains 670,000 examples giving the frequency of car accidents for drivers of various ages, past accident history, car type, car color, geographical region, etc. We take only the first 50 000 examples to speed up training.\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "d451e829",
"metadata": {},
"outputs": [],
"source": [
"df = fetch_openml(data_id=41214, as_frame=True, cache=True, data_home=\"~/.cache/sklearn\").frame\n",
"df = df.head(50000)"
]
},
{
"cell_type": "markdown",
"id": "39a70df7",
"metadata": {},
"source": [
"The target variable is the number of claims per year, which is computed by the following formula :"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "5e163891",
"metadata": {},
"outputs": [],
"source": [
"df[\"Frequency\"] = df[\"ClaimNb\"] / df[\"Exposure\"]"
]
},
{
"cell_type": "markdown",
"id": "75f4fdb7",
"metadata": {},
"source": [
"Let's visualize our data set, showing that the target variable, \"Frequency\" has a poisson distribution !"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "2a124a62",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA3sAAAG5CAYAAAA3ci11AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABxL0lEQVR4nO3dd3xUVf7/8fckEemhhpJEEEJNKEIAWV16UTTBghRRQNAo9lX2p9913QXXgitY1rpRlqIsCK4LRAULGkUFaVZYICDBFEQEEyEQ0s7vj5ghM5nJzCQzmcnk9Xw88kjunXvPfd87N5n7yS3HYowxAgAAAAAElRB/BwAAAAAAeB/FHgAAAAAEIYo9AAAAAAhCFHsAAAAAEIQo9gAAAAAgCFHsAQAAAEAQotgDqmjv3r3q27evmjRpon/84x9uz5eamqqoqCi3pl2+fLnGjBlT1Yi10i233KK//e1v/o4BAF4TGxur1NRUf8fwq//+97+Kjo5W48aN9eWXX/o7Tq302WefqUuXLmrcuLHWrFnj9nxLlizRxRdf7Na0jz76qG688cYqJkQgstDPHhzp2LGjjhw5otDQUOu4ffv2qX379n5MFVhmzZqlpk2b6qmnnvJovtTUVF133XXKzMz0UbLAULYPhYWFKTQ0VD179tS0adOUlJSkkJDA+j/TsGHD9PXXX+vHH3/Uueee6+84AGqRjh076pVXXtGoUaOs45YsWaJXXnlFn376qdvtpKen6/zzz1dhYaHCwsJ8EdWvOnfurCeffFLjx493+LrFYlHDhg1lsVgkSWFhYcrJyanBhIFv5MiRSkxM1F133eXRfFXZHxE8AuuICwElJSVFJ0+etH7ZF3pFRUV+ShYYDh06pNjYWH/HCGgpKSk6ceKEDh06pPvvv1+PP/64Zs2a5XT64uJin+QwxqikpMTha+np6dq0aZMsFovWrVvnk+UDgL/5+zPbnc/Mr7/+2nrM4ajQ8/c6+BvHHagKij14xGKx6Pnnn1eXLl3UpUsXSdJbb72lvn37qlmzZvrd736nb775xjr9l19+qX79+qlJkyaaNGmSJk+erD//+c+SHF9WYLFYtH//fknSmTNnNGfOHJ133nlq06aNbrnlFp0+fVrS2UshFy5cqIiICLVr106LFy+2tnP69Gnde++96tChg8LDw3XxxRfr9OnTuuyyy/Tss8/aLLN3797673//63B9161bp9jYWDVr1kzDhg3T//73P0nSiBEj9NFHH+n2229X48aNtW/fvgrzHj9+XDfccIPat2+v5s2b64orrnC4jPnz56tz585q0qSJevbsaZPFfhtZLBa98MIL6tKli5o0aaIHH3xQBw4c0O9+9zs1bdpUEydOVEFBgSTp559/1uWXX65mzZqpRYsW+v3vf++w4Jk9e7bmzJljM278+PF68sknJUmPP/64IiMj1aRJE3Xr1k0bN250uB6VCQ8PV2Jiol5//XUtXbpU3333nSRpxowZmj17tsaNG6dGjRrpo48+0owZM6z7SI8ePfTWW29Z2ykqKlLr1q21c+dOSdKWLVv0u9/9Ts2aNVOfPn1sLpMaNmyYHnjgAV100UVq2LChvv/+e4fZli1bpgsvvFAzZszQ0qVLbV47duyYEhIS1LRpUw0YMEB//vOfbd6PPXv2aPTo0WrRooW6deumVatWebxtAAS/jh076oMPPpAkbd26VfHx8WratKnatGmje+65R5I0ZMgQSVKzZs3UuHFjbd68WSUlJXr44YfVoUMHRUREaNq0acrNzbW2u2zZMnXo0EEtW7bU3/72N5vlzJ07VxMmTNB1112npk2basmSJdq6dasGDx6sZs2aqV27drr99tutnxmSZ58x9pxlPXPmjBo3bqzi4mL16dNHnTt3dnu7paeny2KxaNGiRTrvvPM0YsQISdK//vUv9ejRQ82bN9fYsWN16NAh6zzvv/++unfvrvDwcN1+++0aOnSoXnnlFes2ue666yq0X1ZE5ubmatasWWrXrp0iIyP15z//2fpPyLLP4zlz5qh58+Y6//zztX79emtbzj7z4+LilJKSYp2usLBQrVq1cnop68svv6yYmBi1aNFCiYmJys7OllR6ZvT7779XQkKCGjdurDNnzlSYNyMjQ1dddZVat26tli1b6vbbb3e4jLvuukvR0dFq2rSp+vfvr02bNllfK7+NyrbP4sWLFR0drebNm+ull17Stm3b1Lt3bzVr1sxmGfv379fQoUMVHh6uVq1aadKkSQ6XjxpmAAc6dOhg3n///QrjJZlRo0aZY8eOmVOnTpmdO3ea1q1bmy1btpiioiKzZMkS06FDB5Ofn2/OnDljzjvvPPPkk0+agoICs3r1ahMWFmYeeOABY4wxixcvNhdddFGF9tPS0owxxtx9990mISHBHDt2zPz666/m8ssvN/fff78xxpiPPvrIhIaGmgcffNAUFBSYt99+2zRo0MAcP37cGGPMrbfeaoYOHWoyMzNNUVGR+eyzz0x+fr55/fXXzcCBA63L++qrr0yLFi3MmTNnKqzr3r17TcOGDc17771nCgoKzOOPP246d+5snXbo0KHm5ZdfdroNx40bZyZOnGiOHz9uCgoKTGpqqjV7ZGSkdbpVq1aZrKwsU1xcbFauXGkaNmxosrOzHW4jSSYxMdHk5uaa7777ztSrV8+MGDHCHDhwwOTk5JgePXqYJUuWGGOMuf/++83NN99sCgoKTEFBgfnkk09MSUlJhZwff/yxiYqKsr52/PhxU79+fZOVlWX27NljoqKiTFZWljHGmIMHD5r9+/c7XefynO1D0dHR5oUXXjDGGDN9+nTTtGlT8+mnn5ri4mJz+vRpM336dOs+Mm/ePHPttdda533rrbdM9+7djTHGZGZmmhYtWpi3337bFBcXm/fee8+0aNHC/PTTT8aY0vcnOjrafPfdd6awsNAUFBQ4zNm5c2fz/PPPm+3bt5uwsDDz448/Wl+bNGmSmTRpksnLyzO7du0yUVFR1vfj5MmTJioqyvzrX/8yhYWFZufOnaZly5Zm165dbm0fAMHB0d86+7/d5ae58MILzbJly4wxxpw4ccJs3rzZGFP691WSKSwstM63aNEi07lzZ3PgwAFz4sQJc+WVV5rrrrvOGGPMrl27TKNGjcymTZvMmTNnzL333mvCwsKsy/nrX/9qwsLCzH//+19TXFxsTp06ZbZv3242b95sCgsLzcGDB0337t3NU089ZV2eJ58x9irLWtZ22ee7I45eL9sm119/vTl58qQ5deqUWbNmjencubPZvXu3KSwsNH/729/M4MGDjTHGHD161DRu3NisXr3aFBQUmCeffNKEhoZaP6v/+te/mqlTp1Zov2ybX3HFFSYpKcmcPHnSHDlyxAwYMMC89NJL1vc0LCzMJCcnm6KiIvPCCy+Ydu3aWT87nX3mP/7442bixInWZa5Zs8bExcU53AYbN240LVu2NDt27DD5+fnm9ttvN7///e+trzv7XDXGmKKiItO7d29z9913m5MnT5rTp0+bTZs2WbOX3x9fffVV8/PPP5vCwkKzYMEC06ZNG3P69OkK26hs+9x8883m9OnT5t133zXnnnuuGT9+vDly5IjJzMw0rVu3tq7r5MmTzcMPP2z9PC9bPvyLYg8OdejQwTRq1MiEh4eb8PBwM378eGNM6R/jjRs3Wqe75ZZbzJ///Gebebt27WpSU1PNxx9/bPOH0BhjBg8e7FaxV1JSYho2bGhTWHz++eemY8eOxpjSgql+/fo2H4qtW7c2mzdvNsXFxaZ+/frmq6++qrBep0+fNs2aNTP79u0zxhhz7733mtmzZzvcBg899JC55pprrMPFxcWmffv25qOPPjLGVF7sZWdnG4vFYi0+y7Mv9uz16dPHrFmzxhjjuNj79NNPrcP9+vUz8+fPtw7fc8895q677jLGGPPggw+axMTESj9cjTGmpKTEREdHm48//tgYY0xycrIZPny4McaYtLQ007p1a/P+++87LZaccfahNGjQIPPwww8bY0qLveuvv97m9fLFXlpammncuLHJy8szxhhz7bXXmnnz5hljjJk/f77NgYQxxowZM8Z6IDJ06FDz4IMPVppx06ZNJiwszBw9etQYY0y3bt3Mk08+aYwp/eAMCwsze/bssU7/wAMPWN+PlStXmosvvtimvaSkJDN37txKlwkguNh/XoaHh5sGDRo4LfZ+//vfm7/85S/WvztlHBV7I0aMMM8//7x1eM+ePSYsLMwUFhaaefPmmcmTJ1tfy8vLM+ecc45NsVe+UHDkqaeeMldccYV12JPPGHuVZS1r21Wx16RJE+s2vOOOO6zb5MCBA9bpLrnkEvPKK69Yh4uLi02DBg1Menq6Wbp0qRk0aJD1tZKSEhMZGelWsffjjz+aevXqmVOnTllf//e//22GDRtmjCn9PO7cubP1tby8PCPJHD58uNLP/KysLNO4cWOTm5trjDHm6quvNo8//rjDbTBz5kzzxz/+0Tp84sQJExYWZg4ePGiMqbzY+/zzz02rVq1s9p8yjo63ymvWrJn1mMlRsZeZmWmdtkWLFmblypXW4auuusr6D4Prr7/e3HTTTSYjI8PpslDzuIwTTq1Zs0Y5OTnKycmxeepTdHS09edDhw5p4cKFatasmfUrIyND2dnZys7OVmRkpPVma0nq0KGDW8s+evSoTp06pf79+1vbveSSS3T06FHrNC1btrS5ib1hw4Y6efKkfv75Z+Xn5zu8VKR+/fqaNGmSXnvtNZWUlGjFihW6/vrrHWbIzs62yRsSEqLo6GhlZWW5zJ+RkaEWLVqoefPmLqddtmyZ9TLYZs2a6bvvvtPPP//sdPo2bdpYf27QoEGF4ZMnT0qS/vjHPyomJkZjxoxRp06dNH/+fIftWSwWTZ48WStWrJAk/fvf/9bUqVMlSTExMXr66ac1d+5cRUREaPLkydZLSqoqKytLLVq0sA6X35/sxcTEqEePHkpJSdGpU6e0bt06XXvttZJK973Vq1fb7HuffvqpDh8+7FbbkrR06VKNGTNGrVq1kiRde+211ks5jx49qqKiIps27Pf9L774wmb5y5cv148//ujB1gAQDMp/Xubk5OiFF15wOu2iRYu0b98+de/eXQMGDLC5VN2e/edQhw4dVFRUpCNHjig7O9vmb1LDhg3VsmVLm/nt/wbu27dPl19+udq2baumTZvqT3/6U4XPG3c/YzzJ6q6dO3dat2H5p1zb/+296667rH93W7RoIWOMsrKyKmwTi8Xi8nOgfLuFhYVq166dte2bb75ZP/30k3Watm3bWn9u2LChJOnkyZOVfua3b99eF110kf7zn/8oJydH69evt37G2rPfho0bN1bLli3dPu7o0KGDWw/3WbBggXr06KHw8HA1a9ZMubm5Xjnu+Pvf/y5jjAYOHKjY2Fj961//cpkFvhd8j3uCz5Uv3qKjo/XAAw/ogQceqDDdxx9/rKysLBljrPP88MMP1iKsUaNGOnXqlHX68gfJrVq1UoMGDbRr1y5FRkZ6lK9Vq1aqX7++Dhw4oD59+lR4ffr06br++ut18cUXq2HDhho8eLDDdtq3b69vv/3WOmyMUUZGhlt5oqOjdfz4ceXk5KhZs2ZOpzt06JBuuukmbdy4UYMHD1ZoaKj69u0r44WH5DZp0kQLFy7UwoUL9d1332nEiBEaMGCARo4cWWHaKVOmaMyYMbr//vv1xRdf2Nw3eO211+raa6/Vr7/+qptvvln33XefXn311Spl2rZtm7Kysirch1iZKVOmaMWKFSopKVHPnj0VExMjqXQbX3/99Xr55ZedzltZ26dPn9aqVatUXFxs/QA/c+aMcnJy9PXXXysuLk5hYWHKzMxU165dJZV+mJaJjo7W0KFD9f7777tecQD4TZcuXax/0958801NmDBBx44dc/j3qn379jb3o/3www8KCwtTmzZt1K5dO+3du9f62unTp3Xs2DGb+e3bnD17ti644AKtWLFCTZo00dNPP6033njDK+tVWdbqcnTc4ahgSktLs/k7Xfa5Xaay447o6Gide+65+vnnnz1+Gqqrz/zp06frlVdeUVFRkQYPHuz0OMJ+G+bl5enYsWNuH3f88MMPKioqqjT/pk2b9Pe//10bN25UbGysQkJC1Lx5c68cd7Rt29b6mfzpp59q1KhRGjJkiPVzG/7BmT1Uy0033aSXXnpJX3zxhYwxysvL09tvv60TJ05o8ODBCgsL0z/+8Q8VFhbqzTff1NatW63z9unTR7t27dJXX32l/Px8zZ071/paSEiIbrrpJv3hD3+w/lctKytL7777rstMISEhmjlzpu655x5lZ2eruLhYmzdvtt7MPHjwYIWEhOjee+91elZPkiZOnKi3335bGzduVGFhoRYuXKhzzz1Xv/vd71xmaNeunS699FLdeuut+uWXX1RYWKhPPvmkwnR5eXmyWCxq3bq1JGnx4sXWh5dU11tvvaX9+/fLGKPw8HCFhoY67fLgggsuUKtWrXTjjTdq7Nix1g+rvXv36sMPP9SZM2dUv359NWjQoErdJvz666966623NHnyZF133XXq1auX2/NOnjxZ7733nl588UXrWT1Juu6665SSkqJ3331XxcXFys/PV2pqqttdWqxZs0ahoaHavXu3vvrqK3311Vf63//+p9///vdatmyZQkNDddVVV2nu3Lk6deqU9uzZo2XLllnnv/zyy7Vv3z69+uqrKiwsVGFhobZt22Z9iA8AOPLaa6/p6NGjCgkJsf6tDQkJUevWrRUSEmLzMKkpU6boqaee0sGDB3Xy5En96U9/0qRJkxQWFqYJEyYoJSVFn3/+uQoKCjR37lyXB+wnTpxQ06ZN1bhxY+3Zs0cvvvii19arsqzedMstt+ixxx7Trl27JJU+VGX16tWSpMsuu0y7du3Sm2++qaKiIv3jH/+wKej69u2rTz75RD/88INyc3P12GOPWV9r166dxowZo3vvvVe//vqrSkpKdODAAX388ccuM7n6zL/iiiu0c+dOPfPMM5o2bZrTdqZMmaLFixfrq6++0pkzZ/SnP/1JgwYNUseOHV1mGDhwoNq1a6f7779feXl5ys/P12effVZhuhMnTigsLEytW7dWUVGRHnroIf36668u23fH6tWrrZ/BzZs3l8ViCbiuluoi3gFUS3x8vF5++WXdfvvtat68uWJiYrRkyRJJUr169fTmm29qyZIlatGihV5//XVdddVV1nm7du2qv/zlLxo1apS6dOlS4cmcjz/+uGJiYnThhReqadOmGjVqlM1/MSuzYMEC9erVSwMGDFCLFi1033332TyJctq0afr2229tnsplr1u3bnrttdd0xx13qFWrVkpJSVFKSorq1avnVoZXX31V55xzjrp3766IiAg9/fTTFabp2bOn7r33Xg0ePFht2rTRt99+q4suusit9l1JS0vTqFGj1LhxYw0ePFi33nqrhg8f7nT6a6+9Vh988IFNQXXmzBndf//9atWqldq2bauffvrJ+uG4fPlyl4+ATkhIUJMmTRQdHa1HHnlE99xzj81TU93Rrl07DR48WJ9//rnNk72io6O1du1aPfroo2rdurWio6P1xBNPOO1iwd7SpUt1ww036LzzzlPbtm2tX7fffruWL1+uoqIiPffcc8rNzVXbtm11/fXXa8qUKdZ++Jo0aaL33ntPK1euVPv27dW2bVvdd999Dp+QBgBlNmzYoNjYWDVu3Fh33XWXVq5cqQYNGqhhw4bWJwg3a9ZMW7Zs0cyZM3X99ddryJAhOv/881W/fn3rE6VjY2P17LPPavLkyWrXrp0aN26siIiISvsKXbBggf7973+rSZMmuummm7z6tMTKsnrTlVdeqfvuu0+TJ09W06ZNFRcXZ30qZqtWrbR69Wrdf//9atmypdLS0mw+U0ePHq1Jkyapd+/e6t+/vy6//HKbtpctW6aCggL17NlTzZs314QJE2xuDahMZZ/5DRo00NVXX62DBw/aHAfZGzVqlP72t7/p6quvVrt27XTgwAGtXLnSreWHhoYqJSVF+/fv13nnnaeoqCi9/vrrFaYbO3asLrnkEnXt2lUdOnRQ/fr13b7U1ZVt27Zp0KBBaty4sRITE/XMM8+oU6dOXmkbVUen6qhRM2bMUFRUlB5++GG/5li2bJmSk5PpYBQeue+++/Tjjz9W6KIBAPzt5MmTatasmdLS0nT++ef7O07AGDZsmK677jrdeOONfs3x0EMPad++fXrttdf8mgN1D2f2UOecOnVKL7zwgpKSkvwdBQFuz549+uabb2SM0datW7Vo0SJdeeWV/o4FAJJkfXhVXl6e5syZo169erl1yR9q1vHjx7Vo0SKOO+AXFHuoU9599121bt1abdq0sblcEXDkxIkTuuqqq9SoUSNNmjRJ9957r8aPH+/vWAAgSVq7dq3at2+v9u3bKy0tTStXrnT50CvUrJdfflnR0dG69NJLNWTIEH/HQR3EZZwAAAAAEIQ4swcAAAAAQahW97PXqlUrrk0HgDoiPT290o5/Ycsbn5F5eXlq1KiRdwLVMLL7T23OT3b/qM3ZJf/nr+zzsVYXex07dtT27dv9HQMAUAPi4+P9HaFW8cZnZGpqqoYNG+adQDWM7P5Tm/OT3T9qc3bJ//kr+3ys1cUeAACwVdYnaG5urr+jAAD8jHv2AAAIIgkJCUpOTlZ4eLi/owAA/IxiDwAAAACCEMUeAAAAAAQh7tkDACCIcM8eAKAMZ/YAAAgi3LMHAChDsQcAAAAAQYhiDwAAAACCEMUeAAAAAAQhHtACAEAQ4QEtAIAynNkDACCI8IAWAEAZij0AAAAACEIUewAAAAAQhCj24L7s5VJqR2lDSOn37OW+macmBGouAAAAwEt4QAvck71c+i5JKjlVOpx/qHRYktpP9d48NSFQcwEAAABexJk9uGffA2eLozIlp0rHe3OemhCouQDAC1JSUpSUlMTTOAEAFHtwU/4Pno2v6jw1IVBzAYAXePNpnDt27JDFYnHrCwAQeCj24J7653k2vqrz1IRAzQUAAAB4EcUe3NP1ESmkoe24kIal4705T00I1FwAAACAF1HswT3tp0pxyVL9DpIspd/jkit/oElV5qkJgZoLAAAA8CKexgn3tZ/qeUFUlXlqQqDmAgAAALyEM3sAAAAAEIQ4swcAQBBJSUlRSkoKXS8AADizBwBAMPFm1wsAgNqNYg8AAAAAghDFHgAAAAAEIYo9AAAAAAhCFHsAAAAAEIR8Vuzt3btXffv2tX41bdpUTz/9tI4fP67Ro0erS5cuGj16tH755RdJkjFGd955p2JiYtS7d2/t3LnTV9EAAAAAIOj5rNjr1q2bvvrqK3311VfasWOHGjZsqCuvvFLz58/XyJEjlZaWppEjR2r+/PmSpPXr1ystLU1paWlKTk7W7NmzfRUNAAAAAIJejVzGuXHjRnXu3FkdOnTQ2rVrNX36dEnS9OnTtWbNGknS2rVrNW3aNFksFl144YXKycnR4cOHayIeAAAAAASdGulUfeXKlZoyZYok6ciRI2rXrp0kqW3btjpy5IgkKSsrS9HR0dZ5oqKilJWVZZ22THJyspKTkyVJR48erYn4AADUGnSqDgAo4/MzewUFBVq3bp2uueaaCq9ZLBZZLBaP2ktKStL27du1fft2tW7d2lsxAQAICnSqDgAo4/Nib/369erXr5/atGkjSWrTpo318szDhw8rIiJCkhQZGamMjAzrfJmZmYqMjPR1PAAAAAAISj4v9lasWGG9hFOSEhMTtXTpUknS0qVLNX78eOv4ZcuWyRijLVu2KDw8vMIlnAAAAAAA9/j0nr28vDy9//77+uc//2kdd//992vixIlatGiROnTooFWrVkmSxo0bp3feeUcxMTFq2LChFi9e7MtoAAAAABDUfFrsNWrUSMeOHbMZ17JlS23cuLHCtBaLRc8//7wv4wAAAABAnVEjXS8AAAAAAGoWxR4AAAAABCGKPQAAAAAIQhR7AAAAABCEKPYAAAAAIAhR7AEAAABAEKLYAwAAAIAg5NN+9gAAQM1KSUlRSkqKcnNz/R0FAOBnnNkDACCIJCQkKDk5WeHh4f6OAgDwM4o9AAAAAAhCFHsAAAAAEIQo9gAAAAAgCFHsAQAAAEAQotgDAAAAgCBEsQcAAAAAQYhiDwAAAACCEMUeAAAAAAQhij0AAAAACEIUewAAAAAQhCj2AAAAACAIUewBAAAAQBCi2AMAAACAIESxBwAAAABBiGIPAAAAAIIQxR4AAAAABCGKPQAAAAAIQhR7AADUAnl5eYqPj9dbb73l7ygAgFqCYg8AAD+YOXOmIiIiFBcXZzN+w4YN6tatm2JiYjR//nzr+Mcff1wTJ06s6ZgAgFqMYg8AAD+YMWOGNmzYYDOuuLhYt912m9avX6/du3drxYoV2r17t95//3317NlTERERfkoLAKiNwvwdAACAumjIkCFKT0+3Gbd161bFxMSoU6dOkqTJkydr7dq1OnnypPLy8rR79241aNBA48aNU0gI/68FAFSOYg8AgACRlZWl6Oho63BUVJS++OILPffcc5KkJUuWqFWrVk4LveTkZCUnJ0uSMjMzlZqaWq08UVFRWrBggVvTVndZ3nby5MmAy+Su2pxdqt35ye4ftTm7FNj5KfYAAKglZsyYUenrSUlJSkpKkiTFx8dr2LBh1VrewoULNWfOHLemNcZUa1nelpqaWu3195fanF2q3fnJ7h+1ObsU2Pm5BgQAgAARGRmpjIwM63BmZqYiIyP9mAgAUJtR7AEAECAGDBigtLQ0HTx4UAUFBVq5cqUSExM9aiMlJUVJSUnKzc31UUoAQG1BsQcAgB9MmTJFgwcP1t69exUVFaVFixYpLCxMzz33nMaOHasePXpo4sSJio2N9ajdhIQEJScnKzw83EfJAQC1BffsAQDgBytWrHA4fty4cRo3blwNpwEABCPO7AEAAABAEOLMHgAAQSQlJUUpKSncswcA8O2ZvZycHE2YMEHdu3dXjx49tHnzZh0/flyjR49Wly5dNHr0aP3yyy+SSh/ZfOeddyomJka9e/fWzp07fRkNAICgxD17AIAyPi327rrrLl1yySXas2ePvv76a/Xo0UPz58/XyJEjlZaWppEjR2r+/PmSpPXr1ystLU1paWlKTk7W7NmzfRkNAAAAAIKaz4q93NxcffLJJ5o1a5YkqV69emrWrJnWrl2r6dOnS5KmT5+uNWvWSJLWrl2radOmyWKx6MILL1ROTo4OHz7sq3gAAAAAENR8VuwdPHhQrVu31g033KALLrhAN954o/Ly8nTkyBG1a9dOktS2bVsdOXJEkpSVlaXo6Gjr/FFRUcrKyqrQbnJysuLj4xUfH6+jR4/6Kj4AALUS/ewBAMr4rNgrKirSzp07NXv2bH355Zdq1KiR9ZLNMhaLRRaLxaN2k5KStH37dm3fvl2tW7f2ZmQAAGo97tkDAJTxWbEXFRWlqKgoDRo0SJI0YcIE7dy5U23atLFennn48GFFRERIkiIjI5WRkWGdPzMzU5GRkb6KBwAAAABBzWfFXtu2bRUdHa29e/dKkjZu3KiePXsqMTFRS5culSQtXbpU48ePlyQlJiZq2bJlMsZoy5YtCg8Pt17uCQAAAADwjE/72Xv22Wc1depUFRQUqFOnTlq8eLFKSko0ceJELVq0SB06dNCqVaskSePGjdM777yjmJgYNWzYUIsXL/ZlNAAAAAAIaj4t9vr27avt27dXGL9x48YK4ywWi55//nlfxgEAIOjRqToAoIxP+9kDAAA1iwe0AADKUOwBAAAAQBCi2AMAAACAIESxBwAAAABBiGIPAAAAAIKQT5/GCQAAahZP4wQAlOHMHgAAQYSncQIAylDsAQAAAEAQotgDAAAAgCBEsQcAAAAAQYhiDwAAAACCEMUeAAAAAAQhul4AACCI0PUCAKAMZ/YAAAgidL0AAChDsQcAAAAAQYhiDwAAAACCEMUeAAAAAAQhij0AAAAACEIUewAAAAAQhCj2AAAAACAIUewBAAAAQBCiU3UAAIIInaoDAMpwZg8AgCBCp+oAgDIUewAAAAAQhCj2AAAAACAIUewBAAAAQBCi2AMAAACAIESxBwAAAABBiGIPAAAAAIIQxR4AAAAABCGKPQAAAAAIQhR7AAAAABCEKPYAAAAAIAhR7AEAAABAEArzdwAAAOA9KSkpSklJUW5urr+jAAD8jDN7AAAEkYSEBCUnJys8PNzfUQAAfkaxBwAAAABBiGIPAAAAAIKQT4u9jh07qlevXurbt6/i4+MlScePH9fo0aPVpUsXjR49Wr/88oskyRijO++8UzExMerdu7d27tzpy2gAAAAAENR8fmbvo48+0ldffaXt27dLkubPn6+RI0cqLS1NI0eO1Pz58yVJ69evV1pamtLS0pScnKzZs2f7OhoAAAAABK0av4xz7dq1mj59uiRp+vTpWrNmjXX8tGnTZLFYdOGFFyonJ0eHDx+u6XgAAAAAEBR8WuxZLBaNGTNG/fv3V3JysiTpyJEjateunSSpbdu2OnLkiCQpKytL0dHR1nmjoqKUlZVVoc3k5GTFx8crPj5eR48e9WV8AAAAAKi1fNrP3qeffqrIyEj99NNPGj16tLp3727zusVikcVi8ajNpKQkJSUlSZL1PkAAAAAAgC2fntmLjIyUJEVEROjKK6/U1q1b1aZNG+vlmYcPH1ZERIR12oyMDOu8mZmZ1vkBAAAAAJ7xWbGXl5enEydOWH9+7733FBcXp8TERC1dulSStHTpUo0fP16SlJiYqGXLlskYoy1btig8PNx6uScAAAAAwDM+u4zzyJEjuvLKKyVJRUVFuvbaa3XJJZdowIABmjhxohYtWqQOHTpo1apVkqRx48bpnXfeUUxMjBo2bKjFixf7KhoAAAAABD2fFXudOnXS119/XWF8y5YttXHjxgrjLRaLnn/+eV/FAQAAAIA6pca7XgAAAAAA+B7FHgAAAAAEIYo9AAAAAAhCFHsAAAAAEIQo9gAAAAAgCFHsAQAAAEAQotgDACDA/e9//9Mtt9yiCRMm6MUXX/R3HABALUGxBwCAH8ycOVMRERGKi4uzGb9hwwZ169ZNMTExmj9/viSpR48eeumll7Rq1Sp99tln/ogLAKiFKPYAAPCDGTNmaMOGDTbjiouLddttt2n9+vXavXu3VqxYod27d0uS1q1bp8suu0zjxo3zR1wAQC1kMcYYdyf+5ZdflJGRod69e/syk9vi4+O1fft2f8cAANSAYPybn56erssvv1zfffedJGnz5s2aO3eu3n33XUnSY489Jkn6v//7P+s8l112md5++22H7SUnJys5OVmSlJmZqZUrV1Yr35EjR5SZmenWtP3796/Wsrzt5MmTaty4sb9jVEltzi7V7vxk94/anF3yf/45c+Y4/XwMczXzsGHDtG7dOhUVFal///6KiIjQRRddpCeffNLrQQEAqMuysrIUHR1tHY6KitIXX3yh1NRUvfnmmzpz5kylZ/aSkpKUlJQkqbQ4HjZsWLXyLFy4UHPmzHFrWg/+d1wjUlNTq73+/lKbs0u1Oz/Z/aM2Z5cCO7/LYi83N1dNmzbVK6+8omnTpmnevHkBc2YPAIC6YNiwYQF7IAEACFwu79krKirS4cOHtWrVKl1++eU1kQkAgDopMjJSGRkZ1uHMzExFRkb6MREAoDZzWez95S9/0dixYxUTE6MBAwbo+++/V5cuXWoiGwAAdcqAAQOUlpamgwcPqqCgQCtXrlRiYqJHbaSkpCgpKUm5ubk+SgkAqC1cFnvXXHONvvnmG73wwguSpE6dOuk///mPz4MBABDMpkyZosGDB2vv3r2KiorSokWLFBYWpueee05jx45Vjx49NHHiRMXGxnrUbkJCgpKTkxUeHu6j5ACA2sLlPXsHDx7Us88+q/T0dBUVFVnHr1u3zqfBAAAIZitWrHA4fty4cXSvAADwCpfF3hVXXKFZs2YpISFBISF0ywcAQCBLSUlRSkoKl3ECAFwXe/Xr19edd95ZE1kAAEA1JSQkKCEhQfHx8f6OAgDwM5fF3l133aV58+ZpzJgxOvfcc63j+/Xr59NgAAAAAICqc1nsffvtt3r11Vf14YcfWi/jtFgs+vDDD30eDgAAAABQNS6LvdWrV+v7779XvXr1aiIPAAAAAMALXBZ7cXFxysnJUURERE3kAQAA1cADWgAAZVwWezk5OerevbsGDBhgc88eXS8AABB4eEALAKCMy2Jv3rx5NZEDAAAAAOBFLou9oUOH1kQOAAAAAIAXOe0l/eKLL5YkNWnSRE2bNrV+lQ0DAAAAAAKX0zN7n376qSTpxIkTNRYGAABUDw9oAQCUcXkZZ5mffvpJ+fn51uHzzjvPJ4EAAEDV8YAWAEAZp5dxllm3bp26dOmi888/X0OHDlXHjh116aWX1kQ2AAAAAEAVuSz2HnzwQW3ZskVdu3bVwYMHtXHjRl144YU1kQ0AAAAAUEUui71zzjlHLVu2VElJiUpKSjR8+HBt3769JrIBAAAAAKrI5T17zZo108mTJzVkyBBNnTpVERERatSoUU1kAwAAHuIBLQCAMi7P7K1du1YNGjTQU089pUsuuUSdO3dWSkpKTWQDAAAeSkhIUHJyssLDw/0dBQDgZy7P7JU/izd9+nSfhgEAALWTxWLxaHpjjI+SAADKOC32mjRpIovFImOMzR/wsuFff/21RgICAAAAADzntNijM3UAAAAAqL1c3rO3ZcsWm8LvxIkT+uKLL3waCgAAAABQPS6LvdmzZ6tx48bW4UaNGmn27Nk+DQUAAAAAqB6XxZ79PXshISEqKipyewHFxcW64IILdPnll0uSDh48qEGDBikmJkaTJk1SQUGBJOnMmTOaNGmSYmJiNGjQIKWnp3u4KgAAAACAMi6LvU6dOukf//iHCgsLVVhYqGeeeUadOnVyewHPPPOMevToYR2+77779Ic//EH79+9X8+bNtWjRIknSokWL1Lx5c+3fv19/+MMfdN9991VhdQAAqNtSUlKUlJREP3sAANfF3ksvvaTPP/9ckZGRioqK0hdffKHk5GS3Gs/MzNTbb7+tG2+8UVLpWcIPP/xQEyZMkFTalcOaNWsklfbnV9a1w4QJE7Rx40YeywwAgIfoZw8AUMZlP3sRERFauXJllRq/++679fe//936gJdjx46pWbNmCgsrXWxUVJSysrIkSVlZWYqOji4NFRam8PBwHTt2TK1atbJpMzk52VpsHj16tEq5AAAAACDYuTyzV1VvvfWWIiIi1L9/f6+2m5SUpO3bt2v79u1q3bq1V9sGAAAAgGDh8sxeVX322Wdat26d3nnnHeXn5+vXX3/VXXfdpZycHBUVFSksLEyZmZmKjIyUJEVGRiojI0NRUVEqKipSbm6uWrZs6at4AAAAABDUnJ7Ze+aZZySVFm1V8dhjjykzM1Pp6elauXKlRowYoeXLl2v48OF64403JElLly7V+PHjJUmJiYlaunSpJOmNN97QiBEjbJ4CCgAAAABwn9Nib/HixZKkO+64w6sLfPzxx/Xkk08qJiZGx44d06xZsyRJs2bN0rFjxxQTE6Mnn3xS8+fP9+pyAQDwNkf/EK3qP0kBAPA2p5dx9ujRQ126dFF2drZ69+5tHV/W794333zj9kKGDRumYcOGSSrtymHr1q0Vpqlfv75Wr17tQXQAAPzrjjvu0M6dO12OAwDAH5wWeytWrNCPP/6osWPHat26dTWZCQCAgLZ582Z9/vnnOnr0qJ588knr+F9//VXFxcV+TAYAwFmVPqClbdu2+vrrr1VQUKB9+/ZJkrp166ZzzjmnRsIBABCICgoKdPLkSRUVFVm7F5Kkpk2bWu9L95eUlBSlpKTQqToAwPXTOD/++GNNmzZNHTt2lDFGGRkZWrp0qYYMGVIT+QAACDhDhw7V0KFDNWPGDHXo0MHfcWwkJCQoISFB8fHx/o4CAPAzl8XePffco/fee0/dunWTJO3bt09TpkzRjh07fB4OAIBAdubMGSUlJSk9PV1FRUXW8R9++KEfUwEAUMplsVdYWGgt9CSpa9euKiws9GkoAABqg2uuuUa33HKLbrzxRoWGhvo7DgAANlwWe/Hx8brxxht13XXXSZKWL1/OpSEAAEgKCwvT7Nmz/R0DAACHnPazV+bFF19Uz5499Y9//EP/+Mc/1LNnT7344os1kQ0AgICWkJCgF154QYcPH9bx48etXwAABAKXZ/bOPfdc3XPPPbrnnntqIg8AALXG0qVLJUlPPPGEdZzFYtH333/vr0gAAFi5LPbgoezl0r4HpPwfpPrnSV0fkdpP9WyehjHS8VRJxZJCpUbdpLy9Z4ejk6TYFypvo/U46eg77g87yulpm+6s665bpYzk6q1LVbap/TxbR0nHN54dbjGy9Hv5cY16SsV5zt+X6CSp+UXVz2q/TVoMk07t96xNV2248/66k9WeqzbcWYY32gD85ODBg/6OAACAUxR73pS9XPouSSo5VTqcf6h0WHJ+cOponvxD5SYolvJ22w5n/HYZbVmR5KiNjHKX2rozbJ+zKm26Wtddt9rOU9V1qco2LT+PfaEnVRyWbLe7o/cl40Up82XJFFU9q6NtUj6LO22604Y776+rrPZcteHOMrzRBuBHy5Ytczh+2rRpNZwEAICKXN6z9+2339ZEjuCw74GzB6VlSk6VjvdkHndkJFe/jfLsc1alTVfrWj6zs/HuLLcq27T8PI4Ku6oyRZW/XtVt4kmb7rThzvvrKqs9V224swxvtAH40bZt26xfmzZt0ty5c7Vu3Tp/xwIAQJIbZ/ZuvfVWnTlzRjNmzNDUqVMVHh5eE7lqp/wfPBvv6rVKFXuhDTvl26lqm5XOV+x6vLvLrco29dZ28lSVtoknbbrZhjvvryfbyFUb7izDG20AfvTss8/aDOfk5Gjy5Ml+SgMAgC2XZ/Y2bdqk5cuXKyMjQ/3799e1116r999/vyay1T71z/NsvKvXKlWuP6cqt2GnfDtVbbPS+Zz1QVWFdanKNvXWdvJUlbaJJ2262YY7768n28hVG+4swxttAAGkUaNG3McHAAgYLos9SerSpYsefvhhPf744/r444915513qnv37nrzzTd9na926fqIFNLQdlxIw9Lxnszjjuik6rdRnn3OqrTpal3LZ3Y23p3lVmWblp+n7GEs3mBxcXK8qtvEkzbdacOd99dVVnuu2nBnGd5oA/CjhIQEJSYmKjExUZdddpm6deumK6+80t+xAACQ5MZlnN98840WL16st99+W6NHj1ZKSor69eun7OxsDR48WFdddVVN5Kwdyh4Y4cmTAx3N4+nTOB21Ud2ncValTVfrWpa5sqdxurPcqmzT8vMM/CBwnsbpaJt4+jROd9pw5/319CmXrtpwZxneaAPwozlz5lh/DgsLU4cOHRQVFeXHRFJKSopSUlKUm5vr1xwAAP9zWezdcccduvHGG/Xoo4+qQYMG1vHt27fXww8/7NNwtVL7qZ4fiFZlHl+0URNtxr5QsasFXyzXVRsDP6he+/bLqg53tokv2qiJ7ezOMrzRBuAnQ4cO1ZEjR7Rt2zZJpVfC+FtCQoISEhIUHx/v7ygAAD9zeRnn22+/rWuvvdZa6JWUlOjUqdKn411//fW+TQcAQABbtWqVBg4cqNWrV2vVqlUaNGiQ3njjDX/HAgBAkhtn9kaNGqUPPvhAjRs3liSdOnVKY8aM0eeff+7zcAAABLJHHnlE27ZtU0REhCTp6NGjGjVqlCZMmODnZAAAuHFmLz8/31roSVLjxo2tZ/YAAKjLSkpKrIWeJLVs2VIlJSV+TAQAwFkuz+w1atRIO3fuVL9+/SRJO3bssLl3DwCAuuqSSy7R2LFjNWXKFEnS66+/rnHjxvk5FQAApVwWe08//bSuueYatW/fXsYY/fjjj3r99ddrIhsAAAFp//79OnLkiJ544gm9+eab+vTTTyVJgwcP1tSpPFAIABAYXBZ7AwYM0J49e7R3715JUrdu3XTOOef4PBgAAIHq7rvv1mOPPSZJuuqqq6zdEH377be6++67lZKS4s94AABIcqPYk6Rt27YpPT1dRUVF2rlzpyRp2rRpPg0GAECgOnLkiHr16lVhfK9evZSenl7zgQAAcMBlsXf99dfrwIED6tu3r0JDQyVJFouFYg8AUGfl5OQ4fe306dM1FwQAgEq4LPa2b9+u3bt3y2Kx1EQeAAACXnx8vF5++WXddNNNNuNfeeUV9e/f30+pAACw5bLYi4uL048//qh27drVRB4AAALe008/rSuvvFLLly+3Fnfbt29XQUGB/vvf//o5Xe3g6T+RjTE+SgIAwctlsffzzz+rZ8+eGjhwoM4991zr+HXr1vk0GAAAgapNmzb6/PPP9dFHH+m7776TJF122WUaMWKEn5NBKi0kFyxYoOHDh7s1PYUkgGDlstibO3duDcQAAKD2GT58uNsFBQAANc1lsTd06FAdOnRIaWlpGjVqlE6dOqXi4uKayAYAAAAAqKIQVxO8/PLLmjBhgm6++WZJUlZWlq644gpf5wIAAAAAVIPLYu/555/XZ599pqZNm0qSunTpop9++snnwQAAAAAAVeey2Dv33HNVr14963BRURHdMAAAAABAgHNZ7A0dOlSPPvqoTp8+rffff1/XXHONEhISaiIbAAAAAKCKXBZ78+fPV+vWrdWrVy/985//1Lhx4/Twww/XRDYAACBpzZo1uummmzRp0iS99957/o4DAKglXBZ7ISEhuummm7R69Wq98cYbuummm7iMEwCAapo5c6YiIiIUFxdnM37Dhg3q1q2bYmJiNH/+fEnSFVdcoZdfflkvvfSSXn/9dX/EBQDUQi6LvfPPP1+dOnWq8AUAAKpuxowZ2rBhg8244uJi3XbbbVq/fr12796tFStWaPfu3dbXH374Yd122201HRUAUEu57Gdv+/bt1p/z8/O1evVqHT9+3KehAAAIdkOGDFF6errNuK1btyomJsb6T9XJkydr7dq16tGjh+6//35deuml6tevn9M2k5OTlZycLEnKzMxUampqtTJGRUVpwYIF1WrDWzxZlwULFniUvbrbydtOnjwZcJk8UZvzk90/anN2KbDzuyz2WrZsaTN89913q3///nrooYd8FgoAgLooKytL0dHR1uGo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atu2rY4cOeLndKWKi4vVt29fRUREaPTo0ercubOaNWumsLAwSVJUVJSysrL8nFK6++679fe//10hIaW727FjxwIyZxmLxaIxY8aof//+Sk5OlqSA2wcOHjyo1q1b64YbbtAFF1ygG2+8UXl5eQGX097KlSs1ZcoUSYG3TSMjIzVnzhydd955ateuncLDw9W/f/+A3Ffj4uK0adMmHTt2TKdOndI777yjjIyMgNum5TnLlpWVpejoaOt0gbKN67La/J7Uxv3MneONQMvvyfFH+exhYWEKDw/XsWPH/Jbdk2OSQMsueXaMEkj7jafHLYGUvTx3jmMCLTvFngMnT57U1VdfraefflpNmza1ec1ischisfgpma3Q0FB99dVXyszM1NatW7Vnzx5/R6rgrbfeUkREhPr37+/vKG779NNPtXPnTq1fv17PP/+8PvnkE5vXA2EfKCoq0s6dOzV79mx9+eWXatSoUYX7agIhZ3kFBQVat26drrnmmgqvBULWX375RWvXrtXBgweVnZ2tvLw8bdiwwa+ZnOnRo4fuu+8+jRkzRpdccon69u2r0NBQm2kCYZs6E8jZEDxqw35WW4437NWG4w9HauMxib3acIziSG08brEX6McxzlDs2SksLNTVV1+tqVOn6qqrrpIktWnTRocPH5YkHT58WBEREf6MWEGzZs00fPhwbd68WTk5OSoqKpIkZWZmKjIy0q/ZPvvsM61bt04dO3bU5MmT9eGHH+quu+4KuJzllWWJiIjQlVdeqa1btwbcPhAVFaWoqCgNGjRIkjRhwgTt3Lkz4HKWt379evXr109t2rSRFHi/Vx988IHOP/98tW7dWuecc46uuuoqffbZZwG7r86aNUs7duzQJ598oubNm6tr164Bt03Lc5YtMjJSGRkZ1ukCaRvXVbX5PalN+5knxxuBmF9y7/ijfPaioiLl5uaqZcuWfsnr6TFJIGUv48kxSiDtN54etwRS9jLuHscEWnaKvXKMMZo1a5Z69Oihe+65xzo+MTFRS5culSQtXbpU48eP91dEq6NHjyonJ0eSdPr0ab3//vvq0aOHhg8frjfeeENSYGR97LHHlJmZqfT0dK1cuVIjRozQ8uXLAy5nmby8PJ04ccL683vvvae4uLiA2wfatm2r6Oho7d27V5K0ceNG9ezZM+BylrdixQrrpQ9S4P1enXfeedqy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6tWrp4EDByoqKkqSrPcOhoeHq127dhowYIAkqWnTppKka665Rn/729/0xBNP6F//+pdmzJhRYVmffvqp7rjjDklS9+7d1aFDB+3bt8/ahiMffvihli1bJqn0Xsbw8HCb140x+tOf/qRPPvlEISEhysrK0pEjR9S2bVub6QYMGGD9PO3cubPGjBkjSerVq5f1DONFF12kGTNmaOLEibrqqqtcbjvAExR7gA99//33Cg0NVUREhCSpUaNGDqeLjIxUy5Yt9c033+j111/XSy+9JKn0w+Q///mPunXrZjP9F1984bSt48eP68MPP9S3334ri8Wi4uJiWSwWPfHEE05zGmMUGxurzZs3V2U1AQBBqvxnjTFG//d//6ebb77ZZpqnn37a6fxhYWHWB5Xl5+fbtPXss89q7NixNtOnpqbq3HPPtQ6HhoaqqKjIafsNGzbU6NGjtXbtWq1atUo7duxwa72qa/ny5Tp69Kh27Nihc845Rx07drRZvzLl1yUkJMQ6HBISYl2vl156SV988YXefvtt9e/fXzt27FDLli1rZD0Q/LhnD/CRo0eP6pZbbtHtt98ui8XicvpJkybp73//u3Jzc9W7d29J0tixY/Xss89a71f48ssvXbbzxhtv6Prrr9ehQ4eUnp6ujIwMnX/++dq0aZMuuugi/ec//1FJSYmOHDmi1NRUSVK3bt109OhRa7FXWFhocw8hAABjx47Vv/71L+sDSrKysvTTTz9pyJAhWrNmjU6fPq0TJ04oJSXFOk/Hjh2tBVjZWbyytl588UUVFhZKkvbt26e8vDyny+7WrZsOHz6sbdu2SZJOnDhhLZZuvPFG3XnnnRowYICaN29eYd7f//73Wr58uXU5P/zwQ4V/otobOXKkXnzxRUmlV7vk5ubavJ6bm6uIiAidc845+uijj3To0KFK26vMgQMHNGjQID300ENq3bq1MjIyqtwWYI9iD/Ci06dPW7teGDVqlMaMGWNzA3tlJkyYoJUrV2rixInWcQ8++KAKCwvVu3dvxcbG6sEHH3TZzooVK3TllVfajLv66qu1YsUKXX311YqKilLPnj113XXXqV+/fgoPD1e9evX0xhtv6L777lOfPn3Ut2/fCjejAwDqtjFjxujaa6/V4MGD1atXL02YMEEnTpxQv379NGnSJPXp00eXXnqp9VJLSZozZ45efPFFXXDBBfr555+t42+88Ub17NlT/fr1U1xcnG6++eZKz+DVq1dPr7/+uu644w716dNHo0ePtp5J69+/v5o2baobbrjB4by33nqrSkpK1KtXL02aNElLliyxOePmyDPPPKOPPvpIvXr1Uv/+/bV7926b16dOnart27erV69eWrZsmbp37+5y+znzxz/+Ub169VJcXJz1ATSAt9D1AlDHnDx5Uo0bN9axY8c0cOBAffbZZxXuMQAAoKrmzp2rxo0ba86cOTWyvOzsbA0bNkx79uwJqq4hAG/gnj2gjrn88suVk5OjgoICPfjggxR6AIBaa9myZXrggQf05JNPUugBDnBmDwAAAACCEP8CAQAAAIAgRLEHAAAAAEGIYg8AAAAAghDFHgAAAAAEIYo9AAAAAAhC/x9EGOISXG8oWgAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1080x504 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.ioff()\n",
"fig, ax = plt.subplots(1,2,figsize=(15,7))\n",
"fig.patch.set_facecolor('white')\n",
"ax[0].set_title(\"Frequency of claims vs. Driver Age\")\n",
"ax[0].set_xlabel(\"Driver Age\")\n",
"ax[0].set_ylabel(\"Frequency of claims\")\n",
"ax[0].scatter(df[\"DrivAge\"], df[\"Frequency\"], marker=\"o\", color=\"#ffb700\")\n",
"ax[1].set_title(\"Histogram of Frequency of claims\")\n",
"ax[1].set_xlabel(\"Frequency of claims\")\n",
"ax[1].set_ylabel(\"Count\")\n",
"df[\"Frequency\"].hist(bins=30, log=True, ax=ax[1], color=\"black\")\n",
"display(fig)"
]
},
{
"cell_type": "markdown",
"id": "5c8310ab",
"metadata": {},
"source": [
"We split the data into a training and a test set, but we also keep a part of the data to be used for calibration. This calibration set is not used for training, nor for testing the model. Thus we ensure better generalization of the quantized model."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "d81db277",
"metadata": {},
"outputs": [],
"source": [
"df_train, df_test = train_test_split(df, test_size=0.2, random_state=0)\n",
"df_calib, df_test = train_test_split(df_test, test_size=100, random_state=0)\n"
]
},
{
"cell_type": "markdown",
"id": "4690cc15",
"metadata": {},
"source": [
"## Simple single variable insurance incident frequency predictor\n",
"\n",
"Our initial example only uses a single predictor feature, so we can easily visualize results. "
]
},
{
"cell_type": "markdown",
"id": "faa5247c",
"metadata": {},
"source": [
"We first train the scikit-learn PoissonRegressor model:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "682fb2d8",
"metadata": {},
"outputs": [],
"source": [
"reg = PoissonRegressor(max_iter=300)\n",
"reg.fit(df_train[\"DrivAge\"].values.reshape(-1,1), df_train[\"Frequency\"]);"
]
},
{
"cell_type": "markdown",
"id": "084fb296",
"metadata": {},
"source": [
"We can now test this predictor on the test data:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "4953b03e",
"metadata": {},
"outputs": [],
"source": [
"test_data = np.sort(df_test[\"DrivAge\"].values).reshape(-1,1)\n",
"predictions = reg.predict(test_data)"
]
},
{
"cell_type": "markdown",
"id": "f28155cf",
"metadata": {},
"source": [
"Let's visualize our predictions to see how our model performs !"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "111574ed",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAs0AAAHwCAYAAABdQ1JvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABEjElEQVR4nO3deXwV1f3/8XdWliysCdk3CEnYA2ERFxYJUEQKgqIiaBWoW0WttVrqWvel7t/atNb60xRUrAIuVBFQQBYDBqVIQMhCSAhhJxvZ5vdHmjGXJMwNJPdektfz8ZjHvTN37sxnzh0vb0/OnXEzDMMQAAAAgEa5O7sAAAAAwNURmgEAAAALhGYAAADAAqEZAAAAsEBoBgAAACwQmgEAAAALhGYAcJK1a9cqLi7OZfeflZUlNzc3VVZWntN+1qxZo7CwsCa/BgCuhNAM4LwWFRWlDh06yNfXV0FBQbrhhhtUVFTk7LLscvHFFysjI8Nl9h8VFaWVK1c6rR4AcGWEZgDnveXLl6uoqEjp6en67rvv9OSTTzb7Ps61txWOxecFoLkRmgG0GkFBQZowYYLS09PNZRs3btTIkSPVuXNnDRw4UGvWrDFfy8zM1CWXXCI/Pz+NGzdOt912m6677jpJPw9NeOONNxQREaGxY8dKkv7xj38oISFBXbp00YQJE5SdnS1JMgxDd911lwIDA+Xv76/+/ftr+/btkqRPP/1Uffr0kZ+fn0JDQ/Xcc89Jqj804ccff9To0aPVuXNn9e3bV8uWLTNfu+GGG3Tbbbfpsssuk5+fn4YPH649e/Y02A7XX3+9nn/+eUnS/v375ebmptdee02StGfPHnXt2lXV1dU2+589e7ZycnJ0+eWXy9fXV88884y5vdTUVEVERKh79+56/PHHG23/xo7zdC+//LL69Omj3Nzceq/l5eVp+vTpCggIUHR0tF5++WXztc2bN+uCCy5Q586dFRwcrNtvv13l5eXm67XHGRsbq9jYWPP4nn/+eQUGBio4OFhvvvlmo/UDwBkZAHAei4yMNL744gvDMAxj3759Rr9+/Yw77rjDMAzDyM3NNbp27Wp88sknRlVVlfH5558bXbt2NQ4ePGgYhmGMGDHC+O1vf2ucOnXKWLt2reHn52fMmjXLMAzDyMzMNCQZs2fPNoqKioySkhLjo48+Mnr27Gns2LHDqKioMP70pz8ZF1xwgWEYhrFixQpj8ODBxtGjR43q6mpjx44dRl5enmEYhhEUFGR8/fXXhmEYxpEjR4wtW7YYhmEYq1evNkJDQw3DMIzy8nKjZ8+exuOPP26cOnXK+PLLLw1fX19j586dhmEYxvXXX2907drV2LRpk1FRUWFce+21xsyZMxtskzfeeMOYPHmyYRiGkZqaasTExBhXXXWV+dqUKVPq7f/0tqzbBnPnzjVKSkqM9PR0w9vb29ixY0eD+7XnOB955BEjMTHR/AzqvlZVVWUMHjzYeOSRR4xTp04Ze/bsMaKjo40VK1YYhmEYaWlpxoYNG4yKigojMzPTiI+PN1544QVz/5KMcePGGYcPHzZKSkqM1atXGx4eHsYDDzxglJeXG5988onRoUMH48iRIw3WDwBnQk8zgPPe1KlT5efnp/DwcAUGBuqRRx6RJL3zzjuaNGmSJk2aJHd3dyUnJyspKUmffvqpcnJy9O233+rRRx+Vt7e3LrroIk2ZMqXeth9++GH5+PioQ4cOev3113X//fcrISFBnp6e+sMf/qD09HRlZ2fLy8tLJ0+e1M6dO2UYhhISEhQcHCxJ8vLy0o4dO3TixAl16dJFgwcPrrefjRs3qqioSPfdd5+8vb01duxYTZ48WYsWLTLXmTZtmoYNGyZPT0/NmjXLpke9rlGjRmndunWqrq7W119/rXvvvVfr16+XJH311VcaNWpUk9r3oYceUocOHTRw4EANHDhQ27Zta3C9Mx2nYRi6++679fnnn2v16tUKCAio9/5vv/1WhYWFevDBB+Xt7a2YmBjNmzdPixcvliQNGTJEI0aMkKenp6KiovTrX/9aX331lc027r//fnXt2lUdOnQwa3rwwQfl5eWlSZMmydfX16njyAGcvwjNAM57H330kU6ePKk1a9Zo586dOnTokCQpOztb77//vjp37mxO69atU35+vvLy8tS1a1d17NjR3E54eHi9bdddlp2drQULFpjb6tq1qwzD0P79+zV27Fjdfvvtuu222xQYGKj58+frxIkTkqQPPvhAn376qSIjIzVq1Cht2LCh3n7y8vIUHh4ud/efv5YjIyO1f/9+cz4oKMh83rFjx0Z/8NizZ0/5+PgoPT1da9eu1eTJkxUSEqKMjIyzCs327vdMx3ns2DGlpKTo/vvvV6dOnRp8f3Z2tvLy8mw+ryeeeEIFBQWSpF27dmny5MkKCgqSv7+//vCHP5ifda3TP8Nu3brJ09PTrvoB4EwIzQBajVGjRumGG27QPffcI6kmQM2ePVvHjh0zp+LiYt13330KDg7WkSNHVFJSYr5/37599bbp5uZmPg8PD9df//pXm+2VlpZq5MiRkqQ77rhDW7Zs0Y4dO7Rr1y49++yzkqShQ4dq6dKlOnjwoKZOnaqrrrqq3n5CQkK0b98+VVdXm8tycnIUGhp61m2xZMkSlZeXKzQ0VKNGjdJbb72lo0ePatCgQQ2+p+6xno0zHWeXLl308ccf61e/+pXZ63268PBwRUdH27TvyZMn9emnn0qSbrnlFsXHx2v37t06ceKEnnjiCRmG0azHAACNITQDaFXuvPNOffHFF9q2bZuuu+46LV++XP/5z39UVVWlsrIyrVmzRrm5uYqMjFRSUpIefvhhlZeXa8OGDVq+fPkZt33zzTfrySef1H//+19J0vHjx/X+++9LqhlasGnTJlVUVMjHx0ft27eXu7u7ysvLlZqaquPHj8vLy0v+/v42vcm1hg8fro4dO+qZZ55RRUWF1qxZo+XLl+vqq68+q3YYNWqUXn31VV1yySWSpNGjR+vVV1/VRRddJA8Pjwbf06NHD+3du/es9mfPcY4ePVqpqam64oortHnz5nrbGDZsmPz8/PT000+rtLRUVVVV2r59u7799ltJ0smTJ+Xv7y9fX1/t3LlTf/nLX86qVgA4G4RmAK1KQECA5syZo0cffVTh4eFaunSpnnjiCQUEBCg8PFzPPvus2ZubmpqqDRs2qFu3bvrjH/+omTNnql27do1ue9q0afr973+vq6++Wv7+/urXr58+++wzSdKJEyc0b948denSRZGRkerWrZt+97vfSZLefvttRUVFyd/fX6+//rpSU1Prbdvb21vLly/XZ599pu7du+vWW2/V//t//0/x8fFn1Q6jRo3SyZMnzdB80UUXqaSkxJxvyP3336/HHntMnTt3bvTKF2diz3EmJyfrH//4hy6//HJt3brV5jUPDw99/PHHSk9PV3R0tLp37665c+fq+PHjkqTnnntO//rXv+Tn56d58+Zp5syZTa4RAM6Wm3H637YAoI2aOXOm4uPjzR8SAgBQi55mAG3Wt99+qz179qi6ulorVqzQ0qVLNXXqVGeXBQBwQS0Wmm+88UYFBgaqX79+5rIjR44oOTlZsbGxSk5O1tGjR1tq9wBg6cCBAxo9erR8fX11xx136C9/+YsSExOdXRYAwAW12PCMr7/+Wr6+vpozZ455V6x7771XXbt21X333aennnpKR48e1dNPP90SuwcAAACaTYuOac7KytLkyZPN0BwXF6c1a9YoODhY+fn5Gj16NBeZBwAAgMtz6JjmgoIC8w5ZQUFB5gXrAQAAAFfmab1Ky3BzczvjRehTUlKUkpIiSdq5c+dZX3YJAAAAsEdWVla9O43Wcmho7tGjh/Lz883hGYGBgY2uO3/+fM2fP1+SlJSUpLS0NEeVCQAAgDYoKSmp0dccOjxjypQpeuuttyRJb731ln75y186cvcAAADAWWmx0HzNNdfoggsuUEZGhsLCwvTGG2/ovvvu0xdffKHY2FitXLlS9913X0vtHgAAAGg2LTY8Y9GiRQ0u//LLL1tqlwAAAECLcNoPAQEAAJpbRUWFcnNzVVZW5uxS4MLat2+vsLAweXl52f0eQjMAAGg1cnNz5efnp6ioqDNepQttl2EYOnz4sHJzcxUdHW33+xz6Q0AAAICWVFZWpm7duhGY0Sg3Nzd169atyX+NIDQDAIBWhcAMK2dzjhCaAQAAmpGHh4cGDRpkTllZWVqzZo0mT558VttLT0/Xp59+2qT3jB49ukXucbFmzRp98803zb7dWjfccIOWLFlyxuVz587Vjh07WqyGxjCmGQAAoBl16NBB6enpNsuysrLOenvp6elKS0vTpEmTzq2ws1BZWSlPz5/j4po1a+Tr66uRI0darttS/v73v7f4PhpCTzMAAIADHTlyRFOnTtWAAQM0YsQIff/995KkzZs364ILLlBiYqJGjhypjIwMlZeX68EHH9S7776rQYMG6d1337XZVlVVle655x7169dPAwYM0CuvvFJvf59//rkuuOACDR48WFdeeaWKiookSY8++qiGDh2qfv36af78+TIMQ1JNL/Wdd96ppKQkvfTSS+Z2srKy9Prrr+uFF17QoEGDtHbtWt1www26+eabNXz4cN17773as2ePJk6cqCFDhujiiy/Wzp07JdX0FN9xxx0aOXKkYmJizF5jwzB0++23Ky4uTuPGjdPBgwct269uL7qvr68WLlyogQMHasSIESooKJAkFRYWavr06Ro6dKiGDh2q9evXN+kzagg9zQAAoFW688476/X4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7RoYGKhp06Zp8+bNfOc4QFhYmMLCwjR8+HBJ0owZM7R161ba3oE+++wzDR48WD169JDEv7WOsHLlSkVHRysgIEBeXl664oortH79er7vm4DQ/D+GYeimm25SQkKC7r77bnP5lClT9NZbb0mS3nrrLf3yl790VomtVmFhoY4dOyZJKi0t1RdffKGEhASNGTNGS5YskUTbt5Qnn3xSubm5ysrK0uLFizV27FilpqbS9g5QXFyskydPms8///xz9evXj+8cBwgKClJ4eLgyMjIkSV9++aX69OlD2zvQokWLzKEZEv/WOkJERIQ2btyokpISGYZhnvd839uPm5v8z7p163TxxRerf//+5tjOJ554QsOHD9dVV12lnJwcRUZG6r333lPXrl2dXG3r8v333+v6669XVVWVqqurddVVV+nBBx/U3r17dfXVV+vIkSNKTEzUO++8o3bt2jm73FZrzZo1eu655/Txxx/T9g6wd+9eTZs2TVLNcIFrr71WCxcu1OHDh/nOcYD09HTNnTtX5eXliomJ0Ztvvml+/9D2Lau4uFgRERHau3evOnXqJEmc9w7y0EMP6d1335Wnp6cSExP197//Xfv37+f73k6EZgAAAMACwzMAAAAAC4RmAAAAwAKhGQAAALBAaAYAAAAsEJoBAAAAC4RmAHAwDw8PDRo0SH379tXAgQP1/PPPq7q6usF18/LyNGPGjBar5aOPPpKbmxt34QQAC1xyDgAczNfXV0VFRZKkgwcP6tprr9WFF16oRx55xGa9yspKeXp6Nss+G9vWzJkzlZeXp7Fjx9bbPwDgZ/Q0A4ATBQYGKiUlRa+++qoMw9A///lPTZkyRWPHjtWll16qrKws9evXT5I0YsQI/fe//zXfO3r0aKWlpam4uFg33nijhg0bpsTERC1dulSS6m3rdEVFRVq3bp3eeOMNLV682FxeXV2tW2+9VfHx8UpOTtakSZPMO4Zt2bJFo0aN0pAhQzRhwgTz1scA0NoRmgHAyWJiYlRVVaWDBw9KkrZu3aolS5boq6++sllv5syZeu+99yRJ+fn5ys/PV1JSkh5//HGNHTtWmzdv1urVq/W73/1OxcXFZ9yWJC1dulQTJ05U79691a1bN23ZskWS9O9//1tZWVnasWOH3n77bW3YsEGSVFFRod/85jdasmSJtmzZohtvvFELFy5ssXYBAFfSPH/3AwA0m+Tk5AZvIXzVVVdp/PjxeuSRR/Tee++ZY50///xzLVu2TM8995wkqaysTDk5OWfcliQtWrRICxYskCRdffXVWrRokYYMGaJ169bpyiuvlLu7u4KCgjRmzBhJUkZGhrZv367k5GRJUlVVlYKDg5v34AHARRGaAcDJ9u7dKw8PDwUGBkqSfHx8GlwvNDRU3bp10/fff693331Xr7/+uiTJMAx98MEHiouLs1l/06ZNjW7ryJEjWrVqlX744Qe5ubmpqqpKbm5uevbZZxut0zAM9e3b1+x5BoC2hOEZAOBEhYWFuvnmm3X77bfLzc3Ncv2ZM2fqmWee0fHjxzVgwABJ0oQJE/TKK6+o9nfd3333neV2lixZotmzZys7O1tZWVnat2+foqOjtXbtWl144YX64IMPVF1drYKCAq1Zs0aSFBcXp8LCQpvhGnXHWANAa0ZoBgAHKy0tNS85N27cOI0fP14PPfSQXe+dMWOGFi9erKuuuspc9sADD6iiokIDBgxQ37599cADD1huZ9GiRZo2bZrNsunTp2vRokWaPn26wsLC1KdPH1133XUaPHiwOnXqJG9vby1ZskS///3vNXDgQA0aNEjffPNN0w4eAM5TXHIOAFBPUVGRfH19dfjwYQ0bNkzr169XUFCQs8sCAKdhTDMAoJ7Jkyfr2LFjKi8v1wMPPEBgBtDm0dMMAAAAWGBMMwAAAGCB0AwAAABYIDQDAAAAFgjNAAAAgAVCMwAAAGCB0AwAAABY+P9p0pjROOzIegAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 864x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.clf()\n",
"fig, ax = plt.subplots(1,figsize=(12,8))\n",
"fig.patch.set_facecolor('white')\n",
"ax.plot(test_data, predictions, color=\"black\", label=f\"Float clear trend line\")\n",
"ax.scatter(df_test[\"DrivAge\"], df_test[\"Frequency\"], marker=\"o\", color=\"#ffb700\")\n",
"ax.set_xlabel(\"Driver Age\")\n",
"ax.set_ylim(0,10)\n",
"ax.set_title(\"Regression with sklearn\")\n",
"ax.set_ylabel(\"Frequency of claims\")\n",
"ax.legend(loc=\"upper right\")\n",
"display(fig)"
]
},
{
"cell_type": "markdown",
"id": "429d8cc8",
"metadata": {},
"source": [
"### Analysis\n",
"\n",
"The trend line obtained from the model suggests an increase of incidents with driver age, but the data shows that incidents peak around the ages of 30 to 40 years of age with a decrease afterwards. This simple model does not seem to be a good one. We convert it to FHE to show visually some details of the conversion. In the second part of this example we train a more powerful model."
]
},
{
"cell_type": "markdown",
"id": "2d959640",
"metadata": {},
"source": [
"### FHE models need to be quantized, so let's define a **Quantized Poisson Regressor**\n",
"\n",
"We use the quantization primitives available in the Concrete library: QuantizedArray, QuantizedFunction, and QuantizedLinear to define a Poisson Regressor which is a Generalized Linear Model with exponential link."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "9f5acbfe",
"metadata": {},
"outputs": [],
"source": [
"class QuantizedExp(QuantizedActivation):\n",
" \"\"\"Quantized exponential function.\"\"\"\n",
"\n",
" def calibrate(self, x: np.ndarray):\n",
" self.q_out = QuantizedArray(self.n_bits, np.exp(x))\n",
"\n",
" def __call__(self, q_input: QuantizedArray) -> QuantizedArray:\n",
" quant_exp = np.exp(self.dequant_input(q_input))\n",
" q_out = self.quant_output(quant_exp)\n",
" return q_out\n",
" \n",
"class QuantizedGLM(QuantizedModule):\n",
" def __init__(self, n_bits, sklearn_model, calibration_data) -> None:\n",
" # Create a QuantizedLinear layer\n",
" self.n_bits = n_bits\n",
"\n",
" self.q_calibration_data = QuantizedArray(n_bits, calibration_data)\n",
"\n",
" q_weights = QuantizedArray(2, np.expand_dims(sklearn_model.coef_,1), is_signed=False)\n",
" q_bias = QuantizedArray(1, sklearn_model.intercept_)\n",
" q_layer = QuantizedLinear(6, q_weights, q_bias)\n",
" quant_layers_dict = {}\n",
" # Calibrate and get new calibration_data for next layer/activation\n",
" calibration_data = self._calibrate_and_store_layers_activation(\n",
" \"linear\", q_layer, calibration_data, quant_layers_dict\n",
" )\n",
"\n",
" # Create a new quantized layer (based on type(layer))\n",
" q_exp = QuantizedExp(n_bits=7)\n",
" calibration_data = self._calibrate_and_store_layers_activation(\n",
" \"invlink\", q_exp, calibration_data, quant_layers_dict\n",
" )\n",
"\n",
" super().__init__(quant_layers_dict)\n",
"\n",
"\n",
" def _calibrate_and_store_layers_activation(self, name, q_function, calibration_data, quant_layers_dict):\n",
" # Calibrate the output of the layer\n",
" q_function.calibrate(calibration_data)\n",
" # Store the learned quantized layer\n",
" quant_layers_dict[name] = q_function\n",
" # Create new calibration data (output of the previous layer)\n",
" q_calibration_data = QuantizedArray(self.n_bits, calibration_data)\n",
" # Dequantize to have the value in clear and ready for next calibration\n",
" return q_function(q_calibration_data).dequant()\n",
"\n",
"\n",
" def quantize_input(self, x):\n",
" q_input_arr = deepcopy(self.q_calibration_data)\n",
" q_input_arr.update_values(x)\n",
" return q_input_arr"
]
},
{
"cell_type": "markdown",
"id": "ab82ae87",
"metadata": {},
"source": [
"### We can now convert the scikit-learn model to our quantized version\n",
"\n",
"First, we get the calibration data, and we then run it through the non-quantized (float) model to determine all possible intermediate values. After each operation, these values are quantized and the quantized version of the operations are stored in the QuantizedGLM module."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "09d12194",
"metadata": {},
"outputs": [],
"source": [
"calib_data = np.expand_dims(df_calib[\"DrivAge\"].values, 1)\n",
"n_bits = 5\n",
"q_glm = QuantizedGLM(n_bits, reg, calib_data)"
]
},
{
"cell_type": "markdown",
"id": "e2528092",
"metadata": {},
"source": [
"Once the model's parameters and input ranges are quantized, we can quantize our test data and perform quantized inference. "
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "f0f0699a",
"metadata": {},
"outputs": [],
"source": [
"q_test_data = q_glm.quantize_input(test_data)\n",
"y_pred = q_glm.forward_and_dequant(q_test_data)\n"
]
},
{
"cell_type": "markdown",
"id": "a5a50eb8",
"metadata": {},
"source": [
"Let's visualize the results of the quantized model. We can measure the goodness of fit on the test data using the Poisson deviance. We then plot the two trend lines (float value model and quantized model) to check for differences. "
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "04777aeb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"mean Poisson deviance (float): 3.7115219475021872\n",
"mean Poisson deviance (quant): 3.716861851757367\n"
]
}
],
"source": [
"from sklearn.metrics import mean_poisson_deviance\n",
"\n",
"y_gt = df_test[\"Frequency\"]\n",
"gt_weight = df_test[\"Exposure\"]\n",
"\n",
"dev_real = mean_poisson_deviance(y_gt, predictions, sample_weight=gt_weight)\n",
"dev_q = mean_poisson_deviance(y_gt, y_pred, sample_weight=gt_weight)\n",
"\n",
"print(f\"mean Poisson deviance (float): {dev_real}\")\n",
"print(f\"mean Poisson deviance (quant): {dev_q}\")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "5fb15eb4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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dly7do2IiAh69eqlXhb+bsuWLVOH6lu3bhEfH6+JZjU7+fn50vY2pq22G9p22zVJQvMDsra2Vq+0t2jRIkxNTfnTn/7U4OfHx8djamraoNDcEBKahWj+ysrKiIqKYsqUKTz66KM1Hre3tycwMBATExNMTEwYMGAAR48epWfPntjZ2QFVQzbGjRtHYmJiraE5Ojqa6OhooGqe5rY6d2tbnre2rba9rbYb2nbbNanNDM9ITk5myZIlvP766yxZsoTk5ORGP8bBgwcZOHAg/v7+DB06VL1C3UcffYS7uzteXl5MnDiR9PR0li5dygcffFBjlT+o6sUeMmQIHh4ezJw5s9rqdWPHjsXf3x8PDw91b9LChQspKirCx8dHvYpfbdsJIbRHURRmzJiBm5sbCxYsqHWbMWPGkJycTHl5OYWFhezfvx83NzcKCgrUK28WFBSwZcsWevfurcnyhRCizWsTPc3JycnExMRQVlYGQE5ODjExMQB4eno2yjEUReG5555j/fr12NrasmbNGl5++WX++9//8tZbb5GWloahoSG3b9/G0tKS2bNn19k7/frrr9OvXz9effVVYmNjqy25/N///hcrKyuKiooIDAwkKiqKt956i48//ljd813XdtbW1o3SViHE/duzZw8rV65UTxsHVZ8QXbhwAYDZs2fj5uZGnz598PLyQkdHh5kzZ9K7d2/Onz/PuHHjgKohHJMnT2bYsGHaaooQQrRJbSI0x8XFqQPzHWVlZcTFxTVaaC4pKeH48eNEREQAUFFRQefOnQHw8vJiypQpjB07lrFjx9a7r507d/LTTz8BMHLkSNq3b69+7KOPPmLdunVA1byvqamptYbhhm4nhNCMfv36VfvUqC4TJ05k6dKl1e5zdnbm6NGjTVWaEEKIBmgToTknJ+e+7n8QiqLg4eHBvn37ajwWGxvLzp07iYmJ4c0333zgoSHx8fFs27aNffv20a5dO8LCwiguLn7g7YQQQgghRMO0iTHNFhYW93X/gzA0NOT69evq0FxWVsaJEyeorKxUrwT29ttvk5OTQ35+PmZmZuoxir83YMAAvv32WwA2bdrErVu3gKqQ3759e9q1a8fp06dJSEhQP0dfX7/a8JO6thNCCCGEEPevTYTm8PBw9PX1q92nr6+vnjKuMejo6LB27VpeeuklvL298fHxYe/evVRUVDB16lQ8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",
"text/plain": [
"<Figure size 864x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.clf()\n",
"fig, ax = plt.subplots(1,figsize=(12,8))\n",
"fig.patch.set_facecolor('white')\n",
"#ax.set_yscale(\"log\")\n",
"ax.plot(test_data, predictions, color=\"black\", label=f\"Float clear trend line, d={dev_real:.3f}\")\n",
"ax.scatter(df_test[\"DrivAge\"], df_test[\"Frequency\"], marker=\"o\", color=\"gray\", label=\"Test data\")\n",
"ax.set_xlabel(\"Driver Age\")\n",
"ax.set_ylim(0,10)\n",
"ax.set_title(\"Poisson Regression, float in clear vs. quantized \")\n",
"ax.set_ylabel(\"Frequency of claims\")\n",
"ax.plot(test_data, y_pred, color=\"red\",label=f\"Quantized trend line, d={dev_q:.3f}\")\n",
"ax.legend(loc=\"upper left\")\n",
"ax.grid()\n",
"\n",
"# inset axes....\n",
"axins = ax.inset_axes([0.5, 0.5, 0.47, 0.47])\n",
"axins.plot(test_data, predictions, color=\"black\", label=f\"Float clear trend line, d={dev_real:.3f}\")\n",
"axins.plot(test_data, y_pred, color=\"red\",label=f\"Quantized trend line, d={dev_q:.3f}\")\n",
"# sub region of the original image\n",
"x1, x2, y1, y2 = 60, 65, 2.3, 2.7\n",
"axins.set_xlim(x1, x2)\n",
"axins.set_ylim(y1, y2)\n",
"#axins.set_xticklabels([])\n",
"#axins.set_yticklabels([])\n",
"axins.grid()\n",
"ax.indicate_inset_zoom(axins, edgecolor=\"black\")\n",
"\n",
"display(fig)"
]
},
{
"cell_type": "markdown",
"id": "aa8854b2",
"metadata": {},
"source": [
"### Analysis\n",
"\n",
"We see, in the graph above, that the trend line of the quantized model is more jaggy and has slightly higher deviance. The tradeoff between better fit and compatibility with FHE compilation needs to be made by the practitioner."
]
},
{
"cell_type": "markdown",
"id": "af6bc89e",
"metadata": {},
"source": [
"### Now it's time to make the inference homomorphic. Compiling a model to FHE is done with a single line of code\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "fe9935bd",
"metadata": {},
"outputs": [],
"source": [
"engine = q_glm.compile(q_test_data)"
]
},
{
"cell_type": "markdown",
"id": "46753da7",
"metadata": {},
"source": [
"And now we can test the model on the test set in FHE:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "ca928b78",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 100/100 [00:21<00:00, 4.72it/s]\n"
]
}
],
"source": [
"y_pred_fhe = np.zeros((test_data.shape[0],), np.float32)\n",
"for i, test_sample in enumerate(tqdm(q_test_data.qvalues)):\n",
" q_sample = np.expand_dims(test_sample, 1).transpose([1,0]).astype(np.uint8)\n",
" q_pred_fhe = engine.run(q_sample)\n",
" y_pred_fhe[i] = q_glm.dequantize_output(q_pred_fhe)"
]
},
{
"cell_type": "markdown",
"id": "68f67b3f",
"metadata": {},
"source": [
"Finally we check if there are any differences to the quantized model on non-encrypted clear data by plotting the trend lines. Sometimes, FHE noise can create minor artifacts."
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "92c7f2f5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 864x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.clf()\n",
"fig, ax = plt.subplots(1,figsize=(12,8))\n",
"fig.patch.set_facecolor('white')\n",
"ax.plot(test_data, predictions, color=\"black\", label=f\"Float clear trend line, d={dev_real:.3f}\")\n",
"ax.plot(test_data, y_pred_fhe, color=\"blue\", label=f\"FHE quantized trend line\")\n",
"ax.scatter(df_test[\"DrivAge\"], df_test[\"Frequency\"], marker=\"o\", color=\"gray\", label=\"Test data\")\n",
"ax.set_xlabel(\"Driver Age\")\n",
"ax.set_ylim(0,10)\n",
"ax.set_title(\"Poisson Regression, float in clear vs. quantized FHE encrypted\")\n",
"ax.set_ylabel(\"Frequency of claims\")\n",
"ax.plot(test_data, y_pred, color=\"red\",label=f\"Quantized trend line, d={dev_q:.3f}\")\n",
"ax.legend(loc=\"upper left\")\n",
"ax.grid()\n",
"\n",
"axins = ax.inset_axes([0.5, 0.5, 0.47, 0.47])\n",
"axins.plot(test_data, predictions, color=\"black\", label=f\"Float clear trend line, d={dev_real:.3f}\")\n",
"axins.plot(test_data, y_pred, color=\"red\",label=f\"Quantized FHE trend line, d={dev_q:.3f}\")\n",
"axins.plot(test_data, y_pred_fhe, color=\"blue\", label=f\"FHE quantized trend line\")\n",
"x1, x2, y1, y2 = 60, 65, 2.3, 2.7\n",
"axins.set_xlim(x1, x2)\n",
"axins.set_ylim(y1, y2)\n",
"axins.grid()\n",
"ax.indicate_inset_zoom(axins, edgecolor=\"black\")\n",
"\n",
"display(fig)"
]
},
{
"cell_type": "markdown",
"id": "14394b94",
"metadata": {},
"source": [
"## A multi-variate model\n",
"\n",
"The simple single variable model does not achieve good results (age is not a good predictor for the number of claims). Let's train a model with all of our predictor variables. We proceed by transforming the raw features into ones that can be input to a regression model. Thus, the categorical features are transformed into one-hot encoding, but we also reduce the resolution of vehicle and person by binning. Transforming the data this way, we end up with a total of 57 continuous features (instead of the initial 11).\n",
"\n",
"Here is where we encounter one of the limitations of our framework. We perform a dot product in the prediction, in the QuantizedLinear class, but in our framework the maximum integer size is, for now, limited to 7 bits. As every multiplication doubles the number of bits of precision of the inputs performing 57 multiplication-additions of integers to compute w.x would quickly overflow 7 bits. \n",
"\n",
"As a workaround to the limited accumulator resolution, we perform PCA to reduce dimensionality from 57 to 14 dimensions and train our multi-variate model in this reduced dimensionality space. However, we also train a reference model on all of the original features. "
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "759507c5",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.metrics import mean_poisson_deviance\n",
"\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.pipeline import Pipeline, make_pipeline\n",
"from sklearn.preprocessing import (\n",
" FunctionTransformer,\n",
" KBinsDiscretizer,\n",
" OneHotEncoder,\n",
" StandardScaler,\n",
")\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"log_scale_transformer = make_pipeline(\n",
" FunctionTransformer(np.log, validate=False), StandardScaler()\n",
");\n",
"\n",
"linear_model_preprocessor = ColumnTransformer(\n",
" [\n",
" (\"passthrough_numeric\", \"passthrough\", [\"BonusMalus\"]),\n",
" (\"binned_numeric\", KBinsDiscretizer(n_bins=10), [\"VehAge\", \"DrivAge\"]),\n",
" (\"log_scaled_numeric\", log_scale_transformer, [\"Density\"]),\n",
" (\n",
" \"onehot_categorical\",\n",
" OneHotEncoder(sparse=False),\n",
" [\"VehBrand\", \"VehPower\", \"VehGas\", \"Region\", \"Area\"],\n",
" ),\n",
" ],\n",
" remainder=\"drop\",\n",
");\n",
"\n",
"poisson_glm = Pipeline(\n",
" [\n",
" (\"preprocessor\", linear_model_preprocessor),\n",
" (\"regressor\", PoissonRegressor(alpha=1e-12, max_iter=300)),\n",
" ]\n",
");\n",
"\n",
"poisson_glm_pca = Pipeline(\n",
" [\n",
" (\"preprocessor\", linear_model_preprocessor),\n",
" (\"pca\", PCA(n_components=14, whiten=True)),\n",
" (\"regressor\", PoissonRegressor(alpha=1e-12, max_iter=300)),\n",
" ]\n",
");\n",
"\n",
"poisson_glm.fit(df_train, df_train[\"Frequency\"], regressor__sample_weight=df_train[\"Exposure\"])\n",
"\n",
"poisson_glm_pca.fit(\n",
" df_train, df_train[\"Frequency\"], regressor__sample_weight=df_train[\"Exposure\"]\n",
");"
]
},
{
"cell_type": "markdown",
"id": "bfbd0ff1",
"metadata": {},
"source": [
"### Now we evaluate the new models"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "0ffae598",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"PoissonRegressor evaluation: 1.3773\n",
"PoissonRegressor+PCA evaluation: 1.4399\n"
]
}
],
"source": [
"def score_estimator(y_pred, y_gt, gt_weight):\n",
" \"\"\"Score an estimator on the test set.\"\"\"\n",
" y_pred = np.squeeze(y_pred)\n",
" dev = mean_poisson_deviance(y_gt, y_pred, sample_weight=gt_weight)\n",
" return dev\n",
"\n",
"\n",
"def score_sklearn_estimator(estimator, df_test):\n",
" \"\"\"A wrapper to score a sklearn pipeline on a dataframe\"\"\"\n",
" return score_estimator(estimator.predict(df_test), df_test[\"Frequency\"], df_test[\"Exposure\"])\n",
"\n",
"\n",
"def score_concrete_glm_estimator(poisson_glm_pca, q_glm, df_test):\n",
" \"\"\"A wrapper to score QuantizedGLM on a dataframe, transforming the dataframe using\n",
" a sklearn pipeline\n",
" \"\"\"\n",
" test_data = poisson_glm_pca[\"pca\"].transform(poisson_glm_pca[\"preprocessor\"].transform(df_test))\n",
" q_test_data = q_glm.quantize_input(test_data)\n",
" y_pred = q_glm.forward_and_dequant(q_test_data)\n",
" return score_estimator(y_pred, df_test[\"Frequency\"], df_test[\"Exposure\"])\n",
"\n",
"\n",
"print(f\"PoissonRegressor evaluation: {score_sklearn_estimator(poisson_glm, df_test):.4f}\")\n",
"print(f\"PoissonRegressor+PCA evaluation: {score_sklearn_estimator(poisson_glm_pca, df_test):.4f}\")\n"
]
},
{
"cell_type": "markdown",
"id": "de58b9eb",
"metadata": {},
"source": [
"### Test the multi-variate GLM with multiple quantization bit-widths"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "bce8b011",
"metadata": {},
"outputs": [],
"source": [
"# Now, get calibration data from the held out set\n",
"calib_data = poisson_glm_pca[\"pca\"].transform(\n",
" poisson_glm_pca[\"preprocessor\"].transform(df_calib)\n",
")\n",
"\n",
"# Let's see how performance decreases with bit-depth.\n",
"# This is just a test of our quantized model, not in FHE\n",
"n_bits_test = np.asarray([28, 16, 6, 5, 4, 3, 2])\n",
"dev_bits_test = np.zeros_like(n_bits_test,dtype=np.float32)\n",
"for i, n_bits in enumerate(n_bits_test):\n",
" q_glm = QuantizedGLM(n_bits, poisson_glm_pca[\"regressor\"], calib_data)\n",
" dev_bits_test[i] = score_concrete_glm_estimator(poisson_glm_pca, q_glm, df_test)\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "6dcb5f7e",
"metadata": {},
"source": [
"We plot the Poisson deviance with respect to the quantized bit-width, to show how performance degrades with quantization:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "0e3c4858",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtoAAAHgCAYAAACb58plAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABSsklEQVR4nO3deVzUdeLH8fdwI5eK4AFepCKHioJ45VWJ5pZXaVl55FWZbW27VntU1m6bbbtdduq2lh1q2bltGViRR6Wiosl44IGpyQBeHILAzPz+MPlpiqAyfGeG1/Px2H0wM9/5ft/fLzPxnq+f+XxNdrvdLgAAAAB1ysPoAAAAAIA7omgDAAAADkDRBgAAAByAog0AAAA4AEUbAAAAcACKNgAAAOAAXkYHqEuNGzdWhw4djI4BF1NSUqKAgACjYwBwAFd+f7ty9tpw9/2rCxwj55WTk6OCgoIal3Orot28eXNlZGQYHQMuJj09XYMGDTI6BgAHcOX3tytnrw1337+6wDFyXklJSbVajqEjAAAAgANQtAEAAAAHoGgDAAAADuBWY7TPp6KiQgcOHFBZWZnRUeCkQkJCtG3bNqNj4Ax+fn6KjIyUt7e30VEAALhkbl+0Dxw4oKCgILVr104mk8noOHBCRUVFCgoKMjoGfmG323X48GEdOHBA7du3NzoOAACXzO2HjpSVlSk0NJSSDbgIk8mk0NBQ/hUKAODy3L5oS6JkAy6G9ywAwB00iKJtNE9PTyUkJCg+Pl5jx47ViRMnql32008/1dy5c+sx3bkCAwMv6Xk///yzbrzxxjpOUzsvvPCCYmJidOuttxqy/dr6+9//ftbtvn37XvY633jjDc2aNeu894eFhSkhIUEJCQmaOHGiJGny5MlatmzZWcue/p3n5OTI39+/6jkJCQlatGjROeuurKzUn/70J3Xs2LFquSeeeOKc9Z1pzpw5MplM2rVrV9V9zz33nEwmE/PfAwDcEkW7Hvj7+yszM1Nbt26Vj4+PXn311WqXHTFihB566KF6TFd3WrVqdU6Bqy8vv/yy0tLS9M4779Rq+crKSgcnOr9fF+3vvvvOodu76aablJmZqczMzPMW5vO54oorqp6TmZlZVdDP9Je//EU///yzfvzxR2VmZmrVqlWqqKiocd1dunTRkiVLqm6///77iouLq/0OAQDgQija9ax///7atWuXjhw5olGjRqlr167q3bu3tmzZIunss5Pvv/++4uPj1a1bNw0YMECSlJWVpeTkZCUkJKhr167Kzs6WJD3zzDOKj49XfHy8nnvuOUmnzk7GxMRo+vTpiouLU0pKikpLS8/JtHfvXvXp00ddunTRX/7yl7Mee/rpp9WzZ0917dpVjz76qCTpoYce0ksvvVS1zJw5c/TPf/5TOTk5io+Pr9p2//791aNHD/Xo0aOqUJ6+ytWNN96ozp0769Zbb5XdbpckrV+/Xn379lW3bt2UnJysoqIiWa1WzZ49uyrDa6+9dk7+O++8U3v27NG1116rZ599ttpjO2fOHE2YMEH9+vXThAkTzlqH3W7XrFmzFB0drWuuuUbDhw+v+tDQrl27qsusZmRkVF2la926derTp4+6d++uvn37aseOHVW/wzFjxmjYsGHq2LGjHnjggarjVlpaqoSEhKoz76fP/D7yyCNVZ4YjIiJ0++23S5Lefvvtqt/3HXfcIavVKklauHChOnXqpOTkZK1Zs+acY+JIJ06c0IIFCzRv3jz5+flJkoKCgjRnzpwanztq1Ch98sknkqTdu3crJCREzZo1c2RcAAAM4/azjpzpsf9myfxzYZ2uM7ZVsB69vnZn5CorK/XFF19o2LBhevTRR9W9e3d9/PHH+vrrrzVx4kRlZmaetfzjjz+uL7/8UhERETp27Jgk6dVXX9W9996rW2+9VeXl5bJardqwYYMWLlyotWvXym63q1evXho4cKCaNGmi7OxsLV68WAsWLNC4ceP0wQcf6LbbbjtrO/fee6/uuusuTZw48awCnZqaquzsbK1bt052u10jRozQypUrddNNN+m+++7T3XffLUl677339OWXX1aVQEkKDw9XWlqa/Pz8lJ2drfHjx1cND9i0aZOysrLUqlUr9evXT2vWrFFycrJuuukmLV26VD179lRhYaH8/f31+uuvKyQkROvXr9fJkyfVr18/paSknDUbxauvvqrly5frm2++UbNmzXTPPfdUe2zNZrNWr14tf3//s47BRx99pB07dshsNstisSg2NlZTpky54O+zc+fOWrVqlby8vLRixQr96U9/0gcffCBJyszM1KZNm+Tr66vo6Gjdc889mjt3rl588cVzfs+nf9ePP/64jh07pv79+2vWrFnatm2bli5dqjVr1sjb21szZ87UO++8oyFDhujRRx/Vhg0bFBISosGDB6t79+7nzbh06VKtXr266vd8usDPnj1bf/vb3877nN27dyshIaHq9rx589S/f/+q27t27VKbNm0uaaaW4OBgtW7dWlu3btUnn3yim266SQsXLrzo9QAA4AoaVNE2yumzmNKpM9pTp05Vr169qkrZVVddpcOHD6uw8OwPAf369dPkyZM1btw4jRkzRpLUp08fPfHEEzpw4IDGjBmjjh07avXq1Ro9erQCAgIkSWPGjNGqVas0YsQItW/fvmrbiYmJysnJOSffmjVrqrJMmDBBDz74oKRTRTs1NbWqxBUXFys7O1tTp05VXl6efv75Z+Xn56tJkyZq3br1WeuuqKjQrFmzlJmZKU9PT+3cubPqseTkZEVGRkqSEhISlJOTo5CQELVs2VI9e/aUdKqQnc6wZcuWqrPLx48fV3Z29gWnfVu9enW1x3bEiBHnlGxJWrlypcaPHy9PT0+1atVKV111VbXrP+348eOaNGmSsrOzZTKZzho6cfXVVyskJESSFBsbq3379ql169YXXJ/dbtdtt92m+++/X4mJiXrxxRe1YcOGqmNSWlqq8PBwrV27VoMGDVJYWJikU8NDzjy+Z7rpppv04osvnnP/008/fdZ4+jPHVJ8eOlJbCxcu1PPPP6/Dhw/ru+++q3E/b775Zi1ZskRffvmlvvrqK4o2AMBtNaiiXdszz3Xt9Bjti/Xqq69q7dq1+t///qfExERt2LBBt9xyi3r16qX//e9/Gj58+HmHUpzJ19e36mdPT8/zDh2Rzj/Lg91u1x//+Efdcccd5zw2duxYLVu2TLm5ubrpppvOefzZZ59V8+bNtXnzZtlstqohBufLdKHx0na7XfPmzdPQoUOrXeZinP4wcjG8vLxks9kk6awp5x5++GENHjxYH330kXJycqqGlEgXt4+nzZkzR5GRkVVnne12uyZNmqQnn3zyrOU+/vjji96HutShQwf99NNPVfOP33777br99tsVHx9/1r9qVOe6667T7NmzlZSUVPWBCgAAd8QYbYP079+/6ot76enpatas2TmlY/fu3erVq5cef/xxhYWFaf/+/dqzZ4+ioqL029/+ViNHjtSWLVvUv39/ffzxxzpx4oRKSkr00UcfnfVP/TXp169f1RfUzvwy4dChQ/Wf//xHxcXFkqSDBw8qLy9P0qkzpUuWLNGyZcs0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cXrggQcMSgegrh07dkw33nijOnfurJiYGH3//fdGR6qVdu3aqUuXLlV/y9yV1WpV9+7ddd111xkdxemUlZUpOTlZ3bp1U1xcnB599FGjI+EX1XXQ6rjk0JFDhw7p0KFD6tGjh4qKipSYmKiPP/5Y9913n373u9/p2muv1eeff65//OMfSk9PNzounMTKlSsVGBioiRMnauvWrZKkb775Rk888YT+97//ydfXV3l5eQoPDzc4KYC6MGnSJPXv31/Tpk1TeXm5Tpw4ocaNGxsdq0bt2rVTRkaGmjVrZnQUh3rmmWeUkZGhwsJCffbZZ0bHcSp2u10lJSUKDAxURUWFrrzySj3//PPq3bu30dEavOo6aGxs7HmXd8kz2i1btlSPHj0kSUFBQYqJidHBgwdlMplUWFgo6dQFFFq1amVkTDiZAQMGqGnTpmfd98orr+ihhx6Sr6+vJFGyATdx/PhxrVy5UlOnTpUk+fj4uETJbigOHDig//3vf5o2bZrRUZySyWRSYGCgJKmiokIVFRUymUwGp4JUfQetjksW7TPl5ORo06ZN6tWrl5577jnNnj1brVu31h/+8Ac9+eSTRseDk9u5c6dWrVqlXr16aeDAgVq/fr3RkQDUgb179yosLEy33367unfvrmnTpqmkpMToWLViMpmUkpKixMREp70Q0OW677779I9//EMeHi5fQxzGarUqISFB4eHhGjJkiHr16mV0JPzKmR20Oi79Ci8uLtYNN9yg5557TsHBwXrllVf07LPPav/+/Xr22WerzmQA1amsrNSRI0f0ww8/6Omnn9a4cePkgqOpAPxKZWWlNm7cqLvuukubNm1SQECA5s6da3SsWlm9erU2btyoL774Qi+99JJWrlxpdKQ69dlnnyk8PFyJiYlGR3Fqnp6eyszM1IEDB7Ru3bqqIY9wDr/uoNVx2aJdUVGhG264QbfeeqvGjBkjSXrzzTerfh47dixfhkSNIiMjNWbMGJlMJiUnJ8vDw0MFBQVGxwJwmSIjIxUZGVl1punGG2/Uxo0bDU5VOxEREZJODWUbPXq02/0tW7NmjT799FO1a9dON998s77++mvddtttRsdyWo0bN9bgwYO1fPlyo6PgF+froNVxyaJtt9s1depUxcTE6P7776+6v1WrVvr2228lSV9//bU6duxoVES4iFGjRumbb76RdGoYSXl5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",
"text/plain": [
"<Figure size 864x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"plt.clf()\n",
"fig, ax = plt.subplots(1, figsize=(12,8)) \n",
"fig.patch.set_facecolor(\"white\")\n",
"ax.plot(n_bits_test, dev_bits_test, label=\"Poisson deviance for quantized FHE GLM\")\n",
"ax.set_xlim(2,28)\n",
"ax.invert_xaxis()\n",
"ax.set_xlabel(\"Number of bits\")\n",
"ax.set_ylabel(\"Poisson deviance\")\n",
"ax.set_xscale(\"log\")\n",
"ax.set_xticks(n_bits_test)\n",
"ax.set_xticklabels([str(k) for k in n_bits_test])\n",
"ax.grid()\n",
"ax.legend(loc=\"upper left\")\n",
"display(fig)"
]
},
{
"cell_type": "markdown",
"id": "43e6fd06",
"metadata": {},
"source": [
"### Analysis\n",
"\n",
"While the prediction quality is mostly stable until 6 bits, we see a decrease in prediction performance in lower bit-widths. For 4 bits the performance seems to improve, but this is probably just a lucky sampling of the data, as this graph shows a single experiment. We expect to have a smooth increase of the deviance with lower bit-width when running the experiment multiple times.\n",
"\n",
"With 14 features, we can have weights and data in at most 2 bits. "
]
},
{
"cell_type": "markdown",
"id": "1ac216b1",
"metadata": {},
"source": [
"We now choose an operating point that is compatible with FHE: 2 bit quantization."
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "3c521ec8",
"metadata": {},
"outputs": [],
"source": [
"q_glm = QuantizedGLM(2, poisson_glm_pca[\"regressor\"], calib_data)\n",
"test_data = poisson_glm_pca[\"pca\"].transform(poisson_glm_pca[\"preprocessor\"].transform(df_test))\n",
"q_test_data = q_glm.quantize_input(test_data)"
]
},
{
"cell_type": "markdown",
"id": "a7f45c8c",
"metadata": {},
"source": [
"### Compile the multi-variate GLM to FHE. Again, with a single line of code we compile to FHE:"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "f89eaa07",
"metadata": {},
"outputs": [],
"source": [
"engine = q_glm.compile(q_test_data)"
]
},
{
"cell_type": "markdown",
"id": "baa0667b",
"metadata": {},
"source": [
"Finally, we evaluate the model on encrypted data:"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "f6fe2737",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 100/100 [00:40<00:00, 2.50it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"PoissonRegressor evaluation: 1.3773\n",
"PoissonRegressor+PCA evaluation: 1.4399\n",
"FHE Quantized deviance: 1.6530\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"y_pred_fhe = np.zeros((test_data.shape[0],), np.float32)\n",
"for i, test_sample in enumerate(tqdm(q_test_data.qvalues)):\n",
" q_sample = np.expand_dims(test_sample, 1).transpose([1, 0]).astype(np.uint8)\n",
" q_pred_fhe = engine.run(q_sample)\n",
" y_pred_fhe[i] = q_glm.dequantize_output(q_pred_fhe)\n",
"\n",
"dev_pca_quantized_fhe = score_estimator(y_pred_fhe, df_test[\"Frequency\"], df_test[\"Exposure\"])\n",
"\n",
"print(f\"PoissonRegressor evaluation: {score_sklearn_estimator(poisson_glm, df_test):.4f}\")\n",
"print(f\"PoissonRegressor+PCA evaluation: {score_sklearn_estimator(poisson_glm_pca, df_test):.4f}\")\n",
"print(f\"FHE Quantized deviance: {dev_pca_quantized_fhe:.4f}\")"
]
},
{
"cell_type": "markdown",
"id": "c18dbdd1",
"metadata": {},
"source": [
"### Conclusion\n",
"\n",
"In this tutorial, we have discussed how we can use Concrete Numpy to convert a scikit-learn based Poisson regression model to FHE. \n",
"\n",
"First of all, we have shown that with the proper choice of pipeline and parameters, we can do the conversion with little loss of precision. This decrease in the quality of prediction is due to quantization of model weights and input data, and some minor noise can appear due to FHE. This noise is visible on the single variable FHE trend line as minor deviations of the blue curve with respect to the red one. \n",
"\n",
"Finally, we have shown how conversion of a model to FHE can be done with a single line of code and how quantization is aided by the tools in Concrete Numpy. \n"
]
}
],
"metadata": {
"execution": {
"timeout": 10800
}
},
"nbformat": 4,
"nbformat_minor": 5
}