From 85d1ea974746fd30d55baf587881febd5e623ef2 Mon Sep 17 00:00:00 2001 From: Joerg Marks Date: Wed, 5 Apr 2023 20:07:23 +0200 Subject: [PATCH] add files --- notebooks/03_ml_basics_ex_1_sol_magic.ipynb | 467 ++++++++++++++++++ ...cs_ex_2_sol_mnist_softmax_regression.ipynb | 233 +++++++++ 2 files changed, 700 insertions(+) create mode 100644 notebooks/03_ml_basics_ex_1_sol_magic.ipynb create mode 100644 notebooks/03_ml_basics_ex_2_sol_mnist_softmax_regression.ipynb diff --git a/notebooks/03_ml_basics_ex_1_sol_magic.ipynb b/notebooks/03_ml_basics_ex_1_sol_magic.ipynb new file mode 100644 index 0000000..4f474a3 --- /dev/null +++ b/notebooks/03_ml_basics_ex_1_sol_magic.ipynb @@ -0,0 +1,467 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise: Classification of air showers measured with the MAGIC telescope\n", + "\n", + "The [MAGIC telescope](https://en.wikipedia.org/wiki/MAGIC_(telescope)) is a Cherenkov telescope situated on La Palma, one of the Canary Islands. The [MAGIC machine learning dataset](https://archive.ics.uci.edu/ml/datasets/magic+gamma+telescope) can be obtained from [UC Irvine Machine Learning Repository](https://archive.ics.uci.edu/ml/index.php).\n", + "\n", + "The task is to separate signal events (gamma showers) and background events (hadron showers) based on the features of a measured Cherenkov shower.\n", + "\n", + "The features of a shower are:\n", + "\n", + " 1. fLength: continuous # major axis of ellipse [mm]\n", + " 2. fWidth: continuous # minor axis of ellipse [mm] \n", + " 3. fSize: continuous # 10-log of sum of content of all pixels [in #phot]\n", + " 4. fConc: continuous # ratio of sum of two highest pixels over fSize [ratio]\n", + " 5. fConc1: continuous # ratio of highest pixel over fSize [ratio]\n", + " 6. fAsym: continuous # distance from highest pixel to center, projected onto major axis [mm]\n", + " 7. fM3Long: continuous # 3rd root of third moment along major axis [mm] \n", + " 8. fM3Trans: continuous # 3rd root of third moment along minor axis [mm]\n", + " 9. fAlpha: continuous # angle of major axis with vector to origin [deg]\n", + " 10. fDist: continuous # distance from origin to center of ellipse [mm]\n", + " 11. class: g,h # gamma (signal), hadron (background)\n", + "\n", + "g = gamma (signal): 12332\n", + "h = hadron (background): 6688\n", + "\n", + "For technical reasons, the number of h events is underestimated.\n", + "In the real data, the h class represents the majority of the events.\n", + "\n", + "You can find further information about the MAGIC telescope and the data discrimination studies in the following [paper](https://reader.elsevier.com/reader/sd/pii/S0168900203025051?token=8A02764E2448BDC5E4DD0ED53A301295162A6E9C8F223378E8CF80B187DBFD98BD3B642AB83886944002206EB1688FF4) (R. K. Bock et al., \"Methods for multidimensional event classification: a case studyusing images from a Cherenkov gamma-ray telescope\" NIM A 516 (2004) 511-528) (You need to be within the university network to get free access.) " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "filename = \"https://www.physi.uni-heidelberg.de/~reygers/lectures/2021/ml/data/magic04_data.txt\"\n", + "df = pd.read_csv(filename, engine='python')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# use categories 1 and 0 insted of \"g\" and \"h\"\n", + "df['class'] = df['class'].map({'g': 1, 'h': 0})" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
fLengthfWidthfSizefConcfConc1fAsymfM3LongfM3TransfAlphafDistclass
028.796716.00212.64490.39180.198227.700422.0110-8.202740.092081.88281
131.603611.72352.51850.53030.377326.272223.8238-9.95746.3609205.26101
2162.0520136.03104.06120.03740.0187116.7410-64.8580-45.216076.9600256.78801
323.81729.57282.33850.61470.392227.2107-6.4633-7.151310.4490116.73701
475.136230.92053.16110.31680.1832-5.527728.552521.83934.6480356.46201
\n", + "
" + ], + "text/plain": [ + " fLength fWidth fSize fConc fConc1 fAsym fM3Long fM3Trans \\\n", + "0 28.7967 16.0021 2.6449 0.3918 0.1982 27.7004 22.0110 -8.2027 \n", + "1 31.6036 11.7235 2.5185 0.5303 0.3773 26.2722 23.8238 -9.9574 \n", + "2 162.0520 136.0310 4.0612 0.0374 0.0187 116.7410 -64.8580 -45.2160 \n", + "3 23.8172 9.5728 2.3385 0.6147 0.3922 27.2107 -6.4633 -7.1513 \n", + "4 75.1362 30.9205 3.1611 0.3168 0.1832 -5.5277 28.5525 21.8393 \n", + "\n", + " fAlpha fDist class \n", + "0 40.0920 81.8828 1 \n", + "1 6.3609 205.2610 1 \n", + "2 76.9600 256.7880 1 \n", + "3 10.4490 116.7370 1 \n", + "4 4.6480 356.4620 1 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### a) Create for each variable a figure with a plot for gammas and hadrons overlayed." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "df0 = df[df['class'] == 0] # hadron data set\n", + "df1 = df[df['class'] == 1] # gamma data set" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(nrows=2, ncols=5, figsize=(15,5))\n", + "plt.subplots_adjust(hspace = 0.3, wspace=0.3)\n", + "\n", + "for i in range(10):\n", + " kx = i // 5\n", + " ky = i % 5\n", + " axs[kx, ky].set_xlabel(df0.columns[i])\n", + " df0.iloc[:,i].hist(ax = axs[kx, ky], bins = 50, alpha=0.5, density=True, label='h')\n", + " df1.iloc[:,i].hist(ax = axs[kx, ky], bins = 50, alpha=0.5, density=True, label='g')\n", + "\n", + "axs[0, 0].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### b) Create training and test data set. The tast data should amount to 50\\% of the total data set." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "y = df['class'].values\n", + "X = df[[col for col in df.columns if col!=\"class\"]]\n", + "\n", + "### YOUR CODE ### \n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, shuffle=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### c) Define the logistic regressor and fit the training data" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn import linear_model\n", + "\n", + "# define logistic regressor\n", + "\n", + "### YOUR CODE ###\n", + "\n", + "logreg=linear_model.LogisticRegression(fit_intercept=True,\n", + " penalty='none',\n", + " max_iter=1000,\n", + " tol=1E-5)\n", + "\n", + "# fit training data\n", + "\n", + "### YOUR CODE ###\n", + "\n", + "import time\n", + "start_time = time.time()\n", + "logreg.fit(X_train, y_train)\n", + "run_time = time.time() - start_time" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred = logreg.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### d) Determine the Model Accuracy, the AUC score and the Run time" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model Accuracy: 78.99%\n", + "AUC score: 0.74\n", + "Run time: 0.22 sec\n", + "\n", + "\n" + ] + } + ], + "source": [ + "from sklearn.metrics import roc_auc_score\n", + "\n", + "### YOUR CODE ###\n", + "\n", + "print(\"Model Accuracy: {:.2f}%\".format(100*logreg.score(X_test, y_test)))\n", + "print(\"AUC score: {:.2f}\".format(roc_auc_score(y_test,y_pred)))\n", + "print(\"Run time: {:.2f} sec\\n\\n\".format(run_time))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### e) Plot the ROC curve (Backgropund Rejection vs signal efficiency)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "from sklearn.metrics import roc_curve\n", + "%matplotlib inline\n", + "\n", + "y_pred_prob = logreg.predict_proba(X_test) # predicted probabilities\n", + "\n", + "### YOUR CODE ###\n", + "\n", + "fpr, tpr, _ = roc_curve(y_test, y_pred_prob[:,1])\n", + "plt.plot(tpr, 1-fpr)\n", + "plt.xlabel('Signal efficiency')\n", + "plt.ylabel('Background Rejection');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### f) Plot the Signal efficiency vs. the Background efficiency and compare it to the corresponding plot in the paper" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "### YOUR CODE ###\n", + "plt.plot(fpr, tpr)\n", + "plt.xscale(\"log\")\n", + "plt.xlabel('Background efficiency')\n", + "plt.ylabel('Signal efficiency');" + ] + } + ], + "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": 4 +} diff --git a/notebooks/03_ml_basics_ex_2_sol_mnist_softmax_regression.ipynb b/notebooks/03_ml_basics_ex_2_sol_mnist_softmax_regression.ipynb new file mode 100644 index 0000000..d13704c --- /dev/null +++ b/notebooks/03_ml_basics_ex_2_sol_mnist_softmax_regression.ipynb @@ -0,0 +1,233 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# MNIST digits: Softmax Regression " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.datasets import fetch_openml # MNIST data\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import classification_report\n", + "from sklearn.metrics import accuracy_score" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# load MNIST data from https://www.openml.org/d/554\n", + "X, y = fetch_openml('mnist_784', version=1, return_X_y=True)\n", + "X = X.to_numpy()\n", + "y = y.to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# generate training and test datasets\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.subplots(1, 6, figsize=(15,5))\n", + "for i in range(6):\n", + " index = 9000 + i # image number\n", + " pixels = np.array(X_train[index], dtype='uint8')\n", + " pixels = pixels.reshape((28, 28))\n", + " plt.subplot(1, 6, i+1)\n", + " plt.title('Label is {label}'.format(label=y_train[index]))\n", + " plt.imshow(pixels, cmap='gray')\n", + " plt.xticks(())\n", + " plt.yticks(())" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# apply logistic regressor with 'sag' solver, C is the inverse regularization strength\n", + "clf = LogisticRegression(multi_class='multinomial',\n", + " penalty='none', solver='sag', tol=0.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression(multi_class='multinomial', penalty='none', solver='sag',\n", + " tol=0.1)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# fit data\n", + "clf.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.95 0.97 0.96 1407\n", + " 1 0.96 0.97 0.96 1525\n", + " 2 0.92 0.89 0.91 1410\n", + " 3 0.91 0.90 0.90 1453\n", + " 4 0.91 0.93 0.92 1407\n", + " 5 0.90 0.84 0.87 1260\n", + " 6 0.93 0.96 0.94 1387\n", + " 7 0.93 0.94 0.94 1434\n", + " 8 0.87 0.88 0.88 1375\n", + " 9 0.90 0.90 0.90 1342\n", + "\n", + " accuracy 0.92 14000\n", + " macro avg 0.92 0.92 0.92 14000\n", + "weighted avg 0.92 0.92 0.92 14000\n", + "\n", + "0.9195714285714286\n" + ] + } + ], + "source": [ + "#Test the model\n", + "predictions = clf.predict(X_test)\n", + "\n", + "#Precision, recall, f1-score\n", + "print(classification_report(y_test, predictions))\n", + "print(accuracy_score(y_test, predictions))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAADrCAYAAACICmHVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFkUlEQVR4nO3dsWpUWxiG4T2HEBRBQRTE5iRFBCFCIGJnqzaBXEBIYeNVWHkDqS0lja3p0oeAYBCNCorIQQMRT2OwUCHOuQH3P5lxZ/Q78zxl/tnOal6WsFh7ev1+vwH+fH/97gUARyNWCCFWCCFWCCFWCCFWCDE1zId7vZ5zHjhm/X6/97O/21khhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghhFghxFC/Isf43b17t5zPzc390r+/urr6S88zPnZWCCFWCCFWCCFWCCFWCCFWCCFWCNHr9/tH/3Cvd/QPT5C1tbVyPjMzU84XFhZaZ4eHh+Wznz9/LueD7O3tlfOlpaVf+vcZXr/f7/3s73ZWCCFWCCFWCCFWCCFWCCFWCCFWCOGc9Qg2NzfL+eXLl8v59+/fy/nW1lbr7Ljvm+7s7JTz6hz24cOH5bPr6+sjrWnSOWeFcGKFEGKFEGKFEGKFEGKFEF5F2jTNkydPyvmg461Xr16V8xs3bgy9pnHZ3d0t5zdv3mydDTq6oVt2VgghVgghVgghVgghVgghVgghVgjhnLVpmrdv35bz06dPl/Nbt251uZyxGnT9b35+vnV29erV8llX5LplZ4UQYoUQYoUQYoUQYoUQYoUQYoUQXkVKaWNjo3V28eLF8tnFxcWulzMRvIoUwokVQogVQogVQogVQogVQogVQrjPSunKlSuts/fv349xJdhZIYRYIYRYIYRYIYRYIYRYIYRYIYRz1gm3trZWzg8PD1tng945TLfsrBBCrBBCrBBCrBBCrBBCrBDCq0gn3OvXr8v59PR062xmZqbj1dA0XkUK8cQKIcQKIcQKIcQKIcQKIcQKIVyRCzfomtqlS5fK+fPnz8v50tLS0GvieNhZIYRYIYRYIYRYIYRYIYRYIYRYIYT7rB3Y2dkp53Nzc+X8xIkTI3/31FR9VP7169dy/u3bt3L+6NGj1tnq6mr5LKNxnxXCiRVCiBVCiBVCiBVCiBVCiBVCuM/agd3d3XL+48ePcv7hw4fW2eLiYvns/fv3y/m7d+/K+e3bt8v5oO9nfOysEEKsEEKsEEKsEEKsEEKsEEKsEMJ9VkobGxuts/n5+fLZ2dnZrpczEdxnhXBihRBihRBihRBihRBihRCuyFF6/Phx6+zatWtjXAl2VgghVgghVgghVgghVgghVgghVgjhnJVS9SrTL1++lM+urKyU8/X19ZHWNKnsrBBCrBBCrBBCrBBCrBBCrBBCrBDCq0gZ2cePH8v59vZ2OV9eXu5wNf8fXkUK4cQKIcQKIcQKIcQKIcQKIcQKIdxnZWR7e3vl/ODgYEwrmQx2VgghVgghVgghVgghVgghVgjh6KZpms3NzXJ+8uTJcn79+vUulxPj7Nmzv3sJE8XOCiHECiHECiHECiHECiHECiHECiGcszZN8/Lly3J+586dcv7p06dyfv78+aHX9Kd49uzZyM8OOr9mOHZWCCFWCCFWCCFWCCFWCCFWCCFWCOEnHzvw4sWLcn7u3LlyXv104v7+/khrOup3nzlzppyfOnWqdXbhwoWR1kTNTz5COLFCCLFCCLFCCLFCCLFCCLFCCOesY/DgwYNyvrCwcGzf/fTp03L+5s2bcn7v3r0OV8NROGeFcGKFEGKFEGKFEGKFEGKFEGKFEM5Z4Q/jnBXCiRVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCiBVCTA35+X+bpvnnOBYCNE3TNH+3DYZ6bzDw+/hvMIQQK4QQK4QQK4QQK4QQK4QQK4QQK4QQK4T4D1Fb9wK3fp4mAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import png\n", + "filename = \"/local/home/marks/syncDir/doc/anaKurs/notebooks/your_own_digit.png\"\n", + "image = np.zeros((1, 28, 28, 1), dtype=np.uint8)\n", + "pngdata = png.Reader(open(filename, 'rb')).asDirect()\n", + "for i_row, row in enumerate(pngdata[2]):\n", + " image[0, i_row, :, 0] = row\n", + "\n", + "plt.imshow(np.squeeze(image), cmap=\"gray\")\n", + "plt.xticks(())\n", + "plt.yticks(())\n", + "plt.show()\n", + "\n", + "# one digit, -1: unspecified number determined by numpy\n", + "my_digit = image.reshape((1,-1))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1.11972749e-05 1.82203682e-05 1.39789844e-02 9.62151101e-01\n", + " 1.50087700e-04 5.80624586e-03 7.91859994e-07 8.48579889e-06\n", + " 1.77603280e-02 1.14557842e-04]]\n", + "prediction = 3\n" + ] + } + ], + "source": [ + "probabilities = clf.predict_proba(my_digit)\n", + "prediction = np.argmax(probabilities)\n", + "print(probabilities)\n", + "print(f\"prediction = {prediction}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}