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

760 lines
71 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "2507dc1b",
"metadata": {},
"source": [
"### Load MNIST dataset"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "d214bb2f",
"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": "056cad96",
"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": "80c92d8a",
"metadata": {},
"outputs": [],
"source": [
"# common imports\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "e07cdb1a",
"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": "code",
"execution_count": 5,
"id": "8ccbd6b7",
"metadata": {},
"outputs": [],
"source": [
"X, y = mnist[\"data\"], mnist[\"target\"]"
]
},
{
"cell_type": "markdown",
"id": "78c78c04",
"metadata": {},
"source": [
"### Plot data"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "2963a0bf",
"metadata": {},
"outputs": [],
"source": [
"# import plotting libraries\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "a7f1c08b",
"metadata": {},
"outputs": [],
"source": [
"# convert string labels to int\n",
"y = y.astype(np.uint8)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b33ff35b",
"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": 9,
"id": "89a76fba",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGPklEQVR4nO3dT4hN/x/H8d9o/FspmUHZkY2ylI2NoRhTLGQpG0lSygZplpTZScrGRrMQUrOZlNlNipWYpmxZ2fgzhRjMb/crNed9/e4Y8zrj8Vh6de495fv8nvLp3tszNzf3HyDPiqW+AWB+4oRQ4oRQ4oRQ4oRQvR12/5QLi69nvj/05IRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQvUt9A2305s2bcr969Wq5v3z5snGbnJzs6p5+1+HDh8v9/fv3jduOHTvKa3ft2lXuJ06cKHd+5ckJocQJocQJocQJocQJocQJocQJoXrm5uaqvRzb6vnz5+V+7dq1cn/y5Em5v379+v+9pf/ZsGFDuW/fvr3cO93bYurr6yv3t2/f/qU7aZ2e+f7QkxNCiRNCiRNCiRNCiRNCiRNCtfYjY3fu3Cn306dPN26zs7PltZ32gYGBch8bGyv3bdu2NW4rVtT/v+ztrf/Kvn37Vu4HDhwo98X+yBq/z5MTQokTQokTQokTQokTQokTQokTQrX2nPPjx4/l/vnz565fe+PGjeU+MjJS7jt37uz6vReq0zlop3PUhRgaGlq01/4XeXJCKHFCKHFCKHFCKHFCKHFCKHFCqNZ+NeaPHz/Kvfopu05WrlxZ7uvWrev6tRfb1NRUuXc6i6y+1nPNmjXltffv3y/3wcHBcv+H+WpMaBNxQihxQihxQihxQihxQihxQqjWnnMyv9WrV5d7p+/krc4yL1y4UF47PDxc7jRyzgltIk4IJU4IJU4IJU4IJU4IJU4I1drvrW2zmZmZxu3u3bvltVeuXCn3TueYq1atKvdLly41bpcvXy6v5c/y5IRQ4oRQ4oRQ4oRQ4oRQ4oRQjlK68OnTp3I/efJkuY+PjzdunX7acKH27NlT7sePH1/U9+f3eXJCKHFCKHFCKHFCKHFCKHFCKHFCKF+N2YUPHz6U+6ZNm8r958+fjdv379+7uaU/pr+/v3Fbv359ee2pU6fK/ezZs+W+YsU/+6zw1ZjQJuKEUOKEUOKEUOKEUOKEUOKEUM45l8DU1FTj9uzZswW99vXr18v9xYsXC3r9hRgYGCj30dHRxq06f10GnHNCm4gTQokTQokTQokTQokTQokTQjnnXGa+fPlS7tPT0+X++PHjxu3ixYtd3dPvGhsba9yGhoYW9b2XmHNOaBNxQihxQihxQihxQihxQihxQijnnPyi+u9hcHCwvPbRo0cLeu/z5883biMjIwt67XDOOaFNxAmhxAmhxAmhxAmhxAmhepf6BsjS0zPvv+p33P6ErVu3Lurrt40nJ4QSJ4QSJ4QSJ4QSJ4QSJ4QSJ4Ryzskv7t2717hNTEws6nvv27dvUV+/bTw5IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IZRzzn/M5ORkuQ8PDzdus7OzC3rvI0eOlPvmzZsX9PrLjScnhBInhBInhBInhBInhBInhBInhPITgMvM7du3y/3MmTPl/vXr167fe8uWLeX+6tWrcl+7dm3X791yfgIQ2kScEEqcEEqcEEqcEEqcEMpHxsJMT0+X+40bN8r91q1b5d7h6KzU19dX7g8ePCj3f/iopCuenBBKnBBKnBBKnBBKnBBKnBBKnBBq2Z5zVueF4+Pj5bUHDx4s93fv3pX706dPy31qaqpxe/jwYXntzMxMuXfS21v/lR86dKhxu3nzZnmtr7b8szw5IZQ4IZQ4IZQ4IZQ4IZQ4IZQ4IdSy/WrM/fv3N24TExN/8U7+rt27d5f7uXPnyv3YsWN/8G74Tb4aE9pEnBBKnBBKnBBKnBBKnBBKnBBq2X6e8+jRo41b8jlnf39/uY+Ojpb73r17y72nZ94jNQJ5ckIocUIocUIocUIocUIocUIocUKoZft5TmgRn+eENhEnhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhBInhOr0E4B+Lw6WiCcnhBInhBInhBInhBInhBInhPovMLcDdQGgUUMAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot_digit(X[10000])"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "0f59fcd5",
"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": "markdown",
"id": "ff272b79",
"metadata": {},
"source": [
"### Prepare data for machine learning"
]
},
{
"cell_type": "markdown",
"id": "a330fd86",
"metadata": {},
"source": [
"### Identify Train Set and Test Set"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "36f7f273",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"X_train: 56000, (56000, 784)\n",
"X_test: 14000, (14000, 784)\n",
"y_train: 56000, (56000,)\n",
"y_test: 14000, (14000,)\n"
]
},
{
"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": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"k = 3\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1337)\n",
"\n",
"print(f\"X_train: {len(X_train)}, {X_train.shape}\")\n",
"print(f\"X_test: {len(X_test)}, {X_test.shape}\")\n",
"print(f\"y_train: {len(y_train)}, {y_train.shape}\")\n",
"print(f\"y_test: {len(y_test)}, {y_test.shape}\")\n",
"\n",
"plot_digit(X_test[10000])"
]
},
{
"cell_type": "markdown",
"id": "b3267043",
"metadata": {},
"source": [
"## Train kNN classifier"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "afb277c8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 107 ms, sys: 3.58 ms, total: 111 ms\n",
"Wall time: 110 ms\n"
]
},
{
"data": {
"text/plain": [
"KNeighborsClassifier(n_neighbors=3)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"\n",
"classifier = KNeighborsClassifier(n_neighbors=k)\n",
"classifier.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "e30c9192",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3\n"
]
}
],
"source": [
"# take a test digit\n",
"td = 4000\n",
"test_digit = X_test[td]\n",
"print(y_test[td])"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "2e4676ab",
"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_digit(test_digit)"
]
},
{
"cell_type": "markdown",
"id": "2d53bd60",
"metadata": {},
"source": [
"### Evaluation"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "cae65dc4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy Train 98.57321428571429\n",
"CPU times: user 7min 43s, sys: 14min 20s, total: 22min 4s\n",
"Wall time: 51.7 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# 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": 16,
"id": "b551da35",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy Test 97.14285714285714\n",
"CPU times: user 1min 54s, sys: 3min 39s, total: 5min 34s\n",
"Wall time: 13.2 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# 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": "22c0058c",
"metadata": {},
"source": [
"Accuracy is strongly influenced by the distribution of the classes in the test data."
]
},
{
"cell_type": "markdown",
"id": "351768b0",
"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": 17,
"id": "7d943683",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.96866127 0.9686077 0.9694632 ]\n",
"CPU times: user 4min 38s, sys: 10min, total: 14min 38s\n",
"Wall time: 33.7 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# 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": 18,
"id": "d49c670c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[5 8 0 ... 9 3 7]\n",
"CPU times: user 5min 52s, sys: 11min 7s, total: 17min\n",
"Wall time: 41.3 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# 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=5)\n",
"print(y_train_pred)"
]
},
{
"cell_type": "markdown",
"id": "182a1c52",
"metadata": {},
"source": [
"#### Accuracy"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "1d66c93e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.970375"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.metrics import accuracy_score\n",
"\n",
"accuracy_score(y_train, y_train_pred)"
]
},
{
"cell_type": "markdown",
"id": "2c1c857b",
"metadata": {},
"source": [
"#### Precision"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "327ca201",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9705500243024229"
]
},
"execution_count": 20,
"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": "1a051995",
"metadata": {},
"source": [
"#### Recall"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "0852a4e4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.970375"
]
},
"execution_count": 21,
"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": "4848e2f8",
"metadata": {},
"source": [
"#### F1 Score"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "d5d2fe0e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9703221334372104"
]
},
"execution_count": 22,
"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": "3acab292",
"metadata": {},
"source": [
"#### Confusion Matrix"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "f8f613b8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[5464 4 3 0 0 7 16 2 0 3]\n",
" [ 1 6252 9 2 3 1 4 10 2 3]\n",
" [ 35 49 5396 14 5 4 11 67 11 3]\n",
" [ 5 15 36 5475 2 67 3 30 30 16]\n",
" [ 4 45 4 1 5260 0 13 9 2 112]\n",
" [ 17 9 4 60 10 4887 46 5 9 21]\n",
" [ 23 17 1 0 5 14 5480 0 2 0]\n",
" [ 3 67 16 0 12 1 0 5691 1 55]\n",
" [ 20 69 28 85 27 69 19 15 5134 38]\n",
" [ 10 16 10 44 61 15 3 63 6 5302]]\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": 24,
"id": "57dc8b25",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[9.93635206e-01 7.27404983e-04 5.45553737e-04 0.00000000e+00\n",
" 0.00000000e+00 1.27295872e-03 2.90961993e-03 3.63702491e-04\n",
" 0.00000000e+00 5.45553737e-04]\n",
" [1.59058374e-04 9.94432957e-01 1.43152537e-03 3.18116749e-04\n",
" 4.77175123e-04 1.59058374e-04 6.36233498e-04 1.59058374e-03\n",
" 3.18116749e-04 4.77175123e-04]\n",
" [6.25558534e-03 8.75781948e-03 9.64432529e-01 2.50223414e-03\n",
" 8.93655049e-04 7.14924039e-04 1.96604111e-03 1.19749777e-02\n",
" 1.96604111e-03 5.36193029e-04]\n",
" [8.80436697e-04 2.64131009e-03 6.33914422e-03 9.64078183e-01\n",
" 3.52174679e-04 1.17978517e-02 5.28262018e-04 5.28262018e-03\n",
" 5.28262018e-03 2.81739743e-03]\n",
" [7.33944954e-04 8.25688073e-03 7.33944954e-04 1.83486239e-04\n",
" 9.65137615e-01 0.00000000e+00 2.38532110e-03 1.65137615e-03\n",
" 3.66972477e-04 2.05504587e-02]\n",
" [3.35438043e-03 1.77584846e-03 7.89265983e-04 1.18389897e-02\n",
" 1.97316496e-03 9.64285714e-01 9.07655880e-03 9.86582478e-04\n",
" 1.77584846e-03 4.14364641e-03]\n",
" [4.15012631e-03 3.06748466e-03 1.80440274e-04 0.00000000e+00\n",
" 9.02201371e-04 2.52616384e-03 9.88812703e-01 0.00000000e+00\n",
" 3.60880549e-04 0.00000000e+00]\n",
" [5.13171399e-04 1.14608279e-02 2.73691413e-03 0.00000000e+00\n",
" 2.05268560e-03 1.71057133e-04 0.00000000e+00 9.73486144e-01\n",
" 1.71057133e-04 9.40814232e-03]\n",
" [3.63372093e-03 1.25363372e-02 5.08720930e-03 1.54433140e-02\n",
" 4.90552326e-03 1.25363372e-02 3.45203488e-03 2.72529070e-03\n",
" 9.32776163e-01 6.90406977e-03]\n",
" [1.80831826e-03 2.89330922e-03 1.80831826e-03 7.95660036e-03\n",
" 1.10307414e-02 2.71247740e-03 5.42495479e-04 1.13924051e-02\n",
" 1.08499096e-03 9.58770344e-01]]\n"
]
}
],
"source": [
"cm = confusion_matrix(y_train, y_train_pred, normalize='true')\n",
"print(cm)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "a0891a45",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import seaborn as sn"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "c584cc3d",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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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": 30,
"id": "dc855642",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Pipeline: knn (97.0375%)\n",
" precision recall f1-score support\n",
"\n",
" 0 0.98 0.99 0.99 5499\n",
" 1 0.96 0.99 0.97 6287\n",
" 2 0.98 0.96 0.97 5595\n",
" 3 0.96 0.96 0.96 5679\n",
" 4 0.98 0.97 0.97 5450\n",
" 5 0.96 0.96 0.96 5068\n",
" 6 0.98 0.99 0.98 5542\n",
" 7 0.97 0.97 0.97 5846\n",
" 8 0.99 0.93 0.96 5504\n",
" 9 0.95 0.96 0.96 5530\n",
"\n",
" accuracy 0.97 56000\n",
" macro avg 0.97 0.97 0.97 56000\n",
"weighted avg 0.97 0.97 0.97 56000\n",
"\n"
]
}
],
"source": [
"from sklearn.metrics import classification_report\n",
"\n",
"accuracy = accuracy_score(y_train, y_train_pred, normalize=True)*100\n",
"print(f\"Pipeline: knn ({accuracy:.4f}%)\")\n",
"print(classification_report(y_train, y_train_pred))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b27fdf05",
"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
}