{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Uczenie maszynowe\n", "# 10. Przegląd metod uczenia nadzorowanego – część 2" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Przydatne importy\n", "\n", "import ipywidgets as widgets\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 10.1. Maszyny wektorów nośnych" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "# Wczytanie danych (gatunki kosaćców)\n", "\n", "data_iris = pandas.read_csv('iris.csv')\n", "data_iris_setosa = pandas.DataFrame()\n", "data_iris_setosa['dł. płatka'] = data_iris['pl'] # \"pl\" oznacza \"petal length\"\n", "data_iris_setosa['szer. płatka'] = data_iris['pw'] # \"pw\" oznacza \"petal width\"\n", "data_iris_setosa['Iris setosa?'] = data_iris['Gatunek'].apply(lambda x: 1 if x=='Iris-setosa' else -1)\n", "\n", "m, n_plus_1 = data_iris_setosa.values.shape\n", "n = n_plus_1 - 1\n", "X = data_iris_setosa.values[:, 0:n].reshape(m, n)\n", "Y = np.array(data_iris_setosa.values[:, 2])" ] }, { "cell_type": "code", "execution_count": 149, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = plt.gca()\n", "ax.scatter(X[:, 0], X[:, 1], c=Y, cmap='coolwarm')\n", "ax.set_aspect('equal')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Maszyna wektorów nośnych** (*support vector machine*) próbuje oddzielić punkty należące do różnych klas za pomocą hiperpłaszczyzny w taki sposób, żeby margines był jak największy." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "W tym celu wykorzystywana jest funkcja kosztu *hinge loss*." ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "
SVC(C=10000000000.0, kernel='linear')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "SVC(C=10000000000.0, kernel='linear')" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.svm import SVC # \"Support vector classifier\"\n", "model = SVC(kernel='linear', C=1E10)\n", "model.fit(X, Y)" ] }, { "cell_type": "code", "execution_count": 143, "metadata": { "slideshow": { "slide_type": "notes" } }, "outputs": [], "source": [ "def plot_svc_decision_function(model, plot_support=True):\n", " \"\"\"Plot the decision function for a 2D SVC\"\"\"\n", " ax = plt.gca()\n", " xlim = ax.get_xlim()\n", " ylim = ax.get_ylim()\n", " \n", " # create grid to evaluate model\n", " x = np.linspace(xlim[0], xlim[1], 30)\n", " y = np.linspace(ylim[0], ylim[1], 30)\n", " Y, X = np.meshgrid(y, x)\n", " xy = np.vstack([X.ravel(), Y.ravel()]).T\n", " P = model.decision_function(xy).reshape(X.shape)\n", " \n", " # plot decision boundary and margins\n", " ax.contour(X, Y, P, colors='k',\n", " levels=[-1, 0, 1], alpha=0.5,\n", " linestyles=['--', '-', '--'])\n", " \n", " # plot support vectors\n", " if plot_support:\n", " ax.scatter(model.support_vectors_[:, 0],\n", " model.support_vectors_[:, 1],\n", " s=300, linewidth=1, edgecolors='k', facecolors='none')\n", " ax.set_aspect('equal')" ] }, { "cell_type": "code", "execution_count": 144, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(X[:, 0], X[:, 1], c=Y, cmap='coolwarm')\n", "plot_svc_decision_function(model)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 10.2. Drzewa decyzyjne" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Drzewa decyzyjne – przykład" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Day Outlook Humidity Wind Play\n", "0 1 Sunny High Weak No\n", "1 2 Sunny High Strong No\n", "2 3 Overcast High Weak Yes\n", "3 4 Rain High Weak Yes\n", "4 5 Rain Normal Weak Yes\n", "5 6 Rain Normal Strong No\n", "6 7 Overcast Normal Strong Yes\n", "7 8 Sunny High Weak No\n", "8 9 Sunny Normal Weak Yes\n", "9 10 Rain Normal Weak Yes\n", "10 11 Sunny Normal Strong Yes\n", "11 12 Overcast High Strong Yes\n", "12 13 Overcast Normal Weak Yes\n", "13 14 Rain High Strong No\n" ] } ], "source": [ "alldata = pandas.read_csv('tennis.tsv', sep='\\t')\n", "print(alldata)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "{'Outlook': {'Overcast', 'Rain', 'Sunny'},\n", " 'Humidity': {'High', 'Normal'},\n", " 'Wind': {'Strong', 'Weak'}}" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Dane jako lista słowników\n", "data = alldata.T.to_dict().values()\n", "features = ['Outlook', 'Humidity', 'Wind']\n", "\n", "# Możliwe wartości w poszczególnych kolumnach\n", "values = {feature: set(row[feature] for row in data)\n", " for feature in features}\n", "values" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* Czy John zagra w tenisa, jeżeli będzie padać, przy wysokiej wilgotności i silnym wietrze?\n", "* Algorytm drzew decyzyjnych spróbuje _zrozumieć_ „taktykę” Johna.\n", "* Wykorzystamy metodę „dziel i zwyciężaj”." ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Podziel dane\n", "def split(features, data):\n", " values = {feature: list(set(row[feature]\n", " for row in data))\n", " for feature in features}\n", " if not features:\n", " return data\n", " return {val: split(features[1:],\n", " [row for row in data\n", " if row[features[0]] == val])\n", " for val in values[features[0]]}" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\tOutlook\tHumid\tWind\tPlay\n", "Day 1:\tSunny\tHigh\tWeak\tNo\n", "Day 2:\tSunny\tHigh\tStrong\tNo\n", "Day 8:\tSunny\tHigh\tWeak\tNo\n", "Day 9:\tSunny\tNormal\tWeak\tYes\n", "Day 11:\tSunny\tNormal\tStrong\tYes\n", "\n", "\tOutlook\tHumid\tWind\tPlay\n", "Day 4:\tRain\tHigh\tWeak\tYes\n", "Day 5:\tRain\tNormal\tWeak\tYes\n", "Day 6:\tRain\tNormal\tStrong\tNo\n", "Day 10:\tRain\tNormal\tWeak\tYes\n", "Day 14:\tRain\tHigh\tStrong\tNo\n", "\n", "\tOutlook\tHumid\tWind\tPlay\n", "Day 3:\tOvercast\tHigh\tWeak\tYes\n", "Day 7:\tOvercast\tNormal\tStrong\tYes\n", "Day 12:\tOvercast\tHigh\tStrong\tYes\n", "Day 13:\tOvercast\tNormal\tWeak\tYes\n" ] } ], "source": [ "split_data = split(['Outlook'], data)\n", "\n", "for outlook in values['Outlook']:\n", " print('\\n\\tOutlook\\tHumid\\tWind\\tPlay')\n", " for row in split_data[outlook]:\n", " print('Day {Day}:\\t{Outlook}\\t{Humidity}\\t{Wind}\\t{Play}'\n", " .format(**row))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Obserwacja: John lubi grać, gdy jest pochmurnie.\n", "\n", "W pozostałych przypadkach podzielmy dane ponownie:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\tOutlook\tHumid\tWind\tPlay\n", "Day 1:\tSunny\tHigh\tWeak\tNo\n", "Day 2:\tSunny\tHigh\tStrong\tNo\n", "Day 8:\tSunny\tHigh\tWeak\tNo\n", "\n", "\tOutlook\tHumid\tWind\tPlay\n", "Day 9:\tSunny\tNormal\tWeak\tYes\n", "Day 11:\tSunny\tNormal\tStrong\tYes\n" ] } ], "source": [ "split_data_sunny = split(['Outlook', 'Humidity'], data)\n", "\n", "for humidity in values['Humidity']:\n", " print('\\n\\tOutlook\\tHumid\\tWind\\tPlay')\n", " for row in split_data_sunny['Sunny'][humidity]:\n", " print('Day {Day}:\\t{Outlook}\\t{Humidity}\\t{Wind}\\t{Play}'\n", " .format(**row))" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\tOutlook\tHumid\tWind\tPlay\n", "Day 6:\tRain\tNormal\tStrong\tNo\n", "Day 14:\tRain\tHigh\tStrong\tNo\n", "\n", "\tOutlook\tHumid\tWind\tPlay\n", "Day 4:\tRain\tHigh\tWeak\tYes\n", "Day 5:\tRain\tNormal\tWeak\tYes\n", "Day 10:\tRain\tNormal\tWeak\tYes\n" ] } ], "source": [ "split_data_rain = split(['Outlook', 'Wind'], data)\n", "\n", "for wind in values['Wind']:\n", " print('\\n\\tOutlook\\tHumid\\tWind\\tPlay')\n", " for row in split_data_rain['Rain'][wind]:\n", " print('Day {Day}:\\t{Outlook}\\t{Humidity}\\t{Wind}\\t{Play}'\n", " .format(**row))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* Outlook=\n", " * Overcast\n", " * → Playing\n", " * Sunny\n", " * Humidity=\n", " * High\n", " * → Not playing\n", " * Normal\n", " * → Playing\n", " * Rain\n", " * Wind=\n", " * Weak\n", " * → Playing\n", " * Strong\n", " * → Not playing" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* (9/5)\n", " * Outlook=Overcast (4/0)\n", " * YES\n", " * Outlook=Sunny (2/3)\n", " * Humidity=High (0/3)\n", " * NO\n", " * Humidity=Normal (2/0)\n", " * YES\n", " * Outlook=Rain (3/2)\n", " * Wind=Weak (3/0)\n", " * YES\n", " * Wind=Strong (0/2)\n", " * NO" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Algorytm ID3" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Pseudokod algorytmu:\n", "\n", "* podziel(węzeł, zbiór przykładów):\n", " 1. A ← najlepszy atrybut do podziału zbioru przykładów\n", " 1. Dla każdej wartości atrybutu A, utwórz nowy węzeł potomny\n", " 1. Podziel zbiór przykładów na podzbiory według węzłów potomnych\n", " 1. Dla każdego węzła potomnego i podzbioru:\n", " * jeżeli podzbiór jest jednolity: zakończ\n", " * w przeciwnym przypadku: podziel(węzeł potomny, podzbiór)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Jak wybrać „najlepszy atrybut”?\n", "* powinien zawierać jednolity podzbiór\n", "* albo przynajmniej „w miarę jednolity”\n", "\n", "Skąd wziąć miarę „jednolitości” podzbioru?\n", "* miara powinna być symetryczna (4/0 vs. 0/4)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Entropia\n", "\n", "$$ H(S) = - p_{(+)} \\log p_{(+)} - p_{(-)} \\log p_{(-)} $$\n", "\n", "* $S$ – podzbiór przykładów\n", "* $p_{(+)}$, $p_{(-)}$ – procent pozytywnych/negatywnych przykładów w $S$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Entropię można traktować jako „liczbę bitów” potrzebną do sprawdzenia, czy losowo wybrany $x \\in S$ jest pozytywnym, czy negatywnym przykładem." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Przykład:\n", "\n", "* (3 TAK / 3 NIE):\n", "$$ H(S) = -\\frac{3}{6} \\log\\frac{3}{6} - \\frac{3}{6} \\log\\frac{3}{6} = 1 \\mbox{ bit} $$\n", "* (4 TAK / 0 NIE):\n", "$$ H(S) = -\\frac{4}{4} \\log\\frac{4}{4} - \\frac{0}{4} \\log\\frac{0}{4} = 0 \\mbox{ bitów} $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### *Information gain*\n", "\n", "*Information gain* – różnica między entropią przed podziałem a entropią po podziale (podczas podziału entropia zmienia się):\n", "\n", "$$ \\mathop{\\rm Gain}(S,A) = H(S) - \\sum_{V \\in \\mathop{\\rm Values(A)}} \\frac{|S_V|}{|S|} H(S_V) $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Przykład:\n", "\n", "$$ \\mathop{\\rm Gain}(S, Wind) = H(S) - \\frac{8}{14} H(S_{Wind={\\rm Weak}}) - \\frac{6}{14} H(S_{Wind={\\rm Strong}}) = \\\\\n", "= 0.94 - \\frac{8}{14} \\cdot 0.81 - \\frac{6}{14} \\cdot 1.0 = 0.049 $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "* _Information gain_ jest całkiem sensowną heurystyką wskazującą, który atrybut jest najlepszy do dokonania podziału.\n", "* **Ale**: _information gain_ przeszacowuje użyteczność atrybutów, które mają dużo różnych wartości.\n", "* **Przykład**: gdybyśmy wybrali jako atrybut *datę*, otrzymalibyśmy bardzo duży *information gain*, ponieważ każdy podzbiór byłby jednolity, a nie byłoby to ani trochę użyteczne!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### _Information gain ratio_\n", "\n", "$$ \\mathop{\\rm GainRatio}(S, A) = \\frac{ \\mathop{\\rm Gain}(S, A) }{ -\\sum_{V \\in \\mathop{\\rm Values}(A)} \\frac{|S_V|}{|S|} \\log\\frac{|S_V|}{|S|} } $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* _Information gain ratio_ może być lepszym wyborem heurystyki wskazującej najużyteczniejszy atrybut, jeżeli atrybuty mają wiele różnych wartości." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Drzewa decyzyjne a formuły logiczne\n", "\n", "Drzewo decyzyjne można pzekształcić na formułę logiczną w postaci normalnej (DNF):\n", "\n", "$$ Play={\\rm True} \\Leftrightarrow \\left( Outlook={\\rm Overcast} \\vee \\\\\n", "( Outlook={\\rm Rain} \\wedge Wind={\\rm Weak} ) \\vee \\\\\n", "( Outlook={\\rm Sunny} \\wedge Humidity={\\rm Normal} ) \\right) $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Klasyfikacja wieloklasowa przy użyciu drzew decyzyjnych\n", "\n", "Algorytm przebiega analogicznie, zmienia się jedynie wzór na entropię:\n", "\n", "$$ H(S) = -\\sum_{y \\in Y} p_{(y)} \\log p_{(y)} $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Skuteczność algorytmu ID3\n", "\n", "* Przyjmujemy, że wśród danych uczących nie ma duplikatów (tj. przykładów, które mają jednakowe cechy $x$, a mimo to należą do różnych klas $y$).\n", "* Wówczas algorytm drzew decyzyjnych zawsze znajdzie rozwiązanie, ponieważ w ostateczności będziemy mieli węzły 1-elementowe na liściach drzewa." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Nadmierne dopasowanie drzew decyzyjnych\n", "\n", "* Zauważmy, że w miarę postępowania algorytmu dokładność przewidywań drzewa (*accuracy*) liczona na zbiorze uczącym dąży do 100% (i w ostateczności osiąga 100%, nawet kosztem jednoelementowych liści).\n", "* Takie rozwiązanie niekoniecznie jest optymalne. Dokładność na zbiorze testowym może być dużo niższa, a to oznacza nadmierne dopasowanie." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Jak zapobiec nadmiernemu dopasowaniu?\n", "\n", "Aby zapobiegać nadmiernemu dopasowaniu drzew decyzyjnych, należy je przycinać (*pruning*)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Można tego dokonywać na kilka sposobów:\n", "* Można zatrzymywać procedurę podziału w pewnym momencie (np. kiedy podzbiory staja się zbyt małe).\n", "* Można najpierw wykonać algorytm ID3 w całości, a następnie przyciąć drzewo, np. kierując się wynikami uzyskanymi na zbiorze walidacyjnym.\n", "* Algorytm _sub-tree replacement pruning_ (algorytm zachłanny)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Algorytm _Sub-tree replacement pruning_\n", "\n", "1. Dla każdego węzła:\n", " 1. Udaj, że usuwasz węzeł wraz z całym zaczepionym w nim poddrzewem.\n", " 1. Dokonaj ewaluacji na zbiorze walidacyjnym.\n", "1. Usuń węzeł, którego usunięcie daje największą poprawę wyniku.\n", "1. Powtarzaj, dopóki usuwanie węzłów poprawia wynik." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Zalety drzew decyzyjnych\n", "\n", "* Zasadę działania drzew decyzyjnych łatwo zrozumieć człowiekowi.\n", "* Atrybuty, które nie wpływają na wynik, mają _gain_ równy 0, zatem są od razu pomijane przez algorytm.\n", "* Po zbudowaniu, drzewo decyzyjne jest bardzo szybkim klasyfikatorem (złożoność $O(d)$, gdzie $d$ jest głębokościa drzewa)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Wady drzew decyzyjnych\n", "\n", "* ID3 jest algorytmem zachłannym – może nie wskazać najlepszego drzewa.\n", "* Nie da się otrzymać granic klas (*decision boundaries*), które nie są równoległe do osi wykresu." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Lasy losowe" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Algorytm lasów losowych – idea\n", "\n", "* Algorytm lasów losowych jest rozwinięciem algorytmu ID3.\n", "* Jest to bardzo wydajny algorytm klasyfikacji.\n", "* Zamiast jednego, będziemy budować $k$ drzew." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Algorytm lasów losowych – budowa lasu\n", "\n", "1. Weź losowy podzbiór $S_r$ zbioru uczącego.\n", "1. Zbuduj pełne (tj. bez przycinania) drzewo decyzyjne dla $S_r$, używając algorytmu ID3 z następującymi modyfikacjami:\n", " * podczas podziału używaj losowego $d$-elementowego podzbioru atrybutów,\n", " * obliczaj _gain_ względem $S_r$.\n", "1. Powyższą procedurę powtórz $k$-krotnie, otrzymując $k$ drzew ($T_1, T_2, \\ldots, T_k$)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Algorytm lasów losowych – predykcja\n", "\n", "1. Sklasyfikuj $x$ według każdego z drzew $T_1, T_2, \\ldots, T_k$ z osobna.\n", "1. Użyj głosowania większościowego: przypisz klasę przewidzianą przez najwięcej drzew." ] } ], "metadata": { "celltoolbar": "Slideshow", "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.6" }, "livereveal": { "start_slideshow_at": "selected", "theme": "white" } }, "nbformat": 4, "nbformat_minor": 4 }