From 62fae7c77be0889521180c1876c5bf325d0a9a52 Mon Sep 17 00:00:00 2001 From: Tuan-Dat Tran Date: Mon, 17 May 2021 01:34:11 +0000 Subject: [PATCH] Too many changes to properly fit in a commit msg, changes will be discussed on discord or simply ask me --- 0-pilot-project/MNIST-kNN-best-pipeline.ipynb | 522 ++++++++++ 0-pilot-project/MNIST-kNN-best.ipynb | 933 ++++++++++++++++++ 0-pilot-project/MNIST-kNN.ipynb | 786 +++++---------- 0-pilot-project/MNIST.ipynb | 165 ++-- 0-pilot-project/Process.md | 48 + 0-pilot-project/notes.md | 9 +- 0-pilot-project/results.md | 146 +++ 7 files changed, 1976 insertions(+), 633 deletions(-) create mode 100644 0-pilot-project/MNIST-kNN-best-pipeline.ipynb create mode 100644 0-pilot-project/MNIST-kNN-best.ipynb create mode 100644 0-pilot-project/Process.md create mode 100644 0-pilot-project/results.md diff --git a/0-pilot-project/MNIST-kNN-best-pipeline.ipynb b/0-pilot-project/MNIST-kNN-best-pipeline.ipynb new file mode 100644 index 0000000..a22c0ea --- /dev/null +++ b/0-pilot-project/MNIST-kNN-best-pipeline.ipynb @@ -0,0 +1,522 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e4d89124", + "metadata": {}, + "source": [ + "### Load MNIST dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5789ec72", + "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": "f491d383", + "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": "575a6a42", + "metadata": {}, + "outputs": [], + "source": [ + "# common imports\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "921dc114", + "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": "6271045c", + "metadata": {}, + "outputs": [], + "source": [ + "X, y = mnist[\"data\"], mnist[\"target\"]" + ] + }, + { + "cell_type": "markdown", + "id": "37777133", + "metadata": {}, + "source": [ + "### Fix labels" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "30a441d3", + "metadata": {}, + "outputs": [], + "source": [ + "# import plotting libraries\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2d9693b1", + "metadata": {}, + "outputs": [], + "source": [ + "# convert string labels to int\n", + "y = y.astype(np.uint8)" + ] + }, + { + "cell_type": "markdown", + "id": "182f4b1b", + "metadata": {}, + "source": [ + "### Prepare data for machine learning" + ] + }, + { + "cell_type": "markdown", + "id": "77ff6bd1", + "metadata": {}, + "source": [ + "### Identify Train Set and Test Set" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f8247d13", + "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" + ] + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\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}\")" + ] + }, + { + "cell_type": "markdown", + "id": "c4062436", + "metadata": {}, + "source": [ + "## Pipeline Declaration" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "67645a47", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.pipeline import Pipeline\n", + "from sklearn.decomposition import PCA\n", + "from sklearn.preprocessing import StandardScaler, MinMaxScaler\n", + "from sklearn.neighbors import KNeighborsClassifier\n", + "from sklearn.model_selection import cross_val_predict\n", + "from sklearn.metrics import classification_report, precision_score\n", + "\n", + "n_neighbors = 3\n", + "n95_components = 0.95\n", + "n99_components = 0.99" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "82b1e834", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "names = ['knn', \n", + " 'scalar+knn', \n", + " 'standard+pca95+knn', \n", + " 'minmax+pca95+knn', \n", + " 'standard+pca99+knn', \n", + " 'minmax+pca99+knn'\n", + " ]\n", + "\n", + "classifiers = [\n", + " Pipeline([('knn', KNeighborsClassifier(n_neighbors=n_neighbors))]),\n", + " Pipeline([\n", + " ('scaler', StandardScaler()),\n", + " ('knn', KNeighborsClassifier(n_neighbors=n_neighbors))\n", + " ]),\n", + " Pipeline([\n", + " ('standard', StandardScaler()),\n", + " ('pca', PCA(n_components=n95_components)),\n", + " ('knn', KNeighborsClassifier(n_neighbors=n_neighbors))\n", + " ]),\n", + " Pipeline([\n", + " ('minmax', MinMaxScaler()),\n", + " ('pca', PCA(n_components=n95_components)),\n", + " ('knn', KNeighborsClassifier(n_neighbors=n_neighbors))\n", + " ]),\n", + " Pipeline([\n", + " ('standard', StandardScaler()),\n", + " ('pca', PCA(n_components=n99_components)),\n", + " ('knn', KNeighborsClassifier(n_neighbors=n_neighbors))\n", + " ]),\n", + " Pipeline([\n", + " ('minmax', MinMaxScaler()),\n", + " ('pca', PCA(n_components=n99_components)),\n", + " ('knn', KNeighborsClassifier(n_neighbors=n_neighbors))\n", + " ])\n", + "]\n", + "\n", + "len(names)" + ] + }, + { + "cell_type": "markdown", + "id": "156dbf2c", + "metadata": {}, + "source": [ + "# Crossvalidation" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "8e5168e4", + "metadata": {}, + "outputs": [], + "source": [ + "# for name, clf in zip(names, classifiers):\n", + "# y_train_pred = cross_val_predict(clf, X_train, y_train, cv=3)\n", + "# print(f\"Pipeline: {name} ({precision_score(y_train, y_train_pred, average='weighted'):.4f})\")\n", + "# print(classification_report(y_train, y_train_pred))\n", + "precs = []" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "db14a027", + "metadata": {}, + "outputs": [], + "source": [ + "def cv(num):\n", + " name = names[num]\n", + " clf = classifiers[num]\n", + " y_train_pred = cross_val_predict(clf, X_train, y_train, cv=3)\n", + " precision = precision_score(y_train, y_train_pred, average='weighted')\n", + " print(f\"Pipeline: {name} ({precision:.4f})\")\n", + " print(classification_report(y_train, y_train_pred))\n", + " return precision" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "b8983bf8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pipeline: knn (0.9691)\n", + " precision recall f1-score support\n", + "\n", + " 0 0.98 0.99 0.99 5499\n", + " 1 0.95 0.99 0.97 6287\n", + " 2 0.98 0.96 0.97 5595\n", + " 3 0.96 0.97 0.96 5679\n", + " 4 0.98 0.96 0.97 5450\n", + " 5 0.96 0.96 0.96 5068\n", + " 6 0.98 0.99 0.98 5542\n", + " 7 0.96 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": [ + "cv(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "62ff42f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pipeline: scalar+knn (0.9420)\n", + " precision recall f1-score support\n", + "\n", + " 0 0.95 0.99 0.97 5499\n", + " 1 0.95 0.99 0.97 6287\n", + " 2 0.95 0.93 0.94 5595\n", + " 3 0.92 0.94 0.93 5679\n", + " 4 0.94 0.93 0.94 5450\n", + " 5 0.93 0.92 0.93 5068\n", + " 6 0.96 0.97 0.97 5542\n", + " 7 0.94 0.93 0.94 5846\n", + " 8 0.97 0.89 0.93 5504\n", + " 9 0.91 0.92 0.91 5530\n", + "\n", + " accuracy 0.94 56000\n", + " macro avg 0.94 0.94 0.94 56000\n", + "weighted avg 0.94 0.94 0.94 56000\n", + "\n" + ] + } + ], + "source": [ + "cv(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "9b553141", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pipeline: standard+pca95+knn (0.9457)\n", + " precision recall f1-score support\n", + "\n", + " 0 0.96 0.99 0.97 5499\n", + " 1 0.95 0.99 0.97 6287\n", + " 2 0.95 0.94 0.95 5595\n", + " 3 0.93 0.94 0.94 5679\n", + " 4 0.95 0.93 0.94 5450\n", + " 5 0.93 0.92 0.93 5068\n", + " 6 0.96 0.97 0.97 5542\n", + " 7 0.95 0.94 0.94 5846\n", + " 8 0.97 0.89 0.93 5504\n", + " 9 0.92 0.92 0.92 5530\n", + "\n", + " accuracy 0.95 56000\n", + " macro avg 0.95 0.94 0.94 56000\n", + "weighted avg 0.95 0.95 0.95 56000\n", + "\n" + ] + } + ], + "source": [ + "cv(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "2a1d6c65", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pipeline: minmax+pca95+knn (0.9706)\n", + " precision recall f1-score support\n", + "\n", + " 0 0.98 0.99 0.99 5499\n", + " 1 0.96 0.99 0.98 6287\n", + " 2 0.98 0.97 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.98 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": [ + "cv(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "de40f817", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pipeline: standard+pca99+knn (0.9424)\n", + " precision recall f1-score support\n", + "\n", + " 0 0.95 0.99 0.97 5499\n", + " 1 0.95 0.99 0.97 6287\n", + " 2 0.95 0.93 0.94 5595\n", + " 3 0.92 0.94 0.93 5679\n", + " 4 0.94 0.93 0.94 5450\n", + " 5 0.93 0.92 0.93 5068\n", + " 6 0.96 0.97 0.97 5542\n", + " 7 0.94 0.93 0.94 5846\n", + " 8 0.97 0.89 0.93 5504\n", + " 9 0.91 0.92 0.92 5530\n", + "\n", + " accuracy 0.94 56000\n", + " macro avg 0.94 0.94 0.94 56000\n", + "weighted avg 0.94 0.94 0.94 56000\n", + "\n" + ] + } + ], + "source": [ + "cv(4)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "2c1c26b0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pipeline: minmax+pca99+knn (0.9695)\n", + " precision recall f1-score support\n", + "\n", + " 0 0.98 0.99 0.99 5499\n", + " 1 0.95 0.99 0.97 6287\n", + " 2 0.98 0.96 0.97 5595\n", + " 3 0.96 0.97 0.96 5679\n", + " 4 0.98 0.96 0.97 5450\n", + " 5 0.96 0.96 0.96 5068\n", + " 6 0.98 0.99 0.98 5542\n", + " 7 0.96 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": [ + "cv(5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb6b6d69", + "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 +} diff --git a/0-pilot-project/MNIST-kNN-best.ipynb b/0-pilot-project/MNIST-kNN-best.ipynb new file mode 100644 index 0000000..ad3ce3d --- /dev/null +++ b/0-pilot-project/MNIST-kNN-best.ipynb @@ -0,0 +1,933 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8fa4cf8e", + "metadata": {}, + "source": [ + "### Load MNIST dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e27d97b9", + "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": "2b8ccc05", + "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": "7298eee1", + "metadata": {}, + "outputs": [], + "source": [ + "# common imports\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "40da16c7", + "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": "1e12a50b", + "metadata": {}, + "outputs": [], + "source": [ + "X, y = mnist[\"data\"], mnist[\"target\"]" + ] + }, + { + "cell_type": "markdown", + "id": "6efc5548", + "metadata": {}, + "source": [ + "### Plot data" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "10e1081b", + "metadata": {}, + "outputs": [], + "source": [ + "# import plotting libraries\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9d192696", + "metadata": {}, + "outputs": [], + "source": [ + "# convert string labels to int\n", + "y = y.astype(np.uint8)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "176b99f0", + "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": "c8e346bc", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_digit_pca(data):\n", + " image = data.reshape(20, 20)\n", + " plt.imshow(image, cmap = mpl.cm.binary, interpolation=\"nearest\")\n", + " plt.axis(\"off\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0368906e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_digit(X[10000])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f221c138", + "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": "844b1526", + "metadata": {}, + "source": [ + "### Prepare data for machine learning" + ] + }, + { + "cell_type": "markdown", + "id": "33559dc5", + "metadata": {}, + "source": [ + "### Identify Train Set and Test Set" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "3092d886", + "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": [ + "
" + ] + }, + "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": "af3f4bee", + "metadata": {}, + "source": [ + "## Feature Scaling" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "04149a6e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X_train: 56000, (56000, 784)\n", + "X_test: 14000, (14000, 784)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "sc = StandardScaler()\n", + "X_train_scalar = sc.fit_transform(X_train)\n", + "X_test_scalar = sc.transform(X_test)\n", + "\n", + "print(f\"X_train: {len(X_train_scalar)}, {X_train_scalar.shape}\")\n", + "print(f\"X_test: {len(X_test_scalar)}, {X_test_scalar.shape}\")\n", + "\n", + "\n", + "plot_digit(X_test_scalar[10000])" + ] + }, + { + "cell_type": "markdown", + "id": "5db1baaa", + "metadata": {}, + "source": [ + "## Dimension reduction: LDA" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1f2d4db8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X_train: 56000, (56000, 9)\n", + "X_test: 14000, (14000, 9)\n" + ] + } + ], + "source": [ + "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA\n", + "\n", + "lda = LDA(n_components=9)\n", + "X_train_lda = lda.fit_transform(X_train_scalar, y_train)\n", + "X_test_lda = lda.transform(X_test_scalar)\n", + "\n", + "print(f\"X_train: {len(X_train_lda)}, {X_train_lda.shape}\")\n", + "print(f\"X_test: {len(X_test_lda)}, {X_test_lda.shape}\")" + ] + }, + { + "cell_type": "markdown", + "id": "475a2c3b", + "metadata": {}, + "source": [ + "## Dimension reduction: PCA" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c7265a51", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.decomposition import PCA\n", + "pca = PCA()\n", + "pca.n_components = 784\n", + "pca_data = pca.fit_transform(X_train)\n", + "\n", + "percentage_var_explained = pca.explained_variance_ / np.sum(pca.explained_variance_)\n", + "cum_var_explained = np.cumsum(percentage_var_explained)\n", + "\n", + "# Plot the PCA spectrum\n", + "plt.figure(1, figsize=(6, 4))\n", + "plt.clf()\n", + "plt.plot(cum_var_explained, linewidth=2)\n", + "plt.axis('tight')\n", + "plt.grid()\n", + "plt.xlabel('n_components')\n", + "plt.ylabel('Cumulative_explained_variance')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "4af59c69", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(784,)\n", + "0.9999999999999992\n", + "0.9999999999999992\n" + ] + } + ], + "source": [ + "print(cum_var_explained.shape)\n", + "print(cum_var_explained[708])\n", + "print(cum_var_explained[783])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "81195792", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "X_train: (56000, 709)\n", + "X_test: (14000, 709)\n" + ] + } + ], + "source": [ + "pca = PCA(n_components=709)\n", + "X_train_pca = pca.fit_transform(X_train_scalar)\n", + "X_test_pca = pca.fit_transform(X_test_scalar)\n", + "\n", + "print(f\"X_train: {X_train_pca.shape}\")\n", + "print(f\"X_test: {X_test_pca.shape}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "68b90f56", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7\n" + ] + }, + { + "data": { + "text/plain": [ + "(709,)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(y_test[10000])\n", + "X_test_pca[10000].shape" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "b64e518f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(array([ 3, 6, 7, ..., 55967, 55976, 55999]),)\n" + ] + }, + { + "data": { + "text/plain": [ + "(709,)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(np.where(y_train == 7))\n", + "X_train_pca[np.where(y_train == 7)[0]][1].shape" + ] + }, + { + "cell_type": "markdown", + "id": "89f986c5", + "metadata": {}, + "source": [ + "## Train kNN classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "cc0ac6ac", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 28.2 ms, sys: 0 ns, total: 28.2 ms\n", + "Wall time: 27.9 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "((56000, 784), (14000, 784))" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "from sklearn.neighbors import KNeighborsClassifier\n", + "\n", + "X_train_use = X_train_scalar\n", + "X_test_use = X_test_scalar\n", + "\n", + "classifier = KNeighborsClassifier(n_neighbors=k)\n", + "classifier.fit(X_train_use, y_train)\n", + "\n", + "X_train_use.shape, X_test_use.shape" + ] + }, + { + "cell_type": "markdown", + "id": "1e36d13f", + "metadata": {}, + "source": [ + "### Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "f4d0cc9b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy Train 97.17857142857143\n", + "CPU times: user 7min 58s, sys: 14min 49s, total: 22min 48s\n", + "Wall time: 1min\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "# trainings accuracy\n", + "wrong_images = X_train_use[(classifier.predict(X_train_use)-y_train) != 0]\n", + "percentage = ((1-len(wrong_images)/len(X_train)) * 100)\n", + "print(\"Accuracy Train \" + str(percentage))" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "3abf88d6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy Test 79.10714285714285\n", + "CPU times: user 1min 52s, sys: 1min 45s, total: 3min 37s\n", + "Wall time: 14.3 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": "33ff4424", + "metadata": {}, + "source": [ + "Accuracy is strongly influenced by the distribution of the classes in the test data." + ] + }, + { + "cell_type": "markdown", + "id": "32d25b65", + "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": 23, + "id": "8b3c6121", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.94235817 0.94123319 0.94214079]\n", + "CPU times: user 4min 47s, sys: 10min 39s, total: 15min 26s\n", + "Wall time: 42.4 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_use, y_train, cv=3, scoring=\"accuracy\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "ea48e3e7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5 8 0 ... 9 3 7]\n", + "CPU times: user 4min 43s, sys: 10min 20s, total: 15min 3s\n", + "Wall time: 37.6 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_use, y_train, cv=3)\n", + "print(y_train_pred)" + ] + }, + { + "cell_type": "markdown", + "id": "b88646bc", + "metadata": {}, + "source": [ + "#### Precision" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "de1ca457", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9421179116417701" + ] + }, + "execution_count": 25, + "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": "6dd9927b", + "metadata": {}, + "source": [ + "#### Recall" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "ff0032f3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9419107142857143" + ] + }, + "execution_count": 26, + "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": "89335658", + "metadata": {}, + "source": [ + "#### F1 Score" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "444c5ca2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9417261091486361" + ] + }, + "execution_count": 27, + "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": "03b3c02a", + "metadata": {}, + "source": [ + "#### Confusion Matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "92bc152a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[5423 3 10 7 3 16 35 0 1 1]\n", + " [ 5 6222 16 4 6 2 18 8 4 2]\n", + " [ 67 62 5211 88 19 8 45 57 29 9]\n", + " [ 16 21 68 5351 5 90 7 48 51 22]\n", + " [ 9 63 48 6 5063 9 21 21 9 201]\n", + " [ 31 13 17 145 24 4675 71 10 44 38]\n", + " [ 59 22 24 2 10 38 5381 1 5 0]\n", + " [ 11 76 41 20 57 2 0 5463 3 173]\n", + " [ 50 82 54 121 45 169 26 24 4884 49]\n", + " [ 22 16 15 59 128 15 0 187 14 5074]]\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": 29, + "id": "cb933b64", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[9.86179305e-01 5.45553737e-04 1.81851246e-03 1.27295872e-03\n", + " 5.45553737e-04 2.90961993e-03 6.36479360e-03 0.00000000e+00\n", + " 1.81851246e-04 1.81851246e-04]\n", + " [7.95291872e-04 9.89661206e-01 2.54493399e-03 6.36233498e-04\n", + " 9.54350247e-04 3.18116749e-04 2.86305074e-03 1.27246700e-03\n", + " 6.36233498e-04 3.18116749e-04]\n", + " [1.19749777e-02 1.10813226e-02 9.31367292e-01 1.57283289e-02\n", + " 3.39588919e-03 1.42984808e-03 8.04289544e-03 1.01876676e-02\n", + " 5.18319929e-03 1.60857909e-03]\n", + " [2.81739743e-03 3.69783413e-03 1.19739391e-02 9.42243353e-01\n", + " 8.80436697e-04 1.58478605e-02 1.23261138e-03 8.45219229e-03\n", + " 8.98045431e-03 3.87392147e-03]\n", + " [1.65137615e-03 1.15596330e-02 8.80733945e-03 1.10091743e-03\n", + " 9.28990826e-01 1.65137615e-03 3.85321101e-03 3.85321101e-03\n", + " 1.65137615e-03 3.68807339e-02]\n", + " [6.11681137e-03 2.56511444e-03 3.35438043e-03 2.86108919e-02\n", + " 4.73559590e-03 9.22454617e-01 1.40094712e-02 1.97316496e-03\n", + " 8.68192581e-03 7.49802684e-03]\n", + " [1.06459762e-02 3.96968603e-03 4.33056658e-03 3.60880549e-04\n", + " 1.80440274e-03 6.85673042e-03 9.70949116e-01 1.80440274e-04\n", + " 9.02201371e-04 0.00000000e+00]\n", + " [1.88162846e-03 1.30003421e-02 7.01334246e-03 3.42114266e-03\n", + " 9.75025659e-03 3.42114266e-04 0.00000000e+00 9.34485118e-01\n", + " 5.13171399e-04 2.95928840e-02]\n", + " [9.08430233e-03 1.48982558e-02 9.81104651e-03 2.19840116e-02\n", + " 8.17587209e-03 3.07049419e-02 4.72383721e-03 4.36046512e-03\n", + " 8.87354651e-01 8.90261628e-03]\n", + " [3.97830018e-03 2.89330922e-03 2.71247740e-03 1.06690778e-02\n", + " 2.31464738e-02 2.71247740e-03 0.00000000e+00 3.38155515e-02\n", + " 2.53164557e-03 9.17540687e-01]]\n" + ] + } + ], + "source": [ + "cm = confusion_matrix(y_train, y_train_pred, normalize='true')\n", + "print(cm)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "cb87112a", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import seaborn as sn" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "97961b7c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "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": 32, + "id": "305b7806", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.95 0.99 0.97 5499\n", + " 1 0.95 0.99 0.97 6287\n", + " 2 0.95 0.93 0.94 5595\n", + " 3 0.92 0.94 0.93 5679\n", + " 4 0.94 0.93 0.94 5450\n", + " 5 0.93 0.92 0.93 5068\n", + " 6 0.96 0.97 0.97 5542\n", + " 7 0.94 0.93 0.94 5846\n", + " 8 0.97 0.89 0.93 5504\n", + " 9 0.91 0.92 0.91 5530\n", + "\n", + " accuracy 0.94 56000\n", + " macro avg 0.94 0.94 0.94 56000\n", + "weighted avg 0.94 0.94 0.94 56000\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": "1b44c292", + "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 +} diff --git a/0-pilot-project/MNIST-kNN.ipynb b/0-pilot-project/MNIST-kNN.ipynb index 1499438..2634644 100644 --- a/0-pilot-project/MNIST-kNN.ipynb +++ b/0-pilot-project/MNIST-kNN.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "0b4fc5df", + "id": "b857abc2", "metadata": {}, "source": [ "### Load MNIST dataset" @@ -11,7 +11,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "12f0d563", + "id": "cf588d8d", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "00907c8a", + "id": "12b23f05", "metadata": {}, "outputs": [], "source": [ @@ -35,7 +35,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "75bfecec", + "id": "cd447696", "metadata": {}, "outputs": [], "source": [ @@ -46,7 +46,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "a46d690d", + "id": "72617a69", "metadata": {}, "outputs": [ { @@ -71,189 +71,19 @@ "type(mnist)" ] }, - { - "cell_type": "markdown", - "id": "91ca9e00", - "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": "73f99731", - "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": "4e9d2111", - "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": "a265f8c6", - "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": "6adfe3a8", - "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": "d7fb839a", - "metadata": {}, - "source": [ - "### Prepare the MNIST dataset" - ] - }, - { - "cell_type": "markdown", - "id": "74c92079", - "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": "0b84ef9b", + "id": "44a852a7", "metadata": {}, "outputs": [], "source": [ "X, y = mnist[\"data\"], mnist[\"target\"]" ] }, - { - "cell_type": "code", - "execution_count": 9, - "id": "3f87bfe5", - "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": "df5d43d6", - "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": "6ac9bcc4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(70000,)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y.shape" - ] - }, { "cell_type": "markdown", - "id": "4112ff94", + "id": "2df276ee", "metadata": {}, "source": [ "### Plot data" @@ -261,8 +91,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "79eee1c1", + "execution_count": 6, + "id": "653e8b2d", "metadata": {}, "outputs": [], "source": [ @@ -273,98 +103,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "880e45dd", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\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": "70a234b6", - "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": "cd746b72", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "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": "51633961", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5\n", - "\n" - ] - } - ], - "source": [ - "# plot label of example image\n", - "print(y[0])\n", - "print(type(y[0]))" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "34e6d15c", + "execution_count": 7, + "id": "ae3655b4", "metadata": {}, "outputs": [], "source": [ @@ -374,8 +114,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "id": "1b8d8b53", + "execution_count": 8, + "id": "9bcf3722", "metadata": {}, "outputs": [], "source": [ @@ -388,13 +128,13 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "cd36c702", + "execution_count": 9, + "id": "7d6cadc8", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -406,14 +146,13 @@ } ], "source": [ - "# quickly plot a single digit\n", - "plot_digit(X[1])" + "plot_digit(X[10000])" ] }, { "cell_type": "code", - "execution_count": 20, - "id": "9400192f", + "execution_count": 10, + "id": "0e764d62", "metadata": {}, "outputs": [], "source": [ @@ -426,164 +165,41 @@ " plt.axis(\"off\")" ] }, - { - "cell_type": "code", - "execution_count": 21, - "id": "929a8060", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "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": "02209b9d", + "id": "6198035d", "metadata": {}, "source": [ "### Prepare data for machine learning" ] }, - { - "cell_type": "code", - "execution_count": 22, - "id": "512aa5ff", - "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": "markdown", - "id": "6f9cd32d", + "id": "a0606a56", "metadata": {}, "source": [ - "### Train classifier" + "### Identify Train Set and Test Set" ] }, { "cell_type": "code", - "execution_count": 23, - "id": "0212798c", + "execution_count": 11, + "id": "52cd17f4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "train_sz=66652, k= 3, accuracy=98.7754%\n" + "X_train: 56000, (56000, 784)\n", + "X_test: 14000, (14000, 784)\n", + "y_train: 56000, (56000,)\n", + "y_test: 14000, (14000,)\n" ] - } - ], - "source": [ - "from sklearn.neighbors import KNeighborsClassifier\n", - "\n", - "# train_sz=60030, k= 3, accuracy=97.05%\n", - "# train_sz=67000, k= 3, accuracy=98.67%\n", - "# train_sz=66700, k= 3, accuracy=98.76%\n", - "# train_sz=66660, k= 3, accuracy=98.77%\n", - "# train_sz=66652, k= 3, accuracy=98.7754%\n", - "train_ranges = range(30, len(X), 10000)\n", - "kVals = range(1, 30, 2)\n", - "accuracies = []\n", - "classifier = KNeighborsClassifier()\n", - "\n", - "train_sz = 66652\n", - "k = 3\n", - "\n", - "X_train, X_test, y_train, y_test = X[:train_sz], X[train_sz:], y[:train_sz], y[train_sz:]\n", - "classifier = KNeighborsClassifier(n_neighbors=k)\n", - "classifier.fit(X_train, y_train)\n", - "score = classifier.score(X_test, y_test)\n", - "print(f\"train_sz={train_sz:5d}, k={k:2d}, accuracy={score*100:.4f}%\")\n", - "# for train_sz in train_ranges:\n", - "# # we use the first train_sz for training and test with the other images\n", - "# X_train, X_test, y_train, y_test = X[:train_sz], X[train_sz:], y[:train_sz], y[train_sz:]\n", - "# for k in kVals:\n", - "# # train the k-Nearest Neighbor classifier with the current value of `k`\n", - "# classifier = KNeighborsClassifier(n_neighbors=k)\n", - "# classifier.fit(X_train, y_train)\n", - "# # evaluate the model and update the accuracies list\n", - "# score = classifier.score(X_test, y_test)\n", - "# print(f\"train_sz={train_sz:5d}, k={k:2d}, accuracy={score*100:.4f}%\")\n", - "# accuracies.append(score)\n", - "\n", - "# import support vector machine\n", - "# import sklearn.svm\n", - "\n", - "# specify the parameter of the SVM\n", - "# classifier = sklearn.svm.SVC(C=10, gamma=\"scale\", kernel=\"poly\") #gamma=0.1 degree=3" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "157dbaa6", - "metadata": {}, - "outputs": [], - "source": [ - "# import matplotlib.pyplot as plt\n", - "\n", - "# fig = plt.figure(figsize=(20, 20))\n", - "# ax = fig.add_subplot(121, projection='3d')\n", - "\n", - "# _train, _kVals = np.meshgrid(train_ranges, kVals)\n", - "# _train, _kVals = _train.ravel(), _kVals.ravel()\n", - "\n", - "# top = accuracies-min(accuracies)\n", - "# bottom = np.full_like(top,min(accuracies))\n", - "# width = 1000\n", - "# depth = 2\n", - "\n", - "# colors = ['#ffffff', '#b3dce2', '#9fd3de', '#8ccada', '#7bc3d7', '#66b9d2']\n", - "# ax.bar3d(x=_train, y=_kVals, z=bottom, dx=width, dy=depth, dz=top, color='#66b9d2',shade=True)\n", - "# ax.set_zlim3d((min(accuracies),max(accuracies)))\n", - "\n", - "# ax.set_xlabel(\"Train_size\")\n", - "# ax.set_ylabel(\"k\")\n", - "# ax.set_zlabel(\"accuracy\")\n", - "\n", - "# fig.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "d5babb27", - "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", + "image/png": "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\n", "text/plain": [ "
" ] @@ -595,85 +211,108 @@ } ], "source": [ - "# take a test digit\n", - "test_digit = X[12121]\n", - "plot_digit(test_digit)" + "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": "45056d70", + "metadata": {}, + "source": [ + "## Train kNN classifier" ] }, { "cell_type": "code", - "execution_count": 27, - "id": "40267938", + "execution_count": 12, + "id": "f7711356", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "4\n" + "CPU times: user 80.6 ms, sys: 183 µs, total: 80.7 ms\n", + "Wall time: 80.3 ms\n" ] - } - ], - "source": [ - "# see label for test digit\n", - "print(y[12121])" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "6a53fad1", - "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": "832b7b62", - "metadata": {}, - "outputs": [], - "source": [ - "# see propability for all classes\n", - "# classifier.decision_function([X[12121]])" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "444ed55f", - "metadata": {}, - "outputs": [ + }, { "data": { "text/plain": [ - "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)" + "KNeighborsClassifier(n_neighbors=3)" ] }, - "execution_count": 30, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# see the classes to understand which received which score\n", - "classifier.classes_" + "%%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": "c1888789", + "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": "1e2e2a1f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_digit(test_digit)" ] }, { "cell_type": "markdown", - "id": "c96b451a", + "id": "87c511b2", "metadata": {}, "source": [ "### Evaluation" @@ -681,19 +320,23 @@ }, { "cell_type": "code", - "execution_count": 31, - "id": "964f3493", + "execution_count": 15, + "id": "90636a49", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Accuracy Train 98.66020524515393\n" + "Accuracy Train 98.57321428571429\n", + "CPU times: user 7min 45s, sys: 16min 28s, total: 24min 14s\n", + "Wall time: 49.4 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", @@ -702,19 +345,23 @@ }, { "cell_type": "code", - "execution_count": 32, - "id": "c04ca966", + "execution_count": 16, + "id": "0b545276", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Accuracy Test 98.77538829151732\n" + "Accuracy Test 97.14285714285714\n", + "CPU times: user 1min 54s, sys: 4min 7s, total: 6min 2s\n", + "Wall time: 12.3 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", @@ -723,7 +370,7 @@ }, { "cell_type": "markdown", - "id": "d6bcbe4b", + "id": "90959859", "metadata": {}, "source": [ "Accuracy is strongly influenced by the distribution of the classes in the test data." @@ -731,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "62200820", + "id": "22a52196", "metadata": {}, "source": [ "#### Cross Validation\n", @@ -740,19 +387,23 @@ }, { "cell_type": "code", - "execution_count": 33, - "id": "485d7fb2", + "execution_count": 17, + "id": "cad28e74", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[0.96930417 0.96898771 0.96498177]\n" + "[0.96866127 0.9686077 0.9694632 ]\n", + "CPU times: user 4min 41s, sys: 11min 10s, total: 15min 51s\n", + "Wall time: 33 s\n" ] } ], "source": [ + "%%time\n", + "\n", "# cross validation score\n", "from sklearn.model_selection import cross_val_score\n", "\n", @@ -761,19 +412,23 @@ }, { "cell_type": "code", - "execution_count": 34, - "id": "48cd1f2e", + "execution_count": 18, + "id": "9ad4da9b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[5 0 4 ... 8 9 5]\n" + "[5 8 0 ... 9 3 7]\n", + "CPU times: user 4min 40s, sys: 11min 5s, total: 15min 45s\n", + "Wall time: 33 s\n" ] } ], "source": [ + "%%time\n", + "\n", "# prediction of classifier\n", "from sklearn.model_selection import cross_val_predict\n", "\n", @@ -783,7 +438,7 @@ }, { "cell_type": "markdown", - "id": "61adca5b", + "id": "515fa5cd", "metadata": {}, "source": [ "#### Precision" @@ -791,17 +446,17 @@ }, { "cell_type": "code", - "execution_count": 35, - "id": "dc6137f4", + "execution_count": 19, + "id": "d0b1d476", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.9679281746772196" + "0.9691263682630111" ] }, - "execution_count": 35, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -814,7 +469,7 @@ }, { "cell_type": "markdown", - "id": "6e71a45e", + "id": "72e1dd8c", "metadata": {}, "source": [ "#### Recall" @@ -822,17 +477,17 @@ }, { "cell_type": "code", - "execution_count": 36, - "id": "5651a2f9", + "execution_count": 20, + "id": "21efc1ec", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.9677579067394827" + "0.9689107142857143" ] }, - "execution_count": 36, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -845,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "d1ad054a", + "id": "abd47e74", "metadata": {}, "source": [ "#### F1 Score" @@ -853,17 +508,17 @@ }, { "cell_type": "code", - "execution_count": 37, - "id": "d9091409", + "execution_count": 21, + "id": "db7ea5c6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.9676787940700043" + "0.9688480125980605" ] }, - "execution_count": 37, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -876,7 +531,7 @@ }, { "cell_type": "markdown", - "id": "e46c2f46", + "id": "1e307e68", "metadata": {}, "source": [ "#### Confusion Matrix" @@ -884,24 +539,24 @@ }, { "cell_type": "code", - "execution_count": 38, - "id": "c7d6cb70", + "execution_count": 22, + "id": "6c0f7b1e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[[6516 2 6 0 1 7 17 2 4 3]\n", - " [ 2 7457 10 2 2 1 4 11 3 4]\n", - " [ 54 63 6379 22 7 3 7 99 17 6]\n", - " [ 12 19 44 6534 2 75 4 37 40 29]\n", - " [ 9 59 1 1 6276 0 16 11 3 126]\n", - " [ 26 12 5 86 10 5774 62 4 21 27]\n", - " [ 31 12 2 0 9 22 6462 0 2 0]\n", - " [ 4 78 17 3 23 2 0 6743 3 67]\n", - " [ 32 77 34 93 43 109 29 16 6014 58]\n", - " [ 27 17 8 50 74 14 4 81 8 6348]]\n" + "[[5465 4 2 0 0 8 15 1 1 3]\n", + " [ 1 6252 11 2 2 1 4 9 2 3]\n", + " [ 36 57 5381 14 3 4 9 78 11 2]\n", + " [ 6 18 37 5484 2 58 3 25 33 13]\n", + " [ 3 48 3 1 5251 0 14 11 2 117]\n", + " [ 18 10 5 67 13 4874 50 4 8 19]\n", + " [ 27 15 1 0 5 18 5473 0 3 0]\n", + " [ 1 72 12 2 12 1 0 5684 2 60]\n", + " [ 25 75 25 80 31 88 19 17 5098 46]\n", + " [ 12 17 8 44 60 15 3 66 8 5297]]\n" ] } ], @@ -914,44 +569,44 @@ }, { "cell_type": "code", - "execution_count": 39, - "id": "5435b8a1", + "execution_count": 23, + "id": "4338b3bb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[[9.93595608e-01 3.04971028e-04 9.14913083e-04 0.00000000e+00\n", - " 1.52485514e-04 1.06739860e-03 2.59225374e-03 3.04971028e-04\n", - " 6.09942056e-04 4.57456542e-04]\n", - " [2.66808965e-04 9.94797225e-01 1.33404482e-03 2.66808965e-04\n", - " 2.66808965e-04 1.33404482e-04 5.33617930e-04 1.46744931e-03\n", - " 4.00213447e-04 5.33617930e-04]\n", - " [8.11176205e-03 9.46372240e-03 9.58239447e-01 3.30479195e-03\n", - " 1.05152471e-03 4.50653447e-04 1.05152471e-03 1.48715638e-02\n", - " 2.55370287e-03 9.01306895e-04]\n", - " [1.76574456e-03 2.79576221e-03 6.47439670e-03 9.61447911e-01\n", - " 2.94290759e-04 1.10359035e-02 5.88581519e-04 5.44437905e-03\n", - " 5.88581519e-03 4.26721601e-03]\n", - " [1.38418948e-03 9.07413104e-03 1.53798831e-04 1.53798831e-04\n", - " 9.65241464e-01 0.00000000e+00 2.46078130e-03 1.69178714e-03\n", - " 4.61396493e-04 1.93786527e-02]\n", - " [4.31392069e-03 1.99104032e-03 8.29600133e-04 1.42691223e-02\n", - " 1.65920027e-03 9.58022233e-01 1.02870416e-02 6.63680106e-04\n", - " 3.48432056e-03 4.47984072e-03]\n", - " [4.74006116e-03 1.83486239e-03 3.05810398e-04 0.00000000e+00\n", - " 1.37614679e-03 3.36391437e-03 9.88073394e-01 0.00000000e+00\n", - " 3.05810398e-04 0.00000000e+00]\n", - " [5.76368876e-04 1.12391931e-02 2.44956772e-03 4.32276657e-04\n", - " 3.31412104e-03 2.88184438e-04 0.00000000e+00 9.71613833e-01\n", - " 4.32276657e-04 9.65417867e-03]\n", - " [4.91929285e-03 1.18370484e-02 5.22674865e-03 1.42966949e-02\n", - " 6.61029977e-03 1.67563413e-02 4.45810915e-03 2.45964643e-03\n", - " 9.24519600e-01 8.91621829e-03]\n", - " [4.07178404e-03 2.56371588e-03 1.20645453e-03 7.54034082e-03\n", - " 1.11597044e-02 2.11129543e-03 6.03227266e-04 1.22153521e-02\n", - " 1.20645453e-03 9.57321671e-01]]\n" + "[[9.93817058e-01 7.27404983e-04 3.63702491e-04 0.00000000e+00\n", + " 0.00000000e+00 1.45480997e-03 2.72776869e-03 1.81851246e-04\n", + " 1.81851246e-04 5.45553737e-04]\n", + " [1.59058374e-04 9.94432957e-01 1.74964212e-03 3.18116749e-04\n", + " 3.18116749e-04 1.59058374e-04 6.36233498e-04 1.43152537e-03\n", + " 3.18116749e-04 4.77175123e-04]\n", + " [6.43431635e-03 1.01876676e-02 9.61751564e-01 2.50223414e-03\n", + " 5.36193029e-04 7.14924039e-04 1.60857909e-03 1.39410188e-02\n", + " 1.96604111e-03 3.57462020e-04]\n", + " [1.05652404e-03 3.16957211e-03 6.51523155e-03 9.65662969e-01\n", + " 3.52174679e-04 1.02130657e-02 5.28262018e-04 4.40218348e-03\n", + " 5.81088220e-03 2.28913541e-03]\n", + " [5.50458716e-04 8.80733945e-03 5.50458716e-04 1.83486239e-04\n", + " 9.63486239e-01 0.00000000e+00 2.56880734e-03 2.01834862e-03\n", + " 3.66972477e-04 2.14678899e-02]\n", + " [3.55169692e-03 1.97316496e-03 9.86582478e-04 1.32202052e-02\n", + " 2.56511444e-03 9.61720600e-01 9.86582478e-03 7.89265983e-04\n", + " 1.57853197e-03 3.74901342e-03]\n", + " [4.87188741e-03 2.70660411e-03 1.80440274e-04 0.00000000e+00\n", + " 9.02201371e-04 3.24792494e-03 9.87549621e-01 0.00000000e+00\n", + " 5.41320823e-04 0.00000000e+00]\n", + " [1.71057133e-04 1.23161136e-02 2.05268560e-03 3.42114266e-04\n", + " 2.05268560e-03 1.71057133e-04 0.00000000e+00 9.72288744e-01\n", + " 3.42114266e-04 1.02634280e-02]\n", + " [4.54215116e-03 1.36264535e-02 4.54215116e-03 1.45348837e-02\n", + " 5.63226744e-03 1.59883721e-02 3.45203488e-03 3.08866279e-03\n", + " 9.26235465e-01 8.35755814e-03]\n", + " [2.16998192e-03 3.07414105e-03 1.44665461e-03 7.95660036e-03\n", + " 1.08499096e-02 2.71247740e-03 5.42495479e-04 1.19349005e-02\n", + " 1.44665461e-03 9.57866184e-01]]\n" ] } ], @@ -962,8 +617,8 @@ }, { "cell_type": "code", - "execution_count": 40, - "id": "4d36c617", + "execution_count": 24, + "id": "dbccf666", "metadata": {}, "outputs": [], "source": [ @@ -973,13 +628,13 @@ }, { "cell_type": "code", - "execution_count": 41, - "id": "6ac6f602", + "execution_count": 25, + "id": "83cfa9e4", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1002,18 +657,45 @@ ] }, { - "cell_type": "markdown", - "id": "e437a491", + "cell_type": "code", + "execution_count": 26, + "id": "69dc2a66", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.98 0.99 0.99 5499\n", + " 1 0.95 0.99 0.97 6287\n", + " 2 0.98 0.96 0.97 5595\n", + " 3 0.96 0.97 0.96 5679\n", + " 4 0.98 0.96 0.97 5450\n", + " 5 0.96 0.96 0.96 5068\n", + " 6 0.98 0.99 0.98 5542\n", + " 7 0.96 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": [ - "## Train kNN Classifer\n", - "__TODO__" + "from sklearn.metrics import classification_report\n", + "\n", + "print(classification_report(y_train, y_train_pred))" ] }, { "cell_type": "code", "execution_count": null, - "id": "c41b6913", + "id": "8d64b441", "metadata": {}, "outputs": [], "source": [] diff --git a/0-pilot-project/MNIST.ipynb b/0-pilot-project/MNIST.ipynb index 2485e16..c5235d4 100644 --- a/0-pilot-project/MNIST.ipynb +++ b/0-pilot-project/MNIST.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "9507bfb9", + "id": "7a0c752a", "metadata": {}, "source": [ "### Load MNIST dataset" @@ -11,7 +11,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "1ed54820", + "id": "e07d82fe", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "532fc961", + "id": "1f97dcb1", "metadata": {}, "outputs": [], "source": [ @@ -35,7 +35,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "37391208", + "id": "01f83832", "metadata": {}, "outputs": [], "source": [ @@ -46,7 +46,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "aaf9d74d", + "id": "affa0e2b", "metadata": {}, "outputs": [ { @@ -73,7 +73,7 @@ }, { "cell_type": "markdown", - "id": "02444b3c", + "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", @@ -83,7 +83,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "60abd5bd", + "id": "78be57ab", "metadata": {}, "outputs": [ { @@ -106,7 +106,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "f9eb1a3e", + "id": "d0450c41", "metadata": {}, "outputs": [ { @@ -127,7 +127,7 @@ }, { "cell_type": "markdown", - "id": "6ffbf39a", + "id": "e61e2adb", "metadata": {}, "source": [ "Datasets loaded by Scikit-Learn generally have a similar dictionary structure, including the following:\\\n", @@ -139,13 +139,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "2b3ee5f6", + "id": "fe285433", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "\"The MNIST database of handwritten digits with 784 features. 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.\"" + "\"**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, @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "04b6042e", + "id": "5a70a746", "metadata": {}, "source": [ "### Prepare the MNIST dataset" @@ -167,7 +167,7 @@ }, { "cell_type": "markdown", - "id": "0c6a4dcf", + "id": "a9b7a120", "metadata": {}, "source": [ "$f(X) = y$\n", @@ -181,7 +181,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "53f4723d", + "id": "4e02cf2a", "metadata": {}, "outputs": [], "source": [ @@ -191,7 +191,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "0c9ba2bb", + "id": "001d736f", "metadata": {}, "outputs": [ { @@ -212,7 +212,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "cb7b421b", + "id": "b344be1d", "metadata": {}, "outputs": [ { @@ -233,7 +233,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "82e2f7ba", + "id": "cef23e9f", "metadata": {}, "outputs": [ { @@ -253,7 +253,7 @@ }, { "cell_type": "markdown", - "id": "65185c61", + "id": "fe3b1259", "metadata": {}, "source": [ "### Plot data" @@ -262,7 +262,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "8370fd0e", + "id": "953d9415", "metadata": {}, "outputs": [], "source": [ @@ -274,7 +274,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "448321e3", + "id": "b68f6cee", "metadata": {}, "outputs": [ { @@ -297,7 +297,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "7f66718a", + "id": "8779b1a2", "metadata": {}, "outputs": [ { @@ -317,7 +317,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "ba95d655", + "id": "dcc605cf", "metadata": {}, "outputs": [ { @@ -343,7 +343,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "7d665e31", + "id": "6d41d752", "metadata": {}, "outputs": [ { @@ -364,7 +364,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "e12786e6", + "id": "230cfd35", "metadata": {}, "outputs": [], "source": [ @@ -375,7 +375,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "b114c10d", + "id": "25a3a2e7", "metadata": {}, "outputs": [], "source": [ @@ -389,7 +389,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "5f4d40c4", + "id": "f1552762", "metadata": {}, "outputs": [ { @@ -413,7 +413,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "5a18f4f9", + "id": "74b3a063", "metadata": {}, "outputs": [], "source": [ @@ -429,7 +429,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "fdd1cc4d", + "id": "949b3914", "metadata": {}, "outputs": [ { @@ -454,7 +454,7 @@ }, { "cell_type": "markdown", - "id": "88c50f5b", + "id": "ec8a9d34", "metadata": {}, "source": [ "### Prepare data for machine learning" @@ -463,7 +463,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "0ebec6fa", + "id": "febbd286", "metadata": {}, "outputs": [ { @@ -485,7 +485,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "6e0cb6ee", + "id": "fff839b6", "metadata": {}, "outputs": [], "source": [ @@ -495,7 +495,7 @@ }, { "cell_type": "markdown", - "id": "6edf6046", + "id": "2bdbeb4e", "metadata": {}, "source": [ "### Train classifier" @@ -504,7 +504,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "549db50c", + "id": "4c32ae9f", "metadata": {}, "outputs": [], "source": [ @@ -515,7 +515,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "92297e2c", + "id": "fe06ae55", "metadata": {}, "outputs": [ { @@ -540,7 +540,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "c08adc09", + "id": "e6209258", "metadata": {}, "outputs": [ { @@ -565,7 +565,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "e9622d3b", + "id": "62773b1b", "metadata": {}, "outputs": [ { @@ -584,7 +584,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "afd7df0b", + "id": "0ce21474", "metadata": {}, "outputs": [ { @@ -603,7 +603,7 @@ { "cell_type": "code", "execution_count": 29, - "id": "3591ea2c", + "id": "78a8e8a7", "metadata": {}, "outputs": [ { @@ -626,7 +626,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "21c1ce01", + "id": "45d93a99", "metadata": {}, "outputs": [ { @@ -647,7 +647,7 @@ }, { "cell_type": "markdown", - "id": "62982f84", + "id": "fc739051", "metadata": {}, "source": [ "### Evaluation" @@ -656,7 +656,7 @@ { "cell_type": "code", "execution_count": 31, - "id": "e257d6fa", + "id": "990a5b7c", "metadata": {}, "outputs": [ { @@ -677,7 +677,7 @@ { "cell_type": "code", "execution_count": 32, - "id": "160c355e", + "id": "f125a37d", "metadata": {}, "outputs": [ { @@ -697,7 +697,7 @@ }, { "cell_type": "markdown", - "id": "5ca9eb13", + "id": "bdcb6e6e", "metadata": {}, "source": [ "Accuracy is strongly influenced by the distribution of the classes in the test data." @@ -705,7 +705,7 @@ }, { "cell_type": "markdown", - "id": "7e1d98d0", + "id": "be858cd5", "metadata": {}, "source": [ "#### Cross Validation\n", @@ -715,7 +715,7 @@ { "cell_type": "code", "execution_count": 33, - "id": "bf3fe38d", + "id": "7adb1ea7", "metadata": {}, "outputs": [ { @@ -736,7 +736,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "ef410d43", + "id": "11d22c5e", "metadata": {}, "outputs": [ { @@ -759,7 +759,7 @@ }, { "cell_type": "markdown", - "id": "b5d581d2", + "id": "b54e83a5", "metadata": {}, "source": [ "#### Precision" @@ -768,7 +768,7 @@ { "cell_type": "code", "execution_count": 35, - "id": "6c6c13b2", + "id": "ef7a9e7e", "metadata": {}, "outputs": [ { @@ -790,7 +790,7 @@ }, { "cell_type": "markdown", - "id": "ad953977", + "id": "da723740", "metadata": {}, "source": [ "#### Recall" @@ -799,7 +799,7 @@ { "cell_type": "code", "execution_count": 36, - "id": "6f9f5706", + "id": "cb77bf58", "metadata": {}, "outputs": [ { @@ -821,7 +821,7 @@ }, { "cell_type": "markdown", - "id": "c5d15006", + "id": "28867d1b", "metadata": {}, "source": [ "#### F1 Score" @@ -830,7 +830,7 @@ { "cell_type": "code", "execution_count": 37, - "id": "4c6a0676", + "id": "0674e0de", "metadata": {}, "outputs": [ { @@ -852,7 +852,7 @@ }, { "cell_type": "markdown", - "id": "29f5d5e2", + "id": "da59da11", "metadata": {}, "source": [ "#### Confusion Matrix" @@ -861,7 +861,7 @@ { "cell_type": "code", "execution_count": 38, - "id": "db5092b9", + "id": "adbdeece", "metadata": {}, "outputs": [ { @@ -891,7 +891,7 @@ { "cell_type": "code", "execution_count": 39, - "id": "9b9b93f7", + "id": "fb50c5a4", "metadata": {}, "outputs": [ { @@ -929,7 +929,7 @@ { "cell_type": "code", "execution_count": 40, - "id": "d0c229f1", + "id": "2f0d536a", "metadata": {}, "outputs": [], "source": [ @@ -940,7 +940,7 @@ { "cell_type": "code", "execution_count": 41, - "id": "634396e4", + "id": "dddf5fe8", "metadata": {}, "outputs": [ { @@ -969,33 +969,44 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "1ef938c5", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f55ba3ed", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "9238e672", + "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": [ - "## Train kNN Classifer\n", - "__TODO__" + "from sklearn.metrics import classification_report\n", + "\n", + "print(classification_report(y_train, y_train_pred))" ] }, { "cell_type": "code", "execution_count": null, - "id": "a8fbef47", + "id": "57d96f56", "metadata": {}, "outputs": [], "source": [] diff --git a/0-pilot-project/Process.md b/0-pilot-project/Process.md new file mode 100644 index 0000000..d07a49c --- /dev/null +++ b/0-pilot-project/Process.md @@ -0,0 +1,48 @@ +# Using kNN +## Finding optimal k-Value +Through testing on the original dataset (split 80:20) we found, that the optimal k-value is 3. + +Running the kNN on the dataset without any preprocessing results in: +> weighted avg 0.97 0.97 0.97 56000 + +# Dataset optimization +## Standardization +### Standard +It seemed like StandardScalar on the MNIST dataset wouldn't change the outcome, so we ommitted standardization. +Reason for that is probably, that the MNIST Dataset was already optimized for processing. + +### MinMax +Needs to be updated. + +## Feature selection +To be tested + +## Feature reduction +### PCA +Testing with PCA and plotting component vs. variance we found that a 98.64% variance could be archived with only 300 components [^1]. + +Testing further the a variance of 99.99999999999992% was archived at 709 components, which was also the same for 784 components (the original amount of components), which means, that no/minimal variance/information is lost when using 709 components in comparison to 784 components[^2]. + +For now we will simply go with n_components of 709. + +### LDA +To be tested + +# TODO +- [ ] Look up point of Covariance Matrix and how it works + - https://www.youtube.com/watch?v=152tSYtiQbw + - Probably part of PCA +- [ ] Reference for standardization not changing results of classifier +- [ ] Reference for MNIST already been standardized +- [ ] Test standardization method other than `StandardScalar` +- [ ] Test feature reduction method other than `PCA` (i.e. LDA(Linear Discriminant Analysis)) + - https://en.wikipedia.org/wiki/Dimensionality_reduction + - https://towardsdatascience.com/is-lda-a-dimensionality-reduction-technique-or-a-classifier-algorithm-eeed4de9953a + - https://medium.com/machine-learning-researcher/dimensionality-reduction-pca-and-lda-6be91734f567 + - https://towardsdatascience.com/dimensionality-reduction-does-pca-really-improve-classification-outcome-6e9ba21f0a32 +- [ ] Add feature selection process + - https://scikit-learn.org/stable/modules/feature_selection.html + + +[^1]: https://medium.com/@miat1015/mnist-using-pca-for-dimension-reduction-and-also-t-sne-and-also-3d-visualization-55084e0320b5 +[^2]: Could be due to rounding in python \ No newline at end of file diff --git a/0-pilot-project/notes.md b/0-pilot-project/notes.md index 63f0d53..b2e2f31 100644 --- a/0-pilot-project/notes.md +++ b/0-pilot-project/notes.md @@ -5,9 +5,10 @@ - Wo ist der Unterschied zwischen sklearn.model_selection.train_test_split und manuellem pick mit list arguments ## Todos -- Unterschied zwischen accuracy und precision score (steht vlt in Folien) +- ~~Unterschied zwischen accuracy und precision score (steht vlt in Folien)~~ - Classifier grafisch anzeigen lassen (https://scikit-learn.org/stable/auto_examples/neighbors/plot_classification.html#sphx-glr-auto-examples-neighbors-plot-classification-py) -- Schauen wie wir mit weniger Features arbeiten können -- Zeitmessung von einzelnen classifier test loops und mitprinten bei jedem Durchlauf +- ~~Schauen wie wir mit weniger Features arbeiten können~~ PCA/LDA +- ~~Zeitmessung von einzelnen classifier test loops und mitprinten bei jedem Durchlauf~~ %%time - Unterschiedliche Validierungsmethoden testen -- Code anpassen, dass er nicht stirbt \ No newline at end of file +- ~~Code anpassen, dass er nicht stirbt~~ +- Accuracy anhand Testdatensatz \ No newline at end of file diff --git a/0-pilot-project/results.md b/0-pilot-project/results.md new file mode 100644 index 0000000..16c586b --- /dev/null +++ b/0-pilot-project/results.md @@ -0,0 +1,146 @@ +## StandardScalar & LDA=9 + +``` + precision recall f1-score support + + 0 0.94 0.97 0.96 5499 + 1 0.93 0.98 0.95 6287 + 2 0.90 0.91 0.90 5595 + 3 0.89 0.87 0.88 5679 + 4 0.91 0.93 0.92 5450 + 5 0.88 0.86 0.87 5068 + 6 0.95 0.95 0.95 5542 + 7 0.95 0.93 0.94 5846 + 8 0.90 0.84 0.87 5504 + 9 0.90 0.89 0.89 5530 + + accuracy 0.91 56000 + macro avg 0.91 0.91 0.91 56000 +weighted avg 0.91 0.91 0.91 56000 +``` + + +## StandardScalar & PCA=70 + +``` + precision recall f1-score support + + 0 0.97 0.99 0.98 5499 + 1 0.97 0.99 0.98 6287 + 2 0.96 0.96 0.96 5595 + 3 0.94 0.94 0.94 5679 + 4 0.95 0.95 0.95 5450 + 5 0.95 0.94 0.94 5068 + 6 0.97 0.98 0.97 5542 + 7 0.96 0.95 0.95 5846 + 8 0.95 0.93 0.94 5504 + 9 0.93 0.93 0.93 5530 + + accuracy 0.96 56000 + macro avg 0.95 0.95 0.95 56000 +weighted avg 0.96 0.96 0.96 56000 +``` + +## StandardScalar & PCA=400 + +``` + precision recall f1-score support + + 0 0.95 0.99 0.97 5499 + 1 0.95 0.99 0.97 6287 + 2 0.95 0.94 0.94 5595 + 3 0.93 0.94 0.93 5679 + 4 0.94 0.93 0.94 5450 + 5 0.93 0.92 0.93 5068 + 6 0.96 0.97 0.97 5542 + 7 0.94 0.94 0.94 5846 + 8 0.97 0.89 0.93 5504 + 9 0.91 0.92 0.92 5530 + + accuracy 0.94 56000 + macro avg 0.94 0.94 0.94 56000 +weighted avg 0.94 0.94 0.94 56000 +``` + +## PCA=300 +``` + precision recall f1-score support + + 0 0.96 0.99 0.97 5499 + 1 0.96 0.99 0.97 6287 + 2 0.95 0.94 0.95 5595 + 3 0.93 0.94 0.94 5679 + 4 0.95 0.94 0.94 5450 + 5 0.93 0.92 0.93 5068 + 6 0.96 0.97 0.97 5542 + 7 0.95 0.94 0.94 5846 + 8 0.96 0.90 0.93 5504 + 9 0.92 0.92 0.92 5530 + + accuracy 0.95 56000 + macro avg 0.95 0.95 0.95 56000 +weighted avg 0.95 0.95 0.95 56000 +``` + +## Nothing + +``` + precision recall f1-score support + + 0 0.98 0.99 0.99 5499 + 1 0.95 0.99 0.97 6287 + 2 0.98 0.96 0.97 5595 + 3 0.96 0.97 0.96 5679 + 4 0.98 0.96 0.97 5450 + 5 0.96 0.96 0.96 5068 + 6 0.98 0.99 0.98 5542 + 7 0.96 0.97 0.97 5846 + 8 0.99 0.93 0.96 5504 + 9 0.95 0.96 0.96 5530 + + accuracy 0.97 56000 + macro avg 0.97 0.97 0.97 56000 +weighted avg 0.97 0.97 0.97 56000 +``` + +## PCA=400 & StandardScalar (same for non StandardScalar) + +``` + precision recall f1-score support + + 0 0.85 0.95 0.90 5499 + 1 0.68 0.99 0.80 6287 + 2 0.88 0.75 0.81 5595 + 3 0.82 0.84 0.83 5679 + 4 0.90 0.79 0.84 5450 + 5 0.88 0.76 0.82 5068 + 6 0.91 0.93 0.92 5542 + 7 0.87 0.87 0.87 5846 + 8 0.96 0.66 0.78 5504 + 9 0.83 0.85 0.84 5530 + + accuracy 0.84 56000 + macro avg 0.86 0.84 0.84 56000 +weighted avg 0.86 0.84 0.84 56000 +``` + +## PCA=708 & StandardScalar (same for non StandardScalar) + +``` + precision recall f1-score support + + 0 0.95 0.99 0.97 5499 + 1 0.95 0.99 0.97 6287 + 2 0.95 0.93 0.94 5595 + 3 0.92 0.94 0.93 5679 + 4 0.94 0.93 0.94 5450 + 5 0.93 0.92 0.93 5068 + 6 0.96 0.97 0.97 5542 + 7 0.94 0.93 0.94 5846 + 8 0.97 0.89 0.93 5504 + 9 0.91 0.92 0.91 5530 + + accuracy 0.94 56000 + macro avg 0.94 0.94 0.94 56000 +weighted avg 0.94 0.94 0.94 56000 +``` \ No newline at end of file