From 87d51ce0f4c20f7560197ffaa0ed0e2168e4d15a Mon Sep 17 00:00:00 2001 From: Tuan-Dat Tran Date: Mon, 17 May 2021 01:35:54 +0000 Subject: [PATCH] MNISt-kNN-best was not really best and was replaced functionalitywise by MNIST-kNNbest-pipeline --- 0-pilot-project/MNIST-kNN-best.ipynb | 933 --------------------------- 1 file changed, 933 deletions(-) delete mode 100644 0-pilot-project/MNIST-kNN-best.ipynb diff --git a/0-pilot-project/MNIST-kNN-best.ipynb b/0-pilot-project/MNIST-kNN-best.ipynb deleted file mode 100644 index ad3ce3d..0000000 --- a/0-pilot-project/MNIST-kNN-best.ipynb +++ /dev/null @@ -1,933 +0,0 @@ -{ - "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 -}