{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "bukochgPFg7s" }, "source": [ "## Evaluate Parameterisation Sensitivity of Metric\n", "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/understandable-machine-intelligence-lab/Quantus/main?labpath=tutorials%2FTutorial_Metric_Parameterisation_Analysis.ipynb)\n", "\n", "\n", "This tutorial demonstrates how one can use the library to measure to what extent the outcome of evaluation is sensitive to the choice of hyperparameters e.g., choice of baseline value to mask an image with, patch sizes or number of runs. \n", "\n", "For this purpose, we use a LeNet model and CIFAR-10 dataset to showcase the library's functionality and test the Faithfulness Correlation by Bhatt et al., 2020.\n", "\n", "- Make sure to have GPUs enabled to speed up computation.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "yMelSNFCs7Fr" }, "outputs": [], "source": [ "from IPython.display import clear_output\n", "!pip install torch torchvision captum quantus\n", "clear_output()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "czLiEl_Ts_3f" }, "outputs": [], "source": [ "import pathlib\n", "import numpy as np\n", "import pandas as pd\n", "import quantus\n", "import torch\n", "import torchvision\n", "from captum.attr import *\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "sns.set()\n", "\n", "# Enable GPU.\n", "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\") \n", "clear_output()" ] }, { "cell_type": "markdown", "metadata": { "id": "rvHznz40r2lw" }, "source": [ "## 1) Preliminaries" ] }, { "cell_type": "markdown", "metadata": { "id": "mB2QuiaDlu7w" }, "source": [ "### 1.1 Load CIFAR10 dataset" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 2614, "status": "ok", "timestamp": 1665167383435, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "PZ6VyL7x26Ue", "outputId": "c214430d-8f8a-4856-d186-73817903117c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files already downloaded and verified\n", "Files already downloaded and verified\n" ] } ], "source": [ "# Load datasets and make loaders.\n", "test_samples = 20\n", "transformer = torchvision.transforms.Compose([torchvision.transforms.ToTensor(), torchvision.transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])\n", "train_set = torchvision.datasets.CIFAR10(root='./sample_data', train=True, transform=transformer, download=True)\n", "test_set = torchvision.datasets.CIFAR10(root='./sample_data', train=False, transform=transformer, download=True)\n", "train_loader = torch.utils.data.DataLoader(train_set, batch_size=128, shuffle=True, pin_memory=True) # num_workers=4,\n", "test_loader = torch.utils.data.DataLoader(test_set, batch_size=200, pin_memory=True)\n", "\n", "# Specify class labels.\n", "classes = {0: 'plane', 1: 'car', 2: 'bird', 3: 'cat', 4: 'deer', 5: 'dog', 6: 'frog', 7: 'horse', 8: 'ship', 9: 'truck'}\n", "\n", "# Load a batch of inputs and outputs to use for evaluation.\n", "x_batch, y_batch = iter(test_loader).next()\n", "x_batch, y_batch = x_batch.to(device), y_batch.to(device)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 226 }, "executionInfo": { "elapsed": 540, "status": "ok", "timestamp": 1665167404361, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "9lqfGwtePvEN", "outputId": "57135cb2-10ef-4a19-ffcf-3cf00890031d" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def plot_images(images) -> None:\n", " \"\"\"Plot some images.\"\"\"\n", " fig = plt.figure(figsize=(20, 10))\n", " img = images / 2 + 0.5 \n", " plt.imshow(np.transpose(img.cpu().numpy(), (1, 2, 0)))\n", " plt.axis(\"off\")\n", " plt.show()\n", "\n", "# Plot image examples!\n", "plot_images(torchvision.utils.make_grid(x_batch[:6, :, :, :]))" ] }, { "cell_type": "markdown", "metadata": { "id": "YKwN9uWs29sn" }, "source": [ "### 1.2 Train a LeNet model\n", "\n", "(or any other model of choice). Network architecture and training procedure is partly copied from: https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 208, "status": "ok", "timestamp": 1665167420994, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "ypxtHPfolQPD", "outputId": "7e132a83-22a7-42e8-a7cb-373a9ce0aed1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Model architecture: LeNet3D(\n", " (conv_1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\n", " (pool_1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (pool_2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (conv_2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\n", " (fc_1): Linear(in_features=400, out_features=120, bias=True)\n", " (fc_2): Linear(in_features=120, out_features=84, bias=True)\n", " (fc_3): Linear(in_features=84, out_features=10, bias=True)\n", " (relu_1): ReLU()\n", " (relu_2): ReLU()\n", " (relu_3): ReLU()\n", " (relu_4): ReLU()\n", ")\n", "\n" ] } ], "source": [ "class LeNet3D(torch.nn.Module):\n", " def __init__(self):\n", " super(LeNet3D, self).__init__()\n", " self.conv_1 = torch.nn.Conv2d(3, 6, 5)\n", " self.pool_1 = torch.nn.MaxPool2d(2, 2)\n", " self.pool_2 = torch.nn.MaxPool2d(2, 2)\n", " self.conv_2 = torch.nn.Conv2d(6, 16, 5)\n", " self.fc_1 = torch.nn.Linear(16 * 5 * 5, 120)\n", " self.fc_2 = torch.nn.Linear(120, 84)\n", " self.fc_3 = torch.nn.Linear(84, 10)\n", " self.relu_1 = torch.nn.ReLU()\n", " self.relu_2 = torch.nn.ReLU()\n", " self.relu_3 = torch.nn.ReLU()\n", " self.relu_4 = torch.nn.ReLU()\n", "\n", " def forward(self, x):\n", " x = self.pool_1(self.relu_1(self.conv_1(x)))\n", " x = self.pool_2(self.relu_2(self.conv_2(x)))\n", " x = x.view(-1, 16 * 5 * 5)\n", " x = self.relu_3(self.fc_1(x))\n", " x = self.relu_4(self.fc_2(x))\n", " x = self.fc_3(x)\n", " return x\n", "\n", "\n", "# Load model architecture.\n", "model = LeNet3D()\n", "print(f\"\\n Model architecture: {model.eval()}\\n\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "8mP55MfxuSZh" }, "outputs": [], "source": [ "def train_model(model, \n", " train_data: torchvision.datasets,\n", " test_data: torchvision.datasets, \n", " device: torch.device, \n", " epochs: int = 20,\n", " criterion: torch.nn = torch.nn.CrossEntropyLoss(), \n", " optimizer: torch.optim = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9), \n", " evaluate: bool = False):\n", " \"\"\"Train torch model.\"\"\"\n", " \n", " model.train()\n", " \n", " for epoch in range(epochs):\n", "\n", " for images, labels in train_data:\n", " images, labels = images.to(device), labels.to(device)\n", " \n", " optimizer.zero_grad()\n", " \n", " logits = model(images)\n", " loss = criterion(logits, labels)\n", " loss.backward()\n", " optimizer.step()\n", "\n", " # Evaluate model!\n", " if evaluate:\n", " predictions, labels = evaluate_model(model, test_data, device)\n", " test_acc = np.mean(np.argmax(predictions.cpu().numpy(), axis=1) == labels.cpu().numpy())\n", " \n", " print(f\"Epoch {epoch+1}/{epochs} - test accuracy: {(100 * test_acc):.2f}% and CE loss {loss.item():.2f}\")\n", "\n", " return model\n", "\n", "def evaluate_model(model, data, device):\n", " \"\"\"Evaluate torch model.\"\"\"\n", " model.eval()\n", " logits = torch.Tensor().to(device)\n", " targets = torch.LongTensor().to(device)\n", "\n", " with torch.no_grad():\n", " for images, labels in data:\n", " images, labels = images.to(device), labels.to(device)\n", " logits = torch.cat([logits, model(images)])\n", " targets = torch.cat([targets, labels])\n", " \n", " return torch.nn.functional.softmax(logits, dim=1), targets" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 151067, "status": "ok", "timestamp": 1665167592167, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "lbfAkSEtmGym", "outputId": "14262829-80c8-4be5-c648-c451872567cb" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10 - test accuracy: 39.27% and CE loss 1.66\n", "Epoch 2/10 - test accuracy: 47.94% and CE loss 1.18\n", "Epoch 3/10 - test accuracy: 53.34% and CE loss 1.16\n", "Epoch 4/10 - test accuracy: 55.20% and CE loss 0.94\n", "Epoch 5/10 - test accuracy: 58.22% and CE loss 1.24\n", "Epoch 6/10 - test accuracy: 57.41% and CE loss 0.97\n", "Epoch 7/10 - test accuracy: 60.10% and CE loss 0.87\n", "Epoch 8/10 - test accuracy: 60.91% and CE loss 1.16\n", "Epoch 9/10 - test accuracy: 62.40% and CE loss 0.95\n", "Epoch 10/10 - test accuracy: 61.25% and CE loss 0.91\n", "Model test accuracy: 61.25%\n" ] } ], "source": [ "# Train and evaluate model.\n", "model = train_model(model=model.to(device),\n", " train_data=train_loader,\n", " test_data=test_loader,\n", " device=device,\n", " epochs=10,\n", " criterion=torch.nn.CrossEntropyLoss().to(device),\n", " optimizer=torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9),\n", " evaluate=True)\n", "\n", "# Model to GPU and eval mode.\n", "model.to(device)\n", "model.eval()\n", "\n", "# Check test set performance.\n", "predictions, labels = evaluate_model(model, test_loader, device)\n", "test_acc = np.mean(np.argmax(predictions.cpu().numpy(), axis=1) == labels.cpu().numpy()) \n", "print(f\"Model test accuracy: {(100 * test_acc):.2f}%\")" ] }, { "cell_type": "markdown", "metadata": { "id": "XqKzag4VFjHT" }, "source": [ "### 1.3 Load gradient-based attributions" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 506 }, "executionInfo": { "elapsed": 604, "status": "ok", "timestamp": 1665167862341, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "uSUkm-d6-p20", "outputId": "f3ff10bf-d176-4457-9397-de04e65a0d4c" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Load some attributions and plot them. \n", "a_batch = quantus.explain(model, \n", " x_batch, \n", " y_batch, \n", " method=\"IntegratedGradients\",)\n", "\n", "# Plot examplary inputs!\n", "nr_images = 3\n", "fig, axes = plt.subplots(nrows=nr_images, ncols=2, figsize=(nr_images*1.5, int(nr_images*3)))\n", "for i in range(nr_images):\n", " axes[i, 0].imshow(np.moveaxis(np.clip(x_batch[i].cpu().numpy(), 0, 1), 0, -1), \n", " vmin=0.0, vmax=1.0)\n", " axes[i, 0].title.set_text(f\"CIFAR-10 - {classes[y_batch[i].item()]}\")\n", " axes[i, 0].axis(\"off\")\n", " axes[i, 1].imshow(a_batch[i].reshape(32, 32), cmap=\"seismic\")\n", " axes[i, 1].title.set_text(f\"IG_norm=[0, 1]\")\n", " axes[i, 1].axis(\"off\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "3zPsqB-OsAjf" }, "source": [ "## 2) Quantiatative evaluation using Quantus" ] }, { "cell_type": "markdown", "metadata": { "id": "Vrl4GiojK6r-" }, "source": [ "### 2.1 Measure sensitivity of hyperparameter choice\n", "\n", "We want to understand how sensitive the evaluation outome of Faithfulness Correlation (Bhatt et al., 2020) is from its hyperparameters." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 1225, "status": "ok", "timestamp": 1665167868214, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "sD5STAScsp_3", "outputId": "bd2e79b2-5df2-4b4d-f2b0-281cfc51387a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Warnings and information:\n", " (1) The Faithfulness Correlation metric is likely to be sensitive to the choice of baseline value 'perturb_baseline', size of subset |S| 'subset_size' and the number of runs (for each input and explanation pair) 'nr_runs'. \n", " (2) If attributions are normalised or their absolute values are taken it may destroy or skew information in the explanation and as a result, affect the overall evaluation outcome.\n", " (3) Make sure to validate the choices for hyperparameters of the metric (by calling .get_params of the metric instance).\n", " (4) For further information, see original publication: Bhatt, Umang, Adrian Weller, and José MF Moura. 'Evaluating and aggregating feature-based model explanations.' arXiv preprint arXiv:2005.00631 (2020).\n", " (5) To disable these warnings set 'disable_warnings' = True when initialising the metric.\n", "\u001B[0m\n" ] } ], "source": [ "# Let's list the default parameters of the metric.\n", "metric = quantus.FaithfulnessCorrelation()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 4197, "status": "ok", "timestamp": 1665167875556, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "YCiGXKSVuP3L", "outputId": "a9ba4b69-95e8-4775-e0d5-ad63223c7390" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/captum/_utils/gradient.py:59: UserWarning: Input Tensor 0 did not already require gradients, required_grads has been set automatically.\n", " \"required_grads has been set automatically.\" % index\n" ] } ], "source": [ "# Recompute some Saliency explanations.\n", "a_batch = Saliency(model).attribute(inputs=x_batch, target=y_batch, abs=True).sum(axis=1).cpu().numpy()\n", "a_batch_occ = Occlusion(model).attribute(inputs=x_batch, target=y_batch, sliding_window_shapes=(1, 4, 4)).sum(axis=1).cpu().numpy()\n", "a_batch_ig = IntegratedGradients(model.to(device)).attribute(inputs=x_batch,\n", " target=y_batch,\n", " baselines=torch.zeros_like(x_batch), \n", " n_steps=10, \n", " method=\"riemann_trapezoid\").sum(axis=1).cpu().numpy()\n", "a_batch_gh = GradientShap(model).attribute(inputs=x_batch,\n", " target=y_batch,\n", " baselines=torch.zeros_like(x_batch),).sum(axis=1).cpu().data.numpy()\n", "\n", "# Metric class expects numpy arrays.\n", "x_batch, y_batch = x_batch.cpu().numpy(), y_batch.cpu().numpy()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "JSJ-n7xcVDcd" }, "outputs": [], "source": [ "# Define some parameter settings to evaluate.\n", "baseline_strategies = [\"mean\", \"uniform\"]\n", "subset_sizes = np.array([2, 52, 102])\n", "sim_funcs = {\"pearson\": quantus.similarity_func.correlation_pearson, \"spearman\": quantus.similarity_func.correlation_spearman}\n", "\n", "result = {\n", " \"Faithfulness score\": [],\n", " \"Method\": [],\n", " \"Similarity function\": [],\n", " \"Baseline strategy\": [],\n", " \"Subset size\": [],\n", "}\n", "methods = {\"Saliency\": a_batch, \"Occlusion\": a_batch_occ, \"Integrated Gradients\": a_batch_ig, \"GradShap\": a_batch_gh}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "UhQWT0TuJKSo" }, "outputs": [], "source": [ "# Score explanations!\n", "for b in baseline_strategies:\n", " for s in subset_sizes:\n", " for method, attr in methods.items():\n", " for sim, sim_func in sim_funcs.items():\n", " metric = quantus.FaithfulnessCorrelation(abs=True,\n", " normalise=True,\n", " return_aggregate=True,\n", " disable_warnings=True,\n", " aggregate_func=np.mean,\n", " normalise_func=quantus.normalise_func.normalise_by_negative,\n", " nr_runs=10,\n", " perturb_baseline=b,\n", " perturb_func=quantus.perturb_func.baseline_replacement_by_indices,\n", " similarity_func=sim_func,\n", " subset_size=s)\n", " score = metric(model=model.cuda(), x_batch=x_batch, y_batch=y_batch, a_batch=attr, device=device)\n", " result[\"Method\"].append(method)\n", " result[\"Baseline strategy\"].append(b.capitalize())\n", " result[\"Subset size\"].append(s)\n", " result[\"Faithfulness score\"].append(score[0])\n", " result[\"Similarity function\"].append(sim)\n", "\n", "df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "executionInfo": { "elapsed": 4, "status": "ok", "timestamp": 1665169080915, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "CKUC7vWENMgW", "outputId": "fc4342cf-48f9-4917-c7ac-31835432591a" }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Faithfulness scoreMethodSimilarity functionBaseline strategySubset sizeRank
00.019963SaliencypearsonMean21.0
10.045515SaliencyspearmanMean22.0
20.078820OcclusionpearsonMean23.0
30.013273OcclusionspearmanMean21.0
40.081141Integrated\\nGradientspearsonMean24.0
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ], "text/plain": [ " Faithfulness score Method Similarity function \\\n", "0 0.019963 Saliency pearson \n", "1 0.045515 Saliency spearman \n", "2 0.078820 Occlusion pearson \n", "3 0.013273 Occlusion spearman \n", "4 0.081141 Integrated\\nGradients pearson \n", "\n", " Baseline strategy Subset size Rank \n", "0 Mean 2 1.0 \n", "1 Mean 2 2.0 \n", "2 Mean 2 3.0 \n", "3 Mean 2 1.0 \n", "4 Mean 2 4.0 " ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Group by the ranking.\n", "df[\"Rank\"] = df.groupby(['Baseline strategy', 'Subset size', 'Similarity function'])[\"Faithfulness score\"].rank()\n", "\n", "# Smaller adjustments.\n", "df = df.loc[:, ~df.columns.str.contains('^Unnamed')]\n", "df.columns = map(lambda x: str(x).capitalize(), df.columns)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 614 }, "executionInfo": { "elapsed": 335, "status": "ok", "timestamp": 1665169089555, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "Z_nKiL1Ra8W-", "outputId": "143349af-6052-44e3-af04-9e74717a3032" }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MethodRankPercentage
0Method A1.0100
1Method B2.0100
2Method C3.0100
3Method D4.0100
4Saliency1.066.67
5Saliency2.016.67
6Saliency3.016.67
7Occlusion1.025.0
8Occlusion2.025.0
9Occlusion3.025.0
10Occlusion4.025.0
11Integrated\\nGradients2.033.33
12Integrated\\nGradients3.033.33
13Integrated\\nGradients4.025.0
14Integrated\\nGradients1.08.33
15GradShap4.050.0
16GradShap2.025.0
17GradShap3.025.0
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ], "text/plain": [ " Method Rank Percentage\n", "0 Method A 1.0 100\n", "1 Method B 2.0 100\n", "2 Method C 3.0 100\n", "3 Method D 4.0 100\n", "4 Saliency 1.0 66.67\n", "5 Saliency 2.0 16.67\n", "6 Saliency 3.0 16.67\n", "7 Occlusion 1.0 25.0\n", "8 Occlusion 2.0 25.0\n", "9 Occlusion 3.0 25.0\n", "10 Occlusion 4.0 25.0\n", "11 Integrated\\nGradients 2.0 33.33\n", "12 Integrated\\nGradients 3.0 33.33\n", "13 Integrated\\nGradients 4.0 25.0\n", "14 Integrated\\nGradients 1.0 8.33\n", "15 GradShap 4.0 50.0\n", "16 GradShap 2.0 25.0\n", "17 GradShap 3.0 25.0" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Group by rank.\n", "df_view = df.groupby([\"Method\"])[\"Rank\"].value_counts(normalize=True).mul(100).reset_index(name='Percentage').round(2)\n", "df_view = df_view.append({'Method': 'Method A', 'Rank': 1.0, 'Percentage': 100}, ignore_index=True)\n", "df_view = df_view.append({'Method': 'Method B', 'Rank': 2.0, 'Percentage': 100}, ignore_index=True)\n", "df_view = df_view.append({'Method': 'Method C', 'Rank': 3.0, 'Percentage': 100}, ignore_index=True)\n", "df_view = df_view.append({'Method': 'Method D', 'Rank': 4.0, 'Percentage': 100}, ignore_index=True)\n", "\n", "# Reorder the methods for plotting purporses.\n", "df_view_ordered = pd.DataFrame(columns=[\"Method\", \"Rank\", \"Percentage\"])\n", "df_view_ordered = df_view_ordered.append({'Method': 'Method A', 'Rank': 1.0, 'Percentage': 100}, ignore_index=True)\n", "df_view_ordered = df_view_ordered.append({'Method': 'Method B', 'Rank': 2.0, 'Percentage': 100}, ignore_index=True)\n", "df_view_ordered = df_view_ordered.append({'Method': 'Method C', 'Rank': 3.0, 'Percentage': 100}, ignore_index=True)\n", "df_view_ordered = df_view_ordered.append({'Method': 'Method D', 'Rank': 4.0, 'Percentage': 100}, ignore_index=True)\n", "df_view_ordered = df_view_ordered.append([df_view.loc[df_view[\"Method\"] == 'Saliency']], ignore_index=True)\n", "df_view_ordered = df_view_ordered.append([df_view.loc[df_view[\"Method\"] == 'Occlusion']], ignore_index=True)\n", "df_view_ordered = df_view_ordered.append([df_view.loc[df_view[\"Method\"] == 'Integrated\\nGradients']], ignore_index=True)\n", "df_view_ordered = df_view_ordered.append([df_view.loc[df_view[\"Method\"] == 'GradShap']], ignore_index=True)\n", "df_view_ordered" ] }, { "cell_type": "markdown", "metadata": { "id": "sl-xLLHInca-" }, "source": [ "### 2.2 Plot results!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 388 }, "executionInfo": { "elapsed": 541, "status": "ok", "timestamp": 1665169172234, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "F3kR9dNzhNi7", "outputId": "437c3d41-1bb4-4c5a-af04-a152c011d391" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " # Remove the CWD from sys.path while we load stuff.\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcQAAAFQCAYAAAAhqA5KAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA89ElEQVR4nO3deVxU9f7H8dewI7IIF7fUzFA0wzU3xLwKWmpuLWrqVUwzK7PMrDRbbHNJcysj5Zpb5i4qeqkUNbW0rmZqLiXlXooLICr7/P7wx9wI0BmYBfD9fDx6JOf7Pee858wMH872PQaj0WhERETkNufk6AAiIiIlgQqiiIgIKogiIiKACqKIiAiggigiIgKoIIqIiAAqiCIiIoAKooiICKCCKCIiAqggioiIACqIIiIigAqiiIgIoIIoIiICqCCK2N2sWbMIDg52dAwxw+rVqwkODub06dOOjiL/L/f7k5KSYvVlqyDa0fnz55kyZQr/+te/aNy4McHBwezevdvi5ezbt49Zs2bZ5ANxO9u/fz/jx4+nc+fONGrUiH/+85+MHDmSEydOODqa3MKBAwd49tlnadeuHQ0aNKB169YMHjyYvXv3Ojqa3MLcuXMJDg6me/fueabPmTOHTZs22TVLqSqIxqwMR0coVobff/+duXPncu7cuWLtIezbt4+PPvqoRBbEjOwsR0cocobo6Gi+/vprQkNDee211+jVqxfff/89PXr0ICEhwcopSx5jdgn4fhUxw6lTp8jOzuaxxx7j9ddfZ/DgwVy6dIn+/fuzc+dOK6d0rIysHEdHsFqGxMREPvnkE8qVK5evzREF0cWuaysmg4sbxye0c2iGmmO2FHne+vXrs2vXLipUqMCmTZt49tlnrZisZHBzdiH8P584NMPmTk8Xab7IyEimTJmCm5ubaVrnzp3p2rUrc+fOZeLEidaKWCIZnN34Y2UHh2ao8ujXRZqvc+fOdO7cOc+0xx9/nIiICBYuXEjr1q0LnC87O5vs7Ow873lJ5+biRPtPvnVohvinQ62ynKlTp3LvvfdiNBpLxB/4pWoPsbQrX748FSpUuGW/DRs28PDDD9O4cWOaNGlC165dWbBgAXDj+PmECRMACA8PJzg4WOc4rKRJkyb5fjHWrFmT2rVr59lDDA4O5r333uPLL7+kS5cu3HvvvXTp0oVvvvkm3zL/+9//8sgjjxASEkJERARLly61+euQGzw9PfH398/zizb3vYuJieHBBx8kJCSEH3/8EYBff/2VAQMG0KBBA+6//35mz55NTo7j98bKqv3797Nu3TrGjBmTry04OJgrV66wZs0a0++4V199NU+f5ORkXn75ZZo2bUrTpk0ZM2YM169fL1amUrWHeDvYuXMnL774Ih07dqRXr15kZ2dz7Ngx9u7dy8CBA+nQoQMnT540fZByC6y/v7+Dk5dNRqORCxcuULdu3TzTf/jhB+Li4ujbty/lypVj0aJFjBgxgi1btpjek6NHjzJ48GACAgJ47rnnyMrKYtasWQQEBDjipdwWUlNTycjIICkpiZiYGH755Zd8R2J27tzJf/7zH/r27YuPjw+BgYEkJiYyYMAAcnJyGDp0KJ6enixfvhx3d3cHvZKyzWg08s4779CjRw/q1auXr33y5Mm8+eab1K9fn169egFQo0aNPH1GjBhB9erVGTVqFIcOHWLFihX4+/szevToIudSQSxhtm7dSu3atZk1a1aB7XXr1qV+/fqsW7eOiIgIqlWrZueEt5d169Zx7tw5Ro4cmWd6QkICGzdupHr16gC0aNGC7t27s2HDBvr37w/AzJkzMRgMfPHFF1SqVAmABx54gK5du9r3RdxGxo4dy5dffgmAq6srffr0YdiwYXn6HD9+nA0bNnDXXXeZpr3//vtcvnyZVatWUb9+fQB69uxJx44d7Rf+NhITE8OxY8f4+OOPC2zv3r0777zzDtWrV893sU2ukJAQ3n77bdPPSUlJrFy5slgFUYdMSxgfHx/++OMPfvrpJ0dHue0lJCTw9ttv07Rp03xfyrCwMFMxhBt/qJQvX55Tp04BN85N7dixgw4dOpiKIcDdd99NWFiYfV7AbejZZ59l3rx5vP/++zRp0oSMjAwyMzPz9GnZsmWeYgiwbds2mjRpYiqGcOOoi/54sb7U1FSmTp3K0KFDqVixYpGX06dPnzw/33fffSQlJZGamlrkZaogljB9+/alUqVK9OrVi/DwcN544w2+/daxJ9BvR4mJiTz11FP4+voyY8YMnJzyflWqVq2abx5fX1/T+apLly6RlpbGnXfema/f338Zi/UEBwfTunVrHnnkEf7973/z888/5ztHVdBRlbNnz+q9spNPPvkEV1dXBg0aVKzlVKlSJc/PPj4+wI1zi0WlgljCBAQEEBMTQ1RUFPfffz87d+5k0KBBjB071tHRbhtXrlzhySef5MqVK0RHRxMYGJivz98LZC6j0WjreGImV1dXwsPD+eqrr0hLSzNN13lBxzl//jwLFiygb9++XLhwgdOnT3P69GnS09PJzMzk9OnTZhc0Z2fnAqcX5zuoc4glkJubG+3ataNdu3amk8+ff/45w4YNo0aNGhgMBkdHLLPS09MZNmwYx48fZ/78+dSqVatIy/H398fDw6PAm/p///334sYUM6WlpWE0Grl69SoeHh6F9qtatareKzu4ePEimZmZTJkyhSlTpuRrDw8P58knn+Sll15yyO85FcQS5vLly3luzTAYDKab+NPT0wFMN7FeuXLF/gHLsOzsbF544QX27dvH7NmzadSoUZGX5ezsTFhYGF9//TXnzp0znUdMSEhgx44dVkosuS5dupTvSuvU1FS+/PJLqlSpcssre9u2bcvChQv5+eefTecRL126xPr1622W+XZUrVq1Ai+kmT59OteuXWPs2LHUrFkTuHHbjL3vTVRBtLPZs2cDmO5rW7t2LXv27MHHx4f+/fszbtw4kpOTadmyJZUqVeKPP/5g8eLF1KtXj7vvvhvA9IWdNm0anTt3xtXVlXbt2hU42oOYb+LEicTHx9OuXTuSkpJYu3atqc3Ly4uIiAiLlvfcc8+xfft2Hn/8cfr06UN2djaLFy8mKCiIo0ePWjv+be2FF17A3d2dxo0bExgYyB9//MHq1av5888/+fDDD285/5AhQ1i7di1PPPEE//rXv0y3XVStWlXvlRV5e3sX+D1asGABzs7Oedrq16/Pd999x2effUbFihWpVq0aDRs2tGk+FcRCZGZmF9qWmFj0PbMZM2bk+XnVqlUAVK5chQce6M4//9mBdevWsHjx56SmXsHfP4B//jOcJ54YysWLVwEIDKzOU089y+rVK9i+fTs5OTmsWLGOKlXyX+hhLRUqlOPy5Wu37BcY6E3GTbadLbm6OJH5/0NKFeU92r//IABbtmxhy5a8IxJVrlyFhg1bmH6+fj0z3zqys3NIS/vf9ICAO5g6dRazZk1j5syZBAZWJDLySa5dS+bo0aPF+hzZQmCgt+lz7+LiRJaDhggzd7v89TPZrl1H4uI2sGDBQq5cScHb25t77glh7Ni3aNy4aZ5lFvTeGQyezJgRxbRpk/n00zn4+vrSvfvD/OMfgUyc+A6XLl3F3d3y98vc740lrP0d++v3xhJF/fwGBnqb1e+VV17h9ddfZ/r06aSlpdGzZ0+bF0SDsRRdBWDMysDg4tghlrIy0ricnHnrjhYIDPQucb8c/87cjOX9PPB0dbVDosJdz8wkNSnt1h0dpKS+3/5+rji7Fn6ezR6yM9O4lGTe96ukbse/skXG8r6eeLo5dl/mekYWqclFGxXG3ILoCKVqD9GexfDixVRyckrN3wolRmpSGqk4phiVhl+QJdmNQnSjGGlbllypydcp+p12+em9/h/ddiEiIoIKooiICKCCKCIiAqggioiIAA4uiH/++SfvvPMOvXv3pmHDhoU+1y89PZ1JkyYRFhZGgwYN6N27Nz/88EO+fjk5OXz66ae0b9+ekJAQunXrZhr5XkRE5GYcWhBPnDjBf/7zH3x8fLjvvvsK7Td27FhWrFjBiBEj+PTTTwkMDGTw4MEcPnw4T78ZM2Ywa9Ys+vXrx9y5c2nUqBHPP/8827Zts/VLERGRUs6ht100a9bM9CSHFStWFDik1ZEjR4iNjeX999/nkUceMc3XpUsXZsyYQVRUFHBjjLx///vfDB06lMGDBwM3HvNy4sQJpkyZQtu2be30qkREpDRy6B5iYU8M+KvNmzfj6upK586dTdNcXFzo0qULO3bsICMjA4Dt27eTmZlJt27d8szfrVs3fvnlF9Nz6kRERApS4i+qOXbsGHfccQeenp55pgcFBZGZmWkaof7YsWO4ubnle6ZZ7dq1gf+NHSoiIlKQEl8Qk5OT8fX1zTfdz8/P1J77fx8fn3yPDMmdNykpyaY5pexZtmwJy5YtcXQMEbGTUjV0mz0FBJQv8rwZWTm4uVj2t4al4/sVZR1/ZczJxuBU8AM2C2NpxqKs469yjEacLHwmmqUZb7aOlSu/AGD48KcKnd9oNBbpuW2W5CzqOnIV9bNiScbifh6LugxlzM/W3+3ifq9LshJfEH18fDhz5ky+6bl7fLl7gD4+PqSkpOT75ZG7B5m7R2mu4oxlGhjoTdjM7Wb3d3N1tnj0+h0j2hRr/MHAQG9OftHe7P6urs43fQJIQWo8Hl/sjG3WfWR2/6Jsx+3dhheaMff13uw1BAZ68+vb91u0Tku3Ze03vin2drTk8wiWb8vifh7B9t+b2ymjLb/b1vhel1Ql/pBpUFAQZ86c4fr1vCOrJyQk4OrqajpnWLt2bTIyMjh58mSefseOHQMwPUtQRESkICW+ILZv357MzEzi4uJM07Kysti4cSNhYWG4ud14AkabNm1wdXXN94TrdevWUadOHapXr27X3CIiUro4/JBpbqE7ePDGw1m/+eYb/P398ff3p3nz5txzzz107tyZ999/n6ysLKpVq8YXX3zB6dOnmTJlimk5AQEBREZG8umnn+Ll5cU999zDxo0b2bVrF5988olDXpuIiJQeDi+Izz//fJ6fx48fD0Dz5s1ZtGgRABMmTGDatGlMnz6dlJQU6tatS3R0NPXr188z78iRIylXrhwLFy4kMTGRu+66i+nTp9OuXTv7vBgRESm1HF4Qjx49ess+Hh4ejBkzhjFjxty0n7OzM8888wzPPPOMteKJiMhtosSfQxQREbEHFUQRERFUEEVERAAVRBEREUAFUUREBFBBFBERAVQQRUREABVEERERQAVRREQEUEEUEREBVBBFREQAFUQRERFABVFERARQQRQREQFUEEVERIAS8DxEEZHSIj0rmx0j2th0+eI4KogiImZyd3Hm5Bftze7v6upMZqb5Ra7G4/FFiSVWokOmIiIiqCCKiIgAKogiIiKACqKIiAiggigiIgKoIIqIiAAqiCIiIoAKooiICKCCKCIiAqggioiIACqIIiIigAqiiIgIoIIoIiICqCCKiIgAKogiIiKACqKIiAiggigiIgKoIIqIiAAqiCIiIoAKooiICKCCKCIiAqggioiIABYUxNjY2Fv2GT9+fLHCiIiIOIrZBXHMmDHs2rWr0PZ3332XpUuXWiXU3+3Zs4cnnniCVq1a0bhxY3r27MnKlSvz9ElPT2fSpEmEhYXRoEEDevfuzQ8//GCTPCIiUvaYXRDDwsIYPnw4R44cydc2adIkFi9ezNNPP23VcABHjhxh0KBBZGZm8s477/DRRx8REhLCa6+9xpIlS0z9xo4dy4oVKxgxYgSffvopgYGBDB48mMOHD1s9k4iIlD1mF8Tp06cTFBTEk08+ydmzZ03Tp06dymeffcbQoUMZMWKE1QNu3LiRnJwcoqKiiIiIoHXr1rz99ts0atSItWvXAjeKZmxsLGPGjKFXr160atWK6dOnU6VKFWbMmGH1TCIiUvaYXRDd3d2JiorCy8uLIUOGkJSUxMyZM5k7dy6DBg3ixRdftEnAzMxMXFxc8PDwyDO9fPny5OTkALB582ZcXV3p3Lmzqd3FxYUuXbqwY8cOMjIybJJNRETKDouuMvXz8yM6OpqUlBS6d+/OJ598Qv/+/XnllVdslY+ePXsCN85Rnjt3jpSUFJYvX86uXbuIjIwE4NixY9xxxx14enrmmTcoKIjMzExOnDhhs3wiIlI2uFg6Q7Vq1YiOjqZfv3707t2bcePG2SKXSZ06dVi4cCHDhw83nTN0dXXlrbfeokuXLgAkJyfj6+ubb14/Pz9Tu4iIyM0UWhDr1q2LwWAodEaj0ciyZctYtmyZaZrBYODQoUNWDXj8+HFGjBhB7dq1GT9+PB4eHmzevJm33noLd3d3unXrZtX15QoIKF+s+d1cnW3aHyAw0Nvief7K1cJ1Wtofip/Rkdsx9/Xe6jUUZbtYOo+9t2NR5iluxqKs0xEZbf29uV0ylkSFFsQePXrctCDay4cffoiLiwtRUVG4uroC0KpVKy5fvsx7773HQw89hI+PD2fOnMk3b1JSEkCBe4+3cvFiKjk5xiJlDgz0JiMz2+z+bq7OFvXPlZh4xeJ5cgUGepNpwTpdXZ0t6p+ruBkduR1zX+/NXoOl2xGKti3tuR2haNuyOBnBPu+3NTLa+ntT1jOW5GJaaEGcOHGiPXMU6pdffqFu3bqmYpirQYMGxMbGcvHiRYKCgti0aRPXr1/Pcx4xISEBV1dX7rzzTnvHFhGRUqbED90WGBjI4cOH810pun//ftzd3fH19aV9+/ZkZmYSFxdnas/KymLjxo2EhYXh5uZm79giIlLKWHxRzfXr1zlz5gxJSUkYjfkPKTZr1swqwXL169eP559/nqeffprHH38cDw8P4uPjiY2NJTIyEjc3N+655x46d+7M+++/T1ZWFtWqVeOLL77g9OnTTJkyxap5RESkbDK7IF6/fp0JEyawevVqsrPzH282Go0YDAarjwzz4IMPMmfOHKKjoxk3bhzp6enUqFGDN954gz59+pj6TZgwgWnTpjF9+nRSUlKoW7cu0dHR1K9f36p5RESkbDK7IL733nusXLmStm3b0rJlS9MtDfbQtm1b2rZte9M+Hh4ejBkzhjFjxtgplYiIlCVmF8Svv/6aLl26MHXqVFvmERERcQizL6rJyMigRYsWtswiIiLiMGYXxHvvvZfjx4/bMIqIiIjjmF0QR40axerVqzlw4IAt84iIiDiE2ecQly1bRuXKlenduzeNGjWievXqODnlracGg4H333/f6iFFRERszeyCuGbNGtO/9+7dy969e/P1UUEUEZHSyuyCeOTIEVvmEJHbXHpWNjtGtLHp8m8HOVnp1Hg83qbLL6ssHqlGRMQW3F2cOflFe7P7WzootS2LREni5OJOm3Ufmd3f0kHSt3cbDpTNh66X+LFMRURE7MGiPcTk5GRWrlzJTz/9REpKCjk5OXnaDQYDCxYssGpAERERezC7IJ45c4bHH3+c8+fP4+3tTWpqKr6+vqbCWKFChTyPXhIRESlNzD5kOn36dK5cucL8+fP58ssvMRqNTJs2jT179vDUU0/h5eXFkiVLbJlVRETEZswuiN999x2PPfYYLVu2xGAwmKZ7enoycuRI6tSpwwcffGCTkCIiIrZmdkFMSkqidu3aAKan16elpZnaW7duzbfffmvleCIiIvZhdkH09/cnOTkZAC8vL9zd3Tlz5oypPTMzM0+BFBERKU3MLoi1a9c23ZxvMBho0KABS5Ys4ezZs5w+fZply5ZRq1YtmwUVERGxJbMLYvv27dm3b59pL/CZZ57hxIkThIeH06FDB06cOMEzzzxjs6AiIiK2ZPZtF/369aNfv36mn1u1asXSpUuJjY3FycmJDh060KRJE5uEFBERsTWzCmJ2djbnzp2jXLly+Pn5maaHhIQQEhJiq2wiIiJ2Y9Yh06ysLCIiIli5cqWt84iIiDiEWQXR3d1dI9GIiEiZZvZFNffffz9bt261YRQRERHHMbsgjh49msTERF555RWOHj1KenrZfSaWiIjcfsy+yjQ0NBSDwcCRI0dYt25dgX0MBgOHDh2yWjgRERF7Mbsg9ujRI88YpiIiImWJ2QVx4sSJtswhIiLiUGafQxQRESnLVBBFRERQQRQREQFUEEVERAAVRBEREeAmBTEmJobTp0/bM4uIiIjDFFoQx4wZw48//mj6uV69eqxfv94uoUREROyt0ILo6elpehgwgNFotEsgERERRyj0xvzatWuzaNEiKlSogK+vLwC//fYbP/zww00X2KxZM+smFBERsYNCC+LIkSMZMWIEzz33HHBjnNKoqCiioqIK7G80GjEYDBw+fNg2SUVERGyo0ILYsmVLNm3axIEDB0hMTOTVV1+lV69eNG7c2J75RERE7OKmY5n6+PjQunVrAGbOnEnbtm0JDw+3SzARERF7Mntw7/j4eFvmEBERcSizC2KuXbt2sWnTJk6dOgVA9erViYiIoGXLllYPJyIiYi9mF8ScnBxeeeUVYmNjMRqNODk5maZ//vnndO3alUmTJtn0mYnbtm1jzpw5HDp0CIPBQM2aNRk9ejStWrUCIDk5mcmTJ7Np0ybS09Np1KgRY8aMITg42GaZRESkbDC7IM6bN4/169fz4IMPMmzYMO6++24AEhISmDNnDuvXr6du3bo88cQTNgm6dOlS3nnnHfr168czzzxDTk4Ohw8fNt0raTQaGTZsGGfOnOH111/Hx8eHOXPmMGDAANauXUvlypVtkktERMoGswvimjVraN26NdOnT88zvW7dunz44YckJyezatUqmxTE06dP8/777zN69GgiIyNN09u0aWP69+bNm9m7dy8LFiwwHb5t3Lgx4eHhREdHM27cOKvnEhGRssPswb1PnTpF+/btC21v37696byita1atQonJycef/zxQvvEx8dTsWLFPOcyvb29adeuHZs3b7ZJLhERKTvMLoienp5cuHCh0PbExEQ8PT2tEurv9uzZQ61atdiwYQMRERHcc889dOjQgc8//9zU59ixY9SpUyffvEFBQZw9e5arV6/aJJuIiJQNZhfE++67j88//5xff/01X9uxY8dYsmSJzYZtO3/+PMePH2fy5MkMHTqUf//734SGhvL222+zYMEC4MYFNT4+Pvnm9fPzAyAlJcUm2UREpGww+xziiBEj6N27Nz179qR9+/YEBQUBN4phfHw8rq6upmHerM1oNHL16lUmTpxIx44dAWjVqhVnzpwxXThjbQEB5Ys1v5urs037AwQGels8z1+5WrhOS/tD8TM6cjvmvt5bvYaibBdL57H3dizKPMXNCLb/TN4uGW39vbFGxpLI7IIYHBzMokWLeO+99/jqq6/46quvTG2NGzfmtddes9ntDbl7eaGhoXmmh4WFsX37ds6fP4+Pj0+Be4FJSUkABe493szFi6nk5BTtCR+Bgd5kZGab3d/N1dmi/rkSE69YPE+uwEBvMi1Yp6urs0X9cxU3oyO3Y+7rvdlrsHQ7QtG2pT23IxRtWxYnI9jnM3m7ZLT196a4n8eSyqIb80NCQli6dCmXLl0yPTy4WrVq+Pv72yRcrqCgIPbt21dou5OTE0FBQezcuTNfW0JCAlWrVsXL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L2f9+vUcO3aMtLQ0KlasSIsWLejfvz/169cvdnb433v81VdfmdZvNBqJjY1l9erVHDp0iNTUVLy9valbty4dOnTgkUcewcPDwyrrv5Uff/yRhQsXsmfPHi5duoSbmxt33XUXbdq0oW/fvlSsWBG48Z7mcnFxwdvbm1q1atG6dWv69OlDQECAXfI6kgqiA6WlpfGf//wHgNjYWF5++eUCf/k40owZM6hcuTLZ2dmcOnWK2bNnExkZyYYNG/D2tmx8TFuZP38+EydOpGXLlrz00kvccccdJCcns3PnTt566y28vb2JiIhwaMbc7ZiRkcHZs2fZtm0bo0aNYvny5URFRdnsl+PChQt57733eOSRRxg8eDCenp6cOnWKrVu3smvXrgILYkxMDACXLl3im2++sek9vFFRUUybNo2IiAjeffddfH19+fnnn5k7dy5fffUVCxcupEqVKgCcP3+eQYMGcf78efr168eLL76Iq6srCQkJrFq1ir1795qyX7t2jSeffJIDBw7Qp08fhg0bRrly5Thx4gTr1q0jMjKSH374wSavKSsri5EjR7J582a6d+9uKiYXL15k+/btTJw4katXrzJ06FCbrP+v5s2bx+TJk2nRogUvvPAC1atX59q1a+zdu5fly5dz8OBBoqOjTf0ffvhhevfuTU5ODklJSfz0008sXryYRYsWMXv2bJo0aWLzzA5lFIdZv369sU6dOsYnn3zSWKdOHWN8fLyjI5msWrXKWKdOHePx48fzTN+5c6exTp06xq1btzooWV7ff/+9MTg42PjOO+8U2H7ixAnj4cOH7Zzqfwrbjkaj0RgXF2cMDg42vv322zZbf9u2bY3PPPNMgW3Z2dn5pqWlpRmbNm1q7N+/v7Fhw4bG5557rsB569SpY/zwww+Lle27774zBgcHG9977718bSdPnjQ2a9bM2L9/f9O0gQMHGps1a2b8/fff8/XPyckxfv3116afx44da6xfv75x7969Ba77q6++Klb2v/r7ezxz5kxjcHBwoes4efKkXb4/N9u+RqPRePXqVeOqVatMPxf2niYmJho7duxoDA0NNV67ds1meUsCnUN0oDVr1uDr68vEiRPx8PBgzZo1jo50S+XLlwdu/BVcEsydOxdfX19Gjx5dYHuNGjWoW7eunVOZ54EHHiA8PJzly5dz/fp1m6wjOTmZf/zjHwW2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bx85OTkkJyezb98+VqxYgdFotOkAEiWFHv9kZ8888wy7du1i586dBe4VXLlyhbCwMDp16sTEiRMdkPCGvw85BuDv70/t2rV58sknadOmjYOSFWzv3r3Mnz+fvXv3cvnyZby8vLj33nvp3r07Xbt2LfCeO3v4+3Z0d3cnICCAe+65h4ceeogHH3zQphcqfPHFF2zbto2jR49y4cIFnJ2dqVmzJl26dGHgwIG4ubmxadMmnn32WSZNmmS66vnvRo0aRXx8PDt27MDLyyvPMF9/t3LlSkJCQszO+M0337BgwQL279/P9evXqVq1KuHh4Tz11FP4+fnl6Xv16tV8Q7fdcccdtGnThoEDB1K9enVT378O3fbLL7+QkZFBxYoVadWqFf/617+s9kdSQUO35eTksH79elavXs2RI0fyDN3WsWNHHnnkEbvdKrRnzx4WLlxo+m7kDt3Wtm1b+vTpU+jQbeXLl6dWrVq0adOGPn36lJijQrakgigiIoLOIYqIiAAqiCIiIoAKooiICKCCKCIiAqggioiIACqIIiIigAqiiIgIoIIoIiICqCCKiIgA8H8IVBJAoInv9gAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot results!\n", "fig, ax = plt.subplots(figsize=(6.5,5))\n", "ax = sns.histplot(x='Method', hue='Rank', weights='Percentage', multiple='stack', data=df_view_ordered, shrink=0.6, palette=\"colorblind\", legend=False)\n", "ax.spines[\"right\"].set_visible(False)\n", "ax.spines['top'].set_visible(False)\n", "ax.tick_params(axis='both', which='major', labelsize=16)\n", "ax.set_ylabel('Frequency of rank')\n", "ax.set_xlabel('')\n", "ax.set_xticklabels([\"A\", \"B\", \"C\", \"D\", \"SAL\", \"OCC\", \"IG\", \"GD\"])\n", "plt.legend(loc='upper center', bbox_to_anchor=(0.5, 1.1), ncol=4, fancybox=True, shadow=False, labels=['1st', \"2nd\", \"3rd\", \"4th\"])\n", "plt.axvline(x=3.5, ymax=0.95, color='black', linestyle='-')\n", "plt.tight_layout();" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "bXYjPlIMztc1" }, "outputs": [], "source": [] } ], "metadata": { "accelerator": "GPU", "colab": { "collapsed_sections": [], "provenance": [ { "file_id": "1nMiFlKaXP_F5rbeFwc35BL4SwO2ktnEs", "timestamp": 1627483591348 }, { "file_id": "14H0YjeULfWNdvzhVJbiScA0sUcLhGmY0", "timestamp": 1627472772689 }, { "file_id": "1tlXprNNO0PAcdH4Wh5ThFWgknpSQTkmd", "timestamp": 1626956510892 } ], "toc_visible": true }, "gpuClass": "premium", "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.13" } }, "nbformat": 4, "nbformat_minor": 1 }