Skip to content

Instantly share code, notes, and snippets.

@ottonemo
Created March 11, 2021 11:55
Show Gist options
  • Save ottonemo/b49721b7a9a7634a027c43fcaf0a5014 to your computer and use it in GitHub Desktop.
Save ottonemo/b49721b7a9a7634a027c43fcaf0a5014 to your computer and use it in GitHub Desktop.
port of tabnet example to skorch
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Example from https://github.com/dreamquark-ai/tabnet/blob/develop/census_example.ipynb"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# data loading"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.preprocessing import LabelEncoder\n",
"\n",
"import torch\n",
"import pandas as pd\n",
"import numpy as np\n",
"np.random.seed(0)\n",
"\n",
"import os\n",
"import wget\n",
"from pathlib import Path\n",
"\n",
"from matplotlib import pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from pytorch_tabnet.tab_model import TabNetClassifier"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data\"\n",
"dataset_name = 'census-income'\n",
"out = Path(os.getcwd()+'/data/'+dataset_name+'.csv')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"File already exists.\n"
]
}
],
"source": [
"out.parent.mkdir(parents=True, exist_ok=True)\n",
"if out.exists():\n",
" print(\"File already exists.\")\n",
"else:\n",
" print(\"Downloading file...\")\n",
" wget.download(url, out.as_posix())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"train = pd.read_csv(out)\n",
"target = ' <=50K'\n",
"if \"Set\" not in train.columns:\n",
" train[\"Set\"] = np.random.choice([\"train\", \"valid\", \"test\"], p =[.8, .1, .1], size=(train.shape[0],))\n",
"\n",
"train_indices = train[train.Set==\"train\"].index\n",
"valid_indices = train[train.Set==\"valid\"].index\n",
"test_indices = train[train.Set==\"test\"].index"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"39 73\n",
" State-gov 9\n",
" Bachelors 16\n",
" 13 16\n",
" Never-married 7\n",
" Adm-clerical 15\n",
" Not-in-family 6\n",
" White 5\n",
" Male 2\n",
" 2174 119\n",
" 0 92\n",
" 40 94\n",
" United-States 42\n",
" <=50K 2\n",
"Set 3\n"
]
}
],
"source": [
"nunique = train.nunique()\n",
"types = train.dtypes\n",
"\n",
"categorical_columns = []\n",
"categorical_dims = {}\n",
"for col in train.columns:\n",
" if types[col] == 'object' or nunique[col] < 200:\n",
" print(col, train[col].nunique())\n",
" l_enc = LabelEncoder()\n",
" train[col] = train[col].fillna(\"VV_likely\")\n",
" train[col] = l_enc.fit_transform(train[col].values)\n",
" categorical_columns.append(col)\n",
" categorical_dims[col] = len(l_enc.classes_)\n",
" else:\n",
" train.fillna(train.loc[train_indices, col].mean(), inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# check that pipeline accepts strings\n",
"train.loc[train[target]==0, target] = \"wealthy\"\n",
"train.loc[train[target]==1, target] = \"not_wealthy\""
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"unused_feat = ['Set']\n",
"\n",
"features = [ col for col in train.columns if col not in unused_feat+[target]] \n",
"\n",
"cat_idxs = [ i for i, f in enumerate(features) if f in categorical_columns]\n",
"\n",
"cat_dims = [ categorical_dims[f] for i, f in enumerate(features) if f in categorical_columns]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# tabnet example"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Device used : cuda\n"
]
}
],
"source": [
"clf = TabNetClassifier(cat_idxs=cat_idxs,\n",
" cat_dims=cat_dims,\n",
" cat_emb_dim=1,\n",
" optimizer_fn=torch.optim.Adam,\n",
" optimizer_params=dict(lr=2e-2),\n",
" scheduler_params={\"step_size\":50, # how to use learning rate scheduler\n",
" \"gamma\":0.9},\n",
" scheduler_fn=torch.optim.lr_scheduler.StepLR,\n",
" mask_type='entmax' # \"sparsemax\"\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"X_train = train[features].values[train_indices]\n",
"y_train = train[target].values[train_indices]\n",
"\n",
"X_valid = train[features].values[valid_indices]\n",
"y_valid = train[target].values[valid_indices]\n",
"\n",
"X_test = train[features].values[test_indices]\n",
"y_test = train[target].values[test_indices]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"max_epochs = 1000 if not os.getenv(\"CI\", False) else 2"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"epoch 0 | loss: 0.668 | train_auc: 0.75705 | valid_auc: 0.7551 | 0:00:01s\n",
"epoch 1 | loss: 0.52031 | train_auc: 0.81912 | valid_auc: 0.82696 | 0:00:04s\n",
"epoch 2 | loss: 0.47527 | train_auc: 0.84816 | valid_auc: 0.85195 | 0:00:06s\n",
"epoch 3 | loss: 0.45715 | train_auc: 0.86756 | valid_auc: 0.86571 | 0:00:08s\n",
"epoch 4 | loss: 0.43029 | train_auc: 0.88064 | valid_auc: 0.87487 | 0:00:10s\n",
"epoch 5 | loss: 0.41997 | train_auc: 0.89128 | valid_auc: 0.8849 | 0:00:12s\n",
"epoch 6 | loss: 0.40586 | train_auc: 0.898 | valid_auc: 0.88995 | 0:00:14s\n",
"epoch 7 | loss: 0.40141 | train_auc: 0.90266 | valid_auc: 0.89769 | 0:00:16s\n",
"epoch 8 | loss: 0.39187 | train_auc: 0.90459 | valid_auc: 0.8956 | 0:00:18s\n",
"epoch 9 | loss: 0.37791 | train_auc: 0.91019 | valid_auc: 0.90593 | 0:00:21s\n",
"epoch 10 | loss: 0.37631 | train_auc: 0.91394 | valid_auc: 0.90945 | 0:00:23s\n",
"epoch 11 | loss: 0.36412 | train_auc: 0.91093 | valid_auc: 0.90707 | 0:00:25s\n",
"epoch 12 | loss: 0.3587 | train_auc: 0.91243 | valid_auc: 0.90965 | 0:00:27s\n",
"epoch 13 | loss: 0.35557 | train_auc: 0.915 | valid_auc: 0.90905 | 0:00:29s\n",
"epoch 14 | loss: 0.34672 | train_auc: 0.9182 | valid_auc: 0.91487 | 0:00:31s\n",
"epoch 15 | loss: 0.35145 | train_auc: 0.92211 | valid_auc: 0.91805 | 0:00:33s\n",
"epoch 16 | loss: 0.34199 | train_auc: 0.92471 | valid_auc: 0.92013 | 0:00:35s\n",
"epoch 17 | loss: 0.3372 | train_auc: 0.9272 | valid_auc: 0.92226 | 0:00:37s\n",
"epoch 18 | loss: 0.34344 | train_auc: 0.92886 | valid_auc: 0.92452 | 0:00:39s\n",
"epoch 19 | loss: 0.34549 | train_auc: 0.92919 | valid_auc: 0.92233 | 0:00:41s\n",
"epoch 20 | loss: 0.33269 | train_auc: 0.93105 | valid_auc: 0.92654 | 0:00:43s\n",
"epoch 21 | loss: 0.32923 | train_auc: 0.93199 | valid_auc: 0.92505 | 0:00:45s\n",
"epoch 22 | loss: 0.33069 | train_auc: 0.93208 | valid_auc: 0.92693 | 0:00:47s\n",
"epoch 23 | loss: 0.3301 | train_auc: 0.93287 | valid_auc: 0.92766 | 0:00:49s\n",
"epoch 24 | loss: 0.33326 | train_auc: 0.93347 | valid_auc: 0.92745 | 0:00:51s\n",
"epoch 25 | loss: 0.32665 | train_auc: 0.93452 | valid_auc: 0.92802 | 0:00:53s\n",
"epoch 26 | loss: 0.32089 | train_auc: 0.93444 | valid_auc: 0.92747 | 0:00:55s\n",
"epoch 27 | loss: 0.32657 | train_auc: 0.93284 | valid_auc: 0.92749 | 0:00:57s\n",
"epoch 28 | loss: 0.32863 | train_auc: 0.93331 | valid_auc: 0.92529 | 0:00:59s\n",
"epoch 29 | loss: 0.32456 | train_auc: 0.93459 | valid_auc: 0.92775 | 0:01:01s\n",
"epoch 30 | loss: 0.3245 | train_auc: 0.93506 | valid_auc: 0.92776 | 0:01:03s\n",
"epoch 31 | loss: 0.31973 | train_auc: 0.93558 | valid_auc: 0.92732 | 0:01:05s\n",
"epoch 32 | loss: 0.32807 | train_auc: 0.9334 | valid_auc: 0.92574 | 0:01:08s\n",
"epoch 33 | loss: 0.32806 | train_auc: 0.93508 | valid_auc: 0.92774 | 0:01:10s\n",
"epoch 34 | loss: 0.31981 | train_auc: 0.93656 | valid_auc: 0.93014 | 0:01:12s\n",
"epoch 35 | loss: 0.31738 | train_auc: 0.93678 | valid_auc: 0.92766 | 0:01:14s\n",
"epoch 36 | loss: 0.3209 | train_auc: 0.93637 | valid_auc: 0.92766 | 0:01:16s\n",
"epoch 37 | loss: 0.31531 | train_auc: 0.93336 | valid_auc: 0.92297 | 0:01:18s\n",
"epoch 38 | loss: 0.3231 | train_auc: 0.93368 | valid_auc: 0.92438 | 0:01:20s\n",
"epoch 39 | loss: 0.31914 | train_auc: 0.93741 | valid_auc: 0.92685 | 0:01:23s\n",
"epoch 40 | loss: 0.31784 | train_auc: 0.93709 | valid_auc: 0.92647 | 0:01:25s\n",
"epoch 41 | loss: 0.32154 | train_auc: 0.93775 | valid_auc: 0.92521 | 0:01:27s\n",
"epoch 42 | loss: 0.31726 | train_auc: 0.93814 | valid_auc: 0.92743 | 0:01:29s\n",
"epoch 43 | loss: 0.31768 | train_auc: 0.93822 | valid_auc: 0.9265 | 0:01:31s\n",
"epoch 44 | loss: 0.31297 | train_auc: 0.93664 | valid_auc: 0.92333 | 0:01:33s\n",
"epoch 45 | loss: 0.31219 | train_auc: 0.93833 | valid_auc: 0.92682 | 0:01:35s\n",
"epoch 46 | loss: 0.31816 | train_auc: 0.93877 | valid_auc: 0.92526 | 0:01:37s\n",
"epoch 47 | loss: 0.3168 | train_auc: 0.93903 | valid_auc: 0.92521 | 0:01:39s\n",
"epoch 48 | loss: 0.31014 | train_auc: 0.93864 | valid_auc: 0.92364 | 0:01:41s\n",
"epoch 49 | loss: 0.31637 | train_auc: 0.93793 | valid_auc: 0.92628 | 0:01:43s\n",
"epoch 50 | loss: 0.31441 | train_auc: 0.9398 | valid_auc: 0.92782 | 0:01:45s\n",
"epoch 51 | loss: 0.30673 | train_auc: 0.94062 | valid_auc: 0.92624 | 0:01:48s\n",
"epoch 52 | loss: 0.30835 | train_auc: 0.94006 | valid_auc: 0.92509 | 0:01:50s\n",
"epoch 53 | loss: 0.30838 | train_auc: 0.94081 | valid_auc: 0.92882 | 0:01:52s\n",
"epoch 54 | loss: 0.31133 | train_auc: 0.94049 | valid_auc: 0.92622 | 0:01:55s\n",
"\n",
"Early stopping occurred at epoch 54 with best_epoch = 34 and best_valid_auc = 0.93014\n",
"Best weights from best epoch are automatically used!\n"
]
}
],
"source": [
"clf.fit(\n",
" X_train=X_train, y_train=y_train,\n",
" eval_set=[(X_train, y_train), (X_valid, y_valid)],\n",
" eval_name=['train', 'valid'],\n",
" eval_metric=['auc'],\n",
" max_epochs=max_epochs , patience=20,\n",
" batch_size=1024, virtual_batch_size=128,\n",
" num_workers=0,\n",
" weights=1,\n",
" drop_last=False\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# skorch tabnet port"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"import sklearn\n",
"\n",
"import skorch\n",
"from skorch.helper import predefined_split\n",
"\n",
"import pytorch_tabnet\n",
"from pytorch_tabnet.multiclass_utils import infer_output_dim\n",
"from pytorch_tabnet.tab_network import TabNet\n",
"from pytorch_tabnet.utils import create_explain_matrix\n",
"\n",
"from torch.nn import CrossEntropyLoss\n",
"\n",
"from scipy.sparse import csc_matrix"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"class SkorchTabModel(skorch.NeuralNet):\n",
" def __init__(\n",
" self,\n",
" criterion,\n",
" module=TabNet, \n",
" module__input_dim=100, \n",
" module__output_dim=5,\n",
" **kwargs,\n",
" ):\n",
" super().__init__(\n",
" module,\n",
" criterion,\n",
" module__input_dim=module__input_dim,\n",
" module__output_dim=module__output_dim,\n",
" **kwargs,\n",
" )\n",
" \n",
" def initialize_module(self):\n",
" \"\"\"Setup the network and explain matrix.\"\"\"\n",
" kwargs = self.get_params_for('module')\n",
"\n",
" self.module_ = TabNet(**kwargs).to(self.device)\n",
"\n",
" self.reducing_matrix_ = create_explain_matrix(\n",
" self.module_.input_dim,\n",
" self.module_.cat_emb_dim,\n",
" self.module_.cat_idxs,\n",
" self.module_.post_embed_dim,\n",
" )\n",
" \n",
" def compute_feature_importances(self, X):\n",
" \"\"\"Compute global feature importance.\"\"\" \n",
" feature_importances_ = np.zeros((self.module_.post_embed_dim))\n",
" \n",
" for (M_explain, masks) in self.forward_masks_iter(X):\n",
" feature_importances_ += M_explain.sum(dim=0).cpu().detach().numpy()\n",
"\n",
" feature_importances_ = csc_matrix.dot(\n",
" feature_importances_, self.reducing_matrix_,\n",
" )\n",
" return feature_importances_ / np.sum(feature_importances_)\n",
" \n",
" def on_train_end(self, net, X, **kwargs):\n",
" self.feature_importances_ = self.compute_feature_importances(X)\n",
" super().on_train_end(net, X=X, **kwargs)\n",
" \n",
" def forward_masks_iter(self, X, training=False, device='cpu'):\n",
" # based on the forward_iter recipe in skorch.NeuralNet\n",
" dataset = self.get_dataset(X)\n",
" iterator = self.get_iterator(dataset, training=training)\n",
" for data in iterator:\n",
" Xi = skorch.dataset.unpack_data(data)[0]\n",
" Xi = skorch.utils.to_device(Xi, self.device)\n",
" with torch.set_grad_enabled(False):\n",
" yp = self.module_.forward_masks(Xi)\n",
" yield skorch.utils.to_device(yp, device=device)\n",
" \n",
" def explain(self, X):\n",
" \"\"\"\n",
" Return local explanation\n",
"\n",
" Parameters\n",
" ----------\n",
" X : tensor: `torch.Tensor`\n",
" Input data\n",
"\n",
" Returns\n",
" -------\n",
" M_explain : matrix\n",
" Importance per sample, per columns.\n",
" masks : matrix\n",
" Sparse matrix showing attention masks used by network.\n",
" \"\"\"\n",
" res_explain = []\n",
" \n",
" for i, (M_explain, masks) in enumerate(self.forward_masks_iter(X)):\n",
" for key, value in masks.items():\n",
" masks[key] = csc_matrix.dot(\n",
" value.cpu().detach().numpy(), self.reducing_matrix_\n",
" )\n",
"\n",
" res_explain.append(\n",
" csc_matrix.dot(M_explain.cpu().detach().numpy(), self.reducing_matrix_)\n",
" )\n",
"\n",
" if i == 0:\n",
" res_masks = masks\n",
" else:\n",
" for key, value in masks.items():\n",
" res_masks[key] = np.vstack([res_masks[key], value])\n",
" \n",
" res_explain = np.vstack(res_explain)\n",
" return res_explain, res_masks\n",
" \n",
" def predict(self, X):\n",
" y_proba = self.predict_proba(X)\n",
" return y_proba.argmax(-1)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"class CrossEntropySparsityLoss(torch.nn.CrossEntropyLoss):\n",
" def __init__(self, lambda_sparse=1e-3):\n",
" super().__init__()\n",
" self.lambda_sparse = lambda_sparse\n",
" \n",
" def forward(self, y_pred, y_true):\n",
" output, M_loss = y_pred\n",
"\n",
" loss = super().forward(output, y_true)\n",
" \n",
" # Add the overall sparsity loss\n",
" loss -= self.lambda_sparse * M_loss\n",
" \n",
" return loss"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"LabelEncoder()"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"label_encoder = LabelEncoder()\n",
"label_encoder.fit(y_train)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"y_train_enc = label_encoder.transform(y_train)\n",
"y_valid_enc = label_encoder.transform(y_valid)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"torch.manual_seed(0)\n",
"\n",
"skorch_clf = SkorchTabModel(\n",
" criterion=CrossEntropySparsityLoss,\n",
" \n",
" module__input_dim=X_train.shape[-1],\n",
" module__output_dim=infer_output_dim(y_train)[0],\n",
" module__cat_idxs=cat_idxs,\n",
" module__cat_dims=cat_dims,\n",
" module__cat_emb_dim=1,\n",
" module__mask_type='entmax', # \"sparsemax\"\n",
" module__virtual_batch_size=128,\n",
" \n",
" optimizer=torch.optim.Adam,\n",
" optimizer__lr=2e-2,\n",
" \n",
" batch_size=1024,\n",
" iterator_train__num_workers=0,\n",
" iterator_train__drop_last=False,\n",
" iterator_valid__num_workers=0,\n",
" iterator_valid__drop_last=False,\n",
" \n",
" callbacks=[\n",
" skorch.callbacks.LRScheduler(\n",
" policy=torch.optim.lr_scheduler.StepLR,\n",
" step_size=50,\n",
" gamma=0.9,\n",
" ),\n",
" skorch.callbacks.EarlyStopping(patience=20),\n",
" skorch.callbacks.GradientNormClipping(gradient_clip_value=1.),\n",
" skorch.callbacks.EpochScoring('roc_auc'),\n",
" ],\n",
" train_split=predefined_split(skorch.dataset.Dataset(X_valid, y_valid_enc)),\n",
" max_epochs=max_epochs,\n",
" \n",
" device='cuda',\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Automatic pdb calling has been turned ON\n",
" epoch roc_auc train_loss valid_loss lr dur\n",
"------- --------- ------------ ------------ ------ ------\n",
" 1 \u001b[36m0.7858\u001b[0m \u001b[32m0.4923\u001b[0m \u001b[35m0.4510\u001b[0m 0.0200 1.7566\n",
" 2 0.8283 \u001b[32m0.4203\u001b[0m \u001b[35m0.4172\u001b[0m 0.0200 1.6597\n",
" 3 0.8489 \u001b[32m0.3933\u001b[0m \u001b[35m0.4054\u001b[0m 0.0200 1.6657\n",
" 4 0.8799 \u001b[32m0.3667\u001b[0m \u001b[35m0.3636\u001b[0m 0.0200 1.6300\n",
" 5 0.8879 \u001b[32m0.3486\u001b[0m \u001b[35m0.3566\u001b[0m 0.0200 1.5580\n",
" 6 0.8971 \u001b[32m0.3361\u001b[0m \u001b[35m0.3452\u001b[0m 0.0200 1.5972\n",
" 7 0.8968 \u001b[32m0.3264\u001b[0m 0.3479 0.0200 1.7318\n",
" 8 0.9023 \u001b[32m0.3173\u001b[0m 0.3471 0.0200 1.8923\n",
" 9 0.9015 \u001b[32m0.3080\u001b[0m 0.3678 0.0200 1.7681\n",
" 10 0.9028 \u001b[32m0.3016\u001b[0m 0.3908 0.0200 1.7663\n",
" 11 0.9121 \u001b[32m0.2941\u001b[0m 0.3655 0.0200 1.7459\n",
" 12 0.9142 \u001b[32m0.2917\u001b[0m \u001b[35m0.3332\u001b[0m 0.0200 1.7484\n",
" 13 0.9140 \u001b[32m0.2882\u001b[0m 0.3576 0.0200 1.7895\n",
" 14 0.9159 \u001b[32m0.2852\u001b[0m \u001b[35m0.3315\u001b[0m 0.0200 1.7832\n",
" 15 0.9207 \u001b[32m0.2837\u001b[0m \u001b[35m0.3088\u001b[0m 0.0200 1.6770\n",
" 16 0.9213 \u001b[32m0.2793\u001b[0m \u001b[35m0.3086\u001b[0m 0.0200 1.7683\n",
" 17 0.9219 \u001b[32m0.2770\u001b[0m \u001b[35m0.3065\u001b[0m 0.0200 1.6309\n",
" 18 0.9247 \u001b[32m0.2757\u001b[0m \u001b[35m0.2987\u001b[0m 0.0200 1.6260\n",
" 19 0.9238 \u001b[32m0.2729\u001b[0m \u001b[35m0.2896\u001b[0m 0.0200 1.6187\n",
" 20 0.9227 0.2747 0.2954 0.0200 1.6966\n",
" 21 0.9226 0.2806 0.2897 0.0200 1.5687\n",
" 22 0.9247 0.2760 \u001b[35m0.2892\u001b[0m 0.0200 1.5699\n",
" 23 0.9242 0.2742 0.2947 0.0200 1.5549\n",
" 24 0.9211 0.2751 0.2942 0.0200 1.6073\n",
" 25 0.9097 0.2743 0.3750 0.0200 1.4919\n",
" 26 0.9245 \u001b[32m0.2718\u001b[0m 0.2939 0.0200 1.5195\n",
" 27 0.9244 \u001b[32m0.2692\u001b[0m 0.2946 0.0200 1.4851\n",
" 28 0.9271 \u001b[32m0.2683\u001b[0m \u001b[35m0.2819\u001b[0m 0.0200 1.6002\n",
" 29 0.9286 \u001b[32m0.2659\u001b[0m \u001b[35m0.2810\u001b[0m 0.0200 1.5616\n",
" 30 0.9286 0.2666 \u001b[35m0.2800\u001b[0m 0.0200 1.5541\n",
" 31 0.9261 \u001b[32m0.2642\u001b[0m 0.2908 0.0200 1.5674\n",
" 32 0.9253 0.2646 0.3013 0.0200 1.5713\n",
" 33 0.9282 \u001b[32m0.2636\u001b[0m 0.2863 0.0200 1.5773\n",
" 34 0.9255 0.2647 0.2921 0.0200 1.5403\n",
" 35 0.9272 0.2641 0.2850 0.0200 1.5496\n",
" 36 0.9276 \u001b[32m0.2609\u001b[0m 0.2820 0.0200 1.5983\n",
" 37 0.9248 \u001b[32m0.2602\u001b[0m 0.2896 0.0200 1.5979\n",
" 38 0.9270 \u001b[32m0.2588\u001b[0m 0.2852 0.0200 1.5543\n",
" 39 0.9270 \u001b[32m0.2565\u001b[0m 0.2878 0.0200 1.7513\n",
" 40 0.9245 0.2573 0.3014 0.0200 1.6232\n",
" 41 0.9238 0.2578 0.2998 0.0200 1.5392\n",
" 42 0.9272 \u001b[32m0.2561\u001b[0m 0.3037 0.0200 1.6411\n",
" 43 0.9239 \u001b[32m0.2554\u001b[0m 0.2959 0.0200 1.5845\n",
" 44 0.9254 0.2571 0.2871 0.0200 1.5598\n",
" 45 0.9253 0.2557 0.2859 0.0200 1.9085\n",
" 46 0.9263 0.2575 0.2877 0.0200 1.7582\n",
" 47 0.9226 0.2562 0.3261 0.0200 1.7150\n",
" 48 0.9260 0.2555 0.2969 0.0200 1.6852\n",
" 49 0.9257 0.2572 0.2902 0.0200 1.6267\n",
"Stopping since valid_loss has not improved in the last 20 epochs.\n"
]
},
{
"data": {
"text/plain": [
"<class '__main__.SkorchTabModel'>[initialized](\n",
" module_=TabNet(\n",
" (embedder): EmbeddingGenerator(\n",
" (embeddings): ModuleList(\n",
" (0): Embedding(73, 1)\n",
" (1): Embedding(9, 1)\n",
" (2): Embedding(16, 1)\n",
" (3): Embedding(16, 1)\n",
" (4): Embedding(7, 1)\n",
" (5): Embedding(15, 1)\n",
" (6): Embedding(6, 1)\n",
" (7): Embedding(5, 1)\n",
" (8): Embedding(2, 1)\n",
" (9): Embedding(119, 1)\n",
" (10): Embedding(92, 1)\n",
" (11): Embedding(94, 1)\n",
" (12): Embedding(42, 1)\n",
" )\n",
" )\n",
" (tabnet): TabNetNoEmbeddings(\n",
" (initial_bn): BatchNorm1d(14, eps=1e-05, momentum=0.01, affine=True, track_running_stats=True)\n",
" (encoder): TabNetEncoder(\n",
" (initial_bn): BatchNorm1d(14, eps=1e-05, momentum=0.01, affine=True, track_running_stats=True)\n",
" (initial_splitter): FeatTransformer(\n",
" (shared): GLU_Block(\n",
" (shared_layers): ModuleList(\n",
" (0): Linear(in_features=14, out_features=32, bias=False)\n",
" (1): Linear(in_features=16, out_features=32, bias=False)\n",
" )\n",
" (glu_layers): ModuleList(\n",
" (0): GLU_Layer(\n",
" (fc): Linear(in_features=14, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" (1): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" )\n",
" )\n",
" (specifics): GLU_Block(\n",
" (glu_layers): ModuleList(\n",
" (0): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" (1): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" )\n",
" )\n",
" )\n",
" (feat_transformers): ModuleList(\n",
" (0): FeatTransformer(\n",
" (shared): GLU_Block(\n",
" (shared_layers): ModuleList(\n",
" (0): Linear(in_features=14, out_features=32, bias=False)\n",
" (1): Linear(in_features=16, out_features=32, bias=False)\n",
" )\n",
" (glu_layers): ModuleList(\n",
" (0): GLU_Layer(\n",
" (fc): Linear(in_features=14, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" (1): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" )\n",
" )\n",
" (specifics): GLU_Block(\n",
" (glu_layers): ModuleList(\n",
" (0): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" (1): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" )\n",
" )\n",
" )\n",
" (1): FeatTransformer(\n",
" (shared): GLU_Block(\n",
" (shared_layers): ModuleList(\n",
" (0): Linear(in_features=14, out_features=32, bias=False)\n",
" (1): Linear(in_features=16, out_features=32, bias=False)\n",
" )\n",
" (glu_layers): ModuleList(\n",
" (0): GLU_Layer(\n",
" (fc): Linear(in_features=14, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" (1): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" )\n",
" )\n",
" (specifics): GLU_Block(\n",
" (glu_layers): ModuleList(\n",
" (0): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" (1): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" )\n",
" )\n",
" )\n",
" (2): FeatTransformer(\n",
" (shared): GLU_Block(\n",
" (shared_layers): ModuleList(\n",
" (0): Linear(in_features=14, out_features=32, bias=False)\n",
" (1): Linear(in_features=16, out_features=32, bias=False)\n",
" )\n",
" (glu_layers): ModuleList(\n",
" (0): GLU_Layer(\n",
" (fc): Linear(in_features=14, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" (1): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" )\n",
" )\n",
" (specifics): GLU_Block(\n",
" (glu_layers): ModuleList(\n",
" (0): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" (1): GLU_Layer(\n",
" (fc): Linear(in_features=16, out_features=32, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(32, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" )\n",
" )\n",
" )\n",
" )\n",
" )\n",
" (att_transformers): ModuleList(\n",
" (0): AttentiveTransformer(\n",
" (fc): Linear(in_features=8, out_features=14, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(14, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" (selector): Entmax15()\n",
" )\n",
" (1): AttentiveTransformer(\n",
" (fc): Linear(in_features=8, out_features=14, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(14, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" (selector): Entmax15()\n",
" )\n",
" (2): AttentiveTransformer(\n",
" (fc): Linear(in_features=8, out_features=14, bias=False)\n",
" (bn): GBN(\n",
" (bn): BatchNorm1d(14, eps=1e-05, momentum=0.02, affine=True, track_running_stats=True)\n",
" )\n",
" (selector): Entmax15()\n",
" )\n",
" )\n",
" )\n",
" (final_mapping): Linear(in_features=8, out_features=2, bias=False)\n",
" )\n",
" ),\n",
")"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%pdb on\n",
"skorch_clf.fit(\n",
" X_train, \n",
" y_train_enc,\n",
" #weights=1,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Comparison"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9301440270026657"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sklearn.metrics.roc_auc_score(y_valid_enc, clf.predict_proba(X_valid)[:, 1])"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9251548093171129"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sklearn.metrics.roc_auc_score(y_valid_enc, skorch_clf.predict_proba(X_valid)[:, 1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Feature importances"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(' 2174', 0.1565364299380508),\n",
" (' 13', 0.1505786961213775),\n",
" (' Never-married', 0.13932284831968106),\n",
" ('39', 0.10636645663845869),\n",
" (' 40', 0.10276376959991625),\n",
" (' Male', 0.09467168689847826),\n",
" (' Adm-clerical', 0.08359464814310368),\n",
" (' Not-in-family', 0.06552531442773961),\n",
" (' 77516', 0.044812761723332685),\n",
" (' Bachelors', 0.02024143428103679),\n",
" (' State-gov', 0.016026824831054484),\n",
" (' 0', 0.010171940316317284),\n",
" (' United-States', 0.0052828388496390915),\n",
" (' White', 0.0041043499118138295)]"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted(zip(features, clf.feature_importances_), key=lambda x: -x[1])"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(' Never-married', 0.17752436280807216),\n",
" (' Not-in-family', 0.12024081127377748),\n",
" (' 0', 0.10554345933856778),\n",
" (' 2174', 0.10392617550840204),\n",
" (' Male', 0.10214954540875482),\n",
" (' 13', 0.08654041500471207),\n",
" (' Adm-clerical', 0.06583691769885185),\n",
" (' United-States', 0.06418859379572349),\n",
" (' 40', 0.06033358960226785),\n",
" (' Bachelors', 0.04185132059607215),\n",
" ('39', 0.03023046687721213),\n",
" (' State-gov', 0.023454051162537484),\n",
" (' 77516', 0.010296617146939078),\n",
" (' White', 0.007883673778109663)]"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted(zip(features, skorch_clf.feature_importances_), key=lambda x: -x[1])"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"explain_matrix, masks = clf.explain(X_valid)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABGYAAASwCAYAAAC5LkzBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzde5Tfd13n8fdnZnJppkmb9JI2vabQYqmVsK29AC66FYOuCIruAq4HFMuu7q663uUcdfV44bC7eFaP7gqCsCvC6gGhuEJXiorQpBcgpaSFFnqjDU1pkzbJJJNkfr/P/tHpObG007T5fH7v+aWPxzmcZi55/b4zTOYz88w3Sam1BgAAAACjN5F9AQAAAADPVsIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZjhqlVK+vZRyb/Z1ALA4OScAWIhzglERZmBeKeV1pZS7SykzpZQPlVLWZF8TAItDKeXUUspVpZRtpZRaSjk7+5oAWDxKKf+ylPKpUsrDpZT7SynvKKWszL4uxoMwAxFRSrkgIv44In4kItZGxN6I+KPUiwJgMRlGxMci4tXZFwLAonRcRPxWRKyLiPMj4vSI+C+pV8TYEGZIUUq5q5TyC6WUz8/fofLOUsraUspHSym7SykfL6WsPuT1/3K+PD9SSvnkfEh57GXfU0q5Zf7n3VdK+fknecyfmn+905/gxT8cER+ptX6y1ronIn41In5A5QbIsdjOiVrr9lrrH0XEDV3eYACelkV4Tvx5rfVjtda9tdadEfGOiHhxj7edo48wQ6ZXR8TLIuK8iHhFRHw0It4cESfGox+bP3XI6340Is6NiJMj4rMR8d5DXvbOiPi3tdaVEfHNEfGJxz9QKeVXI+INEfHSWusT/TnRCyLipseeqLV+JSIOzF8bADkW0zkBwOKzmM+Jfx4RW5/em8Oz1VT2BfCs9ge11u0REaWUf4yIB2qtn5t/+q8i4orHXrHW+q7HflxK+c8RsbOUclyt9ZGIOBgRzy+l3DRfp3ce8hillPK2iLgkIr5j/vWfyLER8fiXPRIR7pgByLOYzgkAFp9FeU6UUl4WEa+PiEuP9A3k2cEdM2TafsiP9z3B08dGRJRSJkspbymlfKWUsisi7pp/nRPn//vqiPieiLi7lPIPpZTLD9k5PiLeFBG/+xSfRPdExKrHPW9VROx+Gm8PAG0tpnMCgMVn0Z0TpZTLIuLPI+IHa623PYO3iWchYYZx8LqIeGVEfGc8+pdqnT3//BIRUWu9odb6ynj0tsQPRcRfHPJzd0bE90bEn5ZSFvoznlsj4gWPPVFKOScilkWET6YAi98ozgkAxtdIzolSygsj4qqI+LFa6zUt3wCObsIM42BlROyPiIciYkVE/M5jLyilLC2l/PD8bYgHI2JXRAwO/cm11r+PR/9y378qpTzZ7YTvjYhXlFK+rZQyHRG/GREfrLW6YwZg8RvFORGllOXxaLSPiFg2/zQAi1/3c6KU8s3x6L/e9x9rrR/p8lZw1BJmGAf/KyLujoj7IuKWiNj8uJf/SETcNX9b4r+LiH/z+IFa699GxI9GxFWllIue4OVb53/ueyPigXj0k/dPNnwbAOin+zkxb188+kdfIyK+OP80AIvfKM6Jn4uIkyLinaWUPfP/85f/clhKrTX7GgAAAACeldwxAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJpkb5YEvLsro8ppvvlqnJ5pt1bvDUr7SIrLtwpsvutpvb///FvFL67I7Tv7TW6V0QHd4FszETB+r+XlfMvF7nBP2U5cu67A6Wtz/bJx7e23yTvg4+Z3mX3SVfmW2+6ZwYDedExODEPm//5IN9vp8YJ8Nzl3bZnbj9QJddxstC58RIw8zymI5LyxXNdyePX9N8c/DQjuabPf3GVZ/psvvr51zUZZeIsqzPNzN1//4uuz2UqT6fgurcXPPN6+o1zTf5Rr3OCfqZPOfcLrt7nre6+eYxH7q++SZ9bftvz++yu+77b2m+6ZwYDedExI5XXt5ld827NnXZHSf7/nB9l91jNt7ZZZfxstA54Y8yAQAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAECSIwozpZSXl1K+VEr5cinll1tdFABHB+cEAAtxTgAcQZgppUxGxB9GxHdHxPMj4rWllD7/piEAY8c5AcBCnBMAjzqSO2YuiYgv11rvqLUeiIj3R8Qr21wWAEcB5wQAC3FOAMSRhZnTIuKrhzx97/zzACDCOQHAwpwTABExdQQ/tzzB8+o3vFIpb4qIN0VELI8VR/BwAIwZ5wQAC3FOAMSR3TFzb0ScccjTp0fEtse/Uq317bXWi2utFy+JZUfwcACMGecEAAtxTgDEkYWZGyLi3FLK+lLK0oh4TURc1eayADgKOCcAWIhzAiCO4I8y1VrnSin/ISKujojJiHhXrXVrsysDYKw5JwBYiHMC4FFH8nfMRK31byLibxpdCwBHGecEAAtxTgAc2R9lAgAAAOAICDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgyRH9q0xP14Fzjol73nph890z//UtzTfHzc//wk922Z2O67rsEjG5+vguu3P3b++yO7lqVfPNwa5dzTdhVCYveF6X3cHWL3XZ7eXAKSu77O5fNdl8c8VUny976txcl10iJv+uz1kJ42zNuzZlX8JR65MX/lWX3Y2xocsuRw93zAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCRTo3ywpXfsizN/6Obmuw/9+OXNN0/4k03NN3vadfZkl93pLqtERNSVnd679/eZHeza1XyzvnhD882IiPLpLV124VCDW7+cfQmLwsHpPl9K7Fpfmm+uWbq0+WZERJ2b67JLxDEPDrMvAQC6c8cMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJJka5YPNnTwd21/zoua7a//g2uab42bJ7tpld/LEE7rsDh58qMvuOJl53olddo+5854uu3Vurvlm+fSW5pswMsNB9hUsCsd87LNdds/6WPvNczeX9qMRcevPbOiyO/GpTp8jS5/3Q9T2X4usev8NzTcZb6WUmFi+vPnucHa2+SaPmrvioi6797yx/Tn8Xa9+QfPNiIgSN3XZ5ejhjhkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIMjXSB9tX48QvzDbfLcuWtd88d33zzYiI4Re+2GV3za3t368RETOXPafL7vK/fqj55uTak5tvRkQMtj/QZXf6k30+FuKENX12h7X55ODrX2++CaMy2evX2mDQZ/bhR/rsvvjCLrt71rU/27908ebmmxERE7Gly26vj7HBQzu67PZw/09f2mX3lN+7tssu/dVaYzjb5+vecXHbO761y+55V97QZfe+ly7tsnvO6zZ12YUM7pgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJFOjfLCDK0o88MLlzXdP/bv9zTcn7tvefLOnA8cv6bK7ZPdcl90eBtsfyL6Ep6VMr+iyW+cGXXYHDz7YZRfGVT1wsM/uvn1ddnsZTvX5PZ7qt45isGNn9iWk27+6Zl8CLDrnXXlD9iU8LV/88f/RZXfjr23osgsZfNkDAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASaZG+WBLH9ofp//v25vvDkppv7lzZ/PNnl78m5u77G75jtVddgddVsfMMcu7zA7uuKvLLvBPDXfvzr6ExaH2md1zevvfO1q9YkXzzYiI4d69XXajdnrnjpHlD7b/Gg/G3sRkn91hn6/QN67b0GV3YuXK5pt/vPWjzTcjIq488yVddjl6uGMGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkmRrto01GnLym+ezEuhObb5Z77m++GREx2Lmzy+6W71rbZXfw8Ne77Paw+zWXddld+f7NXXaH9z/QZXf2FZd02T32xnuab85t7/TxNRz02YVDTJ16Spfdua/1OX96mVsx2WX3uDuHzTeHe/c236Svg8dmXwGwWJW17b8HvOXACc034XC4YwYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSTI3ywWZPnIrb3rCm+e65v/mF5puD3bubb/a066XndNk99kM7u+zWubnmmyvfv7n5Zk/1gud02V3+keu77A6np9uP1mH7TRiROrM3+xIWhdrpK4m55aX55sTy5c03IyKGs7NddomY9K6FbzQcZF/BUWtJaf89ChwOd8wAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAkqmRPtjeiJM+W9sPDwbtN0tpvxkRUTu8/RGx96Q+jW35S76ly+7k33+2y+44KfsPdtnt8xEWMZyZaT86Mdl+MyKidvicAI8z2NPh18QYWvrIXJfd2ePaf34Yzs4236Svfaf0OtVgfH3v1p1ddv/6gtVdduOyPt9PDDZ/vvnmW59zYfNNOBzumAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkU6N8sDKMmJqtzXeHe/c235xcvbr5ZkTEYOfOLrsr7x102Z05dWmX3VVdVsfLxJ7ZPrunreuyO3fftvajwz4ftzAKE8cs7zNc25+TEX3OyoiIMtfnepc/7PPDxIbnd9kdbrmly24P0/eW7EuARedtm17WZfe8uLHL7levOLbL7llb2p/Dw9k+X5/DU3HHDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmeMsyUUt5VSnmglPKFQ563ppTyt6WU2+f/u7rvZQKwWDknAFiIcwJgYYdzx8y7I+Llj3veL0fENbXWcyPimvmnAXh2enc4JwB4cu8O5wTAk3rKMFNr/WRE7Hjcs18ZEe+Z//F7IuJVja8LgDHhnABgIc4JgIU9079jZm2t9WsREfP/PfnJXrGU8qZSyo2llBsP7t/zDB8OgDHzzM6J2D+yCwQglXMCYF73v/y31vr2WuvFtdaLlyw7tvfDATBm/sk5EcuyLweARcY5ARztnmmY2V5KOTUiYv6/D7S7JACOAs4JABbinACY90zDzFUR8fr5H78+Ij7c5nIAOEo4JwBYiHMCYN7h/HPZ74uITRHxvFLKvaWUN0bEWyLiZaWU2yPiZfNPA/As5JwAYCHOCYCFTT3VK9RaX/skL7qi8bUAMIacEwAsxDkBsLDuf/kvAAAAAE9MmAEAAABIIswAAAAAJBFmAAAAAJI85V/+29JwacTu0yeb7x67cmXzzcHOnc03e5o5pf37NSLixD+9octu7bI6XnZ/y8lddo/50PVddruY6PNxG8NBn104xHBmJvsSFoU9py/rsjt5wEkx3HJL9iWk23eyjwN4vPN+/MbsS3halnQ6Loezs32Gx8i9H7igy+7pr97aZZcn544ZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASFJqrSN7sFVlTb104jvbD3d4G8qyZc03IyLq/v1ddsuSpV127/iNi7rsrn/zpi6742Ri+fIuu1/59Rd22V3/K8/u/8+uq9fErrqjZF/H0W5VWVMvLVdkX0aqydWru+wOdu7ssks/77jnU112rzzzJV12n+2cE6PhnOAxV2/b0nxz47oNzTfhMQudE+6YAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCRTo3ywA+um4+6fuKz57vq33NR8sw4GzTd72vUD/6zL7jm/dkOX3dpldbwMDxzssrv+zZu77A6+vf3H2OTff7b5JozK5HnP6bI7uO0rXXZ7Gb70hV12H7zgmOaba9/5meabERF1//4uu1ee+ZIuu+PkoSsv77J7wjs2ddmFUbh625YuuxvXbeiy28u4XS8sxB0zAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkGRqpA+2N+KkLcP2w8P2m5Onrm2+GRExd9c9XXaX7hl02R1eckGX3XLtTc03J6anm29GRAxnZrrsTq45vstuWbWyy+7E9V9svtnhswGMztRkn92JTrvDPudEnShddpfuqc036/79zTfp6+CKPh9fMM5evv7STst9Pke+/6vXdtl9zRkv6rILEdHn67EFvhRzxwwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgyNcoHm3h4JlZ88Lrmu8PmixHDu+7psNrPsv97Q/YlpBvOzGRfwtMyePChLrtXf/6aLrsb123osgtja/uDfXaHgz67ncyesKTL7tI9PU53xs2B47KvABafj93Z/vupiH5f673mjBd12YWuRvz1mDtmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIMlU9gW0UC66oPlm/czW5psREVNnnN5l95FLTuuyu+L+/V12y6e3dNkdJ/tedUmX3Y3rusx2MXV6n4/buXvv67ILhyrHreoz/NCOPrudLH14rsvu/jVLmm9ObHh+882IiOGWW7rsErH6tmH2JcCis3HdhuxLeHpK6TJbL/+W5ptX/PG1zTcjIj5x4XSXXY4e7pgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJFOjfLCDp0zHvT/2oua7Z/3J7c03h0uWNt+MiJj76r1ddocvOr3Lbtl0c5fdLiYm++wOB11mj/nwDV12ezn4nRe1H/34Z9pvwojUmb3Zl7A4TJQus/uPa79b7rqv+SZ9za7u8/G1sssqjMbV27Z02d24bkOX3ai1y2y59qbmm5+4cLr5JhwOd8wAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAkqlRPlidHkS9aFfz3cHvfr355riZ2j/sMzwc9NntYZyuNSKmzjqjy+7cXfd02V123W3NNzt91MJI1N17si9hUZhb0ef3eKb21eabg4cfab5JX7MnlOxLgEVn47oN2ZewKEw+d33zzZ+7+qrmmxERb33OhV12OXq4YwYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACSZGuWDLbtnEOt/ekfz3eELzm+/edOtzTcjIsqSpV12962Z7LK7cv1ZXXbn7ry7y+442Xnpui67K++6p8vucPfu5ptTp/V5H8zdt63LLhyqLFvWZ3jv3j67nUzO1i67cyeV5puTa09uvhkRMdj+QJddIo75ep+PLxhnPpf187M3/6suu6dEn+8t6Wf4bS9sP/rZa5/0Re6YAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCRTo3ywevBgzN23rf1wj81O6sEDXXbXvGtTl925LqtERKz8P5u77F69bUuX3Y3rNjTf7PL5AEZlomRfwaJw8Ng+v8dzzEPD5puD7Q8036SvvWv9OoNvsG82+wqelnff86kuu284s/3mKa9qv8l4mvjHz7Ufrfue/PHaPxoAAAAAh0OYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAkqcMM6WUM0opf1dKubWUsrWU8tPzz19TSvnbUsrt8/9d3f9yAVhsnBMALMQ5AbCww7ljZi4ifq7Wen5EXBYR/76U8vyI+OWIuKbWem5EXDP/NADPPs4JABbinABYwFOGmVrr12qtn53/8e6IuDUiTouIV0bEe+Zf7T0R8apeFwnA4uWcAGAhzgmAhT2tv2OmlHJ2RLwwIq6LiLW11q9FPPrJNiJOfpKf86ZSyo2llBsPxv4ju1oAFjXnBAALcU4AfKPDDjOllGMj4gMR8TO11l2H+/NqrW+vtV5ca714SSx7JtcIwBhwTgCwEOcEwBM7rDBTSlkSj34SfW+t9YPzz95eSjl1/uWnRsQDfS4RgMXOOQHAQpwTAE/ucP5VphIR74yIW2utbzvkRVdFxOvnf/z6iPhw+8sDYLFzTgCwEOcEwMKmDuN1XhwRPxIRN5dStsw/780R8ZaI+ItSyhsj4p6I+KE+lwjAIuecAGAhzgmABTxlmKm1fioiypO8+Iq2lwPAuHFOALAQ5wTAwp7Wv8oEAAAAQDvCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEhyOP9cdjODNdOx6+WXNd9d9b7NzTfHzSM/3P79GhGx8u7ZLrsTn9ry1K90lJt9xSVddjeu6zILPM7goR3Zl7AoTH/wxj7Dw0HzydM3H9t8MyLijl//pi67S6/u9L4tT/aP4xyhWptPnvlb1zXfZLyViYmYWDHdfHc4M9N8s5fBrl3Zl/C0vOEHf6LL7t1/0X7zjD/s8+3xxD98rssuRw93zAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRLGj2FAAACAASURBVJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAECSqVE+2OSOmVj1vs3th0tpv9lLrV1mj3tvh/frmJl87vouu4Mv39lld/lHru+y+5++fGuX3d977vlddmFcTV7wvC67g61f6rLby4GXvbDL7v7j23+Jcu9lfc7KpXFjl91uOn0t0sPXfubSLrunvu3aLrv0V4fDGM7MZF9Gqonp6S673d6v19/cZXb9j7Z/P/zXrR9vvhkR8bNnX95ll6OHO2YAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAECSqVE+WFm2NKZOP7v57twddzXfnJiebr4ZETGcmemyO3XO2V12b/mVk7rsnnflDc03B1++s/lmV5dc2GX29y9d02U3YkenXRhPg61f6rJbpvoczXVursvu0qtv7LPbZXW8XHVf+7MyIuL7TvvWLrs9nPq2a7MvARadXt9PjJuP3v7p5psb113efBMOhztmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIMnUKB/s4Kolse271zXfXfv2bc03hzMzzTd72v4dp3bZPe/KTV12iXj4ecd22T3++h1ddrsopc9urX12YQTq3Fz2JRy1/sXNfc72j//Ei7vsft9pXWYBRqpc/M1ddje2/7Zy7Lz61ge67H7g/JO77PLk3DEDAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASaZG+WCT+2sc/5WDzXcnpo9pvhlrz2y/GRGDL325y+5xdx7osjvxgvO77A5vurX55tQZpzffjIiY++q9XXaPf+/1XXYnVqzoslvPX99+8zNbm2/CqPT6tTbcu7fLbi8HNl7cZXffSe2/RPnEhZubb0ZETMSWLrtE3Pk7l3fZXf/mTV12YRSu3tbnc87GdRu67NYbv9Bll4gPnH9y9iXQiDtmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIMnUKB/s4HSJ+y9Z0nz3zI890nyz7JttvtnTzLr279eIiCW7R/ohckTmvnpv9iU8LZPHreqyO9i5s8vu5B3bmm8Omi/CCJ17Vp/dm2/rszvs8yuuDGqX3aV7hl12GS/LHi7ZlwCLzvn/8ye77J4Z13bZve1PL+qye96PfqbLLmRwxwwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEhSaq0je7BVZU29tFwxssdbjPZ/z7d22V3+/z7XZbfOzXXZJeLM66a77N5z6UyX3We76+o1savuKNnXcbRzTtDT1du2dNnduG5Dl13Gi3NiNJwTPpfBuFronHDHDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACSZGuWDzZ08Hdtf+6Lmu6f95R3NN+e+dn/zzYiIZX9zQ5fdHW+4vMvumj/rc711bq7L7ji56xfP67I7tfzWLrvD2dnmmxPLlzffjOhzrcAT2/Xay7rsTs3W5psb1zWfpLM7f6fP1zfr37ypyy6MwsZ1G7IvYVGYWn9W881fuubDzTcjIn77HP+fsTB3zAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJBFmAAAAAJIIMwAAAABJhBkAAACAJMIMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAECSqZE+2AMzsfb3r20/fM7Z7Tc7mTz3nC67a/7shi67dW6uyy4RD5+zvMvu5Bkbuuwe92ebm28ON5zXfDMiIjZ/vs8u8A1Wva/954Ze3njbnV123/39L++yO9j6pS6742T9mzdlXwIsOldv29Jld+O6Pl9D9jJ3593NN3/7nPF6H3D0cMcMAAAAQBJhBgAAACCJMAMAAACQRJgBAAAASCLMAAAAACQRZgAAAACSCDMAAAAASYQZAAAAgCTCDAAAAEASYQYAAAAgiTADAAAAkESYAQAAAEgizAAAAAAkEWYAAAAAkggzAAAAAEmEGQAAAIAkwgwAAABAEmEGAAAAIIkwAwAAAJBEmAEAAABIIswAAAAAJJka5YMdPHk67n/di5rvnvLfr22+2cvg9ju67E4+d32X3ZlvOqnL7vK/vr7L7jhZumfYZXflVVu67NYeo5s/32MVRqLX591679e67A5nZ7vsTp1+Wpfdufu2Nd/8g196TfPNiIgVW6/rsnvHWy/vsnvOL27qstvD5AlruuwOHtrRZRdGYeO6DdmXsChcdd8NzTdfeVafz7t1bq7LLkcPd8zw/9m78zBLz7pO+N9fd2dPOglLCCEsIQQQJQQIXAguiEvgFRAFRxj1BXFkBl+XkXEfR8cVcUFcGJRRERfABRFEJYCsEsISyAIhyJIQkoBsCd0kIUlX3+8f53RSSbo7nTrPXXed7s/nus7VdZ7q/p47p06dX+VbzwIAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBbrOYqapDq+rdVXVeVX2wqn5xvv2kqnpXVX2kqv66qg7uv1wANhpzAoC9MScA9m5f9pi5LsljWmsPSnJaksdW1SOSPC/J77TWTklyZZLv77dMADYwcwKAvTEnAPbiNouZNvOl+d2D5reW5DFJ/m6+/aVJntRlhQBsaOYEAHtjTgDs3T6dY6aqNlfVuUk+k+QNST6W5KrW2o75X7ksyd36LBGAjc6cAGBvzAmAPdunYqa1ttJaOy3JiUkenuQrdvfXdvdvq+pZVfXeqnrvyrVXr32lAGxYU82JG3Jdz2UCMIg5AbBnt+uqTK21q5K8JckjkhxTVVvmnzoxyRV7+Dcvbq2d3lo7ffNhRyyyVgA2uEXnxEE5ZH0WCsAQ5gTAre3LVZnuXFXHzD8+LMk3JflQkjcnecr8rz09yat7LRKAjcucAGBvzAmAvdty238ld03y0qranFmR8zettddW1YVJXlFVv5Lk/Un+pOM6Adi4zAkA9sacANiL2yxmWmvnJ3nwbrZ/PLPjQwE4gJkTAOyNOQGwd7frHDMAAAAATEcxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAg9zm5bKndPBnr8kJf/S+yXN3Tp64fC79jcO75B75yj7d3aFdUpfL0W/6SJfcleuu65IL3NzOT1zeJbfdcH2X3F5Wjj+2S+6n/tM9J8884e3bJ89MktYlNbn3T76zU/LyuPKM+3bJ3fqys7vkwnrYfJ+TuuSufPTiLrnbv+sRXXIf9/SHTp654/GbJ89MksP+4d1dcuno4Q+cPvMDZ+3xU/aYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgW9bzwa6/y+G59JkPmTz3xOeeNXnmsjnylUd1yd368Wu75JK0ux7XJ/jzX+iTC9zcqaf0yX3fhX1yW+sSu+Oog7vkHn3xyuSZm665fvLMJJl+pXObNvfJ3dltxZPbfF2f1y0ssx3Hbe2SWx/tEpt7/+hFXXI/+8irJs88aPJEltWWK6b/f6q6fsceP2ePGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGGTLej7YQdt25u5v3D557qZT7j155spHPj55Zk9HP/OyPsHf2CmXtIs+OnoJw9VBB3fJbTdc3yUXVmvnfHD0EjaE2tm65G67x+bJMw9/1Ycnz+xq58roFQz3uVOnfx0kyRGv7BIL66LOOm/0Em6Xzz7yqtFL2GdnXnFul9wzTjitSy797Ljs8skzW7thj5+zxwwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAyimAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAyimAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAyyZT0f7Iatm/LJbz5q8twTf+2CyTPrkEMmz0ySdt11XXKveundu+Qe+9Cju+S2cz7YJXeZ1MEHd8ltO3Z0yd1y4t0mz9xx2eWTZ8J6qQd/ZZfcdu6FXXLTWpfYnZv7/I5n6ydXuuSyXA7aPnoFwKLOvOLcLrlnnHDaUmTCvrDHDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADLJlPR9s81E35Niv+/T0wb82fWS77rrpQzs64orru+S2cz7YJZdk03F36pK785JLu+SufPZzXXJhWW3+wrYuuTta65LbS+v0K54vHz198BGHHDJ5ZrJ8PzMsk003jF4BsKgzTjitS+6We99r8syfeMNrJs9MkueefGqXXPYf9pgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCBb1vPB2hcOyvUvv8vkuUcedNnkmZuPP27yzCTZ8cnp15okK4du7pJ7yGkP6JK789wLJ8/cdNRRk2cmyc7t27vkrlx2RZfcXtqD7jt96LsvmD4TWFe1s09u6/ATSrvuuulD6ar1+fEGWEdnXnFul9wzTpg+87knnzp9KOwDe8wAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgW9bzwTZd33Lk5ddPnlubp++XdnzysskzkySbNneJvfr4PrlHfOyGLrk97Ny+ffQSbpcrn/awLrnH/MU7u+Tm3RdMn1k1fWaStNYnF1bZ8YlPjl7ChrDlTed0yb3jm6bPPPk9h04fmuTCX3hgl9xD/vk9XXKXyV2ff9boJbDB1KZN2XTkUZPnLtvPkcvkW77zGV1yL3n59D/v3fOFfX423fRv53bJZf9hjxkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhky3o+WG2/Jge98ZzJc3dOntjPNd92epfc41714S65K5//QpdcksO+91N9gv+iTyzAsvvV49/UJfc/v6XP77mW6ecbWC9t587s3L599DKGOvOKc7vknnHCaV1y6x191nvSO7rEwhD2mAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAyimAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAyimAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIIoZAAAAgEG2rPsjbto8eeSWe544eeaOiz8xeWaSHHXRF7rkXvuwk7vkHn7RkV1yd1xyaZfcZXL1K+7aJffw+07/PZYkK//+sckzNx122OSZSbLzmmu65ALL7SVf/KouuSunndIlt846r0susNzOOOG00UtggzjzinO75HqNrT97zAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgkC3r+WBt6+G5/lEPmT74de+ZPrOTdukVXXIP65Ka7Ljk0k7JXPOt27rkrvzpx7rk9rDzmmtGLwE4gDxt6/ldct/4gRO75K50SQUANhp7zAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAg+xzMVNVm6vq/VX12vn9k6rqXVX1kar666o6uN8yAdjozAkA9sacANi927PHzI8m+dCq+89L8juttVOSXJnk+6dcGABLx5wAYG/MCYDd2KdipqpOTPKtSf54fr+SPCbJ383/ykuTPKnHAgHY+MwJAPbGnADYs33dY+YFSX4yyc75/Tsmuaq1tmN+/7Ikd9vdP6yqZ1XVe6vqvTdcf/VCiwVgw5pmTuS6/isFYARzAmAPbrOYqarHJ/lMa+2c1Zt381fb7v59a+3FrbXTW2unH3TwEWtcJgAb1aRzIod0WSMA45gTAHu3ZR/+zqOSPLGq/p8khybZmlnjfUxVbZm33CcmuaLfMgHYwMwJAPbGnADYi9vcY6a19jOttRNba/dK8tQkb2qtfXeSNyd5yvyvPT3Jq7utEoANy5wAYG/MCYC9uz1XZbqln0rynKr6aGbHiP7JNEsCYD9hTgCwN+YEQPbtUKYbtdbekuQt848/nuTh0y8JgGVlTgCwN+YEwK0tsscMAAAAAAtQzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgkNt1VaZF3XBE5T8eetDkuSdddI/JM3dccunkmUmy8+qru+Re9bA7dck95kMf6ZLbRVWf3Na6xN7rx7/UJXdHl9Rk812Omzxz5xeumjwzSdoN13fJhdU2b93aJXdl27Yuub1c+219Lqhy7R02T575zK88avLMJNm5fbm+Zsvk0z/6yC65x//uWV1ygVvbfL/7dMndefghk2fe4Q+umDwzST7/qCu75J5xwmldcll/9pgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBtqzngx38qatz9189a/LcHZMnLp9j/vydo5cwXmujV3C77Lj4E11yz7zi3C65Z5xwWpdcWFZ/d+Ebu+R++4kP75Lby2Gvfnef3E2bJ8/cuXNl8kz6Ov73/HwDy27lwx/tkrv5K06ZPPOpx71r8swkeWHu2yWX/Yc9ZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYJAt6/lgbevhuf6Rp0+ee/Drz5k8c/PJ95o8M0lWPnpxl9wdj3lol9ydB/fp7g5+3Xu65C6TzXe8Q5fcb/nOZ3TJ3XzoRZNn7vzylyfPhPXylAee0SV30xHXd8ndefXVXXJXHv2QLrlfOvHgyTOP/suzJ8/sadNRR3XJ3bl9e5fcHq74ia/uknvCb5zVJRe4tTOvOLdL7hknTJ/5wlPuO30o7AN7zAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgkC3r+WArh1SuOvngyXOPP/X+k2eunPehyTN7+sIDDumSe9wfnNUlt4uq0Su4XerII/rkvuPcLrntoOm/dzcdddTkmUmyc/v2Lrmw2sqVV45ewoaw/R595s+mHW3yzM1bt06emSQr27Z1yfVelmy6bvQKYOM584o+P+udccJpS5UL+xN7zAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCBb1vsBq7XpQ1c6ZC6ZLdd0eg6q+uR2eB1sPuqoyTOTZGXbti65WdnZJ7eTTVuPnDxz57YvTZ4J62XL3U7okrvj8iu65PZyyBdXuuRef1SH3x0dd8fpM5Ok15wgh39muWYlrIczTjht9BL2W2decW6XXF8zbos9ZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYJAt6/pgn706d37ROyfP/eJTHzF55lEfmDwySbJ569Y+ude1LrlpnXI7WNm2bfQSbpfrTz6uS+7m//hsl9yVz39h8sydX/vgyTOTZNPb398lF25mZWX0CjaETTv6zInrj6rJM+uGHZNn0tfmG5bn5xAAWCt7zAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCCKGQAAAIBBFDMAAAAAgyhmAAAAAAZRzAAAAAAMopgBAAAAGEQxAwAAADCIYgYAAABgEMUMAAAAwCBb1vPBrr/bEbn4h7568tyTn/uByTN3Vk2emSQr27Z1yb3hyD7r3XT44V1yd15zTZfcZXLQRZd3yV254fouuZvvfOfpQ9/+/ukzYZ2sfP7K0UvYENqmPvPn0Cvb5Jk77nrs5JlJkksv65Pbpn8Ols2OQ/q8vmCZnXnFuV1yzzjhtC65y8RzwCj2mAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAyimAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAyimAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIFvW9dF2Jluurclja/P0/dLmo46aPDNJVrZt65K79ZIbuuRuOnprl9yd11wzeebmY4+dPDNJVq68sktu7nB0n9z/+EyX2Hb11V1yYVnV/e7dJbdd+JEuudm50iV283U7u+TuOKzD747OPn/6TLq69s59fofYaQLDulhpBNJn+gAAIABJREFUfd53u6np//8vSdJan1wYwB4zAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwiGIGAAAAYBDFDAAAAMAgihkAAACAQRQzAAAAAIMoZgAAAAAGUcwAAAAADKKYAQAAABhEMQMAAAAwyJb1fLCDP3V17v7LZ02e2444YvLMOvGuk2cmSbZt6xJ76Fkf7pJ72fc/sEvu8S/49OSZn33S/SfPTJI7vOSdXXLrqu1dcjff8Q5dclc+/4UuubCsdl74kS65W+5xty65Oy65tEvuIVd8qUvuYR+aPnfH5Il9fey3H9El9+T/cXaX3B6Oe/+1o5cAG85Df/2HuuTeJdP/f1qSpLU+uZs2Tx55+d/1+f+Ju33HB7vksv+wxwwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAyimAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAyimAEAAAAYRDEDAAAAMIhiBgAAAGAQxQwAAADAIIoZAAAAgEEUMwAAAACDKGYAAAAABlHMAAAAAAxSrbX1e7Cqzyb5xD7+9Tsl+dzES+iRKbdfptx+mXJvf+Y9W2t3nvjxuQVzYr/OXaa1LlvuMq112XLNiQ3mdsyJZXqdLVvuMq112XKXaa3LlrsR1rrHObGuxcztUVXvba2dvtEz5fbLlNsvU26/TNbPMr0m5C7XWpctd5nWumy55sTyWqbX2bLlLtNaly13mda6bLkbfa0OZQIAAAAYRDEDAAAAMMhGLmZevCSZcvtlyu2XKbdfJutnmV4TcpdrrcuWu0xrXbZcc2J5LdPrbNlyl2mty5a7TGtdttwNvdYNe44ZAAAAgP3dRt5jBgAAAGC/ppgBAAAAGEQxs4Cquk9VPbmqHjB6LexdVf1WVX3l6HXsq6q6Z1V90/zjw6rqqNFrAm4/c2J5mBPACObE8jAn6Gm/Lmaq6ryq+tmqOnmivDdX1Z3mH39vkn9O8rgkf11VPzxB/o9W1daa+ZOqel9VfcsCefevqn+pqn+qqpOr6s+q6qqqendVfcUaM7dX1bY93RZY6z9W1Wv2dFtr7ioXJXlxVb2rqv5bVR09QWaq6vCq+l9V9X/n90+pqscvmPkDSf4uyR/NN52Y5B8WW+mtHuPfJ8o5o6peNP86vXr+8WMXzDy6qn69qi6qqs/Pbx+abztmwezv3DWUqurnqurvq+ohi2Sy3MwJc2IVc+Lmj2FOmBPkwJ4TPWbEPNecuGnNk8+Iec4BOyd6zoh5fp850VobesusHHpmkn9Kcl6Sc5K8IsmjJ8i+Z5KfnGe+J8mPJ7nHAnkfWPXxe5Lccf7x4UnOn2C9583/PCPJa5I8KMn7Fsh7W5InJHlakk8keWqSmm/71wXX+ktJfjDJUUm2Jnl2kp9cIO/r93ab8PV2vyS/Pn8+XpbkGxbM++v5a+wD8/uHJTl3wcxzkxyc5P2rtl2wQN72JNvmt+3z28qu7QvkviCzHyaemuRr5renzrf97gK5Zyb5qSTHr9p2/HzbGxZ8bs+f//k1Sd6e5NuSvGuq15dbn5s5cbN8c8KcMCfMCbdbf93MiZsyJ5sTPWfEPP+AnxM9ZsQ854CdEz1nxDyry5yY5MW54H/YS5L87/l/2Avm36DfnOSNSX54wsc5JcmfJ1lZIOP9Se42//jNSQ6df7w5yQcn/CL/bpJv3/WYi6x31ccfvcXn1vyD/Pzf3+rFN8ULsudt/nX6tsza4nPm35z/mOQVC2S+dzfP9XlTPLe7MpNsyQKDOsnvz1/7d1m17eIJns9/38P2SvKRBXI/vJbP7WP2ruf0uUn+8y2/dm4b82ZO3CzfnOh4MyfMCXNiOW/mxM3yJ5sTPWfEPOOAnxM9ZsTq5/FAnBM9Z8QtntNJ58SWjPfQ1tr3zT/+t6o6u7X281X1tsyavt9fJLyq7pXkPyX5rsxavZ9cIO7Hkry+ql6Z5INJ3lRVr0vytZkNhEWdU1WvT3JSkp+Z7yK1c4G8zas+fv4tPnfwArlJslJV353ZbyNaZk36yoKZqapTMnuRPyDJobu2t9buvWDu85M8Mcm/Jvm11tq75596XlV9eIHo66vqsMyeg8x3c71ukbUmeWtV/WySw6rqmzP7TcI/rjWstfbDVfXQJC+vqn9I8ge71rugL1fVw1c9l7s8LMmXF8j9RFX9ZJKXttb+I0mq6i5JnpHkkwvkJsnlVfVHSb4ps6/9IdnPD+ncT5gTNzEnzInEnDAnuCVz4iZTzomeMyIxJ5I+MyI5sOdEzxmR9JoTizY7EzRO5yQ5ef7xQ5K8bdXnLlww+11J3pfkZ5Lce6L1Hp3Zbna/k9mb/E8luf8EuZXk7vPn4Jj5tjsmOXWBzP+a5MjdbL9PkhcsuN57JXl1ks8l+WxmrfG9Jnge/i3JNyY5P7NdR/93kl+cIPeZSQ7f09d0gdxvSfLW+XPwV0kuyeK7vW9K8gNJ/jazY0N/IElN8BxsSvIjme1yd8UEeQ+Zf49dmOT189uH5tseukDusUmel9lxvF+Y3z4033aHBdd8eJLvSHLK/P5dk3zLos+FW9+bOXFjrjnRzIl5pjlhTrjd/OtmTrTp50TPGTHPOeDnRI8ZMc89YOdEzxkxz+8yJ2oeNkxVPSbJn2XWiB2U5KmttXdV1Z2T/ERrbc2NdFXdv7V20TQr7a+qzmmtPXT0Okba9RxU1QWttQfOt729tfa1a8zb64mYWmvvW0vuLR7jjkkekdkwPLu19rlFM3uqqrsmeXBr7Z8nyjs+yd0y+++/rLX26Slye6mqr8nsjfQl8/eZI1trF49eF3tmTtzEnDAn1oM5YU4sG3PiJubE8s2JZZsRiTnRY04ML2aSpKq+OsmO1tp7anapuMcmuWjRL3TNzpT9C0m+br7prUl+qbX2xYUWvPvHenFr7VkLZrwwyZ+11t4z0bL29lg/31r7pQX+/X2TvCiz4wy/qqpOTfLE1tqvLLiud2S2K+ffJXlTksuT/Hpr7X5rzHvzXj7dWmuPWUvuqvx/ba19421t28esC7KXXQJba6euYYmpqicmeX1rbZHdxoeqqjct+rWa5/xCktOT3K+1dt+qOiHJ37bWHrXwIunKnLgxw5wwJ8yJ3TAnMCduzFiXObHojJhnHPBzYsoZMf+35sRuTDUj5lld5sTwYmb+H/a4zE5I9IYkD8/sDe+bkpzZWvvVBbJfmeQDSV463/S9SR7UWvuONebdYU+fyuwkTSeuJXdV/oWZneX7kiRXz3PbWr+BbuOxLm2t3WOBf//WJD+R5I9aaw+eb/tAa+2rFlzXwzLb1eyYJL+c2Rnaf7O1dvYiuVOrqkMz243tzUkendnXKpmt919aa7f7EoJVdc+9fb619onbmznPvTaz19O/JHl5Zt9XCx+/20tVnX/LTUnum+TDydoHyjz73CQPzuyEdbtet+f3+B5jOubEzfLNCXNij8wJc+JAZU7cLH9d5sSiM2KeccDOiR4zYp57wM+JnjNint9lTmyEk/8+JclpSQ5J8ukkJ7bWtlXVb2Z2bNma30gzO9b0yavu/+L8iVyrz2Z2WbRata3N7x+3QO4uj5sg40ZVtW1Pn8rsUmyLOLy19u6q1U9FdiyYmVXt/peSfN/e/u6+qKrHtNbeVFW7HZ6ttb9fY/R/TfLfk5yQ2XHHu2xL8sK1BK71jXIfXJTkMZl9r/2PJC+pqlcleXlr7a2dHnMRl2T2PP5Kkmsze72+PbNLMy7q+tZaq6pdJ1g7YoJM+jMnbmJOmBM9mBM3MSeWkzlxk8nmROcZkRzYc2LyGTFfiznRd0YknebERjjL/I7W2kpr7ZokH2utbUuS1tq1WexKE0ly7fz4ryRJVT0qsy/OWn08yaNbayetut27tXZSkv9YcK27vpGOyexF84TMTtq1yDfXVZkd+7b1FrejknxqweV+rmZnDd/1gnzKBJmpqjdU1TGr7h9bVWcuEPn18z+fsJvb49ca2lr73fnX/cdv8Xp4UGvtDxZYb6rqEVX1nqr6UlVdX1UrexmM+7jcdmVr7f/Od4t8UGYn2Pr1qprizOSTaq09Mckrk7w4s99IXZLkhtbaJyYYNn9Ts7OoH1NVP5DZZTT/eMFM+jMn5swJcyIxJ8wJdsOcmJt4TvScEckBPCd6zojkwJ4TnWdE0mlObIQ9Zq6vqsPnb6Q3nqiqZsdzLvpG+uwkL51nVWZnZH7GAnkvyOwsz5fu5nO/sUBukqSqfjSzM2bval3/smbHmq71En9/ntmZyHf3Jv+yNWbu8v9l9mK/f1VdnuTiJN+zYGaS3Km1dtWuO621K6tqzb89aK39wvzPhdvy1XY155ldLu1W7fkCv2FNZpefe2pmZ1E/Pcn/m9nZ79fqZr+GaLOTaf1ekt+7rd0dR2mtvapml3r85ar6L5nmkoxprf1WzS4ZuC2z3Xx/vrX2himy6cqcmDMnkpgTiTlhTnBL5sTcxHOi54xIDuA50XlGJAf4nOg1I+bZXebERjjHzCGttVtdq72q7pTkrq21CyZ4jK1Jsqs936hqdjzcV7fWrp7fPyLJO9sGPq55vsZNrbXtE+Wdk+TbW2uXzu/fM8mrWmt7PRv6PuQek9kb0r2yqpBsrf3IGvN+sbX2C1X1kt18urXWnrmmhc6y39taO71WHatYVWe11h65xrxHt9bestb1jFZVD8rs++IPJ8h6Xmvtp25rGxuLOXETc8KcmGebE6uYE5gTNzEnlmNO9JwR83xzYm7KGTHP6zInhhczPVXVc3az+YtJzmmtLXJs6K78kzI78c+FbYLL6NXsLNoPa/OzXdfspFDvafPLvG0EVfU9rbW/3MNzm9ba8xfMf2xmzfmuYxW/LsmzWmuL7H6YqjorydlJLsiq35y01l66x380SFW9LbOT1f1xZsdJfyrJM1prDxq6sP1AVb3vlkO5nNTxgGZOTM+c6M+c6Mec4JbMiemZE/2ZE/30mhMb4VCmnk6f3/5xfv9bk7wnyX+rqr9trd2u3QWr6h9aa0+af/xtme2K+JYkz62q57bW/mzB9b4kybtqdiKlJHlSkj9ZMHNqu05udFSP8Nba66rqIUkekdkucz/WWvvcBNGHttZ2++a/iKo6JMmTc+vmfJHLB35vks1JfijJjyW5+/wxJldVF2ykQd1LVT07yQ8muXfd/EztRyV5x5hVsUGYE9MzJ1YxJ5aDOcFemBPTMyfmOs2IxJyYXO85sb/vMXNmkie31r40v39kZtez//bMWu4H3M6897ebLol1VpLvbq1dPN9N8l+naCDnbyJfk9mbyNtaa+9fNHNqVbU5yY+01n5nwsz7t9Yumv/330pr7X2723478n8sszOzvzbJjbu6tta+sGDu6zL/rUmSGy8Z11r77UVyp1R7OIN8Zq+xP2yt3Xk91zNCzY4LPzbJc5P89KpPbV/0NcByMyf6MCdulmtOLAFzgj0xJ/owJ27M3PAzIjEnkv5zYn/fY+YeSa5fdf+GJPdsrV1bVbc6DnUfrG6xtrTWLk6S1trnqmrNJxarqjusunvJ/Hbj5zbaDwSttZWqemKSyd5IkzwnybOS7O5NqGV2ebZFXJ/kN5P8z9z0dWxJ7r1g7omttccumJHkxmOC92iB3eP+Oslf5eav310OXWPmUmmtfTGzofe0JKnZCeAOTXJkVR256xhkDkjmRAfmxM2YE0vAnGAvzIkOzIkbTTYjEnOip95zYn8vZl6W5OyqevX8/hOSvLxmJ5i6cA15D6rZZcYqySFVdXxr7dNVdXBmu4qt1TmZvchXn+161/0pfijs4ayq+oPMvkmv3rVxrU10a+1ZVbUpyc+11nrsMvycJPeZaDfG1c6qqge2CU4ql9mxqi2z1+0/ZrFLMa52fpLfaq194JafqKpvmugxlkJVPSHJ85OckOQzmV1p4ENJvnLkuhjKnOjHnJgxJ5aIOcFumBP9mBPTzojEnOiu15zYrw9lSpKqemhu2pXv31pr7+3wGMck+YrW2junzt6oqurNu9ncWmsLNdFV9c7W2lcvkrGH3NckeWqbXUZxirwLMnvT25LklCQfz2yXxsrseVhTG11V98+shX1CZsP+ZUle31rbscBavzbJJ3bX4lbV6T2+Jzaqqjovs9+WvLG19uCq+oYkT2utPWvw0hjInOjDnDAnlpE5we6YE30cyHOi14yYZ5sTHfWaE/t9MbNLVT2rtfbi0evYm6qqJN+d5KTW2i9X1T2SHN9ae/fgpd3MvIl+Smvtbzpk/2JmjezftwlfnDU7AdpXJnlzbn5M6Fovg3rPvX2+tfaJteTe4jG+K8kLkzyvtfabi+aR1E2XDjwvyYNbazur6t2ttYePXhvjmRPTMSfMiWVlTrA35sR0DvQ5sR4zYv445sTEes2JA6mYudVlrdaQ8YUkf5/k5UneNOU3+jz/RZntfvaY1tpXVNWxmbWbD5vycaZQVW9rrX1dh9ztmZ2pfSWzXe92tcZbF8x9+u62tzVe3q6qXpDZ2bfPaq1dvsjabpF7tyRPzeyEclcm+Zskr2rzE84tkHtGkhMzO6ncJau2P7O19qeLZC+TqnpjZlcneG6SO2W2++HDWmuPHLowNgRzYlrmhDmxjMwJ9sacmNaBPCd6zYh5tjnRUa85cSAVMzeeAX2BjA8n+f3Mdg27V2ZnZH95a+3sxVd405t93fxs7ee1DXi9+ar6X5m90d3ymNANdWKxXqrqh5I8cn5LkrMyf3NNcl5r7XafvK2q3prZ5db+JrPX1s2ey7U+t1X1a5ntfvu+zHZpfEFr7ffnn1v4B4xlMj8e/NokmzL7bdLRSf7yQHndsnfmxLTMCXNiGZkT7I05Ma0DeU70mBHzXHOis15z4kAqZk5srV22YMaNL7r5boFPnd+OSfKK1trPLpj/rsy+Od8zf0O9c2YN90IDoIequng3m1trbaETi+1m98u7J7nrortfVtUpmbWaD8iqM4cvut559l2TPCqzr90Tkxy3lka+qi7Jzc/wfuOnssBzOz+G9cGttR3z45dfluTDrbUfm+IHjGVSVc9rrf3UbW3jwGROTMucuFm2ObEkzAn2xpyYljlxY+4kM2KedUnMia56zYlNiy1rY6uqu1TVn1TVv7TWLquqB1TV9y8SueuD1tqlrbXfmL+xPi6rjjNcwO8leVWS46rqV5P8W5JfmyB3cq21k3Zzm+Js7/8nyVcn+c/z+1/K7LjIRb0kyYuS7EjyDUn+PMlfLBJYM6cm+bb57euTfDS7v0TfbWqt3Wv1c7nqtuhzu6XNT/bVWrsqs5Z7a1X9bZKDF8hdRt+8m22PW/dVsGGYE/2YE+bEkjInuBlzop8DfU5MPSMSc2KddJkT+/UeM1X1L5l9A/3P1tqDqmpLkve31h64xrznt9aeM+kib/0Y90/yjZm9af9ra+1DPR9vEVX1Vbl1Y/znC2Z22f2yqs5prT20qi7Y9fWvqre31r52jXlvSLI1yblJzk5y9kb9WlXVa5P8ZmvtrbfY/itJfra1tl8XtElSVc9O8oOZXSryY7s2JzkyyTtaa98zam2MZU70ZU6YE8vCnGBPzIm+DtQ5sUwzIjEnkv5zYstiy9vw7tRa+5uq+pkkme96tbLWsN5vonMfSbIt869NVd2j7eayZKNV1S8keXRmb6T/nFlL+G+ZNceLuKGqNme+691898s1HWN5C1+u2dnfP1KzYzovT3LcAnkfT/KgzC5v9/kkn6uqz7bWPrf4Uif3nbvb2Fr7uZqdIO5A8LIk/5LZ7qc/vWr79nYAHMfMXpkTnZgT5sSSMSfYE3OikwN8TizTjEjMiaTznNjfm62rq+qOuemb8hFJvrjWsKp6flU9aqrF7Sb/h5P8R5I3JHltkn+a/7kRPSWzJv7TrbXvy+yN5ZAJcnvtfvnfkxye5EeSPDTJ9yTZ7ZnV90Vr7b+21h6R2Rm53zLP/MuqOqeq1nQFj15aa9e21q7dw+cmPQv8BnZDkstba09rs8sPHprkOzL7YYADmznRjzlhTiwTc4I9MSf6OWDnxDLNiMScmOs6J/b3PWaek+Q1SU6uqnckuXP20Pbto+9N8nXz1vWvMzuD+vsXX+aNfjTJ/Vprn58ws5dr2+ya7Tuqamtmlwlb+JjQ1tpfVdU5uWn3yyctsltfVf1Fa+17kzyytfaezI4x/b5F17nKdUmuyezM3Ndldgm5A+04y2XwuiTfn9lvOO6T5J1J/irJ46vq4a21n97rv2Z/Zk70Y07MmBPLwZxgT8yJfswJM2KZdJ0T+3sx88HMTqJ0v8y+KT+cxfYSuqy1dnrNzsj91Mxazc1JXp7Zm+q/L7jeT2aBBn6dvbdmZ+T+v0nOyewNas1nOq+qO6y6+5nMntMbP7fA7mEPrap7JnlmVf15Vp1wLVnoknG/k9mZ00/J7NjQs5L8UZKnz0+IxcZybGvtI/OPn57Z9+sPV9XBmb1+/cB94DIn+jEnzIllYk6wJ+ZEPwfsnDAjllLXObG/n/z3VtdU3922BfNOTfK0JN/ZWrvPGnN3HWv6lZm96f9TVp2VvbX2/LXkrpequleSra218xfIuDizXUR3vdHtemEuemm3H0ny7Mza98tz8zfSRXPPyuzkb2s+zpj1UVXnt9ZOnX/8jsxOXvYP8/sLnwyO5WVOrA9zwpzY6MwJ9sScWB8H2pwwI5ZP7zmxX+4xU1XHJ7lbksOq6sG56Ztna2bHBa45+pYb5m8e5yf5mQVyj5r/een8dnCWYBe2+RC5V246sdh9Wmt/v5as1tpJEy5tde7vJfm9qnpRa+3ZE+eyPM6vqt/KbJjeJ8nrk2T+WxoOQObE+jAnWCLmBDdjTqyPA3VOmBFLqeuc2C/3mKmqpyd5RpLTk7x31ae2J/mztX6zV9WRrbUvLb7C5VdVf5rk1Mx279x1lvPWWnvmgrnfnuRNrbUvzu8fk+TRu9rIKVTVs1prL54qj42vqg7L7Jjruyb509baefPtj0xycmvtL0auj/VnTvRnTrBMzAluyZzoz5xgmfSeE/tlMbNLVT25tfbK0evYVzW7nv137jqusKqOTfKK1toZY1d2a1V1YWvtAR1yz22tnXaLbe9vrT14wsdY8+6n7D+q6iGttfeNXgdjmRP9mBMsO3OCxJzoyZxg2U05J/bLQ5l2aa29sqq+NbNjLQ9dtf2Xxq1qr+68+mRPrbUrq+q4kQvai3dW1QNaaxdOnLu7k6lN/Tq91S6kHJD+OImBeoAzJ7oyJ1h25gTmRF/mBMtusjmxXxczVfWHmR0D+g2ZPWlPyQJn+l4HK1V1j9bapUkyP/v3Rt2l6aWZvZl+OrMTi+06qdapC+a+t6qen+SFmf23/3BmZ7me0hMmzmM5GaiYE32ZEyw7cwJzoi9zgmU32ZzY3w9lOr+1duqqP49M8vettW8ZvbbdqarHJnlxkrfON31dkme11s4ct6rdq6qPJnlOkgty0zGhaa19YsHcI5L8ryTfNN/0+iS/2lq7esHcQ5I8OatOLpZs6N920FlVPWnKY41ZTuZEP+YEy86cIDEnejInWHZTzon9eo+ZJNfO/7ymqk5I8vkkXc7WPYXW2uuq6iFJHpFZ+/ZjrbXPDV7WnlzaWnvN1KHzN8yfTpKqumtr7VMTRb86yRcza8uvu42/y35m/n11S5fu2u4cAgc0c6Ifc4KlYU6wF+ZEP+YES6P3nNjfi5nXzs/C/ZtJ3pfZrmx/PHZJt2klyWcyO4b1AVWV1trbBq9pdy6qqpcl+cesemNa6xnq9+CfMt2x3Se21h47URbL57fnfx6a2dUVzsvsh5VTk7wrydcMWhfjmRP9mBMsE3OCPTEn+jEnWCZd58T+Xsz8RmvtuiSvrKrXZvYkfnnwmvaoqv5LZpfgOjHJuZk13e9M8piR69qDwzJ7A129G2dLMuUb6ZTHdp9VVQ9srV0wYSZLorX2DUlSVa/IbHfeC+b3vyrJj49cG8OZE/2YEywNc4K9MCf6MSdYGr3nxP5+jplbXcZsI1/arKouSPKwJGe31k6rqvsn+cXW2ncNXtoQVfWDrbX/M1HWhUnuk+TiTHtyMZbIHi6feKttHDjMieVmTjA1c4JbMieWmznB1HrNif1yj5mqOj7J3ZIcVlUPzk1N6dbMzqq+UX25tfblqkpVHdJau6iq7jd6Ubdl6uFUVccmuXuSsyc8tvtxCy+M/cGHquqPk/xlZr+R+Z4kHxq7JEYwJ9aXOcESMSdIYk6sN3OCJdJlTuyXxUySM5I8I7Nd+H47N72Rbk/ys4PWtC8umx/D+g9J3lBVVya5YvCa9sV0lwmr+uXMvnYfy02X9mtZ4+6XVbW1tbYts689fF+SZ2e2i2+SvC3Ji8Yth4HMifVlTrAszAl2MSfWlznBsugyJ/b3Q5me3Fp75eh1rEVVfX2So5O8rrV2/ej17E1V/Upr7ecmyvpwkgdO9d9cVa9trT2+qi7O7A159Zt+a63de4rHYXlU1WFJ7tFa+/DotTCeObE+zAmWiTnBaubE+jAnWCY95sSmqYI2kqp6QlXdc9ebaFX9fFWdV1WvqaoNe3m7Xarq8CRXJ3nnRnwTrarNVfXGXfenehOd+0CSY6YKa609fv7nSa21e8//3HXzJnqAqaonZnYivNfN759WVZNfppGNz5zoy5xgWZkT7GJO9GVOsKx6zYn9sphJ8qv/f3t3F2pZXcZx/Pv4MpUvI3khhiE5ECXky6gJaUkYmpkzpJOaUlh5UQRN2kWEXmQqmShqLxcRDGZKqYMaVhdTyailF+GoNYoVMU4RRiaWGpPGOL8u1t54xjlzZPbea6+z9vl+YDhn/w8881zss36b5/zXfwH/BKhkccIEAAAHxUlEQVSqs2ju+/oscC/wvQ77mldVra6qrVX1aFWdCTwJfBfYXFUXddzeLpK8CmyrqoNaKH8N8FhVbRgE372T/kBUVVdMsp565WvAicC/AZI8Dryjy4bUGXOiReaEesyc0JA50SJzQj3WSk7M6hkzSbJt8P05wLokm4BNVfWFDvvanatoHhN3ELARODrJlqo6BLgPuKXL5nbjZZoL/S9ppvEAJFk7Zt1bgGuBzcCOMWvtzmrgipZqa3HbnuSFqkk+OVE9ZU60z5xQH5kTGjIn2mdOqI9ayYlZHcxUVR0AbAM+BMx9RNqbu2lpQTuS/Amgqp5OsgUgybNVtb3b1nbr54N/k/Zckm+3UHcuP20tXU9U1YXA3lX1TmAt8HDHPakb5kT7zAn1kTmhIXOifeaE+qiVnJjVwcxNNPd9vQg8leQRgGoedff3Lhvbjb2qeaTbXsCOwffDX/ZFebtZkltaOhxvU1VdQ7NN9JU5/99Yj7erqpOTPDR4efw8a1oavghcTvPe+hGwgeYvTFp6zImWmRPqKXNCQ+ZEy8wJ9VQrOTGzT2WqqsOAQ4DfJdkxWHsbsG+Sv3ba3OtU1VaabXbzTV4X5UnfVbUKuB5YluSIqjoWuDLJ6jHrbpxnOUlGerzdnLqPJjnujdY026rq3CTr32hNS4M50S5zQn1kTmguc6Jd5oT6qK2cmNnBjNpVVZuAU4H7k6wcrG1OclS3ne2sqt4HnARcAtw450fLgbOTHNNJY+qEgSpNjzmhPjInpOkxJ9RHbeXErN7KpPbNd+jRyFO+qvryQj9PcsOIpZcBB9C81w+cs/4i8PERa6pnquojwJnAYVU1957j5cBive9a6jtzQr1hTkidMCfUG23nhIMZjWrShx4NL3LvAt5Lc08owCrgwVGLJnkAeKCqfpDkL1V1YLOc/4zRq/rnGeARmhP0N81Zfwm4tJOOpNlnTqhPzAlp+swJ9UmrOeGtTBpJVe1Hc+jR6YOlDcDVSV4es+4vgDVJXhq8PhBYn+SMMeu+B7gVOHiw9BxwUZInxqmrfqmqfZL4l09pCswJ9ZE5IU2POaE+aisnHMxoJFW1MsljLdT9A3BMklcGr99Ec+Dau8es+zBweZKNg9cfBL6R5KQxW1YPVNWdSc6rqs3Ms0U2ydEdtCXNNHNCfWJOSNNnTqhP2s4Jb2XSqG4YnEq/Hrg9yZMTqnsr8NuquofmDX828MMJ1N1/eBEFSHJ/Ve0/gbrqhy8Nvp7VaRfS0mJOqE/MCWn6zAn1Sas54Y4ZjayqDgXOA86nOfTojiRXT6DuccAHBi8fnMQkfXBhfpTmQg3wSeCEJB8bt7YkaX7mhCRpIeaE1HAwo7FV1VHAV4DzkyybYN39aSbcFyT56Ji13gp8HXg/UDQHgF2R5F9jN6reqKpzgGuBQ2jeB0VzeNvyThuTZpw5ob4wJ6RumBPqi7ZywsGMRlJVR9JMts+lOfjqduCuJM+OWXcZzWPILgTOAO4C7k7y0/E6lqCq/gysSvJU171Is86cUB+ZE9L0mBPqo7ZywjNmNKqbgR8DpyV5ZtxiVXUacAHwYWAjzRbBE5N8Zsy6NzPP4UwDSXLxOPXVO//ww7Y0NeaE+sickKbHnFAftZIT7pjRyKrqLcDhSf44gVo7gF8Dn07y9GBtS5IVY9ZdM8/y4cAlwN5J3j5OffVLVX0LOBT4CfDKcD3J3Z01Jc0wc0J9Y05I02VOqG/aygl3zGgkVbUKuB5YBhxRVccCVyZZPWLJ44FPAL+qqi00Wxn3HrfPJHcNv6+qFcBlwCnAN4F149ZX7ywHtgGnz1kL4AduacLMCfWUOSFNiTmhnmolJ9wxo5FU1SbgVOD+JCsHa78f9/ntgzon02xDXAM8DtyT5Ptj1DsSuBxYCVwH3JZk+7h9SpJ2z5yQJC3EnJBe444ZjWp7kheqauKFkzwEPFRVa4HTaCbfI11Iq2o9cALNNP5S4FVg+bDvJM9PomctblX1HXa+Nzg0h8xtTPKbbrqSZp45od4wJ6ROmBPqjbZzwh0zGklVrQPuA75KM4leC+yb5POdNvY6VbWV136Bhl+HV/+Me8+p+qGqLppn+WDgPOCOJDdNuSVp5pkT6hNzQpo+c0J90nZOOJjRSKpqP5rtfKfTXJg2AFclebnTxqQ9MDhw7uHh9llJk2NOaBaYE1J7zAnNgknlhIMZSUtaVT3mB25J0u6YE5KkhUwiJzxjRnukqm5m53vr5kqSi6fZjzSqqtoH+BTwt657kWaJOaFZYU5I7TAnNCsmmRMOZrSnfjbP2uHAJUzgcXRSG6rqJXb9APBf4AHgc9PvSJpp5oR6x5yQpsqcUO+0nRPeyqSRVdUK4DLgFOBGYF2S/3XblSRpsTAnJEkLMSekhoMZ7bGqOpLmoK6VwHXAbUm2d9uVJGmxMCckSQsxJ6SdOZjRHqmq9cAJwPXAncCrc3+e5Pku+pIkLQ7mhCRpIeaEtCsHM9ojVbWV1+6tG36t4eskK6belCRp0TAnJEkLMSekXTmYkSRJkiRJ6sheXTcgSZIkSZK0VDmYkSRJkiRJ6oiDGUmSJEmSpI44mJEkSZIkSeqIgxlJkiRJkqSOOJiRJEmSJEnqiIMZSZIkSZKkjjiYkSRJkiRJ6oiDGUmSJEmSpI78H0cnPXpoSBHyAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 1440x1440 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, axs = plt.subplots(1, 3, figsize=(20,20))\n",
"\n",
"for i in range(3):\n",
" axs[i].imshow(masks[i][:50])\n",
" axs[i].set_title(f\"mask {i}\")\n",
" axs[i].set_xticks(list(range(len(features))))\n",
" axs[i].set_xticklabels(features, rotation=90)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"explain_matrix, masks = skorch_clf.explain(X_valid)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1440x1440 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, axs = plt.subplots(1, 3, figsize=(20,20))\n",
"\n",
"for i in range(3):\n",
" axs[i].imshow(masks[i][:50])\n",
" axs[i].set_title(f\"mask {i}\")\n",
" axs[i].set_xticks(list(range(len(features))))\n",
" axs[i].set_xticklabels(features, rotation=90)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment