iui-group-l-name-zensiert/0-pilot-project/MNIST.ipynb

1037 lines
79 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "7a0c752a",
"metadata": {},
"source": [
"### Load MNIST dataset"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "e07d82fe",
"metadata": {},
"outputs": [],
"source": [
"# Python ≥3.5 is required\n",
"import sys\n",
"assert sys.version_info >= (3, 5)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1f97dcb1",
"metadata": {},
"outputs": [],
"source": [
"# scikit-learn ≥0.20 is required\n",
"import sklearn\n",
"assert sklearn.__version__ >= \"0.20\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "01f83832",
"metadata": {},
"outputs": [],
"source": [
"# common imports\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "affa0e2b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"sklearn.utils.Bunch"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# import function to scikit-learn datasets\n",
"from sklearn.datasets import fetch_openml\n",
"\n",
"# load specified dataset (MNIST)\n",
"mnist = fetch_openml('mnist_784', version=1, as_frame=False)\n",
"\n",
"# print type of dataset\n",
"type(mnist)"
]
},
{
"cell_type": "markdown",
"id": "4d51fd43",
"metadata": {},
"source": [
"Bunch objects are sometimes used as an output for functions and methods. They extend dictionaries by enabling values to be accessed by key, bunch[\"value_key\"], or by an attribute, bunch.value_key.\\\n",
"=> dictionary"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "78be57ab",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dict_keys(['name', 'age'])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Reminder of how dicts work\n",
"example = {'name': 'somename', 'age': 15}\n",
"example.keys()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "d0450c41",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dict_keys(['data', 'target', 'frame', 'categories', 'feature_names', 'target_names', 'DESCR', 'details', 'url'])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# let us check out the keys of the mnist dataset\n",
"mnist.keys()"
]
},
{
"cell_type": "markdown",
"id": "e61e2adb",
"metadata": {},
"source": [
"Datasets loaded by Scikit-Learn generally have a similar dictionary structure, including the following:\\\n",
"* __DESCR__ a key describing the dataset\n",
"* __data__ a key containing an array with one row per instance and one column per feature\n",
"* __target__ a key containing an array with labels, one for each row of the data key"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "fe285433",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"**Author**: Yann LeCun, Corinna Cortes, Christopher J.C. Burges \\n**Source**: [MNIST Website](http://yann.lecun.com/exdb/mnist/) - Date unknown \\n**Please cite**: \\n\\nThe MNIST database of handwritten digits with 784 features, raw data available at: http://yann.lecun.com/exdb/mnist/. It can be split in a training set of the first 60,000 examples, and a test set of 10,000 examples \\n\\nIt is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image. It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. The original black and white (bilevel) images from NIST were size normalized to fit in a 20x20 pixel box while preserving their aspect ratio. The resulting images contain grey levels as a result of the anti-aliasing technique used by the normalization algorithm. the images were centered in a 28x28 image by computing the center of mass of the pixels, and translating the image so as to position this point at the center of the 28x28 field. \\n\\nWith some classification methods (particularly template-based methods, such as SVM and K-nearest neighbors), the error rate improves when the digits are centered by bounding box rather than center of mass. If you do this kind of pre-processing, you should report it in your publications. The MNIST database was constructed from NIST's NIST originally designated SD-3 as their training set and SD-1 as their test set. However, SD-3 is much cleaner and easier to recognize than SD-1. The reason for this can be found on the fact that SD-3 was collected among Census Bureau employees, while SD-1 was collected among high-school students. Drawing sensible conclusions from learning experiments requires that the result be independent of the choice of training set and test among the complete set of samples. Therefore it was necessary to build a new database by mixing NIST's datasets. \\n\\nThe MNIST training set is composed of 30,000 patterns from SD-3 and 30,000 patterns from SD-1. Our test set was composed of 5,000 patterns from SD-3 and 5,000 patterns from SD-1. The 60,000 pattern training set contained examples from approximately 250 writers. We made sure that the sets of writers of the training set and test set were disjoint. SD-1 contains 58,527 digit images written by 500 different writers. In contrast to SD-3, where blocks of data from each writer appeared in sequence, the data in SD-1 is scrambled. Writer identities for SD-1 is available and we used this information to unscramble the writers. We then split SD-1 in two: characters written by the first 250 writers went into our new training set. The remaining 250 writers were placed in our test set. Thus we had two sets with nearly 30,000 examples each. The new training set was completed with enough examples from SD-3, starting at pattern # 0, to make a full set of 60,000 training patterns. Similarly, the new test set was completed with SD-3 examples starting at pattern # 35,000 to make a full set with 60,000 test patterns. Only a subset of 10,000 test images (5,000 from SD-1 and 5,000 from SD-3) is available on this site. The full 60,000 sample training set is available.\\n\\nDownloaded from openml.org.\""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mnist[\"DESCR\"]"
]
},
{
"cell_type": "markdown",
"id": "5a70a746",
"metadata": {},
"source": [
"### Prepare the MNIST dataset"
]
},
{
"cell_type": "markdown",
"id": "a9b7a120",
"metadata": {},
"source": [
"$f(X) = y$\n",
"\n",
"$X$ is the data that we have and\\\n",
"$y$ is what we want to predict\n",
"\n",
"In this example, we have images of handwritten digits $X$ and want to predict the digit $y$. In ML, we show the algorithm examples of X and y so that it learns the function $f(X) = y$. If it is successful, we can present $X$ to the algorithm that we did not train with and still get the $y$."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4e02cf2a",
"metadata": {},
"outputs": [],
"source": [
"X, y = mnist[\"data\"], mnist[\"target\"]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "001d736f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"numpy.ndarray"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(X)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "b344be1d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(70000, 784)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X.shape"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "cef23e9f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(70000,)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y.shape"
]
},
{
"cell_type": "markdown",
"id": "fe3b1259",
"metadata": {},
"source": [
"### Plot data"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "953d9415",
"metadata": {},
"outputs": [],
"source": [
"# import plotting libraries\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "b68f6cee",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'numpy.ndarray'>\n",
"(784,)\n"
]
}
],
"source": [
"# numpy type\n",
"print(type(X))\n",
"\n",
"example_digit = X[0]\n",
"print(example_digit.shape)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "8779b1a2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(28, 28)\n"
]
}
],
"source": [
"# change shape\n",
"example_digit = example_digit.reshape(28, 28)\n",
"print(example_digit.shape)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "dcc605cf",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# plot example digit\n",
"plt.imshow(example_digit, cmap=mpl.cm.binary)\n",
"#plt.axis(\"off\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "6d41d752",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5\n",
"<class 'str'>\n"
]
}
],
"source": [
"# plot label of example image\n",
"print(y[0])\n",
"print(type(y[0]))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "230cfd35",
"metadata": {},
"outputs": [],
"source": [
"# convert string labels to int\n",
"y = y.astype(np.uint8)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "25a3a2e7",
"metadata": {},
"outputs": [],
"source": [
"# function to quickly plot an image\n",
"def plot_digit(data):\n",
" image = data.reshape(28, 28)\n",
" plt.imshow(image, cmap = mpl.cm.binary, interpolation=\"nearest\")\n",
" plt.axis(\"off\")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "f1552762",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# quickly plot a single digit\n",
"plot_digit(X[1])"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "74b3a063",
"metadata": {},
"outputs": [],
"source": [
"# function to quickly plot several digits\n",
"def plot_digits(instances, **options):\n",
" size = 28\n",
" images = [instance.reshape(size,size) for instance in instances]\n",
" image = np.concatenate(images, axis=1)\n",
" plt.imshow(image, cmap = mpl.cm.binary, **options)\n",
" plt.axis(\"off\")"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "949b3914",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 648x648 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# quickly plot several digits\n",
"plt.figure(figsize=(9,9))\n",
"plot_digits(X[100:110])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "ec8a9d34",
"metadata": {},
"source": [
"### Prepare data for machine learning"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "febbd286",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"70000"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# how many images do we have\n",
"len(X)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "fff839b6",
"metadata": {},
"outputs": [],
"source": [
"# we use the first 60000 for training and test with the other 10000 images\n",
"X_train, X_test, y_train, y_test = X[:100], X[100:], y[:100], y[100:]"
]
},
{
"cell_type": "markdown",
"id": "2bdbeb4e",
"metadata": {},
"source": [
"### Train classifier"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "4c32ae9f",
"metadata": {},
"outputs": [],
"source": [
"# import support vector machine\n",
"import sklearn.svm"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "fe06ae55",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SVC(C=10, kernel='poly')"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# specify the parameter of the SVM\n",
"classifier = sklearn.svm.SVC(C=10, gamma=\"scale\", kernel=\"poly\") #gamma=0.1 degree=3\n",
"\n",
"# train the SVM\n",
"classifier.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "e6209258",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGJUlEQVR4nO3dO2gUexjGYVds7BIlaVRsbLQTLUQRC0G0shBBCxtFwRtY2WjlpbeJlSBio2UQrMSAKIJgFwUxsdLGIuAFiRfYUx9O9pvDTja+yT5P6cvsjpEfA/7ZTafb7a4C8qz+2zcALEycEEqcEEqcEEqcEGpNw+6/cmHwOgv9oScnhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhFrzt29gGM3NzfXc1q1bt4R3srTm5+fL/dy5cz23Bw8elNe+ePGi3Ldv317uiTw5IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZRzzgG4c+dOuU9MTPTcHj16VF67cePGvu4pwczMTLnfu3ev79eenZ0td+ecwKIRJ4QSJ4QSJ4QSJ4QSJ4RylNKHd+/elfvFixfL/devXz23qamp8toTJ06Ue7I2RyXDyJMTQokTQokTQokTQokTQokTQokTQjnn7MPv37/LvTrHbHL37t1yTz7n/PTpU7lPTk72/dpbt24t9127dvX92qk8OSGUOCGUOCGUOCGUOCGUOCGUOCGUc04WTdM5ZtNXY3Y6nZ7btWvXymuX81eG9uLJCaHECaHECaHECaHECaHECaHECaGccw5At9vt+9rR0dFFvJOldfv27XJv83PZu3dv39cuV56cEEqcEEqcEEqcEEqcEEqcEEqcEMo5Zx8+fPhQ7tXnEpscP36872sH7fPnz+X+7du3cm/6ubT5ua1EnpwQSpwQSpwQSpwQSpwQSpwQylHKAl69elXux44dW6I7yXL58uVy//jxY6vXv379es9t/fr1rV57OfLkhFDihFDihFDihFDihFDihFDihFBDec45PT1d7leuXCn3+fn5cm/z0adbt26V+9u3b8v91KlT5b5hw4Zy//LlS89tamqqvLbJpk2byv306dM9t9Wrh+85Mnx/Y1gmxAmhxAmhxAmhxAmhxAmhxAmhVuw557Nnz3puhw8fLq/9+vXrYt/O//by5ctW+5MnT8q9+rmsWlV/ZrPt5zV3795d7mNjY61ef6Xx5IRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQK/ac8+jRoz236jOL/0e32211/fj4eM/t58+f5bVN9970WdULFy6U+/3793tubf/ee/bsaXX9sPHkhFDihFDihFDihFDihFDihFDihFCdhrOrdgdbAzQzM1PuO3bs6Ll9//691Xvv37+/3Ju+93bz5s09tx8/fpTXXrp0qdybPs/Z5jt1m2zZsqXcnz59Wu5N36m7gi34j+LJCaHECaHECaHECaHECaHECaGW7UfGmv7b/uDBgz239+/fl9devXq13A8dOlTua9euLfc2Jicny/3169flvm/fvsW8nX85cOBAuQ/xUUlfPDkhlDghlDghlDghlDghlDghlDgh1LI952zy8OHDv30LA9F0hjoyMrI0N8LAeXJCKHFCKHFCKHFCKHFCKHFCKHFCqBV7zjms3rx5M7DXbvo85tmzZwf23sPIkxNCiRNCiRNCiRNCiRNCiRNCiRNCOedcZubm5sr95s2b5d7wKx9LJ0+eLPdt27b1/dr8lycnhBInhBInhBInhBInhBInhHKUsszcuHGj3Kenp8u90+mU+86dO3tu58+fL69lcXlyQihxQihxQihxQihxQihxQihxQijnnGGeP39e7hMTEwN9/yNHjvTcxsbGBvre/JsnJ4QSJ4QSJ4QSJ4QSJ4QSJ4QSJ4Ryzhnm8ePH5f7nz59Wrz8+Pl7uZ86cafX6LB5PTgglTgglTgglTgglTgglTgglTgjlnDPM7Oxsq+tHR0fLvelXBI6MjLR6fxaPJyeEEieEEieEEieEEieEEieEEieE6nS73WovR2BRLPhLUz05IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IVTTrwBc8Cv7gMHz5IRQ4oRQ4oRQ4oRQ4oRQ4oRQ/wAj3eVzPh6F+gAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# take a test digit\n",
"test_digit = X[12121]\n",
"plot_digit(test_digit)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "62773b1b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4\n"
]
}
],
"source": [
"# see label for test digit\n",
"print(y[12121])"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "0ce21474",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[4]\n"
]
}
],
"source": [
"# see prediction for test digit\n",
"print(classifier.predict([X[12121]]))"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "78a8e8a7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.27831745, 5.82217802, 0.72414032, 2.85240395, 9.30320665,\n",
" 3.83670072, 4.8744213 , 7.20637122, 1.74812151, 8.27550294]])"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# see propability for all classes\n",
"classifier.decision_function([X[12121]])"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "45d93a99",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# see the classes to understand which received which score\n",
"classifier.classes_"
]
},
{
"cell_type": "markdown",
"id": "fc739051",
"metadata": {},
"source": [
"### Evaluation"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "990a5b7c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy Train 100.0\n"
]
}
],
"source": [
"# trainings accuracy\n",
"wrong_images = X_train[(classifier.predict(X_train)-y_train) != 0]\n",
"percentage = ((1-len(wrong_images)/len(X_train)) * 100)\n",
"print(\"Accuracy Train \" + str(percentage))"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "f125a37d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy Test 58.92989985693848\n"
]
}
],
"source": [
"# test accuracy\n",
"wrong_images = X_test[(classifier.predict(X_test)-y_test) != 0]\n",
"percentage = ((1-len(wrong_images)/len(X_test)) * 100)\n",
"print(\"Accuracy Test \" + str(percentage))"
]
},
{
"cell_type": "markdown",
"id": "bdcb6e6e",
"metadata": {},
"source": [
"Accuracy is strongly influenced by the distribution of the classes in the test data."
]
},
{
"cell_type": "markdown",
"id": "be858cd5",
"metadata": {},
"source": [
"#### Cross Validation\n",
"[Find more information on cross validation here.](https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "7adb1ea7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.67647059 0.63636364 0.84848485]\n"
]
}
],
"source": [
"# cross validation score\n",
"from sklearn.model_selection import cross_val_score\n",
"\n",
"print(cross_val_score(classifier, X_train, y_train, cv=3, scoring=\"accuracy\"))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "11d22c5e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1 0 1 1 9 9 1 3 1 4 3 1 3 6 1 7 1 9 1 9 4 0 9 1 1 2 1 3 7 1 1 1 1 9 0 1 6\n",
" 0 7 6 1 8 1 9 1 9 1 1 1 3 1 0 7 1 4 8 0 9 4 1 4 1 6 0 6 5 6 1 1 0 1 7 1 6\n",
" 3 0 1 1 1 7 6 0 2 6 7 8 1 9 0 4 6 7 4 6 8 0 7 8 3 1]\n"
]
}
],
"source": [
"# prediction of classifier\n",
"from sklearn.model_selection import cross_val_predict\n",
"\n",
"y_train_pred = cross_val_predict(classifier, X_train, y_train, cv=3)\n",
"print(y_train_pred)"
]
},
{
"cell_type": "markdown",
"id": "b54e83a5",
"metadata": {},
"source": [
"#### Precision"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "ef7a9e7e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8456190476190476"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.metrics import precision_score\n",
"\n",
"precision_score(y_train, y_train_pred, average='weighted')"
]
},
{
"cell_type": "markdown",
"id": "da723740",
"metadata": {},
"source": [
"#### Recall"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "cb77bf58",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.72"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.metrics import recall_score\n",
"\n",
"recall_score(y_train, y_train_pred, average='weighted')"
]
},
{
"cell_type": "markdown",
"id": "28867d1b",
"metadata": {},
"source": [
"#### F1 Score"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "0674e0de",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.7283140672193305"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.metrics import f1_score\n",
"\n",
"f1_score(y_train, y_train_pred, average='weighted')"
]
},
{
"cell_type": "markdown",
"id": "da59da11",
"metadata": {},
"source": [
"#### Confusion Matrix"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "adbdeece",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[12 1 0 0 0 0 0 0 0 0]\n",
" [ 0 14 0 0 0 0 0 0 0 0]\n",
" [ 0 2 2 0 0 0 0 1 0 1]\n",
" [ 0 4 0 7 0 0 0 0 0 0]\n",
" [ 0 4 0 0 6 0 1 0 0 0]\n",
" [ 0 4 0 0 0 1 0 0 0 0]\n",
" [ 0 2 0 0 0 0 9 0 0 0]\n",
" [ 0 2 0 0 0 0 0 8 0 0]\n",
" [ 0 2 0 0 0 0 0 0 5 1]\n",
" [ 0 1 0 0 1 0 1 0 0 8]]\n"
]
}
],
"source": [
"# confusing matrix\n",
"from sklearn.metrics import confusion_matrix\n",
"\n",
"print(confusion_matrix(y_train, y_train_pred))"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "fb50c5a4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0.92307692 0.07692308 0. 0. 0. 0.\n",
" 0. 0. 0. 0. ]\n",
" [0. 1. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. ]\n",
" [0. 0.33333333 0.33333333 0. 0. 0.\n",
" 0. 0.16666667 0. 0.16666667]\n",
" [0. 0.36363636 0. 0.63636364 0. 0.\n",
" 0. 0. 0. 0. ]\n",
" [0. 0.36363636 0. 0. 0.54545455 0.\n",
" 0.09090909 0. 0. 0. ]\n",
" [0. 0.8 0. 0. 0. 0.2\n",
" 0. 0. 0. 0. ]\n",
" [0. 0.18181818 0. 0. 0. 0.\n",
" 0.81818182 0. 0. 0. ]\n",
" [0. 0.2 0. 0. 0. 0.\n",
" 0. 0.8 0. 0. ]\n",
" [0. 0.25 0. 0. 0. 0.\n",
" 0. 0. 0.625 0.125 ]\n",
" [0. 0.09090909 0. 0. 0.09090909 0.\n",
" 0.09090909 0. 0. 0.72727273]]\n"
]
}
],
"source": [
"cm = confusion_matrix(y_train, y_train_pred, normalize='true')\n",
"print(cm)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "2f0d536a",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import seaborn as sn"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "dddf5fe8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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vODPzNHo7KQymNnSch7LAE/+j7du3Zr169dTUFBAUVER06dPp0uXLl5EOWL5sY+VOf78lheUORH8lhf8mflIF6+RmADQA9h9yOsGLIjTPiuUkZHByJEjGTx4MMFgkH79+tGyZUsvolTaa6+9RqdOnWjYsCEFBQWMGjWK8ePHex2rXH7sY2WOP7/lBWVOBL/lBX9mjsbvIzHmXExnbUo2avYiMME5914Z615zzl1bic3EPlic+e2HIR7/70VE5GdJ6BfJ2WefHbMvgo8//jjhX4JxGYlxzv2qgnWVKWBEREREKqTbDoiIiKQov80gHEpFjIiISIry6tToWPF3ehEREUlZGokRERFJUZpOEhEREV/SdJKIiIiIBzQSIyIikqI0nSQiIiK+5PciRtNJIiIi4ksaiREREUlROrBXREREfMnMYvaoxL56mtkaM1trZiPKWH+Mmc0xs8VmttTMLo62TRUxIiIiEldmlg48DVwEtAKuMbNWhzT7HTDZOXcmcDXwTLTtajpJREQkRSVwOukcYK1zbh2Amb0O9AFWHtTGAUeHn9cBNkfbqIqYGFqwYIHXEark/fff9zpClZ133nleRxCJiW3btnkdoUpycnK8jlBlfutjSHw/x/LsJDMbAgw56KV851x++HlToOCgdRuBdods4vfAO2b2a6Am0C3aPlXEiIiIyM8WLljyozYs3zXAS865P5nZecBfzOxU51yovDeoiBEREUlRCbxOzCYg96DlZuHXDvYroCeAc+59M6sONATKHVLTgb0iIiIpKi0tLWaPKD4CWppZczPLouTA3amHtNkAdAUws5OB6sD2CvP/pE8tIiIiUknOuWLgFmAmsIqSs5BWmNloM+sdbnYHcKOZLQEmAQOdc66i7Wo6SUREJEUl8rYDzrm3gbcPeW3kQc9XAh2qsk0VMSIiIilKV+wVERER8YBGYkRERFKU3+9irSJGREQkRamIEREREV/SMTEiIiIiHtBIjIiISIrSdJKIiIj4kqaTRERERDyQUiMx8+bN4/777ycUCtG/f3+GDBkS/U1xtnTpUl577TVCoRAXXnghl1xySan17777Lu+++y5mRvXq1Rk4cCBNmzZl3bp1TJgwIdKub9++nH322cr7EyTjz0U0fsvst7yQnJkXLlzI448/TigU4pJLLmHAgAGl1n/66ac88cQTrFu3jlGjRtG5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ESXixBNPZOPGjWzZsoUDBw7w7rvv0r59+0q9Nycnh08//ZTi4mKKi4tZsmSJ59NJydjH0Shz/CVj3lWrVtGsWTMaN25MRkYG3bp147333ivVprCwkDZt2gCQl5dHVlYWu3fvplatWjzyyCM8++yzLFu2zIv4ZUrGfq6I3/KCPzNH4/ciJi7XiXHO7QUGhg/ubR7ez0bnnGeThxkZGYwcOZLBgwcTDAbp168fLVu29CpOJNPQoUO58847CYVCXHTRRTRv3pzx48dz4okn0qFDB1avXs3vfvc79u3bx/vvv89LL73ESy+9RMeOHVm8eDE33HADZsY555xT6QIonp8n2fo4GmWOv2TMGwwGGTduHI8++ijp6elMmzaNL7/8ksGDB7N69Wree+89nnzySUaMGMFVV12Fc477778fgCuuuIJmzZoxaNAgBg0qGXC+/fbb2b17t5cfKSn7uSJ+ywv+zHyks2S4tkg5kjZYebZs2eJ1hCpp3Lix1xFEYsLrAv6nWLBggdcRJDkldEhjwYIFMfuubd++fcKHY3TFXhERkRTl9yv2qogRERFJUX4vYlLmir0iIiJyZNFIjIiISIry+0iMihgREZEU5fciRtNJIiIi4ksaiREREUlRfh+JUREjIiKSovxexGg6SURERHxJIzEiIiIpSiMxIiIiIh5QESMiIiK+pOkkERGRFOX36SQVMSIiIilKRYxEFBcXex1BJCUtWLDA6whV1rlzZ68jVMmcOXO8jiByGBUxIiIiKUojMSIiIuJLfi9idHaSiIiI+JJGYkRERFKU30diVMSIiIikKL8XMZpOEhEREV/SSIyIiEiK8vtIjIoYERGRFOX3IkbTSSIiIuJLKmJERETElzSdJCIikqI0nSQiIiLiAY3EiIiIpCi/j8SoiBEREUlRfi9iUmo6ad68efTo0YPu3buTn5/vdZzDfPjhhwwcOJDrr7+eSZMmHbb+b3/7GzfccAM33ngjd955J4WFhR6krFiy93FZlDn+/JYXkj9z27Ztefnll5k4cSLXXHPNYetzcnIYN24c+fn5vPDCC7Rr186DlBVL9j4uix8zH8lSpogJBoOMHj2aF154genTpzNt2jTWrl3rdayIYDDIk08+yQMPPMCLL77InDlz+Oqrr0q1adGiBc888wx//vOfueCCC5LuFyjZ+7gsyhx/fssLyZ85LS2N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\n",
"text/plain": [
"<Figure size 720x504 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"set_digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }\n",
"\n",
"df_cm = pd.DataFrame(cm, index=set_digits, columns=set_digits)\n",
"plt.figure(figsize = (10,7))\n",
"sn_plot = sn.heatmap(df_cm, annot=True, cmap=\"Greys\")\n",
"plt.ylabel(\"True Label\")\n",
"plt.xlabel(\"Predicted Label\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "44537aae",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" 0 1.00 0.92 0.96 13\n",
" 1 0.39 1.00 0.56 14\n",
" 2 1.00 0.33 0.50 6\n",
" 3 1.00 0.64 0.78 11\n",
" 4 0.86 0.55 0.67 11\n",
" 5 1.00 0.20 0.33 5\n",
" 6 0.82 0.82 0.82 11\n",
" 7 0.89 0.80 0.84 10\n",
" 8 1.00 0.62 0.77 8\n",
" 9 0.80 0.73 0.76 11\n",
"\n",
" accuracy 0.72 100\n",
" macro avg 0.88 0.66 0.70 100\n",
"weighted avg 0.85 0.72 0.73 100\n",
"\n"
]
}
],
"source": [
"from sklearn.metrics import classification_report\n",
"\n",
"print(classification_report(y_train, y_train_pred))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "57d96f56",
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}