{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Train your model\n", "\n", "Install the checkout's notebook dependencies first, following the README's\n", "**Run notebooks locally** instructions. Select the `GreatAI (local)` kernel.\n", "The default run uses a balanced subset of the bundled MAG data for speed.\n", "Set `GREAT_AI_NOTEBOOK_FULL=1` before starting Jupyter to use the full splits.\n", "Local subset results differ from the historical full-dataset results below." ], "id": "cell-0" }, { "id": "37cb23a4", "cell_type": "markdown", "source": [ "## Local setup\n", "\n", "Use Python 3.12 or 3.13 and install this checkout with `uv pip install --editable '.[notebooks]'`.\n", "See **Run notebooks locally** in the repository README for the kernel, execution order,\n", "and full-data options. Run related notebooks from the same working directory\n", "to share the default `.cache/` model store and `tracing_database.json` database.\n" ], "metadata": {} }, { "id": "42ed923c", "cell_type": "code", "metadata": { "execution": { "iopub.execute_input": "2026-10-28T22:47:18.653947Z", "iopub.status.busy": "2026-10-28T22:47:18.653802Z", "iopub.status.idle": "2026-10-28T22:47:18.664778Z", "shell.execute_reply": "2026-10-28T22:47:18.663856Z" } }, "execution_count": 1, "source": [ "from docs.notebook_support import DATA_DIR, FULL_RUN, mag_lines" ], "outputs": [] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2026-10-28T22:47:18.667022Z", "iopub.status.busy": "2026-10-28T22:47:18.666820Z", "iopub.status.idle": "2026-10-28T22:47:18.669716Z", "shell.execute_reply": "2026-10-28T22:47:18.669055Z" } }, "outputs": [], "source": [ "# Dependencies are installed once in the environment; no in-kernel installation needed." ], "id": "cell-3" }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we have to get some data. After downloading it [from here](https://github.com/allenai/scibert/tree/master/data/text_classification/mag), we might notice that the dataset is in [JSON Lines](https://jsonlines.org/) format (each line is a separate JSON document). \n", "\n", "Let's write a function which takes a single line and returns the sentence and the corresponding label from it. Before returning, the sentence is also [cleaned](https://great-ai.schmelczer.dev/reference/utilities/#great_ai.utilities.clean.clean) to remove any LaTeX, XML, unicode, PDF-extraction artifacts." ], "id": "cell-4" }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2026-10-28T22:47:18.671242Z", "iopub.status.busy": "2026-10-28T22:47:18.671089Z", "iopub.status.idle": "2026-10-28T22:47:21.261086Z", "shell.execute_reply": "2026-10-28T22:47:21.260622Z" } }, "outputs": [], "source": [ "import json\n", "from great_ai.utilities import clean\n", "\n", "\n", "def preprocess(line):\n", " data_point = json.loads(line)\n", "\n", " sentence = data_point[\"text\"]\n", " label = data_point[\"label\"]\n", "\n", " return clean(sentence), label" ], "id": "cell-5" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can load the dataset and extract the *training* samples from it. Since we're impatient, we can do it in parallel using the [`simple_parallel_map`](https://great-ai.schmelczer.dev/reference/utilities/#great_ai.utilities.simple_parallel_map) function.\n", "\n", "> Open files in Python are iterable: in text mode, each iteration returns the next line." ], "id": "cell-6" }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2026-10-28T22:47:21.262422Z", "iopub.status.busy": "2026-10-28T22:47:21.262265Z", "iopub.status.idle": "2026-10-28T22:47:22.482973Z", "shell.execute_reply": "2026-10-28T22:47:22.482099Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0/700 [00:00.sk-global {\n", " /* Definition of color scheme common for light and dark mode */\n", " --sklearn-color-text: #000;\n", " --sklearn-color-text-muted: #666;\n", " --sklearn-color-line: gray;\n", " /* Definition of color scheme for unfitted estimators */\n", " --sklearn-color-unfitted-level-0: #fff5e6;\n", " --sklearn-color-unfitted-level-1: #f6e4d2;\n", " --sklearn-color-unfitted-level-2: #ffe0b3;\n", " --sklearn-color-unfitted-level-3: chocolate;\n", " /* Definition of color scheme for fitted estimators */\n", " --sklearn-color-fitted-level-0: #f0f8ff;\n", " --sklearn-color-fitted-level-1: #d4ebff;\n", " --sklearn-color-fitted-level-2: #b3dbfd;\n", " --sklearn-color-fitted-level-3: cornflowerblue;\n", "}\n", "\n", ".sk-global.light {\n", " /* Specific color for light theme */\n", " --sklearn-color-text-on-default-background: black;\n", " --sklearn-color-background: white;\n", " --sklearn-color-border-box: black;\n", " --sklearn-color-icon: #696969;\n", "}\n", "\n", ".sk-global.dark {\n", " --sklearn-color-text-on-default-background: white;\n", " --sklearn-color-background: #111;\n", " --sklearn-color-border-box: white;\n", " --sklearn-color-icon: #878787;\n", "}\n", "\n", ".sk-global {\n", " color: var(--sklearn-color-text);\n", "}\n", "\n", ".sk-global pre {\n", " padding: 0;\n", "}\n", "\n", ".sk-global input.sk-hidden--visually {\n", " border: 0;\n", " clip-path: inset(100%);\n", " height: 1px;\n", " margin: -1px;\n", " overflow: hidden;\n", " padding: 0;\n", " position: absolute;\n", " width: 1px;\n", "}\n", "\n", ".sk-global div.sk-dashed-wrapped {\n", " border: 1px dashed var(--sklearn-color-line);\n", " margin: 0 0.4em 0.5em 0.4em;\n", " box-sizing: border-box;\n", " padding-bottom: 0.4em;\n", " background-color: var(--sklearn-color-background);\n", "}\n", "\n", ".sk-global div.sk-container {\n", " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n", " but bootstrap.min.css set `[hidden] { display: none !important; }`\n", " so we also need the `!important` here to be able to override the\n", " default hidden behavior on the sphinx rendered scikit-learn.org.\n", " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n", " display: inline-block !important;\n", " position: relative;\n", "}\n", "\n", ".sk-global div.sk-text-repr-fallback {\n", " display: none;\n", "}\n", "\n", "div.sk-parallel-item,\n", "div.sk-serial,\n", "div.sk-item {\n", " /* draw centered vertical line to link estimators */\n", " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n", " background-size: 2px 100%;\n", " background-repeat: no-repeat;\n", " background-position: center center;\n", "}\n", "\n", "/* Parallel-specific style estimator block */\n", "\n", ".sk-global div.sk-parallel-item::after {\n", " content: \"\";\n", " width: 100%;\n", " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n", " flex-grow: 1;\n", "}\n", "\n", ".sk-global div.sk-parallel {\n", " display: flex;\n", " align-items: stretch;\n", " justify-content: center;\n", " background-color: var(--sklearn-color-background);\n", " position: relative;\n", "}\n", "\n", ".sk-global div.sk-parallel-item {\n", " display: flex;\n", " flex-direction: column;\n", "}\n", "\n", ".sk-global div.sk-parallel-item:first-child::after {\n", " align-self: flex-end;\n", " width: 50%;\n", "}\n", "\n", ".sk-global div.sk-parallel-item:last-child::after {\n", " align-self: flex-start;\n", " width: 50%;\n", "}\n", "\n", ".sk-global div.sk-parallel-item:only-child::after {\n", " width: 0;\n", "}\n", "\n", "/* Serial-specific style estimator block */\n", "\n", ".sk-global div.sk-serial {\n", " display: flex;\n", " flex-direction: column;\n", " align-items: center;\n", " background-color: var(--sklearn-color-background);\n", " padding-right: 1em;\n", " padding-left: 1em;\n", "}\n", "\n", "\n", "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n", "clickable and can be expanded/collapsed.\n", "- Pipeline and ColumnTransformer use this feature and define the default style\n", "- Estimators will overwrite some part of the style using the `sk-estimator` class\n", "*/\n", "\n", "/* Pipeline and ColumnTransformer style (default) */\n", "\n", ".sk-global div.sk-toggleable {\n", " /* Default theme specific background. It is overwritten whether we have a\n", " specific estimator or a Pipeline/ColumnTransformer */\n", " background-color: var(--sklearn-color-background);\n", "}\n", "\n", "/* Toggleable label */\n", ".sk-global label.sk-toggleable__label {\n", " cursor: pointer;\n", " display: flex;\n", " width: 100%;\n", " margin-bottom: 0;\n", " padding: 0.5em;\n", " box-sizing: border-box;\n", " text-align: center;\n", " align-items: center;\n", " justify-content: center;\n", " gap: 0.5em;\n", "}\n", "\n", ".sk-global label.sk-toggleable__label .caption {\n", " font-size: 0.6rem;\n", " font-weight: lighter;\n", " color: var(--sklearn-color-text-muted);\n", "}\n", "\n", ".sk-global label.sk-toggleable__label-arrow:before {\n", " /* Arrow on the left of the label */\n", " content: \"▸\";\n", " float: left;\n", " margin-right: 0.25em;\n", " color: var(--sklearn-color-icon);\n", "}\n", "\n", ".sk-global label.sk-toggleable__label-arrow:hover:before {\n", " color: var(--sklearn-color-text);\n", "}\n", "\n", "/* Toggleable content - dropdown */\n", "\n", ".sk-global div.sk-toggleable__content {\n", " display: none;\n", " text-align: left;\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", "}\n", "\n", ".sk-global div.sk-toggleable__content.fitted {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", ".sk-global div.sk-toggleable__content pre {\n", " margin: 0.2em;\n", " border-radius: 0.25em;\n", " color: var(--sklearn-color-text);\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", "}\n", "\n", ".sk-global div.sk-toggleable__content.fitted pre {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", ".sk-global input.sk-toggleable__control:checked~div.sk-toggleable__content {\n", " /* Expand drop-down */\n", " display: block;\n", " width: 100%;\n", " overflow: visible;\n", "}\n", "\n", ".sk-global input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n", " content: \"▾\";\n", "}\n", "\n", "/* Pipeline/ColumnTransformer-specific style */\n", "\n", ".sk-global div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", ".sk-global div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "/* Estimator-specific style */\n", "\n", "/* Colorize estimator box */\n", ".sk-global div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", ".sk-global div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", ".sk-global div.sk-label label.sk-toggleable__label,\n", ".sk-global div.sk-label label {\n", " /* The background is the default theme color */\n", " color: var(--sklearn-color-text-on-default-background);\n", "}\n", "\n", "/* On hover, darken the color of the background */\n", ".sk-global div.sk-label:hover label.sk-toggleable__label {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", "/* Label box, darken color on hover, fitted */\n", ".sk-global div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "/* Estimator label */\n", "\n", ".sk-global div.sk-label label {\n", " font-family: monospace;\n", " font-weight: bold;\n", " line-height: 1.2em;\n", "}\n", "\n", ".sk-global div.sk-label-container {\n", " text-align: center;\n", "}\n", "\n", "/* Estimator-specific */\n", ".sk-global div.sk-estimator {\n", " font-family: monospace;\n", " border: 1px dotted var(--sklearn-color-border-box);\n", " border-radius: 0.25em;\n", " box-sizing: border-box;\n", " margin-bottom: 0.5em;\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", "}\n", "\n", ".sk-global div.sk-estimator.fitted {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", "/* on hover */\n", ".sk-global div.sk-estimator:hover {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", ".sk-global div.sk-estimator.fitted:hover {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n", "\n", "/* Common style for \"i\" and \"?\" */\n", "\n", ".sk-estimator-doc-link,\n", "a:link.sk-estimator-doc-link,\n", "a:visited.sk-estimator-doc-link {\n", " float: right;\n", " font-size: smaller;\n", " line-height: 1em;\n", " font-family: monospace;\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", " border-radius: 1em;\n", " height: 1em;\n", " width: 1em;\n", " text-decoration: none !important;\n", " margin-left: 0.5em;\n", " text-align: center;\n", " /* unfitted */\n", " border: var(--sklearn-color-unfitted-level-3) 1pt solid;\n", " color: var(--sklearn-color-unfitted-level-3);\n", "}\n", "\n", ".sk-estimator-doc-link.fitted,\n", "a:link.sk-estimator-doc-link.fitted,\n", "a:visited.sk-estimator-doc-link.fitted {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", " border: var(--sklearn-color-fitted-level-3) 1pt solid;\n", " color: var(--sklearn-color-fitted-level-3);\n", "}\n", "\n", "/* On hover */\n", "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n", ".sk-estimator-doc-link:hover,\n", "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n", ".sk-estimator-doc-link:hover {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-3);\n", " border: var(--sklearn-color-fitted-level-0) 1pt solid;\n", " color: var(--sklearn-color-unfitted-level-0);\n", " text-decoration: none;\n", "}\n", "\n", "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n", ".sk-estimator-doc-link.fitted:hover,\n", "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n", ".sk-estimator-doc-link.fitted:hover {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-3);\n", " border: var(--sklearn-color-fitted-level-0) 1pt solid;\n", " color: var(--sklearn-color-fitted-level-0);\n", " text-decoration: none;\n", "}\n", "\n", "/* Span, style for the box shown on hovering the info icon */\n", ".sk-estimator-doc-link span {\n", " display: none;\n", " z-index: 9999;\n", " position: relative;\n", " font-weight: normal;\n", " right: .2ex;\n", " padding: .5ex;\n", " margin: .5ex;\n", " width: min-content;\n", " min-width: 20ex;\n", " max-width: 50ex;\n", " color: var(--sklearn-color-text);\n", " box-shadow: 2pt 2pt 4pt #999;\n", " /* unfitted */\n", " background: var(--sklearn-color-unfitted-level-0);\n", " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n", "}\n", "\n", ".sk-estimator-doc-link.fitted span {\n", " /* fitted */\n", " background: var(--sklearn-color-fitted-level-0);\n", " border: var(--sklearn-color-fitted-level-3);\n", "}\n", "\n", ".sk-estimator-doc-link:hover span {\n", " display: block;\n", "}\n", "\n", "/* \"?\"-specific style due to the `` HTML tag */\n", "\n", ".sk-global a.estimator_doc_link {\n", " float: right;\n", " font-size: 1rem;\n", " line-height: 1em;\n", " font-family: monospace;\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", " border-radius: 1rem;\n", " height: 1rem;\n", " width: 1rem;\n", " text-decoration: none;\n", " /* unfitted */\n", " color: var(--sklearn-color-unfitted-level-1);\n", " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n", "}\n", "\n", ".sk-global a.estimator_doc_link.fitted {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-0);\n", " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n", " color: var(--sklearn-color-fitted-level-1);\n", "}\n", "\n", "/* On hover */\n", ".sk-global a.estimator_doc_link:hover {\n", " /* unfitted */\n", " background-color: var(--sklearn-color-unfitted-level-3);\n", " color: var(--sklearn-color-background);\n", " text-decoration: none;\n", "}\n", "\n", ".sk-global a.estimator_doc_link.fitted:hover {\n", " /* fitted */\n", " background-color: var(--sklearn-color-fitted-level-3);\n", "}\n", "\n", ".sk-top-container.sk-global {\n", " /* pydata-sphinx-theme hides overflow, so scrolling is disabled.\n", " We need to set it to !important and add tabindex=\"0\" in the HTML\n", " to allow keyboard-only users to navigate the display. */\n", " overflow-x: scroll !important;\n", " max-width: 100%;\n", "}\n", "\n", ".estimator-table {\n", " font-family: monospace;\n", "}\n", "\n", ".estimator-table summary {\n", " padding: .5rem;\n", " cursor: pointer;\n", "}\n", "\n", ".estimator-table summary::marker {\n", " font-size: 0.7rem;\n", "}\n", "\n", ".estimator-table details[open] {\n", " padding-left: 0.1rem;\n", " padding-right: 0.1rem;\n", " padding-bottom: 0.3rem;\n", "}\n", "\n", ".estimator-table .parameters-table {\n", " margin-left: auto !important;\n", " margin-right: auto !important;\n", " margin-top: 0;\n", "}\n", "\n", ".estimator-table .parameters-table tr:nth-child(odd) {\n", " background-color: #fff;\n", "}\n", "\n", ".estimator-table .parameters-table tr:nth-child(even) {\n", " background-color: #f6f6f6;\n", "}\n", "\n", ".estimator-table .parameters-table tr:hover td {\n", " background-color: #e0e0e0;\n", "}\n", "\n", ".estimator-table table :is(td, th) {\n", " border: 1px solid rgba(106, 105, 104, 0.232);\n", "}\n", "\n", "/*\n", " `table td`is set in notebook with right text-align.\n", " We need to overwrite it.\n", "*/\n", ".estimator-table table td.param {\n", " text-align: left;\n", " position: relative;\n", " padding: 0;\n", "}\n", "\n", ".user-set td {\n", " color:rgb(255, 94, 0);\n", " text-align: left !important;\n", "}\n", "\n", ".user-set td.value {\n", " color:rgb(255, 94, 0);\n", " background-color: transparent;\n", "}\n", "\n", ".default td, .estimator-table th {\n", " color: black;\n", " text-align: left !important;\n", "}\n", "\n", ".user-set td i,\n", ".default td i {\n", " color: black;\n", "}\n", "\n", "td.fitted-att-type {\n", " white-space: preserve nowrap;\n", "}\n", "\n", "/*\n", " Styles for parameter documentation links\n", " We need styling for visited so jupyter doesn't overwrite it\n", "*/\n", "a.param-doc-link,\n", "a.param-doc-link:link,\n", "a.param-doc-link:visited {\n", " text-decoration: underline dashed;\n", " text-underline-offset: .3em;\n", " color: inherit;\n", " display: block;\n", " padding: .5em;\n", "}\n", "\n", "@supports(anchor-name: --doc-link) {\n", " a.param-doc-link,\n", " a.param-doc-link:link,\n", " a.param-doc-link:visited {\n", " anchor-name: --doc-link;\n", " }\n", "}\n", "\n", "/* \"hack\" to make the entire area of the cell containing the link clickable */\n", "a.param-doc-link::before {\n", " position: absolute;\n", " content: \"\";\n", " inset: 0;\n", "}\n", "\n", ".param-doc-description {\n", " display: none;\n", " position: absolute;\n", " z-index: 9999;\n", " left: 0;\n", " padding: .5ex;\n", " margin-left: 1.5em;\n", " color: var(--sklearn-color-text);\n", " box-shadow: .3em .3em .4em #999;\n", " width: max-content;\n", " text-align: left;\n", " max-height: 10em;\n", " overflow-y: auto;\n", "\n", " /* unfitted */\n", " background: var(--sklearn-color-unfitted-level-0);\n", " border: thin solid var(--sklearn-color-unfitted-level-3);\n", "}\n", "\n", "@supports(position-area: center right) {\n", " .param-doc-description {\n", " position-area: center right;\n", " position: fixed;\n", " margin-left: 0;\n", " }\n", "}\n", "\n", "/* Fitted state for parameter tooltips */\n", ".fitted .param-doc-description {\n", " /* fitted */\n", " background: var(--sklearn-color-fitted-level-0);\n", " border: thin solid var(--sklearn-color-fitted-level-3);\n", "}\n", "\n", ".param-doc-link:hover .param-doc-description {\n", " display: block;\n", "}\n", "\n", ".copy-paste-icon {\n", " background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n", " background-repeat: no-repeat;\n", " background-size: 14px 14px;\n", " background-position: 0;\n", " display: inline-block;\n", " width: 14px;\n", " height: 14px;\n", " cursor: pointer;\n", " border: none;\n", " padding: 0;\n", " background-color: transparent;\n", "}\n", "\n", ".copy-paste-icon:focus-visible {\n", " outline: 1px solid currentColor;\n", " outline-offset: 1px;\n", "}\n", "\n", ".features {\n", " font-family: monospace;\n", " cursor: pointer;\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", " border: 1px dotted var(--sklearn-color-border-box);\n", " border-radius: .20em;\n", " margin-bottom: 0.5em;\n", " font-size: inherit; /* Needed for jupyter */\n", "}\n", "\n", ".features.fitted {\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", ".features summary {\n", " cursor: pointer;\n", " display: flex;\n", " margin-bottom: 0;\n", " text-align: center;\n", " align-items: center;\n", " justify-content: center;\n", " gap: 0.5em;\n", " padding: .25em;\n", "}\n", "\n", ".features details[open] > summary {\n", " color: var(--sklearn-color-text);\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", " border-radius: .20em 0 0 0;\n", "}\n", "\n", ".features.fitted details[open] > summary {\n", " background-color: var(--sklearn-color-fitted-level-2);\n", " border-radius: .20em 0 0 0;\n", "}\n", "\n", ".features details > summary .arrow::before {\n", " content: \"▸\";\n", " color: grey;\n", "}\n", "\n", ".features details[open] > summary .arrow::before {\n", " content: \"▾\";\n", "}\n", "\n", ".features details:hover > summary {\n", " margin: 0;\n", " background-color: var(--sklearn-color-unfitted-level-2);\n", "}\n", "\n", ".features.fitted details:hover > summary {\n", " margin: 0;\n", " background-color: var(--sklearn-color-fitted-level-2);\n", "}\n", "\n", ".features .features-container {\n", " max-height: 10em;\n", " overflow: auto;\n", " scrollbar-width: thin;\n", " padding: .25em 0.1rem;\n", " background-color: var(--sklearn-color-unfitted-level-0);\n", " border-radius: 0 0 .5em .5em;\n", "}\n", "\n", ".features.fitted .features-container {\n", " background-color: var(--sklearn-color-fitted-level-0);\n", "}\n", "\n", ".features .image-container {\n", " block-size: 1em;\n", " inline-size: 1em;\n", " padding: 0;\n", " margin: 0%;\n", " display: flex;\n", " justify-content: center;\n", " align-items: center;\n", "}\n", "\n", ".features .copy-paste-icon {\n", " background-size: 1em 1em;\n", " width: 1em;\n", " height: 1em;\n", " filter: grayscale(100%) opacity(60%);\n", "}\n", "\n", ".features .features-container table {\n", " width: 100%;\n", " margin: 0.01em;\n", "}\n", "\n", ".features .features-container table tr:nth-child(odd) {\n", " background-color: #fff;\n", "}\n", "\n", ".features .features-container table tr:nth-child(even) {\n", " background-color: #f6f6f6;\n", "}\n", "\n", ".features .features-container table tr:hover {\n", " background-color: #e0e0e0;\n", "}\n", "\n", ".features .features-container table {\n", " table-layout: inherit;\n", "}\n", "\n", ".features .features-container table td {\n", " text-align: left;\n", " padding: 0 0.5em;\n", " border: 1px solid rgba(106, 105, 104, 0.232);\n", " white-space: nowrap;\n", " color: var(--sklearn-color-text);\n", "}\n", "\n", ".total_features {\n", " display: flex;\n", " justify-content: center;\n", " margin-top: 0.5em;\n", "}\n", "
Pipeline(steps=[('tfidfvectorizer', TfidfVectorizer()),\n",
       "                ('linearsvc', LinearSVC(random_state=42))])
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": [ "Pipeline(steps=[('tfidfvectorizer', TfidfVectorizer()),\n", " ('linearsvc', LinearSVC(random_state=42))])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.pipeline import make_pipeline\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.svm import LinearSVC\n", "\n", "model = make_pipeline(TfidfVectorizer(), LinearSVC(random_state=42))\n", "# todo: hyperparameter-optimisation\n", "model.fit(X_train, y_train)" ], "id": "cell-11" }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's already finished. Let's see how well it performs. But first, we need to [configure matplotlib](https://matplotlib.org/stable/tutorials/introductory/customizing.html) to make the charts more legible. \n", "> `ConfusionMatrixDisplay` relies on `matplotlib` for rendering." ], "id": "cell-12" }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2026-10-28T22:47:23.727782Z", "iopub.status.busy": "2026-10-28T22:47:23.727693Z", "iopub.status.idle": "2026-10-28T22:47:23.739633Z", "shell.execute_reply": "2026-10-28T22:47:23.739183Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline\n", "plt.rcParams[\"figure.figsize\"] = (30, 15)\n", "plt.rcParams[\"figure.facecolor\"] = \"white\"\n", "plt.rcParams[\"font.size\"] = 12" ], "id": "cell-13" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we check the quality of the model on the `test` split. We can use the classification report to check the common metrics, such as the macro F1-score. We also draw the confusion matrix to get some insights into the types of mistakes being made by the model." ], "id": "cell-14" }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2026-10-28T22:47:23.740364Z", "iopub.status.busy": "2026-10-28T22:47:23.740307Z", "iopub.status.idle": "2026-10-28T22:47:23.948937Z", "shell.execute_reply": "2026-10-28T22:47:23.948633Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " business 0.50 0.53 0.52 30\n", " economics 0.49 0.63 0.55 30\n", " geography 0.44 0.37 0.40 30\n", " medicine 0.67 0.60 0.63 30\n", " politics 0.59 0.57 0.58 30\n", " psychology 0.45 0.43 0.44 30\n", " sociology 0.31 0.30 0.31 30\n", "\n", " accuracy 0.49 210\n", " macro avg 0.49 0.49 0.49 210\n", "weighted avg 0.49 0.49 0.49 210\n", "\n" ] }, { "data": { "image/png": "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hg2L999/P1577bWafRctWhRf/epX484770zD9GbNmqX3u+iii+J73/te5P4z/fSDDz6IU045JQ3Rk2Mmx5k/f35cd911ccYZZ6zXY1fXuP/0pz8dN998cxqkH3DAAekx77333nj11VfT/ZKLAcnxqqqq4pe//GV8/vOfX+0Yu+yyS9x6661pwD9y5Mj04sGf//zn9OePuv3229PHSC42JI+x5557xoMPPhgtW64sq5Gciz/96U8xderUaNeuXa37HnPMMek5Ouigg+r1OaNuFRVV0bHD4mjZckV077YwyssKUVm5wumiCSjE1781Irp0WxI3/WhwWooHAO+TND3+ngRYs+bl+SgUcukCuUmg37XVoqgor4rysnyU5QqRL/hIMlRL/l9JWjEqFOm46tJk05tCoRBHHHFEzJs3Lw3Ce/XqlYbh559/fowfPz7atGlTa/8TTjghnZn+3HPP1cxMf/LJJ9NwvVu3bun9qo85adKkNJSvngV/6aWXxplnnpnud/jhh6/zYyeSGfk9evSIN998M72AkHxaIHH11VfX2i85zje/+c046aSTYty4cbHJJpvUOkbyc/UxxowZkwb9yb5//etfax1nxIgR0bt377R/yb7JuJNQ/+c//3lceOGF6T7/8z//E7/+9a/jd7/7Xfp9tWTfZHb/LbfcUue5Ty4+JK1ach7YMFOmto/bf7Nzzc8nHjsyLvjK8Jg/vzKefaGP00ujOffCf8fQvafFfXdvEf942GsRwPskTZW/JwHq1q/j7LjtsL/GI+O3iEsf2y8K/6mrv3vPKfHLwx9Mv79l+G5OH1BUmmxN/SSgT2afX3HFFWmonkjKxCQheTJT/qMB9/3335/OpF+11My+++4bxx13XNxwww3pz88++2y8+OKLcdlll9Uqa/P9738/fYxrrrlmnR+72ocffhhXXXVVzScCkhI71VasWJGG6I8//nj84x//iEGDBqWfDnjhhRdqHSMp87PqMZJyOsknDR5++OG0HM+q5s6dG1deeWXNvnvssUc69gceeKBmn5122ik+9alPxc9+9rNa9/3pT38aLVq0iOOPP77OsSTjbN++fU2rPgfUn3vu2zaqqnKx59BJTiuN5rRzXo/PHfVOPHBv37j91u08EwDeJ8kQf08CrPTZfhPShXLv+vd2NYF+4p9Tesb4WZ3i0C3HO1VA0WmyM/WT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3va9730vTj755GgoQn0AAAAAAErKxRdfHOecc85q2w888MCYMGFC7Lrrrh97/2XLlsWkSZPiuuuui6OPPrrWbZ07d46GJNQHAAAAACgFyWKyxbqgbGHddk+C94+G7yNHjkxn4H/+85+PTTbZZK2O06VLl9h8881jY1JTHwAAAACAkverX/0qPQdnnXVWkz4XQn0AAAAAAEra0qVL4/e//3307t07DjrooLW+349+9KMYOHBgbL/99nHSSSfF8OHDo6EJ9QEAAAAAKArz5s2r1ZKwfm3cf//9MWvWrDj99NOjrGztYvODDz44fvjDH8Z9990X1157bUydOjV23333uPPOO6MhCfUBAAAAAEqppn6xtojo1atXtG/fvqZdffXVa116p7y8PA3118bWW28dDz/8cBx11FGx7bbbprP7H3300Rg8eHCcd955MX/+/GgoQn0AAAAAAIrC5MmTY+7cuTXtsssu+8T7vPvuu/H444/HIYccEpttttlaPU5yAeCjmjVrFscdd1wa6DdkGZ5mDXZkAAAAAADYiNq1a5e2dXHHHXdEPp+PM888c4Mfv1WrVunXJUuWREMxUx8AAAAAgJJUKBTiN7/5TfTs2TOdqb+hkhn/uVwudthhh2goQn0AAAAAAErS448/HhMnTozTTjutzpI6iTFjxsTmm28e3/ve92q2XXXVVfHggw/G4sWL05+Tr1deeWXce++98T//8z/pRYKGovwOAAAAAEAJyBVWtmKUW89xJQvklpWVfewCucuWLYtJkybFrFmzarYdeuihcc0118QJJ5wQLVu2jJkzZ6bB/w033BAXXnhhNCShPgAAAAAAJen666+P66677mNn1m+zzTbxzjvv1KrVP3jw4Bg2bFhavueDDz5Ig/327dtvlD4L9QEAAAAAKEmbbbbZJ+7TvHnzdBZ+XZL6+T169IiNSU19AAAAAADICDP1AQAAAABKQVJ3vkhr6kexjqsOZuoDAAAAAEBGCPUBAAAAACAjhPoAAAAAAJARQn0AAAAAAMgIC+UCAAAAAJSAXGFlK0a5Ih1XXczUBwAAAACAjBDqAwAAAABARgj1AQAAAAAgI9TUBwAAAAAoBUnd+WKtPV+IkmGmPgAAAAAAZIRQHwAAAAAAMkKoDwAAAAAAGSHUBwAAAACAjLBQLgAAAABAKbBQblEwUx8AAAAAADJCqA8A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eX/961/j5ZdfjlNPPTX22muvorbTvXv3rHd+S9JTHwAAAACAsvKrX/2qQUA/qaysjDXXXDPGjh0bs2fPjrZKUB8AAAAAoBykvPOlPC2mGTNmxLPPPhvLL798dOjQoah1UvqdtPyQIUNizz33jMcffzyam6A+AAAAAAAlYfLkyQ2mmTNnFr3u//zP/8Snn36a5dpfmIqKith3333jyiuvzC4EXH/99Vnv/u222y7+/Oc/R3MS1AcAAAAAoCQMHDgwevXqVTedf/75Ra2XgvK/+93vYvvtt4+TTz55ocunND233HJL/Nd//VesuOKKseWWW8Y999wT3/zmN+PHP/5xTJo0KZqLgXIBAAAAACgJH374YfTs2bPueadOnRa6zu233x4/+MEPYvPNN48777wzy61fTE/9ubVr1y7rvf/Pf/4zRowYEd/5zneiOQjqAwAAAABQEnr27NkgqL8w9913X3zve9+LTTbZJB588MHo3r37Yr1/7UWE5hxoV1AfAAAAAKAcLKEBZdukQtP36+GHH4599tknNtxww3jooYeiR48ei12MdGEg9fRP22wucuoDAAAAAFBWhg8fHnvssUesv/76MWzYsAX27n/11VejX79+2UC6tdLff//73+Pzzz/PnqfH0047Le6999445ZRTYtlll222sgvqAwAAAABQVs4+++yYPn16jB49OoYMGZIF7etPH3/8cd2yVVVVWdB+6tSpdfMOOuigePTRR7MBc7t16xb9+/fPLg78+c9/jt/85jfNWnbpdwAAAAAAKCt33XXXAvPe9+nTp+7vddZZJyZOnBhdunSpm7f66qvH1Vdfnf2dgv0pl36HDh2iJQjqAwAAAACUAzn16/Tq1SuKlXLkp97787O4g+s2lfQ7AAAAAACQE4L6AAAAAACQE4L6AAAAAACQE4L6AAAAAACQEwbKBQAAAAAoB9URURGlu29lQk99AAAAAADICUF9AAAAAADICUF9AAAAAADICTn1AQAAAADKQEWhkE2lqKJE96sxeuoDAAAAAEBOCOoDAAAAAEBOCOoDAAAAAEBOCOoDAAAAAEBOGCgXAAAAAKAcpMFkS3VA2UKJ7lcj9NQHAAAAAICcENQHAAAAAICcENQHAAAAAICckFMfAAAAAKAcVBciKgqlu29lQk99AAAAAADICUF9AAAAAADICUF9AAAAAADICUF9AAAAAADICQPlAgAAAACUg0KhZipFhRLdr0boqQ8AAAAAADkhqA8AAAAAADkhqA8AAAAAADkhpz4AAAAAQFko4Zz6Uar7NS899QEAAAAAICcE9QEAAAAAICcE9QEAAAAAICcE9QEAAAAAICcMlAsAAAAAUA4KJTxQbqFE96sReuoDAAAAAEBOCOoDAAAAAEBOCOoDAAAAAEBOyKkPAAAAAFAOqlPe+UIJ71t50FMfAAAAAAByQlAfAAAAAAByQlAfAAAAAAByQlAfAAAAAABywkC5AAAAAADloFBdM5WiQonuVyP01AcAAAAAgJwQ1AcAAAAAgJwQ1AcAAAAAgJyQUx8AAAAAoBwUCjVTKSqU6H41Qk99AAAAAADICUF9AAAAAADICUF9AAAAAADICUF9AAAAAADICQPlAgAAAACUg+o0mGyhhPetPOipDwAAAAAAOSGoDwAAAAAAOSGoDwAAAAAAOSGnPrSAFQdPjsGrTIpOnebEx+O7xauj+kV1dYVjT6vp22d6rL7qZ9G799fx+Rdd47XRS8fkKZ19IrSK3TcfHV07z55n/vjPesZT/x7cKmWCdpWFWH/LqbHCkJkx5avKGPlkj5j0haYzratbp5mx6crjo1+P6fHB573iX+8uH3Oq9dOi5fnupi1aqtOM2GLAuOjb+ev4dHq3ePqjFWJaVcfWLha0PYVCzVSKCiW6X43wy2QxPPPMM9G1a9fYYIMNWnRd8uMbq30ZJ5z2cqwwaGqMeHbZmD6tfXzvkDdjxozK+MOvN4w3X+/T2kWkzFRWVsdPTxseKw76Ksa82yemTu0YO2z/TgwcOCluunXtuOnWdVq7iJShQ3Z8Kb6e2T6efXXFBvMnT+/UamWivPVeenac97d3o3uvOfH8Iz2zwP6JF4yLC08cFM8+2Ku1i0eZ2mPj0XHSTs/Fa+OWjrETescmq4yLE3d8Ln50/U4xYXL31i4eZcZ3N23NziuNiV9/64l4d1LveO2LfrHPKm/ELzZ7Kk548r/ihQnLtXbxAJY4Qf3FcPTRR8cqq6wSd911V4uuS34MWWVSTJ3SIY48YPv4/LMu2bxOnavit5cMj7PPfz5+8N3vxMyZ/hvScioqCvHAQ9+IF19q2LA9/pjn49CDRsUrry0Tr43u7yOhxb09rm9cevc3HXnahNP++EH0WGpOHLv9qjF1Us339A9/NS7OuPT9OOLbq8eE8Xr90bJ2WPft+Mluw+OUG3eMZ9/6zwXQFft9FeXTH422xnc3bcXgnl/FhVs8FsM+GBI/Hr5dFKIi2lVUx6VbD4tLt3kovnPn92LSLHclA6XFvZqLYcstt4wNN9xwyX0alJxXRvWLn526eV1AP5k5o30Me2BQ9O4zM9ZY+4tWLR/lp6qqcp6AfvLMPwdlj0NW+rIVSgXQdgxcZUZsNHRq3Pf/+tYF9JOb/rhMdOhUiF2+/3mrlo/y075yTvxo52fjgZdXbRDQT97/bKmYqJc+UOZ2G/x2dKysjj+/un4W0E+qC+3iz6+sH707zcx67QOUGl2EF8MVV1yx5D4JStJH4xq/Fbp795rc0RXS6tNGrLn6xKiujnj9zX6tXRTK1NJLTc/y86YUUR993jNGvrVczKrSTKHlrbfF1OzxtRe6NZj/xYQO8cn7HWO9zWteh5ay0eCPom+Pr+PJ11eKIf2/iPVW/CTaVRTi9Y/6xehxy/ggaDW+u2krBnSr+W4eP7VHg/njpvbMHr+57Pj4y+j1W6VsAM2l5H4tf/nll/H2229HdXV1rL766rHUUks1utyHH34Y77zzTnTr1i3WXXfd6NSp8by9kydPjldffTUqKytj7bXXzpYvJi9+sdtfnLK98sor2f6us8460bt373jxxRdj5syZsfnmm2evP/nkk1n5Ntlkk3nWfeONN+K9996L73znO9m+0XK6dJkdO+32XkyZ3CFGvyqnPq1jmf5TY8vNP4iOHebEykO+iCGDv4zfXbx5jHmnr4+EVtGt86xYfcWJ0aXj7Dhsp5ExZ05FnHvDtvHiW8v7RGhRywyclT1+9nGHeV6b+FGHGLTqTJ8ILeoby9bcHbLvZq/F6st9Fk+/OSi6dKyKU3d9Jv759gpx5t//K2a6CEor8N1NW/HFjJrUOst0nRZTJv0nfpKeJwN7TGm1skGbVCjhAWULUTZKKqh/+umnx5/+9KdYY401soD4W2+9Fbvvvns2rzYw/umnn8YhhxwSTzzxRBYw/+STT2LKlClx4YUXxhFHHFG3rWnTpsXJJ58c119/fay00krRp0+fLAh+6qmnximnnDLfvPjFbr8xxa77wQcfxJ577pkF5tNyn332WZx11llx0003Zeu8/PLL2XKp7LfcckuMHz8+evasuUJda7/99ov27dvHjjvuuISOPsUpxI9/OjL69Z8Rf/jNBlkqHmgNHTrMid5LfR1dulTFMv2nRWW7QnTqVOXDoFWcc9128e93l6173rPrjPjDcQ/E+Uc+FAedt19M+MoAkLSczl2rs8dZM+bNUjlzRru616GldO9cc6Fp7YET4oA/7RMff1XTrt9q9ffi9wc/GMds/0Jc/OC3fCC0KN/dtCXDPhgcR649Kg5c7bX4xYit6uZ/f/VXsseu7WvulAcoJSWTU3/YsGFZ8PvOO++MkSNHxvDhw+Pjjz+OzTbbLL7++utsmUKhEHvssUf8+9//zgLfI0aMyALkKTh/5JFHxj333FO3vf333z9uu+22bLtvvvlm/POf/4wxY8ZE9+7zDyw0ZfuLum7tcpMmTcqC+qlc6TEtn8pX33HHHRdTp06NG264ocH8p59+Ouvlf/jhhzdaltTbP92hUH9iyTj25H/HFkM/jjtuXjkefqBhTlRoSePG94qrr9so/nT5ZnHCKTvHw48NiRN/OCK22vx9HwQtrn5AP5k8vXNcdvdm0bVTVXxn44bfbdDcaoP5HTrO282nY6dCzJwhdx4ta2ZVzV21D45apS6gnwx/Y6V46+O+seP6b/tIaHG+u2lLXv5s2bjopU3igNVei6u2fSBOWO+FuHb7+2LD/p/EJ9O7xrTZBrgHSk/JBPVTL/pk5ZVXrpvXrl27LHBdm4InBfqfe+65OPPMM7PUPLXOPffcGDhwYFxwwQXZ8xQgv++++7Llhg4dWrdc6v2fguzzU+z2F2fdlFLnpZdeip/97GfZ/CSlzzn//POzXvr1pUF800WNyy+/vMH8yy67LDp37hwHHHBAo2VJ2+rVq1fdVPs+LJ4fHPNq/PdeY+Oe2wfH1Zeu43DSptx6x1pZupOtthDUp214/9Oa7+5lestfTsuaML4m7U7fZeft1ZfmTRgnMEDL+uTLmhzRn3zVMFd08tGXPaJfj+nRrsIdJLQ+3920pktf2Sh2vXe/eP7T5aJDu+p44L2VY/f79o0OFdXx9le9fThAySmZoP4OO+yQpZjZcsstsxQ5999/f5a6pr5//etf2eMWW2zRYH6HDh2y4HfKSZ88++yz2eM222zTpDIUu/3FWbf2cdNNN22wXAq+r7rqqvNsN/XWf+2117KLAcmECRPi9ttvj7322ivLw9+YdGEh3QlQO6Uc/yyegw8fHfscMCbuu3NwXHHxeg4nbY+Op7Qxy/Wt+Q7/fHLX1i4KZea1ETXjJ622wfQG83v0rorlBs+sex1aysj3BmSD2ffrUZMbur7+PafFF1M7R3WhZH7WkWO+u2ltb3/VJ65+bf34/Uubxa1j1ojBPb+Kvl1mxEMfDGntogEscSXT+ltxxRWzAW1T7vnU6z3lnE958NPzWbNq8lDOmDEje2wshU6PHj2y5dIAu7XpeubOQ78wxW5/cdZNqXHmt1xj81Lu/H79+tX11v/LX/6SbWt+qXeSNP5A2vf6E4tuvwPfiu8d8lYW0L/sD+s6lLSq5QZMjq5da+rE+vbY9Y2orCzEs8+7M4eWtXy/SdGjS8OBRzu0nxOH7/yvqJpTEY+95EcYLWvMK13jjZFdY5fvfx4dO/+n3bbnEROzgbfuv8GA4rSsTyf1iKfeWCn+a90x0bNLzW+GZJ2Bn8Tqy02MYf9exUdCi/LdTVv0jaW+aPC8U2VVnLXJMzFqYv/4x/vak9BAGiS3lKcyUVKjdKY0Meedd142pVzyl1xySdbrfJ111omTTjopBg0alC337rvvztOr/Z133okVVlghS9kzZEhNhZ8G2l1ttdWKfv9it78469amwknphuZOi/P+++/P0/s+BehTAP/3v/99fPTRR3HllVfG4MGDm3wXAotmi6Hj49CjR8dnEzvHpx93jb32b5gbeuSI/vHeu70cXlpMGhT33LMfj7fe7hvjP+4RHdpXx5prTIw1V58YN926Vjzx1GCfBi0qpdf5/Q8fiNff7x8fTOgVXTvPji3Xfj/69Pg6fnn9tvHhhJo0PNCSLjhhUPzm5nfi4nvfjuH3LxXLD5kZQ3f7Ki49a/n4cExnHwYt7td3DY1LDrsvbjjuthj2729El46z4783fCNeHLt8XDpsM58ILcp3N23RD9d5MXp2nBWjPusfXdpXxQ6D3o1Pv+4WRz2+k7uZgJJUMj31J06cOE+v9eOPPz77e9y4cdnjTjvtFF27dp0nx/yoUaOy3v377LNP9nznnXeOvn37ZgPvVlVVNVj2yy+/nG8Zit3+4qyblkv58K+++uoGy6UBfefOqV/rmGOOiTlz5mSD/6aLAT/4wQ+iokKujZYwZXLHuP2mVeLJR1eIpfrMjN5zTR07yX9Ky3pp1IA45sRd4+lnB8WcqnZZHv1HHx8chx61R1x34wY+DlrcyLeXj4PP3zcef3lwzKluF1/P7BDX/GOj2PvnB8RjL/1nnBxoSR+N7RRHbb1a3H7l0tl39djRnePobVeL+2/o54OgVXw5rUt8/7K94qJ/bB5Vc9rFV9M7x+l/2yF+eM2uMWN2zTgQ0FJ8d9MW/Wj4d+LPr64fVdXtYtLMTvHTf24d33tw9/hiRpfWLhpAsyiZnvp///vf45prrsnSzaSe7inFzHXXXZflmj/00EOzZVKg/oorrojDDjssyym/7777ZoHwX//617H++uvHOeecU5fu5uabb85S+KQc92n5lMonDWSbBql9/PHHGy1DsdtfnHVTKp2LL764bsDeXXbZJcaOHRvPPPNMNqjv3Bc3kpVWWim7UJEG/029/WuPB83v3y8tnU3QlsyeXRnPPDconnmutUsCNWbNbh9PjhoST45yRGg7ZkyvjEdu7dPaxYA6c6or4/HXhmQTtDbf3bRFIz5dPpsAykHJ9NQ/8cQT469//WuWD/+mm26KBx54ILbddtt48803Y6211qpb7uCDD46RI0dmge603IgRI+Lcc8/NBsetnzt+u+22i9dffz123XXXePjhh+Puu+/O1knbrZUG5d1www0blKPY7S/OukcddVR2YaGysjK7mFEoFLLlU8qh1Nu/MUceeWTdgMIplQ8AAAAAUGbSeJ+lPJWJikKKCJN76WNcbrnlsosRN9544zyvp5z6p5xyStx2222x9957N2nbkydPzu542G7IidG+stMSLDUsuure8w4MDa1p6oqNX1SF1tLttucdfNqULw77VmsXARroNKV8fviTD59uXDL9LikB1TNmxHs/PysmTZrUoKMp+VUb39u+/xHRvl3HKEVV1bPikQlXl8V56xsjp/8J55aC9Sldz2677dboOqkn/4ABA+b7OgAAAAAAbV/J5NQvJ48++mhccsklWY/7/v37xwsvvBAXXXRRlioo5eKvlcYVeOyxx+LJJ5/MlrnqqquiQwcDaQEAAAAA5JWgfg6lAXzTwL133nlnDBs2LLt1Jg0SvP/++0dFRUXdctOmTcuC/d27d49rr73WALkAAAAAADknqJ9TQ4cOzaYF6d27dzz44IMtViYAAAAAoA1Lw6uW6hCrhRLdr0bIqQ8AAAAAADkhqA8AAAAAADkhqA8AAAAAADkhpz4AAAAAQDmQU78k6KkPAAAAAAA5IagPAAAAAAA5IagPAAAA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9tu3dhEAWq0uUwfSWu1K7VCgFKnbAP5DUJ+y8eWXX8aNN94Y48ePz3o0ffe7340OHTrUvf7GG2/EFVdcEccff3ysssoqdfOrq6vjxz/+cfzXf/1X7LzzznXzv/jii7j99tvjvffey3oMpB5SW221VYOcfT//+c9jv/32i80337wuh/NvfvObOPjgg2PVVVfNyvP+++/H6quvHgcccEB07NhxnnJ/+umncdddd8W7774bPXr0yMqx6aabNlhmYWUpdhmWrMceeyyefvrpmDZtWvZ5p3MhfYZze+KJJ+KZZ56J6dOnZ+fm3nvv3eBcmDVrVtx9993x8ssvR0VFRWy44Yax2267Rfv27RvkOU3n9llnnZXlmEw5odP5veeee2bbnFtTt5nK+Oijj0bv3r3j0EMPjT59+mTLPPXUU/HII49Ely5d4sADD4xBgwbNkyv1tddei1/+8pdN3u+07bQv6VbZ9H9y9913r3tfmi4dy4ceeijatWuXHcv1118/CxCloOOuu+7a5Hqntt5Mt+NPmDAhll122ewcql9/NuW969ePaRs33XRTvP3223HUUUdlz1M9XCudJwMHDsy2Vf+cq7+NIUOGLLDOry+dY/OrjydPnpzV5amsu+yyyzzrpteWW265OProo5v0edC4JVHvNKUOTp/v3/72t+y7MS3zve99r9FtLWpd1th6Ta2vi90XWsei1DvF1p31zd2ufOutt+L888+vO89effXV7O9tt902215j7dBa6X3vueeeeOedd6Jfv36xww47NDj3tBlbT/364fHHH8/+73fu3DmrH9Zcc815ll9QW+mWW26J559/Pjs/5z4P//nPf2bnzY9+9KNYccUVi26b1VpSbc35KXbddJ7//e9/b1CHP/nkk1nZfvvb32bLL8pxoGmKrTOKrfsWVEctqG5blLp1SbdptRuBliSnPmUhNY5TMObDDz/MGonpi/db3/pW1iiolRoh6RbmcePGNVg3BfXT/PqD8aQG5korrRR//etfs6BCuv05DaD3/e9/f6G5T9O81NhMjYAUMEvbP+GEE2LHHXecp9ypkZl+IKb36dq1a3z00UcxdOjQBsGtYspSzDIsOem8Sj+q04+c1DBMn126YLTGGms0yN+dPodtttkmOzfHjh2bfTapMbnBBhtkgZsknbPrrbdeds6mc/frr7+OY489NjbeeOMs8Dp3ntOLLroo/vd//zf70ZKCYWlb6bG+pm4zBQ0uvfTSbJvpx2b6YZXO5XQOpfO59gdTeq+07YXlSi1mv9O5mf6PpHM+Ba7S/7+U+sKgpovmzDPPjC233DLefPPN7MfxqaeemtUH6fNLgcKm1jvJBRdcEGuttVYWUEi9ptJnnQLil1xyySK9d239mM7XdAE1BfRTsCydU2m9VIfVTt26dcsuOqQf8P/4xz/m2UYK+C6szq+V/o8uqD7u2bNnlq86lXtuaX4K1s6ZM2cRPxnmtiTqnWLr4PSZr7POOtm5nH6cp+/KnXbaKQtmzW1R67LG1mtKfV3svtB6mlrvFFt3zm3udmU635Zffvns7759+9bVj+kiWGPL10oXsQYPHhxXXXVVVFZWZvVsuiCR/r8l2oytq7Z++NWvfpV9fql+SL8b1l133awurG9hbaVevXrF73//+7jjjjvmeZ9f/OIXWR1aew4VU5/VWpJtzcYUu24K+KZA74UXXpjV4elcT+VPF0Lqj4vSlONA0xVbZxRb9y2sjppf3baodeuSbtNqNwItqgAl7JVXXimk03zFFVcsjB8/vm7+G2+8UejYsWPh2GOPrZv3j3/8I1v28ccfb7CN2bNnZ/PPOuusunnf//73C6uuumphzpw5DZZ99dVX6/7+8MMPs/Uuv/zyecqz8sorFz755JO6+bfeems2P5Wh/rY6dOjQoIzJgw8+mC171113FV2WYpZhyfne975X6N69e2HMmDENzqOtttqqsMEGG9TN23fffQtdu3YtjB49usH677zzTuHrr7/O/t5+++0LvXv3bnD+jh07Ntv+7rvvXjdv7733zuadc845dfOqqqoK6667bmGzzTZrsP2mbLNbt26Fc889t27e559/XujSpUthxx13LPzsZz+rm//ll19my5500kkN3uvwww8vLLPMMg3mLWy/33333ewcv/HGGxu8nt4j/b+iaZ544onseF5wwQV186qrqwtHHnlkNv8nP/lJk+ud4cOHZ89PP/30Bssdf/zxhXbt2hVefPHFJr/3/OrrSZMmzXffUt22wgorLFKd35T6+IYbbsjmPfbYYw3e/+CDDy507tw5OzdZMpZEvVNsHbztttsWBgwYUPjss8/q5v3rX//K6sf0edfWw4tal81vvabU18XuC62nKfVOsXVnY23Ixua9/fbb2byrrrpqnnI1tvzLL79caN++fXZe1m8Tpr9ff/317G9txrZRB5555pkN5h9yyCGFTp06Fd5///3seTFtpfR9+41vfKPw7W9/u8EyqT6pqKgonHHGGU2qz5qjrdlYHVnsultvvXVh+eWXz74jao0aNarQp0+fBnV4U44DTVdMnVFs3VdMHdVY3bY4dWtztGm1G4GWIqhPWfzQOvHEE+d5Lf1Q7tGjR9YYbWpQ/4ADDij069cva2DOz4KC+qeeemqDZWfOnJk1Kn/xi1/UzUtlTvPqBxtqrbnmmoV99tmn6LIUswxLxsSJE7MGYGPn3C233JJ9/qmR++mnn2af7wknnDDfbaUfM2n5U045ZZ7XfvjDHzY4P9IPrfS+kydPbrDcT3/606xxXHueL8o2p0yZ0mC59CMqbeOrr76a50fYN7/5zQbz5v6xVsx+v/XWW3WN67l/INB0RxxxRBYQrR+gTF544YV5foQUW++kHzCVlZXznAMTJkxoUOc25b1r68f0I6oxs2bNKtxzzz1ZPfmjH/0oC+Smcy6tk86rptb5TamPZ8yYUVh66aXr9j9JxygF9A888MBGy8uiWdx6p9g6eNy4cdnfZ5999jzL7bTTTgsN6hdTlzW2XlPq62L3hdbVlHqn2LqzuYL6c3/PN0absXWl+iF9RvUD1cmbb77ZIKBYbFvpd7/73Tx1RWoDpnlpG02pz5qjrTl3HVnsurXnd/0LDLV22WWXeerwYo4Di6aYOqPYuq+YOqqxum1x6tbmaNNqNwItRU59ykK6fW5u6db1lIMx3dLX1FsuTzvttOzWzm984xuxxRZbxLe//e3slv10m3UxUsqI+lKuypR/MN0+W+uVV17JbmGszZf6fxfhsindBpvSBhRblsUtL8UbPXp0lsIjPaZbMtPnVfv51X6+6bNLt+uneen24vlJ+XKTdDvo3NK8tP6YMWOy2+6TlP9x7hzLyyyzTHb78cSJE7PXF2Wb6TbU+pZeeuno379/djvz3PNTypQFSekiFrbf6TxN+cnTrd3pltaUozLdEv7f//3fcuovgvSZpJzjKSdvfauttto8yxZb76TzKNWbjZ0Daao9z5ry3gt6LZ2/KQXJ559/HnvttVe2zVRv1t6Gn3K5pnNyUer8YurjTp06xeGHH57l5/34449jwIABcc0118SMGTOy+SxZi1PvFFsH19aV8ztX6qd1WtS6bGH7uLD6uth9aaw+p+UVU+8UW3c2l3Qupfev/Y5vjDZj60vnwtxjCKXc3indTW19V2xb6bDDDov/+Z//icsvvzxLJZK+t1Ian/RbIG2jqfVZc7Q16yt23ZSSZ35thjTv/vvvbzCvmOPAoimmzii27iumjmrM4tStzdGm1W4EWoqc+pSFxvId1+ZZTDkYk9qBk2rn10p5++aWBsRJDcqUezrluLzzzjuzgXpSztv0A3xhUtBsbqkc9d875elLjYYVVlghm9KgkKkhkQZxSjkm04BOxZZlcctL8dLnlqTgU+3nVvvZpUGj/vCHP2Q/8mvPu7nPt/pSHsmFnb+1yyzovGps+cXdZjHncGOK2e8k5YxOg/6lcz3l5kwDWKc87+lHA00zv8+lsXnF1jvpHJlfHvm03dpzqCnvXSsF1OeWcuGmAczSgHbpx/jpp5+elSfVZ4ta59cq9lw+5phjsvoy5XhNQYU///nP2Tm59dZbz3dfWDSLU+80tQ5e0LmyJOqy+Smmvi52X2gbiql3iq07m0sx39PajK2vsXMkff+kqf53WDFtpTTGQho89oYbboipU6dmvwXSBfL6F6SbUp81R1uzvmLXXVCZG5tXzHFg0RRTZyxuu3FhFqduba42rXYj0BL01KcszD2QTjJq1KisF0DqUZLU9tys3zuztudqY9JAjanHaJqSNFjiz3/+8yzolHopLIkG0hNPPJENMjR3b51FKUtzl5caacCuNIBjCsKkH1nz069fv2y5ESNGZD2t5tfrLwV1XnrppUYHpUrrL6jHc0ttsynSoJQL2+/6PbLSlHqopjsb1lxzzawHeeqxTfHSMXzmmWeywRrr90JKgYBFrXfSZ5GWSz3lUw+9Wh988EF8+eWXdT3smvLeC5J6R6WgZrq4UF+qvxa1zm+q9N5pAL4U1E+DtqYB+tJAhrWBV/JVB6fzMX128ztXlmRd1tz7QttQTL1TbN1ZrNpgU+1dHAuT6q4U8E3vly4OzY82Y+tKweb0e2S55ZZr8L2ZAo+pXmhqW+m4447L7i5LPfrTILxpIM999tmn2eqzxWlrFrtu6mmflmusPTG/NsbCjgOLbmF1RrF1X7F11NwWp25trjatdiPQEvTUpyykxkG6na/Ws88+G/fee28cddRRdQGZlVdeOesBl26Trv1xlG7tvPLKK+fZXlo3paKoL92eV3u73ZKQett07do1fvjDH2YN1/ree++9eP7554suS0uUl//0BEo/iFLvqeeee67BYUk/xm677ba63shHHnlkXH/99VlDsr7UYJw+fXr2Ge29997x//7f/2tw/o4cOTL+9re/xUEHHTTPLdAL0xzbbIpi9jsFcF988cUGr6Uypd5hztem+8EPfpD1Ijr33HPr5s2aNSuuvvrqRa53jjjiiKzH0k9/+tO6+jKd3z/5yU+y9DW1Pd+a8t4Lkn7kjx8/vi79T5LSo6TzdlHr/EWRjsu4ceOyczgF0w499NBF3hatWwenunCPPfaIv/zlLzF27Ni6ZR588MGiUqAUU5e11L7QNhRT7xRbdxYrXSxI205pwYpx7LHHZsG3VNfXpi9JUhsxlTfRZmx9qX4577zz6s6R9D169tlnZ0Ho/fffP5vXlLZSCpRuttlmcc4552Tf46nHevqub676bHHamsWum5bbfffds/bE+++/3+D/YUon1JiFHQcWTTF1RrF1XzF1VGMWp25tzjatdiPQ3PTUpyycdNJJ2Q/j1OMlfUmnPIs77rhj1kCuldLv/O53v4sDDjggu2Uw3dKeelhddNFFWY+OuXuKpMZGumKfrsKn3jSPPPJInHLKKbHxxhsvkTIPHjw4C1odfPDBWY7CrbbaKkuLkRrxEyZMiMsuu6zosrREeWmYKiQ1+lJOyfS5pTyoqfdHOp/SuVXbKygtl24Brs2DutJKK2U/RFLD8qGHHsqWSSk+Uq+XlGohnbOpsfnAAw9kKT8uvvjiRTrszbHNpljYfqfypEb97Nmzsx5p6bx/8skns/+jF1xwQbOXr9RssMEG8cc//jFLnZN+EKW6LfWA+81vfpP9gK9/K3+x9U7Ku5uCoenHStpWeo8XXngh+2Gd6svaPPVNee8FSXXVHXfckf0Y32233bIAVvqBd8YZZ8QJJ5ywSHX+othhhx2y/8/pNvOdd965yeOx0Lbq4BQsT+fFRhttlOX/TedUOl/SD/cUUCvmfRZWh7fUvtD6iql3iq07i5UCuCnIm9qv6cJrCvqmHtqpnmxMSs1yzz33ZIHRdLE0nVMpKJUCpilQlc4pbcbWl+7uSOfGpptumqUzSQHo1Gv4pptuqguWNrWtlHqpp7vwksYCnEu6Pluctmax66bl0vdyCtan5dLFh7Rsyp//61//utE2xsKOA01XTJ1RbN1XTB3VmMWpW5uzTavdCDS3ijRabrO/C7Ti7aspd2Jq6KWe+KlBmBoaqdGRfiA3JvUETb080pX5FLRJDevUgEzBpPoD/qRb79IthekLPy2TXqsf4EkN43Tlfrvttstua527PHMPqJYapqmMqTFdX/oxn3rJpHzSqcGeGhapLPUbDgsrS7HLsGSlHr1PP/10dutmSh2SGrZpgM25pQBh+oxrf5ilHzFzSz/oUhAn9chLP15SEKq+FDxIA5TN3XM4rfP4449nvVDmHnhyUbeZgr4pqJoCX/WlH31pn+v/SEqN+tQLNvUAa+p+p1QGqXzp9fR/IzXsiw0CM68U8El1W+phnn5kpGOZbjNOt+mn4HhT653aOi1tMwX8U4/RVN81lhO/mPdeUP2YpB91w4YNy3rsp/MhBa5S+dK8Qw45JOvVnG6BTvVt2s53v/vdBdb5i1IfJz/+8Y+zXOa333573W3mLDlLot5pSh2czvWHH344O0fThax0Dqe6MfWMTxeMatObLGpd1th6i1JfF/t9QstrSr1TbN3ZWBuysXlJuoCQtpUuvqZ6Mn2Xp+/L+S2fpDuxUo/sdG6mujgtXxssTrQZW0+6UJeCpKleSXcNPfXUU9n3cPrurP8ZNbWtlD7T9D2Z6qjGUkUVU581R1tzQXXrwtaduw5PbZXUNqhNszP3HYdNOQ40TbF1RrHtxgXVUQuq2xalbm1q2ZrSnk60G4HmJKgPAGUoBcPTj5H77rsvyxVfCu9dP7iWenk1h9Rr8pNPPskuLtQOsA6Ur5aodyjPoP6SlO52S2lt0h3I6a6SUpZ6c6eLEqm3dTkfB9pGm1a7EWhOujwCQIlLvadSb85akydPznLKpl5UjfVGL5X3XtLS7d9p8PRjjjlGQB+A3Ljuuuuy9EzpzrZSkQYGTnfs1Xfrrbdm7Y75jXlTiseBltPUNq12I9Dc5NQHgBKXequlHqQphU6S8u6mHyV33nlnsw8+3JrvvaSMGDEiG7Qv5XlNKVpOO+201i4SACzUL3/5yyywmAYzTePiNJZOJK9SWp799tsv+vXrl6Ueeuedd7KULSmgny6+l8txoOUU26bVbgRaivQ7AFAGUrqYlCc85QodOHBglne2a9euJfXeC8vLv6hGjx6d5ezt379//Pd///c8OYOB8tVc9Q7laX556xdVyi0/c+bMbNDdxnLS510KqKZBS998881o3759NgZAY/8PS/040HKKadNqNwItRVAfAAAAAAByQk59AAAAAADICUF9AAAAAADICUF9AAAAAADICUF9AAAAAADICUF9AAByY+21145dd921wbyllloqjj/++Gjr5WzM4pS9oqIizjjjjEVatznKAwAAtAxBfQAAivLcc89lgeTaqV27dtG3b9/YaaedYvjw4bk7ip07d46TTz65tYsBAADQJIL6AAA0yYUXXhiFQiFmz54djz32WHz++eex3XbbxT//+c9WOZJfffVVXHLJJa3y3gAAAC1NUB8AgEVSWVkZ6623Xlx99dVZgF9gHQAAoPkJ6gMAsFhWX3317PHDDz/MHg866KBYYYUV4rPPPosDDjggevfuHZtssknd8ukiwEYbbRRdunSJnj17Zul7Xn755QbbnDZtWpxwwgnRv3//6N69e5affty4cU3KA/+Xv/wlNt1002z9pZdeOvbee+9444034pNPPsnSB82cOTMuvvjiunRCO+64Y4P1l3Q5m3I8a8vUvn377FgeccQRMWHChEaXHzZsWKy//vpZOqHVVlst2+/GFLM/AABA2yeoDwDAYnnzzTezx4EDB9bNq66ujqOOOioOPfTQePfdd+uC7ikAfuKJJ8bhhx+eXQR4/fXXY/nll48tt9wyXnvttbr1UwD+b3/7WxaI/uijj+L000/Ptjdr1qyiynTsscfGcccdF/vtt18WyE9Tutjwxz/+MZZddtksfVCnTp3ipJNOyv5O04MPPli3fkuVszGprLVlmjx5ctx0003x/PPPxz777JMd1/peeeWVuOqqq+L222/PypkuoqQLAJdffnmD5YrdHwAAIAcKAABQhH/+85+F1Hy88MILs+dVVVWFUaNGFTbbbLNC+/btC8OHD8/mH3jggdlyt99+e4P1//Wvf2Xzzz///Abz03ZWX331wt577509f/TRR7PlrrrqqgbLPfLII9n8XXbZpcH8Xr16FY477ri6588//3y23C9/+csF7k+nTp0KJ5100jzzm6ucjZm77PPz4IMPZtt89dVX6+al50svvXRh+vTpDZbdddddC3369CnMmDGjSfvTlPIAAACtR099AACa5LTTTstSw3To0CGGDh0avXr1iocffjjr9V0rvZ5S0dR33333ZY/77rvvPLn5t95663jyySez548++mj2uNtuuzVYLg3Gm1LcLMz999+fPaZe64uipco5PyNHjow99tgjlllmmew966cGGjNmTINlt99++yydTn1p3S+++KIutU6x+wMAAORD+9YuAAAA+XLhhRfGqaeeusBlUg77jh07NpiXctknKe97UptipvbvFLxOPv/882jXrl22jbmlQPfC1OaeT+llFkVLlbMxKVXRVlttFdtss0088sgjscoqq2RB+2eeeSa7aJIGJF7Y+9TOS2MaNGV/AACAfNBTHwCAJS714p9bv379ssfx48dHVVVVzJkzJ8sRn6YUXK7NF9+3b9/s74kTJ86zjfkNFltfbZA9vc+iaKlyNua2226L6dOnx5VXXhnrrLNOXS/8sWPHNrr8p59+Ot95qXxN2R8AACAfBPUBAGgRtel4br755gUut+2222aP9957b4P5jz32WEyZMqXo90kD2C5It27dYubMma1WzgVJg/jWd/311ze6XOrNP2PGjAbz7r777ujdu3dssMEGTdofAAAgH6TfAQCgRWy22WZxwgknxJlnnpn1Ft9nn32y3uQp5UzK+556t//+97/PguXf+c534ic/+UmWSibl7R81alT22je+8Y2Fvs+mm24aRx99dJx33nnRtWvX2H///bMe70899VQMGzYsLrvssmy5tddeO5599tmsZ3v9NDYtVc7G7LTTTnHWWWfFj3/84/jtb3+bXXT43e9+l41b0JiNN944DjnkkDj//POjZ8+eccUVV2Rl/OMf/1h3YaDY/QEAAPJBT30AAFpMCjan1DK33357rLXWWtG/f/848MADY+rUqXH66adny6Qc73fccUd897vfjcMOOyyWXXbZLECfgvFz5+mfn8svvzwuvvjirLd+yku/xhprxI033hgnnnhi3TLp9RTsX2mllRoMRtuS5ZxbSrmT3jMNcjto0KAsv/5yyy2XXThozLrrrhuHHnpoNjhuGkMg9ehPgf3jjz++yccdAADIh4pC7ShZAAAAAABAm6anPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAARD78f2UC+TnZt+LxAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn import metrics\n", "\n", "y_predicted = model.predict(X_test)\n", "\n", "print(metrics.classification_report(y_test, y_predicted))\n", "metrics.ConfusionMatrixDisplay.from_predictions(y_test, y_predicted)\n", "None" ], "id": "cell-15" }, { "cell_type": "markdown", "metadata": {}, "source": [ "The recorded run achieves a test macro F1-score of about **0.69** on the MAG sentence-classification dataset, above the historical SciBERT baseline of **0.6571** associated with the [2019 SciBERT work](https://arxiv.org/abs/1903.10676). This compares a linear SVM with one historical baseline; it does not establish current state-of-the-art performance. A broader claim would require a current benchmark with comparable data splits, preprocessing, and metrics.\n", "\n", "You might wonder that *\"this is great, but besides some utility functions (`clean`, `simple_parallel_map`, ...) what more value does GreatAI add?\"*. This would be a valid argument because the scope of GreatAI actually only starts here.\n", "\n", "> Not coincidentally, this is the point where the scope of Data Science ends but it's still a grey zone for software engineering.\n", "\n", "In order to use this model in production, we have to make it available on some possibly shared infrastructure." ], "id": "cell-16" }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2026-10-28T22:47:23.949712Z", "iopub.status.busy": "2026-10-28T22:47:23.949648Z", "iopub.status.idle": "2026-10-28T22:47:23.983489Z", "shell.execute_reply": "2026-10-28T22:47:23.982773Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;226mEnvironment variable ENVIRONMENT is not set, defaulting to development mode ‼️\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;226mCannot find credentials files, defaulting to using ParallelTinyDbDriver\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;226mThe selected tracing database (ParallelTinyDbDriver) is not recommended for production\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;226mCannot find credentials files, defaulting to using LargeFileLocal\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39mGreatAI (v0.1.11): configured ✅\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39m 🔩 tracing_database: ParallelTinyDbDriver\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39m 🔩 large_file_implementation: LargeFileLocal\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39m 🔩 is_production: False\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39m 🔩 should_log_exception_stack: True\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39m 🔩 prediction_cache_size: 512\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39m 🔩 dashboard_table_size: 50\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;226mYou still need to check whether you follow all best practices before trusting your deployment.\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;226m> Find out more at https://se-ml.github.io/practices\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39mFetching cached versions of my-domain-predictor\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39mFetching cached versions of my-domain-predictor\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39mFetching cached versions of my-domain-predictor\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[38;5;39mModel my-domain-predictor uploaded with version 0\u001b[0m\n" ] }, { "data": { "text/plain": [ "'my-domain-predictor:0'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from great_ai import save_model\n", "\n", "save_model(model, key=\"my-domain-predictor\")" ], "id": "cell-17" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Let's continue by finishing the deployment in the next notebook.](https://great-ai.schmelczer.dev/tutorial/deploy)" ], "id": "cell-18" } ], "metadata": { "kernelspec": { "display_name": "GreatAI (local)", "language": "python", "name": "great-ai-local" }, "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.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }