You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
M2_SETI/D3/TP/TP_SETI_SVM/plot_digits_classification....

364 lines
64 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"# Recognizing hand-written digits\n",
"\n",
"This example shows how scikit-learn can be used to recognize images of\n",
"hand-written digits, from 0-9.\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Author: Gael Varoquaux <gael dot varoquaux at normalesup dot org>\n",
"# License: BSD 3 clause\n",
"\n",
"# Standard scientific Python imports\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Import datasets, classifiers and performance metrics\n",
"from sklearn import datasets, svm, metrics\n",
"from sklearn.model_selection import train_test_split"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Digits dataset\n",
"\n",
"The digits dataset consists of 8x8\n",
"pixel images of digits. The ``images`` attribute of the dataset stores\n",
"8x8 arrays of grayscale values for each image. We will use these arrays to\n",
"visualize the first 4 images. The ``target`` attribute of the dataset stores\n",
"the digit each image represents and this is included in the title of the 4\n",
"plots below.\n",
"\n",
"Note: if we were working from image files (e.g., 'png' files), we would load\n",
"them using :func:`matplotlib.pyplot.imread`.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxsAAADSCAYAAAAi0d0oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAA9hAAAPYQGoP6dpAAASFklEQVR4nO3db5CVZd0H8N8KsRsBsiLkkiUsOmPJIAHNJCbgsBCkBkmgLxhZxgYqGaM/M8sU5oJlkjZjhRnxBgNzlDLIJlMY2JymN7GyloYzSyw6GU6Kyx9F/no/L57HfaIld8Hr8rC7n88MM+x1zv29rwP82POd++w5ZUVRFAEAAJDYOaXeAAAA0D0pGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBtnoLa2NoYNG3ZGx9bX10dZWVnaDcFZyJxAx8wJdMycdG3dqmyUlZV16ldDQ0Opt3rW+dOf/hSf+tSnom/fvnHBBRfErbfeGq+//nqpt0UG5uTMPPnkk3HzzTfHyJEjo1evXmf8jY+uwZycvkOHDsV9990XU6dOjaqqqujfv398/OMfj/vvvz9OnDhR6u2RgTk5M3feeWd88pOfjMGDB0dFRUVccsklsXjx4njllVdKvbUsyoqiKEq9iVTWrVt30tc///nPY9OmTbF27dqT1qdMmRIf/OAHz/g8x44di7feeivKy8tP+9jjx4/H8ePHo6Ki4ozPn1pTU1NcccUV8dGPfjQWLFgQ//jHP+Kee+6Jq6++Oh5//PFSb4/EzMmZqa2tjYcffjjGjBkTL774YvTq1St2795d6m2RiTk5fc8++2yMGjUqJk+eHFOnTo0BAwbEE088Eb/+9a/jpptuigceeKDUWyQxc3JmZs2aFYMHD45LL700+vfvHzt27IjVq1fHkCFDoqmpKT7wgQ+UeotpFd3YLbfcUnTmIb7xxhvvwW7OXtOnTy+qqqqK/fv3t62tXr26iIjiiSeeKOHOeC+Yk8556aWXiqNHjxZFURTXXHNNcdFFF5V2Q7ynzEnHXnnlleLZZ59ttz5//vwiIorm5uYS7Ir3kjk5c7/85S+LiCgeeuihUm8luW71MqrOmDRpUowcOTIaGxtjwoQJ0bdv3/jmN78ZEREbN26Ma665JoYOHRrl5eUxYsSIuOOOO9pd/v3P1w7u3r07ysrK4p577omf/exnMWLEiCgvL49PfOIT8ec///mkY0/12sGysrJYtGhRbNiwIUaOHBnl5eVx2WWXxe9///t2+29oaIhx48ZFRUVFjBgxIlatWnXKzFdffTWef/75OHTo0Dv+eRw4cCA2bdoUc+fOjQEDBrSt33TTTdGvX7945JFH3vF4uidz0t7QoUPjfe97X4f3o+cwJyc7//zz47LLLmu3/rnPfS4iInbs2PGOx9M9mZPOefvx7du374yOP5v1LvUGSmHv3r0xffr0uPHGG2Pu3Lltl/bWrFkT/fr1i6997WvRr1+/2LJlS3z729+OAwcOxN13391h7i9+8Ys4ePBgLFy4MMrKyuL73/9+XH/99bFr164On6T88Y9/jEcffTS+/OUvR//+/eNHP/pRzJo1K1588cUYNGhQRERs3749pk2bFlVVVbFs2bI4ceJELF++PAYPHtwub+XKlbFs2bLYunVrTJo06b+e969//WscP348xo0bd9J6nz59YvTo0bF9+/YOHzfdkzmBjpmTjr388ssR8b9lhJ7JnLRXFEXs3bs3jh8/Hs3NzbFkyZLo1atX9/xeVOpLKzmd6nLexIkTi4gofvrTn7a7/6FDh9qtLVy4sOjbt29x+PDhtrV58+ad9BKKlpaWIiKKQYMGFa+99lrb+saNG4uIKB577LG2tdtvv73dniKi6NOnT7Fz5862tWeeeaaIiOLHP/5x29p1111X9O3bt3jppZfa1pqbm4vevXu3y3z7PFu3bm33mP7d+vXri4gonnrqqXa3zZ49u7jgggve8Xi6PnPS8Zz8Jy+j6nnMyenPSVEUxZEjR4qPfexjxfDhw4tjx46d9vF0Leak83OyZ8+eIiLafl144YXFww8/3Klju5oe9zKqiIjy8vKYP39+u/X3v//9bb8/ePBgvPrqq3HVVVfFoUOH4vnnn+8w94YbbojKysq2r6+66qqIiNi1a1eHx9bU1MSIESPavh41alQMGDCg7dgTJ07E5s2bY+bMmTF06NC2+1188cUxffr0dnn19fVRFEWHDfnNN9+MiDjlD11VVFS03U7PY06gY+bknS1atCj+9re/xcqVK6N37x75YgrCnJzKeeedF5s2bYrHHnssli9fHueff363fRfQHjn5H/rQh6JPnz7t1p977rlYunRpbNmyJQ4cOHDSbfv37+8w9yMf+chJX789AK2trad97NvHv33sv/71r3jzzTfj4osvbne/U6111tuDfuTIkXa3HT58+KT/COhZzAl0zJz8d3fffXesXr067rjjjvjMZz6TLJeux5y016dPn6ipqYmIiGuvvTYmT54cV155ZQwZMiSuvfbad51/NumRZeNUT6D37dsXEydOjAEDBsTy5ctjxIgRUVFREU8//XTU1dXFW2+91WFur169TrledOLdhd/Nse9GVVVVRETs2bOn3W179uw5qc3Ts5gT6Jg5ObU1a9ZEXV1dfPGLX4ylS5e+Z+fl7GROOjZ+/PioqqqKBx98UNnorhoaGmLv3r3x6KOPxoQJE9rWW1paSrir/zdkyJCoqKiInTt3trvtVGudNXLkyOjdu3ds27Yt5syZ07Z+9OjRaGpqOmkNeuqcwOno6XOycePG+MIXvhDXX3993Hfffe86j+6pp8/JqRw+fLhTV3S6mh75Mxun8nbD/fdGe/To0fjJT35Sqi2dpFevXlFTUxMbNmyIf/7zn23rO3fuPOUH73X2LdjOPffcqKmpiXXr1sXBgwfb1teuXRuvv/56zJ49O92DoMvrqXMCp6Mnz8lTTz0VN954Y0yYMCEefPDBOOccTzM4tZ46J2+88cYp7/OrX/0qWltb2707aHfgysb/GT9+fFRWVsa8efPi1ltvjbKysli7du1Z9fKM+vr6ePLJJ+PKK6+ML33pS3HixIlYuXJljBw5Mpqamk667+m8Bdt3v/vdGD9+fEycOLHtE8R/8IMfxNSpU2PatGn5HhBdTk+ek7/85S/xm9/8JiL+95vN/v374zvf+U5ERFx++eVx3XXX5Xg4dEE9dU5eeOGF+OxnPxtlZWXx+c9/PtavX3/S7aNGjYpRo0ZleDR0RT11Tpqbm6OmpiZuuOGGuPTSS+Occ86Jbdu2xbp162LYsGHxla98Je+DKgFl4/8MGjQofvvb38bXv/71WLp0aVRWVsbcuXNj8uTJ8elPf7rU24uIiLFjx8bjjz8e3/jGN+K2226LD3/4w7F8+fLYsWNHp9614b8ZM2ZMbN68Oerq6uKrX/1q9O/fP26++eb43ve+l3D3dAc9eU6efvrpuO22205ae/vrefPmKRu06alz0tLS0vYSkFtuuaXd7bfffruyQZueOicXXnhhzJo1K7Zs2RIPPPBAHDt2LC666KJYtGhRfOtb32r7jI/upKw4myokZ2TmzJnx3HPPRXNzc6m3AmctcwIdMyfQMXNyeryYsov5z8+9aG5ujt/97nc+JwD+jTmBjpkT6Jg5efdc2ehiqqqqora2Nqqrq+OFF16I+++/P44cORLbt2+PSy65pNTbg7OCOYGOmRPomDl59/zMRhczbdq0eOihh+Lll1+O8vLyuOKKK+LOO+/0Dx7+jTmBjpkT6Jg5efdc2QAAALLwMxsAAEAWygYAAJCFsgEAAGTR7X5A/D8/sTSFurq65JlTpkxJnhkRcddddyXPrKysTJ5J95PjbQD37duXPDMiYtmyZckzZ8yYkTyT7qehoSF55syZM5NnRkSMHj06eWaOx0/prVixInnmkiVLkmcOHz48eWZERGNjY/LM7vTcy5UNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALLoXeoNpFZXV5c8s6WlJXlma2tr8syIiPPOOy955iOPPJI8c/bs2ckzKa2BAwcmz/zDH/6QPDMiYuvWrckzZ8yYkTyT0mpqakqeefXVVyfPPPfcc5NnRkTs3r07Sy6ltWTJkuSZOZ4nrFq1KnnmwoULk2dGRDQ2NibPrKmpSZ5ZKq5sAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGTRu5Qnb2xsTJ7Z0tKSPPPvf/978szq6urkmRERU6ZMSZ6Z4+9p9uzZyTPpvKampuSZDQ0NyTNzGT16dKm3QBewYcOG5JmXX3558syZM2cmz4yIWLZsWZZcSmvBggXJM+vq6pJnjh07Nnnm8OHDk2dGRNTU1GTJ7S5c2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIoncpT97a2po8c8yYMckzq6urk2fmMnbs2FJvgcTuvffe5Jn19fXJM/fv3588M5dJkyaVegt0AYsXL06eOWzYsOSZOfYZETFjxowsuZRWjuc0u3btSp7Z0tKSPLOmpiZ5ZkSe57OVlZXJM0vFlQ0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALHqX8uStra3JM6dMmZI8syvJ8WdaWVmZPJPOW7x4cfLM2tra5Jld6d/Jvn37Sr0FEsvxd3rvvfcmz9ywYUPyzFzWrFlT6i3QRVRXVyfPfO2115Jn1tTUJM/Mlbt58+bkmaX6Pu3KBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJBF71KevLKyMnlmY2Nj8swcWltbs+Ru27YteeacOXOSZ0IpNTU1Jc8cPXp08kw6r76+PnnmD3/4w+SZOWzYsCFL7sCBA7PkQmfkeI64efPm5JkREQsXLkyeuWLFiuSZd911V/LMznBlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACALZQMAAMhC2QAAALJQNgAAgCyUDQAAIAtlAwAAyELZAAAAslA2AACALJQNAAAgC2UDAADIQtkAAACyUDYAAIAslA0AACCL3qU8eXV1dfLMbdu2Jc9cv359l8jMpa6urtRbAHhHtbW1yTMbGhqSZz7zzDPJM2fOnJk8MyJixowZyTPnz5+fPDPHPjk9S5YsSZ5ZU1OTPLO1tTV5ZkTEpk2bkmfOmTMneWapuLIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkEXvUp68uro6eeaKFSuSZ9bV1SXPHDduXPLMiIjGxsYsuXQvAwcOTJ45Y8aM5JkbN25MnhkR0dDQkDyztrY2eSadN3r06OSZTU1NXSKzvr4+eWZEnvkbNmxY8swc//dweiorK5NnLliwIHlmLnPmzEmeuWrVquSZpeLKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWygYAAJCFsgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABkoWwAAABZKBsAAEAWZUVRFKXeBAAA0P24sgEAAGShbAAAAFkoGwAAQBbKBgAAkIWyAQAAZKFsAAAAWSgbAABAFsoGAACQhbIBAABk8T8LB8QXOiCcUAAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1000x300 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"digits = datasets.load_digits()\n",
"\n",
"_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))\n",
"for ax, image, label in zip(axes, digits.images, digits.target):\n",
" ax.set_axis_off()\n",
" ax.imshow(image, cmap=plt.cm.gray_r, interpolation=\"nearest\")\n",
" ax.set_title(\"Training: %i\" % label)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Classification\n",
"\n",
"To apply a classifier on this data, we need to flatten the images, turning\n",
"each 2-D array of grayscale values from shape ``(8, 8)`` into shape\n",
"``(64,)``. Subsequently, the entire dataset will be of shape\n",
"``(n_samples, n_features)``, where ``n_samples`` is the number of images and\n",
"``n_features`` is the total number of pixels in each image.\n",
"\n",
"We can then split the data into train and test subsets and fit a support\n",
"vector classifier on the train samples. The fitted classifier can\n",
"subsequently be used to predict the value of the digit for the samples\n",
"in the test subset.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# flatten the images\n",
"n_samples = len(digits.images)\n",
"data = digits.images.reshape((n_samples, -1))\n",
"\n",
"# Create a classifier: a support vector classifier\n",
"clf = svm.SVC(gamma=0.001)\n",
"\n",
"# Split data into 50% train and 50% test subsets\n",
"X_train, X_test, y_train, y_test = train_test_split(\n",
" data, digits.target, test_size=0.5, shuffle=False\n",
")\n",
"\n",
"# Learn the digits on the train subset\n",
"clf.fit(X_train, y_train)\n",
"\n",
"# Predict the value of the digit on the test subset\n",
"predicted = clf.predict(X_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Below we visualize the first 4 test samples and show their predicted\n",
"digit value in the title.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxsAAADSCAYAAAAi0d0oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAUXUlEQVR4nO3dfWxV9f0H8E+hqJQiZVgV0R9lDohz04qbLhlqHagRNXTGTd1DaM0y9iDSmc2HLZFOjU5HTE1lRrOsdYtG5wwlbuqmGTTiHqMtmToW5lqU4IQltC4OlNLz+4O0roK0Zefb2+LrlfQPzr33fb693E/vfd9ze1qUZVkWAAAAORtX6AUAAACHJmUDAABIQtkAAACSUDYAAIAklA0AACAJZQMAAEhC2QAAAJJQNgAAgCSUDQAAIAllY5gqKiqipqam/9/r1q2LoqKiWLduXW77KCoqivr6+tzyYKSZExgaswKDMydj25gqG83NzVFUVNT/dcQRR8ScOXPi6quvjjfeeKPQyxuWJ554Ykw9qH/+85/Hpz71qSgrK4tp06bFOeecE7/61a8KvSz2w5wUjjkZW8xK4e3evTs++tGPRlFRUaxcubLQy2E/zEnh3HPPPXHSSSfF4YcfHjNmzIhrr7023nrrrUIva9iKC72Ag3HzzTfHrFmzYteuXbF+/fq4995744knnogXX3wxSkpKRnQtZ599duzcuTMOO+ywYd3uiSeeiFWrVu33Qb9z584oLh49/zWNjY1xzTXXxEUXXRQ/+MEPYteuXdHc3BwXX3xxPPbYY3HppZcWeonshzkZWeZk7DIrhdPY2BivvvpqoZfBEJiTkXX99dfHnXfeGZdddlksX748Xn755WhsbIyXXnopfv3rXxd6ecMyeu7VYbjwwgvjE5/4REREfOUrX4lp06bFXXfdFWvWrIkrr7xyv7d56623YtKkSbmvZdy4cXHEEUfkmpl33v+qsbExPvnJT8bjjz8eRUVFERFx1VVXxYwZM+KBBx7wImqUMicjy5yMXWalMLZt2xY333xzXH/99XHTTTcVejkMwpyMnNdffz3uuuuu+PKXvxw//elP+7fPmTMnli1bFo8//nhccsklBVzh8Iypj1G9n8985jMREdHR0RERETU1NVFaWhqvvPJKLFq0KCZPnhxf/OIXIyKit7c3Ghoa4uSTT44jjjgijjnmmFi6dGns2LFjQGaWZXHrrbfG8ccfHyUlJXHuuefGSy+9tM++3+9zg3/84x9j0aJFMXXq1Jg0aVKccsopcffdd/evb9WqVRERAw5N9tnf5wbb2triwgsvjCOPPDJKS0tjwYIF8Yc//GHAdfoOdT733HNx7bXXRnl5eUyaNCk++9nPxvbt2wdct7u7OzZu3Bjd3d2D3r9vvvlmHH300QPW2LeOiRMnDnp7Rgdzspc5YTBmZa9Us9LnhhtuiLlz58aXvvSlId+G0cOc7JViTn7/+99HT09PXHHFFQO29/374YcfPuDtR5sxeWTjvV555ZWIiJg2bVr/tp6enrjgggti/vz5sXLlyv5DfEuXLo3m5uaora2Na665Jjo6OuKee+6Jtra2eO6552LChAkREXHTTTfFrbfeGosWLYpFixbFCy+8EOeff3688847g67n6aefjosvvjimT58ey5cvj2OPPTb++te/xi9/+ctYvnx5LF26NLZu3RpPP/10/OxnPxs076WXXoqzzjorjjzyyLjuuutiwoQJcd9990VVVVW0trbGmWeeOeD6y5Yti6lTp8aKFSuis7MzGhoa4uqrr45HHnmk/zqrV6+O2traaGpqGvBLV/tTVVUVv/jFL6KxsTEuueSS2LVrVzQ2NkZ3d3csX7580PUzOpgTc8LQmJW0sxIR8ac//SkeeOCBWL9+/YAXfIwd5iTdnLz99tsREfu8UdV3fz7//PODrn9UycaQpqamLCKyZ555Jtu+fXv22muvZQ8//HA2bdq0bOLEidmWLVuyLMuyJUuWZBGR3XDDDQNu/+yzz2YRkT344IMDtj/11FMDtm/bti077LDDsosuuijr7e3tv953v/vdLCKyJUuW9G9bu3ZtFhHZ2rVrsyzLsp6enmzWrFnZzJkzsx07dgzYz39nffOb38ze7+6PiGzFihX9/66urs4OO+yw7JVXXunftnXr1mzy5MnZ2Wefvc/9s3DhwgH7+ta3vpWNHz8+6+rq2ue6TU1N+13Df3vjjTeyBQsWZBHR/3XUUUdlv/vd7wa9LSPPnJgThsasFGZWent7szPOOCO78sorsyzLso6Ojiwish/+8IeD3paRZ05Gfk6ef/75LCKyW265ZcD2vvustLT0gLcfbcbkx6gWLlwY5eXlccIJJ8QVV1wRpaWlsXr16pgxY8aA6339618f8O9H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",
"text/plain": [
"<Figure size 1000x300 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))\n",
"for ax, image, prediction in zip(axes, X_test, predicted):\n",
" ax.set_axis_off()\n",
" image = image.reshape(8, 8)\n",
" ax.imshow(image, cmap=plt.cm.gray_r, interpolation=\"nearest\")\n",
" ax.set_title(f\"Prediction: {prediction}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
":func:`~sklearn.metrics.classification_report` builds a text report showing\n",
"the main classification metrics.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Classification report for classifier SVC(gamma=0.001):\n",
" precision recall f1-score support\n",
"\n",
" 0 1.00 0.99 0.99 88\n",
" 1 0.99 0.97 0.98 91\n",
" 2 0.99 0.99 0.99 86\n",
" 3 0.98 0.87 0.92 91\n",
" 4 0.99 0.96 0.97 92\n",
" 5 0.95 0.97 0.96 91\n",
" 6 0.99 0.99 0.99 91\n",
" 7 0.96 0.99 0.97 89\n",
" 8 0.94 1.00 0.97 88\n",
" 9 0.93 0.98 0.95 92\n",
"\n",
" accuracy 0.97 899\n",
" macro avg 0.97 0.97 0.97 899\n",
"weighted avg 0.97 0.97 0.97 899\n",
"\n",
"\n"
]
}
],
"source": [
"print(\n",
" f\"Classification report for classifier {clf}:\\n\"\n",
" f\"{metrics.classification_report(y_test, predicted)}\\n\"\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also plot a `confusion matrix <confusion_matrix>` of the\n",
"true digit values and the predicted digit values.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Confusion matrix:\n",
"[[87 0 0 0 1 0 0 0 0 0]\n",
" [ 0 88 1 0 0 0 0 0 1 1]\n",
" [ 0 0 85 1 0 0 0 0 0 0]\n",
" [ 0 0 0 79 0 3 0 4 5 0]\n",
" [ 0 0 0 0 88 0 0 0 0 4]\n",
" [ 0 0 0 0 0 88 1 0 0 2]\n",
" [ 0 1 0 0 0 0 90 0 0 0]\n",
" [ 0 0 0 0 0 1 0 88 0 0]\n",
" [ 0 0 0 0 0 0 0 0 88 0]\n",
" [ 0 0 0 1 0 1 0 0 0 90]]\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted)\n",
"disp.figure_.suptitle(\"Confusion Matrix\")\n",
"print(f\"Confusion matrix:\\n{disp.confusion_matrix}\")\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If the results from evaluating a classifier are stored in the form of a\n",
"`confusion matrix <confusion_matrix>` and not in terms of `y_true` and\n",
"`y_pred`, one can still build a :func:`~sklearn.metrics.classification_report`\n",
"as follows:\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Classification report rebuilt from confusion matrix:\n",
" precision recall f1-score support\n",
"\n",
" 0 1.00 0.99 0.99 88\n",
" 1 0.99 0.97 0.98 91\n",
" 2 0.99 0.99 0.99 86\n",
" 3 0.98 0.87 0.92 91\n",
" 4 0.99 0.96 0.97 92\n",
" 5 0.95 0.97 0.96 91\n",
" 6 0.99 0.99 0.99 91\n",
" 7 0.96 0.99 0.97 89\n",
" 8 0.94 1.00 0.97 88\n",
" 9 0.93 0.98 0.95 92\n",
"\n",
" accuracy 0.97 899\n",
" macro avg 0.97 0.97 0.97 899\n",
"weighted avg 0.97 0.97 0.97 899\n",
"\n",
"\n"
]
}
],
"source": [
"# The ground truth and predicted lists\n",
"y_true = []\n",
"y_pred = []\n",
"cm = disp.confusion_matrix\n",
"\n",
"# For each cell in the confusion matrix, add the corresponding ground truths\n",
"# and predictions to the lists\n",
"for gt in range(len(cm)):\n",
" for pred in range(len(cm)):\n",
" y_true += [gt] * cm[gt][pred]\n",
" y_pred += [pred] * cm[gt][pred]\n",
"\n",
"print(\n",
" \"Classification report rebuilt from confusion matrix:\\n\"\n",
" f\"{metrics.classification_report(y_true, y_pred)}\\n\"\n",
")"
]
}
],
"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.10"
},
"vscode": {
"interpreter": {
"hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}