Last active
December 14, 2022 18:20
-
-
Save dizys/c427e9229866cffe249a698ea4147d16 to your computer and use it in GitHub Desktop.
Plot a confusion matrix in Jupyter Notebook. A piece of utility code snippet from fastai library.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"provenance": [], | |
"authorship_tag": "ABX9TyNn7oaMu+OmImZXuAPu5d2g", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/dizys/c427e9229866cffe249a698ea4147d16/confusion-matrix.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
" import matplotlib.pyplot as plt\n", | |
" import numpy as np" | |
], | |
"metadata": { | |
"id": "aYFJNLHWsMmo" | |
}, | |
"execution_count": 1, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"vocab = [\"ai\", \"original\"]\n", | |
"TN = 3 # original images correctly detected.\n", | |
"TP = 17 # ai images correctly detected.\n", | |
"FP = 13 # original images falsly detected as ai ones.\n", | |
"FN = 283 # ai images falsly detected as original ones.\n", | |
"cm = np.array([\n", | |
" [TP, FN],\n", | |
" [FP, TN]\n", | |
"])" | |
], | |
"metadata": { | |
"id": "lU-RoAsgs651" | |
}, | |
"execution_count": 2, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 311 | |
}, | |
"id": "YkJ8zXCBsHce", | |
"outputId": "4b13ff46-0750-4a26-e1d0-0f92074f8ff0" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
], | |
"image/png": "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\n" | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
} | |
], | |
"source": [ | |
"\n", | |
"fig = plt.figure()\n", | |
"plt.imshow(cm, interpolation='nearest', cmap=\"Blues\")\n", | |
"plt.title(\"Confusion matrix\")\n", | |
"tick_marks = np.arange(len(vocab))\n", | |
"plt.xticks(tick_marks, vocab, rotation=90)\n", | |
"plt.yticks(tick_marks, vocab, rotation=0)\n", | |
"\n", | |
"thresh = cm.max() / 2.\n", | |
"for i in range(cm.shape[0]):\n", | |
" for j in range(cm.shape[1]):\n", | |
" coeff = f'{cm[i, j]}'\n", | |
" plt.text(j, i, coeff, horizontalalignment=\"center\", verticalalignment=\"center\", color=\"white\"\n", | |
" if cm[i, j] > thresh else \"black\")\n", | |
"\n", | |
"ax = fig.gca()\n", | |
"ax.set_ylim(len(vocab)-.5,-.5)\n", | |
"\n", | |
"plt.tight_layout()\n", | |
"plt.ylabel('Actual')\n", | |
"plt.xlabel('Predicted')\n", | |
"plt.grid(False)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [], | |
"metadata": { | |
"id": "Ggmx0fDwvNhA" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment