From 9074ecb23ac1e9f99e99620bd803fd4b66485ea1 Mon Sep 17 00:00:00 2001 From: Nathan Bartley Date: Mon, 23 Feb 2026 17:39:49 -0800 Subject: [PATCH 1/2] added base scripts, and first pass at the setup, training and serving notebooks --- tutorials/setup_template/.env.example | 3 + tutorials/setup_template/.gitignore | 16 + .../setup_template/configs/baseline.yaml | 14 + .../notebooks/01_setup_and_eda.ipynb | 1067 +++++++++++++++++ .../notebooks/02_train_and_evaluate.ipynb | 600 +++++++++ .../notebooks/03_serve_and_predict.ipynb | 318 +++++ tutorials/setup_template/notebooks/shell1.png | Bin 0 -> 298842 bytes tutorials/setup_template/requirements.txt | 13 + tutorials/setup_template/src/__init__.py | 0 tutorials/setup_template/src/baseline.py | 92 ++ tutorials/setup_template/src/data.py | 24 + tutorials/setup_template/src/eda.py | 31 + tutorials/setup_template/src/serve.py | 22 + tutorials/setup_template/src/utils.py | 23 + 14 files changed, 2223 insertions(+) create mode 100644 tutorials/setup_template/.env.example create mode 100644 tutorials/setup_template/.gitignore create mode 100644 tutorials/setup_template/configs/baseline.yaml create mode 100644 tutorials/setup_template/notebooks/01_setup_and_eda.ipynb create mode 100644 tutorials/setup_template/notebooks/02_train_and_evaluate.ipynb create mode 100644 tutorials/setup_template/notebooks/03_serve_and_predict.ipynb create mode 100644 tutorials/setup_template/notebooks/shell1.png create mode 100644 tutorials/setup_template/requirements.txt create mode 100644 tutorials/setup_template/src/__init__.py create mode 100644 tutorials/setup_template/src/baseline.py create mode 100644 tutorials/setup_template/src/data.py create mode 100644 tutorials/setup_template/src/eda.py create mode 100644 tutorials/setup_template/src/serve.py create mode 100644 tutorials/setup_template/src/utils.py diff --git a/tutorials/setup_template/.env.example b/tutorials/setup_template/.env.example new file mode 100644 index 0000000..dc1a894 --- /dev/null +++ b/tutorials/setup_template/.env.example @@ -0,0 +1,3 @@ +MLFLOW_TRACKING_URL=./mlruns +DATA_CACHE_DIR=./.hf_cache + diff --git a/tutorials/setup_template/.gitignore b/tutorials/setup_template/.gitignore new file mode 100644 index 0000000..c0c5fc5 --- /dev/null +++ b/tutorials/setup_template/.gitignore @@ -0,0 +1,16 @@ +# Environment +.env +nlp311/ + +# Runtime artifacts +data/ +mlruns/ +reports/ +.hf_cache/ + +# Python +__pycache__/ +*.pyc + +# OS +.DS_Store diff --git a/tutorials/setup_template/configs/baseline.yaml b/tutorials/setup_template/configs/baseline.yaml new file mode 100644 index 0000000..21f8066 --- /dev/null +++ b/tutorials/setup_template/configs/baseline.yaml @@ -0,0 +1,14 @@ +experiment_name: "t0_setup_template" +dataset: "ag_news" +test_size: 0.2 +random_state: 42 +tfidf: + max_features: 30000 + ngram_range: [1,2] +model: + type: "logreg" + C: 2.0 + max_iter: 200 +metrics: + average: "macro" + diff --git a/tutorials/setup_template/notebooks/01_setup_and_eda.ipynb b/tutorials/setup_template/notebooks/01_setup_and_eda.ipynb new file mode 100644 index 0000000..3f471cb --- /dev/null +++ b/tutorials/setup_template/notebooks/01_setup_and_eda.ipynb @@ -0,0 +1,1067 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Notebook 1: Setup & Exploratory Data Analysis\n", + "\n", + "Welcome to the **Hack for LA Data Science** setup template tutorial!\n", + "\n", + "This is the first of three notebooks that walk you through a complete NLP (Natural Language Processing) text classification pipeline. By the end of this series, you'll have trained a model that can read a news headline and predict its category.\n", + "\n", + "**What you'll do in this notebook:**\n", + "\n", + "1. Set up your Python environment and install dependencies\n", + "2. Load a real-world news dataset from Hugging Face\n", + "3. Explore the data to understand what we're working with\n", + "\n", + "**Why this matters:** Before building any model, you need to understand your data. Exploratory Data Analysis (EDA) helps you catch problems early — things like imbalanced classes, unexpected text lengths, or missing values — that would otherwise silently hurt your model's performance.\n", + "\n", + "---\n", + "\n", + "### Notebook series\n", + "\n", + "| Notebook | Focus |\n", + "|---|---|\n", + "| **01 — Setup & EDA** (you are here) | Environment, data loading, exploration |\n", + "| 02 — Train & Evaluate | Build, train, and evaluate a text classifier |\n", + "| 03 — Serve & Predict | Load the trained model and make predictions |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Environment Setup\n", + "\n", + "Before writing any code, we need to make sure our tools are installed and configured. Think of this like setting up your workbench before starting a project.\n", + "\n", + "### What is a virtual environment?\n", + "\n", + "A **virtual environment** is an isolated Python installation. Most operating systems come with a version of Python already installed: if you open a terminal or a powershell and type `python` you'll see something like the following:\n", + "\n", + "
\n", + "\n", + "
\n", + "\n", + "Image borrowed from [tutorialsteacher](https://www.tutorialsteacher.com/python/python-interective-shell)\n", + "\n", + "Because there's a lot of variability in dependencies and versions, it's standard practice to use a virtual environment to keep your project's packages separate from your system Python, so you won't accidentally break other projects (or vice versa). Every serious Python project should use one.\n", + "\n", + "### Prerequisites\n", + "- **Python 3.11+** installed on your system\n", + "- This notebook should be run from the `notebooks/` directory inside the project" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1a. Locate the Project Root\n", + "\n", + "Now we need to determine the root of the project we're setting everything up in. This matters because we need to find files like `requirements.txt` and `configs/baseline.yaml` regardless of where you opened the notebook from." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Project root: /Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template\n" + ] + } + ], + "source": [ + "import subprocess, sys, os\n", + "from pathlib import Path\n", + "\n", + "# Try to detect the project root automatically.\n", + "# If running in VS Code, __vsc_ipynb_file__ gives us the notebook's path.\n", + "# Otherwise, we assume the notebook is in a 'notebooks/' subdirectory.\n", + "PROJECT_ROOT = (\n", + " Path(\"__vsc_ipynb_file__\").resolve().parent.parent\n", + " if \"__vsc_ipynb_file__\" in dir()\n", + " else Path.cwd().parent\n", + ")\n", + "\n", + "# Safety check: if we can't find requirements.txt, we're probably already at the root\n", + "if not (PROJECT_ROOT / \"requirements.txt\").exists():\n", + " PROJECT_ROOT = Path.cwd()\n", + "\n", + "print(f\"Project root: {PROJECT_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1b. Create the Virtual Environment\n", + "\n", + "This creates a virtual environment called `nlp311` in the project root. If it already exists, the cell simply skips creation.\n", + "\n", + "> **Note:** Creating the venv from inside the notebook is convenient for this tutorial, but in day-to-day work you'd typically do this once from the terminal." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Virtual environment already exists at /Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template/nlp311\n", + "\n", + "To activate in a terminal, run:\n", + " source /Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template/nlp311/bin/activate\n" + ] + } + ], + "source": [ + "venv_path = PROJECT_ROOT / \"nlp311\"\n", + "\n", + "if not venv_path.exists():\n", + " # this is calling python -m venv venv_path\n", + " subprocess.check_call([sys.executable, \"-m\", \"venv\", str(venv_path)])\n", + " print(f\"Created virtual environment at {venv_path}\")\n", + "else:\n", + " print(f\"Virtual environment already exists at {venv_path}\")\n", + "\n", + "# Show the activation command for terminal use\n", + "if sys.platform == \"win32\":\n", + " activate_cmd = str(venv_path / \"Scripts\" / \"activate\")\n", + "else:\n", + " activate_cmd = f\"source {venv_path / 'bin' / 'activate'}\"\n", + "\n", + "print(f\"\\nTo activate in a terminal, run:\\n {activate_cmd}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1c. Install Dependencies\n", + "\n", + "The `requirements.txt` file lists every Python package this project needs, along with specific version numbers. Pinning versions ensures everyone on the team gets the same behavior — no \"works on my machine\" surprises.\n", + "\n", + "Key packages we're installing:\n", + "- **pandas** — tabular data manipulation (think Excel spreadsheets in Python)\n", + "- **scikit-learn** — classic machine learning algorithms and utilities\n", + "- **datasets** — Hugging Face's library for downloading and managing datasets\n", + "- **mlflow** — experiment tracking (logs your model runs so you can compare them later)\n", + "- **matplotlib** — plotting and visualization\n", + "- **fastapi / uvicorn** — for serving predictions as a web API (used in notebook 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pandas==2.2.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 1)) (2.2.2)\n", + "Requirement already satisfied: scikit-learn==1.5.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 2)) (1.5.2)\n", + "Requirement already satisfied: spacy==3.7.6 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 3)) (3.7.6)\n", + "Requirement already satisfied: matplotlib==3.9.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 4)) (3.9.2)\n", + "Requirement already satisfied: datasets==3.0.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 5)) (3.0.1)\n", + "Requirement already satisfied: transformers==4.44.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 6)) (4.44.2)\n", + "Requirement already satisfied: mlflow==2.16.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 7)) (2.16.2)\n", + "Requirement already satisfied: numpy==1.26.4 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 8)) (1.26.4)\n", + "Requirement already satisfied: pyyaml==6.0.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 9)) (6.0.2)\n", + "Requirement already satisfied: python-dotenv==1.0.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 10)) (1.0.1)\n", + "Requirement already satisfied: pydantic==2.9.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 11)) (2.9.2)\n", + "Requirement already satisfied: fastapi==0.115.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 12)) (0.115.0)\n", + "Requirement already satisfied: uvicorn==0.30.6 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from -r ../requirements.txt (line 13)) (0.30.6)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from pandas==2.2.2->-r ../requirements.txt (line 1)) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from pandas==2.2.2->-r ../requirements.txt (line 1)) (2025.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from pandas==2.2.2->-r ../requirements.txt (line 1)) (2025.3)\n", + "Requirement already satisfied: scipy>=1.6.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from scikit-learn==1.5.2->-r ../requirements.txt (line 2)) (1.16.3)\n", + "Requirement already satisfied: joblib>=1.2.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from scikit-learn==1.5.2->-r ../requirements.txt (line 2)) (1.5.3)\n", + "Requirement already satisfied: threadpoolctl>=3.1.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from scikit-learn==1.5.2->-r ../requirements.txt (line 2)) (3.6.0)\n", + "Requirement already satisfied: spacy-legacy<3.1.0,>=3.0.11 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (3.0.12)\n", + "Requirement already satisfied: spacy-loggers<2.0.0,>=1.0.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (1.0.5)\n", + "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (1.0.15)\n", + "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (2.0.13)\n", + "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (3.0.12)\n", + "Requirement already satisfied: thinc<8.3.0,>=8.2.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (8.2.5)\n", + "Requirement already satisfied: wasabi<1.2.0,>=0.9.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (1.1.3)\n", + "Requirement already satisfied: srsly<3.0.0,>=2.4.3 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (2.5.2)\n", + "Requirement already satisfied: catalogue<2.1.0,>=2.0.6 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (2.0.10)\n", + "Requirement already satisfied: weasel<0.5.0,>=0.1.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (0.4.3)\n", + "Requirement already satisfied: typer<1.0.0,>=0.3.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (0.23.2)\n", + "Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (4.67.1)\n", + "Requirement already satisfied: requests<3.0.0,>=2.13.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (2.32.3)\n", + "Requirement already satisfied: jinja2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (3.1.6)\n", + "Requirement already satisfied: setuptools in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (80.1.0)\n", + "Requirement already satisfied: packaging>=20.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (24.2)\n", + "Requirement already satisfied: langcodes<4.0.0,>=3.2.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from spacy==3.7.6->-r ../requirements.txt (line 3)) (3.5.1)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from pydantic==2.9.2->-r ../requirements.txt (line 11)) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.23.4 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from pydantic==2.9.2->-r ../requirements.txt (line 11)) (2.23.4)\n", + "Requirement already satisfied: typing-extensions>=4.6.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from pydantic==2.9.2->-r ../requirements.txt (line 11)) (4.15.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from matplotlib==3.9.2->-r ../requirements.txt (line 4)) (1.3.3)\n", + "Requirement already satisfied: cycler>=0.10 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from matplotlib==3.9.2->-r ../requirements.txt (line 4)) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from matplotlib==3.9.2->-r ../requirements.txt (line 4)) (4.61.1)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from matplotlib==3.9.2->-r ../requirements.txt (line 4)) (1.4.9)\n", + "Requirement already satisfied: pillow>=8 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from matplotlib==3.9.2->-r ../requirements.txt (line 4)) (12.1.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from matplotlib==3.9.2->-r ../requirements.txt (line 4)) (3.3.2)\n", + "Requirement already satisfied: filelock in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from datasets==3.0.1->-r ../requirements.txt (line 5)) (3.20.3)\n", + "Requirement already satisfied: pyarrow>=15.0.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from datasets==3.0.1->-r ../requirements.txt (line 5)) (17.0.0)\n", + "Requirement already satisfied: dill<0.3.9,>=0.3.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from datasets==3.0.1->-r ../requirements.txt (line 5)) (0.3.8)\n", + "Requirement already satisfied: xxhash in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from datasets==3.0.1->-r ../requirements.txt (line 5)) (3.6.0)\n", + "Requirement already satisfied: multiprocess in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from datasets==3.0.1->-r ../requirements.txt (line 5)) (0.70.16)\n", + "Requirement already satisfied: fsspec<=2024.6.1,>=2023.1.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from fsspec[http]<=2024.6.1,>=2023.1.0->datasets==3.0.1->-r ../requirements.txt (line 5)) (2024.6.1)\n", + "Requirement already satisfied: aiohttp in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from datasets==3.0.1->-r ../requirements.txt (line 5)) (3.13.3)\n", + "Requirement already satisfied: huggingface-hub>=0.22.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from datasets==3.0.1->-r ../requirements.txt (line 5)) (0.36.2)\n", + "Requirement already satisfied: regex!=2019.12.17 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from transformers==4.44.2->-r ../requirements.txt (line 6)) (2025.11.3)\n", + "Requirement already satisfied: safetensors>=0.4.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from transformers==4.44.2->-r ../requirements.txt (line 6)) (0.7.0)\n", + "Requirement already satisfied: tokenizers<0.20,>=0.19 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from transformers==4.44.2->-r ../requirements.txt (line 6)) (0.19.1)\n", + "Requirement already satisfied: mlflow-skinny==2.16.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow==2.16.2->-r ../requirements.txt (line 7)) (2.16.2)\n", + "Requirement already satisfied: Flask<4 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.1.2)\n", + "Requirement already satisfied: alembic!=1.10.0,<2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow==2.16.2->-r ../requirements.txt (line 7)) (1.18.4)\n", + "Requirement already satisfied: docker<8,>=4.0.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow==2.16.2->-r ../requirements.txt (line 7)) (7.1.0)\n", + "Requirement already satisfied: graphene<4 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.4.3)\n", + "Requirement already satisfied: markdown<4,>=3.3 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.10)\n", + "Requirement already satisfied: sqlalchemy<3,>=1.4.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow==2.16.2->-r ../requirements.txt (line 7)) (2.0.46)\n", + "Requirement already satisfied: gunicorn<24 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow==2.16.2->-r ../requirements.txt (line 7)) (23.0.0)\n", + "Requirement already satisfied: starlette<0.39.0,>=0.37.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from fastapi==0.115.0->-r ../requirements.txt (line 12)) (0.38.6)\n", + "Requirement already satisfied: click>=7.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from uvicorn==0.30.6->-r ../requirements.txt (line 13)) (8.3.1)\n", + "Requirement already satisfied: h11>=0.8 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from uvicorn==0.30.6->-r ../requirements.txt (line 13)) (0.16.0)\n", + "Requirement already satisfied: cachetools<6,>=5.0.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (5.5.2)\n", + "Requirement already satisfied: cloudpickle<4 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.1.2)\n", + "Requirement already satisfied: databricks-sdk<1,>=0.20.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (0.88.0)\n", + "Requirement already satisfied: gitpython<4,>=3.1.9 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.1.46)\n", + "Requirement already satisfied: importlib-metadata!=4.7.0,<9,>=3.7.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (8.7.1)\n", + "Requirement already satisfied: opentelemetry-api<3,>=1.9.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (1.39.1)\n", + "Requirement already satisfied: opentelemetry-sdk<3,>=1.9.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (1.39.1)\n", + "Requirement already satisfied: protobuf<6,>=3.12.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (5.29.6)\n", + "Requirement already satisfied: sqlparse<1,>=0.4.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (0.5.5)\n", + "Requirement already satisfied: Mako in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from alembic!=1.10.0,<2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (1.3.10)\n", + "Requirement already satisfied: google-auth~=2.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from databricks-sdk<1,>=0.20.0->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (2.48.0)\n", + "Requirement already satisfied: urllib3>=1.26.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from docker<8,>=4.0.0->mlflow==2.16.2->-r ../requirements.txt (line 7)) (2.4.0)\n", + "Requirement already satisfied: blinker>=1.9.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from Flask<4->mlflow==2.16.2->-r ../requirements.txt (line 7)) (1.9.0)\n", + "Requirement already satisfied: itsdangerous>=2.2.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from Flask<4->mlflow==2.16.2->-r ../requirements.txt (line 7)) (2.2.0)\n", + "Requirement already satisfied: markupsafe>=2.1.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from Flask<4->mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.0.3)\n", + "Requirement already satisfied: werkzeug>=3.1.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from Flask<4->mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.1.5)\n", + "Requirement already satisfied: gitdb<5,>=4.0.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from gitpython<4,>=3.1.9->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (4.0.12)\n", + "Requirement already satisfied: smmap<6,>=3.0.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from gitdb<5,>=4.0.1->gitpython<4,>=3.1.9->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (5.0.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from google-auth~=2.0->databricks-sdk<1,>=0.20.0->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (0.4.2)\n", + "Requirement already satisfied: cryptography>=38.0.3 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from google-auth~=2.0->databricks-sdk<1,>=0.20.0->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (46.0.4)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from google-auth~=2.0->databricks-sdk<1,>=0.20.0->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (4.9.1)\n", + "Requirement already satisfied: graphql-core<3.3,>=3.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from graphene<4->mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.2.7)\n", + "Requirement already satisfied: graphql-relay<3.3,>=3.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from graphene<4->mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.2.0)\n", + "Requirement already satisfied: hf-xet<2.0.0,>=1.1.3 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from huggingface-hub>=0.22.0->datasets==3.0.1->-r ../requirements.txt (line 5)) (1.2.0)\n", + "Requirement already satisfied: zipp>=3.20 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from importlib-metadata!=4.7.0,<9,>=3.7.0->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.23.0)\n", + "Requirement already satisfied: opentelemetry-semantic-conventions==0.60b1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from opentelemetry-sdk<3,>=1.9.0->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (0.60b1)\n", + "Requirement already satisfied: six>=1.5 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas==2.2.2->-r ../requirements.txt (line 1)) (1.17.0)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (3.4.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (3.11)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from requests<3.0.0,>=2.13.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (2026.1.4)\n", + "Requirement already satisfied: pyasn1>=0.1.3 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from rsa<5,>=3.1.4->google-auth~=2.0->databricks-sdk<1,>=0.20.0->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (0.6.2)\n", + "Requirement already satisfied: anyio<5,>=3.4.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from starlette<0.39.0,>=0.37.2->fastapi==0.115.0->-r ../requirements.txt (line 12)) (4.12.1)\n", + "Requirement already satisfied: blis<0.8.0,>=0.7.8 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from thinc<8.3.0,>=8.2.2->spacy==3.7.6->-r ../requirements.txt (line 3)) (0.7.11)\n", + "Requirement already satisfied: confection<1.0.0,>=0.0.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from thinc<8.3.0,>=8.2.2->spacy==3.7.6->-r ../requirements.txt (line 3)) (0.1.5)\n", + "Requirement already satisfied: shellingham>=1.3.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from typer<1.0.0,>=0.3.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (1.5.4)\n", + "Requirement already satisfied: rich>=12.3.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from typer<1.0.0,>=0.3.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (14.3.2)\n", + "Requirement already satisfied: annotated-doc>=0.0.2 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from typer<1.0.0,>=0.3.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (0.0.4)\n", + "Requirement already satisfied: typer-slim<1.0.0,>=0.3.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from weasel<0.5.0,>=0.1.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (0.23.2)\n", + "Requirement already satisfied: cloudpathlib<1.0.0,>=0.7.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from weasel<0.5.0,>=0.1.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (0.23.0)\n", + "Requirement already satisfied: smart-open<8.0.0,>=5.2.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from weasel<0.5.0,>=0.1.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (7.5.0)\n", + "Requirement already satisfied: wrapt in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from smart-open<8.0.0,>=5.2.1->weasel<0.5.0,>=0.1.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (2.1.1)\n", + "Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from aiohttp->datasets==3.0.1->-r ../requirements.txt (line 5)) (2.6.1)\n", + "Requirement already satisfied: aiosignal>=1.4.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from aiohttp->datasets==3.0.1->-r ../requirements.txt (line 5)) (1.4.0)\n", + "Requirement already satisfied: attrs>=17.3.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from aiohttp->datasets==3.0.1->-r ../requirements.txt (line 5)) (25.4.0)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from aiohttp->datasets==3.0.1->-r ../requirements.txt (line 5)) (1.8.0)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from aiohttp->datasets==3.0.1->-r ../requirements.txt (line 5)) (6.7.1)\n", + "Requirement already satisfied: propcache>=0.2.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from aiohttp->datasets==3.0.1->-r ../requirements.txt (line 5)) (0.4.1)\n", + "Requirement already satisfied: yarl<2.0,>=1.17.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from aiohttp->datasets==3.0.1->-r ../requirements.txt (line 5)) (1.22.0)\n", + "Requirement already satisfied: cffi>=2.0.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from cryptography>=38.0.3->google-auth~=2.0->databricks-sdk<1,>=0.20.0->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (2.0.0)\n", + "Requirement already satisfied: pycparser in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from cffi>=2.0.0->cryptography>=38.0.3->google-auth~=2.0->databricks-sdk<1,>=0.20.0->mlflow-skinny==2.16.2->mlflow==2.16.2->-r ../requirements.txt (line 7)) (3.0)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from rich>=12.3.0->typer<1.0.0,>=0.3.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (4.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from rich>=12.3.0->typer<1.0.0,>=0.3.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (2.19.2)\n", + "Requirement already satisfied: mdurl~=0.1 in /Users/Bartley/miniforge3/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich>=12.3.0->typer<1.0.0,>=0.3.0->spacy==3.7.6->-r ../requirements.txt (line 3)) (0.1.2)\n" + ] + } + ], + "source": [ + "!pip install -r ../requirements.txt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1d. Configure Environment Variables (`.env`)\n", + "\n", + "One of the worst things you can do as a developer is hardcode filepaths and important keys that are unique to your environment. This makes it harder to reproduce and run your code in other environments & other machines. Environment variables let you configure things like file paths without hardcoding them in your source code. We store ours in a `.env` file, which is loaded automatically by the `python-dotenv` package.\n", + "\n", + "This project is going to use two variables:\n", + "- `MLFLOW_TRACKING_URI` — where MLflow stores experiment data (default: `./mlruns`)\n", + "- `DATA_CACHE_DIR` — where downloaded datasets are cached (default: `./.hf_cache`)\n", + "\n", + "The cell below copies the example file to `.env` if you haven't already. Projects like this one will often give you an example `.env` file so you know which variables you need to set to be able to run it." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".env already exists — skipping copy\n", + "\n", + "Contents of .env:\n", + "MLFLOW_TRACKING_URL=./mlruns\n", + "DATA_CACHE_DIR=./.hf_cache\n", + "\n", + "\n" + ] + } + ], + "source": [ + "import shutil\n", + "\n", + "env_example = PROJECT_ROOT / \".env.example\"\n", + "env_file = PROJECT_ROOT / \".env\"\n", + "\n", + "if not env_file.exists():\n", + " shutil.copy(env_example, env_file)\n", + " print(f\"Copied {env_example.name} -> {env_file.name}\")\n", + "else:\n", + " print(f\".env already exists — skipping copy\")\n", + "\n", + "print(f\"\\nContents of .env:\")\n", + "print(env_file.read_text())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1e. Verify Installation\n", + "\n", + "Let's do a quick sanity check: import the key packages and print their versions. If any of these fail, go back and re-run the `pip install` cell above." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pandas 2.2.2\n", + "sklearn 1.5.2\n", + "mlflow 2.16.2\n", + "datasets 3.0.1\n", + "fastapi 0.115.0\n", + "matplotlib 3.9.2\n", + "\n", + "All packages imported successfully!\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import sklearn\n", + "import mlflow\n", + "import datasets\n", + "import fastapi\n", + "import matplotlib\n", + "\n", + "for pkg in [pd, sklearn, mlflow, datasets, fastapi, matplotlib]:\n", + " print(f\"{pkg.__name__:20s} {pkg.__version__}\")\n", + "\n", + "print(\"\\nAll packages imported successfully!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Imports & Configuration\n", + "\n", + "Now that our environment is ready, let's import the libraries we'll use and load the project configuration.\n", + "\n", + "### Why a config file?\n", + "\n", + "Instead of scattering settings throughout the code (dataset name, model parameters, etc.), we keep them all in one YAML file: `configs/baseline.yaml`. This makes it easy to:\n", + "- **Change experiments** without editing code (just tweak the YAML)\n", + "- **Reproduce results** by saving/sharing the config alongside your model\n", + "- **Compare runs** by seeing exactly which settings produced which results" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "import os, sys, yaml\n", + "from pathlib import Path\n", + "from collections import Counter\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from datasets import load_dataset\n", + "\n", + "# Make sure Python can find our src/ modules\n", + "if str(PROJECT_ROOT) not in sys.path:\n", + " sys.path.insert(0, str(PROJECT_ROOT))\n", + "\n", + "from src.utils import set_all_seeds, get_env" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set the random seed\n", + "\n", + "Machine learning involves randomness (shuffling data, initializing weights, etc.). Setting a **seed** means the random number generator always produces the same sequence, so your results are **reproducible** — you (or a teammate) can re-run this notebook and get the exact same numbers." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Random seed set to 42 — results will be reproducible.\n" + ] + } + ], + "source": [ + "set_all_seeds(42)\n", + "print(\"Random seed set to 42 — results will be reproducible.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load the configuration file\n", + "\n", + "Let's load `configs/baseline.yaml` and see what's inside. Don't worry about understanding every parameter right now — we'll explain each one when we use it." + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Configuration:\n", + " experiment_name: t0_setup_template\n", + " dataset: ag_news\n", + " test_size: 0.2\n", + " random_state: 42\n", + " tfidf: {'max_features': 30000, 'ngram_range': [1, 2]}\n", + " model: {'type': 'logreg', 'C': 2.0, 'max_iter': 200}\n", + " metrics: {'average': 'macro'}\n" + ] + } + ], + "source": [ + "cfg_path = PROJECT_ROOT / \"configs\" / \"baseline.yaml\"\n", + "\n", + "with open(cfg_path) as f:\n", + " cfg = yaml.safe_load(f)\n", + "\n", + "print(\"Configuration:\")\n", + "for key, value in cfg.items():\n", + " print(f\" {key}: {value}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**What these settings mean:**\n", + "\n", + "| Setting | Value | What it controls |\n", + "|---|---|---|\n", + "| `dataset` | `ag_news` | Which Hugging Face dataset to download |\n", + "| `test_size` | `0.2` | 20% of training data is held out for validation |\n", + "| `random_state` | `42` | Seed for the train/validation split |\n", + "| `tfidf.max_features` | `30000` | Keep only the 30k most common words |\n", + "| `tfidf.ngram_range` | `[1, 2]` | Use single words *and* two-word phrases |\n", + "| `model.C` | `2.0` | Regularization strength (higher = less regularization) |\n", + "| `model.max_iter` | `200` | Max training iterations for the classifier |\n", + "| `metrics.average` | `macro` | Average F1 equally across all classes |\n", + "\n", + "We'll revisit these in notebook 2 when we actually build the model." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Load the Dataset\n", + "\n", + "### What is AG News?\n", + "\n", + "[AG News](https://huggingface.co/datasets/fancyzhx/ag_news) is a widely-used benchmark dataset for text classification. It contains over a million articles in the original dataset, but we will use a sampled set that contains **120,000 training** and **7,600 test** news articles, each labeled with one of four categories:\n", + "\n", + "| Label | Category |\n", + "|---|---|\n", + "| 0 | World |\n", + "| 1 | Sports |\n", + "| 2 | Business |\n", + "| 3 | Sci/Tech |\n", + "\n", + "We're using Hugging Face's `datasets` library to download it. The library automatically caches the download so you only need to wait once.\n", + "\n", + "### What are train / validation / test splits?\n", + "\n", + "In machine learning, we split data into separate groups:\n", + "- **Train** — the model learns from this data\n", + "- **Validation** — used to tune settings and check progress *during* development\n", + "- **Test** — held back until the very end to get an honest measure of performance\n", + "\n", + "This prevents the model from \"cheating\" by memorizing answers it'll be tested on." + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset splits available: ['train', 'test']\n" + ] + } + ], + "source": [ + "# Where to cache the downloaded dataset (from our .env file)\n", + "cache_dir = get_env(\"DATA_CACHE_DIR\", \"./.hf_cache\")\n", + "cache_dir = str(PROJECT_ROOT / cache_dir)\n", + "\n", + "# Download the dataset (or load from cache if already downloaded)\n", + "ds = load_dataset(cfg[\"dataset\"], cache_dir=cache_dir)\n", + "print(f\"Dataset splits available: {list(ds.keys())}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Convert to pandas DataFrames\n", + "\n", + "Hugging Face datasets have their own format, but pandas DataFrames are more familiar and flexible for exploration. Let's convert." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train: 120,000 rows, 2 columns\n", + "Valid: None (we'll create this split in notebook 2)\n", + "Test: 7,600 rows\n" + ] + } + ], + "source": [ + "train_df = pd.DataFrame(ds[\"train\"])\n", + "test_df = pd.DataFrame(ds[\"test\"])\n", + "\n", + "# Some datasets include a validation split; AG News does not,\n", + "# so we'll create one ourselves in notebook 2.\n", + "valid_df = pd.DataFrame(ds[\"validation\"]) if \"validation\" in ds else None\n", + "\n", + "print(f\"Train: {train_df.shape[0]:,} rows, {train_df.shape[1]} columns\")\n", + "if valid_df is not None:\n", + " print(f\"Valid: {valid_df.shape[0]:,} rows\")\n", + "else:\n", + " print(\"Valid: None (we'll create this split in notebook 2)\")\n", + "print(f\"Test: {test_df.shape[0]:,} rows\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Peek at the data\n", + "\n", + "Always look at a few rows before doing anything else. This helps you spot issues like missing values, weird formatting, or columns you didn't expect." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "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", + "
textlabel
0Wall St. Bears Claw Back Into the Black (Reute...2
1Carlyle Looks Toward Commercial Aerospace (Reu...2
2Oil and Economy Cloud Stocks' Outlook (Reuters...2
3Iraq Halts Oil Exports from Main Southern Pipe...2
4Oil prices soar to all-time record, posing new...2
5Stocks End Up, But Near Year Lows (Reuters) Re...2
6Money Funds Fell in Latest Week (AP) AP - Asse...2
7Fed minutes show dissent over inflation (USATO...2
8Safety Net (Forbes.com) Forbes.com - After ear...2
9Wall St. Bears Claw Back Into the Black NEW Y...2
\n", + "
" + ], + "text/plain": [ + " text label\n", + "0 Wall St. Bears Claw Back Into the Black (Reute... 2\n", + "1 Carlyle Looks Toward Commercial Aerospace (Reu... 2\n", + "2 Oil and Economy Cloud Stocks' Outlook (Reuters... 2\n", + "3 Iraq Halts Oil Exports from Main Southern Pipe... 2\n", + "4 Oil prices soar to all-time record, posing new... 2\n", + "5 Stocks End Up, But Near Year Lows (Reuters) Re... 2\n", + "6 Money Funds Fell in Latest Week (AP) AP - Asse... 2\n", + "7 Fed minutes show dissent over inflation (USATO... 2\n", + "8 Safety Net (Forbes.com) Forbes.com - After ear... 2\n", + "9 Wall St. Bears Claw Back Into the Black NEW Y... 2" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each row has:\n", + "- `text` — the news article content\n", + "- `label` — an integer (0–3) representing the category\n", + "\n", + "Notice the labels are numbers, not names. That's typical — it's more efficient for the model. We'll map them to human-readable names when we need to." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Exploratory Data Analysis (EDA)\n", + "\n", + "EDA is a **critical** first step in doing machine learning and data science. \n", + "\n", + "EDA is about asking questions: *How big is the data? Are the classes balanced? How long are the texts?* These answers shape decisions you'll make later.\n", + "\n", + "### 4a. Basic Statistics\n", + "\n", + "Let's compute some summary stats. We'll count rows, measure text lengths (in tokens — roughly, words), and look at the distribution of labels." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== TRAIN ===\n", + " rows: 120000\n", + " avg_tokens: 37.8\n", + " median_tokens: 37.0\n", + " label_counts: {0: 30000, 1: 30000, 2: 30000, 3: 30000}\n", + "\n", + "=== TEST ===\n", + " rows: 7600\n", + " avg_tokens: 37.7\n", + " median_tokens: 37.0\n", + " label_counts: {0: 1900, 1: 1900, 2: 1900, 3: 1900}\n" + ] + } + ], + "source": [ + "def describe_dataset(df, text_col=\"text\", label_col=\"label\"):\n", + " \"\"\"\n", + " Compute basic stats for a text classification DataFrame.\n", + " \n", + " 'Tokens' here means words (split on whitespace). This is a rough\n", + " approximation — real tokenizers are more sophisticated, but this\n", + " gives us a good-enough picture for EDA.\n", + " \"\"\"\n", + " # Count words in each text by splitting on spaces\n", + " lengths = df[text_col].astype(str).str.split().map(len)\n", + " # Count how many examples belong to each label\n", + " counts = Counter(df[label_col])\n", + " \n", + " return {\n", + " \"rows\": len(df),\n", + " \"avg_tokens\": round(float(lengths.mean()), 1),\n", + " \"median_tokens\": float(lengths.median()),\n", + " \"label_counts\": dict(sorted(counts.items())),\n", + " }\n", + "\n", + "\n", + "print(\"=== TRAIN ===\")\n", + "train_stats = describe_dataset(train_df)\n", + "for k, v in train_stats.items():\n", + " print(f\" {k}: {v}\")\n", + "\n", + "print(\"\\n=== TEST ===\")\n", + "test_stats = describe_dataset(test_df)\n", + "for k, v in test_stats.items():\n", + " print(f\" {k}: {v}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**What to look for:**\n", + "\n", + "- **Label counts** — Are they roughly equal? AG News is well-balanced (each class has ~30k examples). If one class had far fewer examples, we'd need strategies like oversampling or class weights to avoid the model ignoring the minority class.\n", + "- **Token lengths** — The average and median give you a sense of typical document size. If there's a huge gap between them, it suggests some very long outliers that might need truncation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4b. Token-Length Histogram\n", + "\n", + "A histogram shows the *distribution* — not just the average, but the full shape. Are most texts about the same length, or is there a wide spread? Are there extreme outliers?\n", + "\n", + "This matters because our TF-IDF model (in notebook 2) treats each text as a \"bag of words.\" Very short texts have fewer words to work with; very long ones might be noisy." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved plot to: /Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template/reports/eda_token_lengths.png\n" + ] + }, + { + "data": { + "image/png": "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9erJwYMHE3RcVFSUOmkePnyozu/duycRERFy9+5d8fPzk6SC5fcdOEgePLU9MgzRzyLl+s2bku3ZY5HoDFbbesfjg91XIm9fk0eWv7OUyHvXk6QtPLsXLhERmeTZnX/kkVfKrYe59v7RkaJ9PT365y+J/neK6qRajxddZx9vkYgAb3l4/aLEmRTjcNV1Tun18I6NEok2//cVj/6M8JbYZ4/ENyBQ0hd9RTIGWQ9wHoSHie76dUlTuLJT2zra/vHtG3J271rp2X+w+AVY/4yKi46V8OtXJddLIeKj/TJwQlvD9iEFCknfbh9Il979JdrCD3NHl53Bz1eGDflEpcI40/3792X8pCnyONr2AEJSrrO19fD39ZMPO79v1J9J1R/uDj848H1+8uRJqz/g6MX7MlOmTJI5c2ZJDo8fP1bnOp3OZlsvnT2tPMD169flpZdekgMHDki1atX0tw8ePFh2794thw8fNmo/evRoGTNmTAqsKRERERG9iKtXr0qePNZT8DiSnEgYcUb+siY+Pl6NImP0OF++fKrzsYuLEg+7EvPmzcu+dAL2pXOxP9mXrorbJvvSFT1yoe9zjA1jNDl37tw22zJI/le2bNnULoCbN28adRCu58yZM0HHIf/QNAcRuwq0HDFsBCm9IbgL9iX70lVx22Rfuipum+xLV5TRRWIjpHfYw3ailIfAwRWVKlWS7du3G40O47ph+gURERERuT+OJBtA+kTHjh3l5ZdfVrWRUQLu6dOn+moXREREROQZGCQbePfdd1VZnZEjR6rJRMqXLy+bNm2SHDmsl0wzhBSMUaNG2SwHRezL5MTtkv3pqrhtsj9dFbdN50mtfcnqFkREREREJpiTTERERERkgkEyEREREZEJBslERERERCYYJBMRERERmWCQ7ERz5syR/PnzS2BgoFStWlWOHDnizMW7pfHjx0vlypUlQ4YMEhwcLC1btpTz588btaldu7Z4eXkZnXr27Jli6+zKMF26aV8VL15cf39kZKT07t1bsmbNKunTp5fWrVsnmECHnsPfsmlf4oT+A26X1u3Zs0eaNWumZrVCv61duzbBrFeoJJQrVy5JkyaN1KtXT/766y+jNpjF9L333lOTD2Cypi5dusiTJ088bhO11pcxMTEyZMgQKVOmjKRLl0616dChg1y/ft3m9jxhwgTxNLa2yw8++CBBPzVq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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Count words per training example\n", + "lengths = train_df[\"text\"].astype(str).str.split().map(len)\n", + "\n", + "plt.figure(figsize=(8, 4))\n", + "lengths.hist(bins=50, edgecolor=\"black\", alpha=0.7)\n", + "plt.xlabel(\"Number of words per article\")\n", + "plt.ylabel(\"Number of articles\")\n", + "plt.title(\"Distribution of Article Lengths (Training Set)\")\n", + "\n", + "# Add a vertical line at the median for reference\n", + "plt.axvline(lengths.median(), color=\"red\", linestyle=\"--\", label=f\"Median: {lengths.median():.0f} words\")\n", + "plt.legend()\n", + "\n", + "# Save the plot to reports/ so it's available outside the notebook\n", + "reports_dir = PROJECT_ROOT / \"reports\"\n", + "reports_dir.mkdir(exist_ok=True)\n", + "plt.savefig(reports_dir / \"eda_token_lengths.png\", dpi=160, bbox_inches=\"tight\")\n", + "print(f\"Saved plot to: {reports_dir / 'eda_token_lengths.png'}\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4c. Label Distribution\n", + "\n", + "Let's visualize how many articles belong to each category. A balanced dataset is easier to model — if one class dominates, the model can get high accuracy just by always predicting that class." + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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bV9//bWNHTvWOnTo4JrODhw4EFHbpN5zRYsWdf/rNmYvN793XXiZmD3uNK9oNlu2bJYhQwY3xVbG30ZsBg4c6JLHffrVX6JECUsOemydQAvVb2858kfWmKVlR/7ca7+teN89/5T6AUsK0Xq8hWMeXcec483xTmmSPWiK6ezZs67ZSwFUpkyZbNGiRW6oAdmyZYsbYkDNeaLbZ555xvVy03AD8sknn7iASE18fpl58+ZFPIbK+NtQ0KbH0uO0a9cutA+a79OnT5z7qeELNKUk+jLNXfhSiya/WfSKxuMtHPPoOuYcb453SpKsQZNqa6677jqX3H348GGbOnWqG1NJwwHkyZPHunXr5mpz8ufP7wKh++67zwU79erVc/dv1aqVC47uuusuGzFihMtfGjRokBvbyQ9oevbsaa+88ooNGDDAunbtaosXL7bp06fb3LlzQ/uhx1CzYJ06deyqq66yMWPGuIT0Ll26JNtrAwAAUpZkDZpUQ3T33Xfb7t27XZCkgS4VMLVs2dKtHz16tOvJppom1T6p19urr74aur+a1ebMmWO9evVywVSOHDlc8PPUU0+FypQuXdoFSBrzSc1+Ghtq4sSJbls+NQUqT0TjOynwqlGjhs2fP/+c5HAAABC9kjVoeuONN+Jdr9G5NVK3priULFnynOa3mJo0aWJr166Nt4ya4uJrjgMAANEtxYzTBAAAkJIRNAEAAARA0AQAABAAQRMAAEAABE0AAAABEDQBAAAEQNAEAAAQAEETAABAAARNAAAAARA0AQAABEDQBAAAEABBEwAAQAAETQAAAAEQNAEAAARA0AQAABAAQRMAAEAABE0AAAABEDQBAAAEQNAEAAAQAEETAABAAARNAAAAARA0AQAABEDQBAAAEABBEwAAQAAETQAAAAEQNAEAAARA0AQAABAAQRMAAEAABE0AAAABEDQBAAAEQNAEAAAQAEETAABAAARNAAAAARA0AQAABEDQBAAAEABBEwAAQAAETQAAAAEQNAEAAKT0oGn48OF25ZVXWq5cuaxw4cLWrl0727JlS0SZJk2aWLp06SKmnj17RpTZuXOntWnTxrJnz+62079/fzt9+nREmSVLllitWrUsS5YsVrZsWZsyZco5+zNu3DgrVaqUZc2a1erWrWurVq1KomcOAABSm2QNmj7//HPr3bu3rVy50j755BM7deqUtWrVyo4cORJRrkePHrZ79+7QNGLEiNC6M2fOuIDp5MmTtnz5cnvzzTddQDR48OBQmR07drgyTZs2tXXr1lnfvn2te/futmDBglCZadOmWb9+/WzIkCG2Zs0aq169urVu3dr27dt3kV4NAACQkmVMzgefP39+xLyCHdUUrV692ho3bhxarhqkokWLxrqNhQsX2saNG+3TTz+1IkWKWI0aNWzYsGH2yCOP2NChQy1z5sw2YcIEK126tI0cOdLdp2LFirZs2TIbPXq0C4xk1KhRLjjr0qWLm9d95s6da5MmTbJHH300CV8FAACQGqSonKaDBw+62/z580csf+edd6xgwYJWpUoVGzhwoB09ejS0bsWKFVa1alUXMPkUCB06dMg2bNgQKtOiRYuIbaqMlotqqRSohZdJnz69m/fLxHTixAn3GOETAABIu5K1pinc2bNnXbNZw4YNXXDku/POO61kyZJWvHhx++6771wNkvKeZs2a5dbv2bMnImASf17r4iujQOfYsWO2f/9+18wXW5nNmzfHmY/15JNPJtKzBwAAKV2KCZqU2/T999+7ZrNw99xzT+h/1SgVK1bMmjdvbtu2bbPLL7/ckotqvJQD5VMAVqJEiWTbHwAAEAVBU58+fWzOnDm2dOlSu/TSS+Mtq15tsnXrVhc0KdcpZi+3vXv3uls/D0q3/rLwMrlz57Zs2bJZhgwZ3BRbmbhyqdQLTxMAAIgOyZrT5HmeC5hmz55tixcvdsna56Peb6IaJ6lfv76tX78+opebeuIpIKpUqVKozKJFiyK2ozJaLkoWr127dkQZNRdq3i8DAACiW8bkbpKbOnWqffjhh26sJj8HKU+ePK4GSE1wWn/99ddbgQIFXE7Tgw8+6HrWVatWzZXVEAUKju666y43FIG2MWjQILdtvyZI4zq98sorNmDAAOvatasL0KZPn+56x/nU1NapUyerU6eOXXXVVTZmzBg39IHfmw4AAES3ZA2axo8fHxrAMtzkyZOtc+fOrgZIQwn4AYxyhtq3b++CIp+a1dS016tXL1crlCNHDhf8PPXUU6EyqsFSgKSAa+zYsa4JcOLEiaHhBqRDhw7222+/ufGdFHhp6AINiRAzORwAAESnjMndPBcfBUkaAPN81Ltu3rx58ZZRYLZ27dp4y6ipUBMAAECKHqcJAAAgpSJoAgAACICgCQAAIACCJgAAgAAImgAAAAIgaAIAAAiAoAkAACAAgiYAAIAACJoAAAACIGgCAAAIgKAJAAAgAIImAACAAAiaAAAAAiBoAgAACICgCQAAIACCJgAAgAAImgAAAAIgaAIAAAiAoAkAAOBiBE1nzpyxdevW2f79+//upgAAANJO0NS3b1974403QgHTNddcY7Vq1bISJUrYkiVLkmIfAQAAUl/QNHPmTKtevbr7/6OPPrIdO3bY5s2b7cEHH7THH388KfYRAAAg9QVNv//+uxUtWtT9P2/ePLvtttusXLly1rVrV1u/fn1S7CMAAEDqC5qKFCliGzdudE1z8+fPt5YtW7rlR48etQwZMiTFPgIAACS7jAm9Q5cuXewf//iHFStWzNKlS2ctWrRwy7/66iurUKFCUuwjAABA6guahg4dalWqVLFffvnFNc1lyZLFLVct06OPPpoU+wgAAJD6gia59dZb3e3x48dDyzp16pR4ewUAAJDac5qUyzRs2DC75JJLLGfOnLZ9+3a3/IknnggNRQAAAGDRHjQ988wzNmXKFBsxYoRlzpw5tFxNdhMnTkzs/QMAAEidQdNbb71lr732mnXs2DGit5zGbtJ4TQAAAGlRgoOm//3vf1a2bNlzlp89e9ZOnTqVWPsFAACQuoOmSpUq2RdffBHrSOE1a9ZMrP0CAABI3b3nBg8e7HrKqcZJtUuzZs2yLVu2uGa7OXPmJM1eAgAApLaaprZt27przn366aeWI0cOF0Rt2rTJLfNHBwcAAEhrLmicpkaNGtknn3yS+HsDAACQVmqaAAAAolGgmqZ8+fK568wF8eeff/7dfQIAAEidQdOYMWOS5MGHDx/uEsk1vlO2bNmsQYMG9vzzz1v58uVDZXSploceesjee+89O3HihLVu3dpeffVVK1KkSKjMzp07rVevXvbZZ5+5UcqVqK5tZ8z4/5/ekiVLrF+/frZhwwYrUaKEDRo0yDp37hyxP+PGjbMXXnjB9uzZ48adevnll+2qq65KkucOAADSYNCUVNeV+/zzz61379525ZVX2unTp+2xxx6zVq1a2caNG12SuTz44IM2d+5cmzFjhuXJk8f69Oljt9xyi3355Zehy7q0adPGihYtasuXL7fdu3fb3XffbZkyZbJnn33WldmxY4cr07NnT3vnnXds0aJF1r17dytWrJgLwmTatGkuqJowYYLVrVvXBYpap56BhQsXTpLnDwAA0nAi+Lx589xI4H6w4Vu4cKELYK677rrA25o/f37EvC7PogBl9erV1rhxYzt48KC7nt3UqVOtWbNmrszkyZOtYsWKtnLlSqtXr557XAVZ6s2n2qcaNWq4a+M98sgjNnToUHepFwVCpUuXtpEjR7pt6P7Lli2z0aNHh57HqFGjrEePHtalSxc3r/soWJs0aZI9+uijCX2ZAABAtCeCK4BQcBSTxmz6u8GFgiTJnz+/u1XwpFHGW7RoESpToUIFu+yyy2zFihVuXrdVq1aNaK5TIHTo0CHXFOeXCd+GX8bfxsmTJ91jhZdJnz69m/fLxKSmQj1G+AQAANKuBAdNP/74oxsVPCYFM1u3br3gHVHQ1bdvX2vYsKG7+K8ot0g1RXnz5o0oqwBJ6/wy4QGTv95fF18ZBTrHjh2z33//3QWCsZXxtxGTcqbUXOhPypMCAABpV4KDJgUI27dvP2e5AiY/D+lCKLfp+++/dwnfqcHAgQNdzZg//fLLL8m9SwAAIKWNCK4aoW3btkUETOrhdtNNN13QTii5W5dgUe+3Sy+9NLRcyd1qOjtw4EBE+b1797p1fhnNx1zvr4uvTO7cuV2vvYIFC7o8rdjK+NuIKUuWLO7+4RMAAEi7Ehw0jRgxwtUoqTlOydWalFhdoEABe/HFFxO0Lc/zXMA0e/ZsW7x4sdtWuNq1a7tecOrt5lNvNg0xUL9+fTev2/Xr19u+fftCZTRauYIYvxlRZcK34Zfxt6EmQD1WeBk1F2reLwMAAKJbxgtpnlPXfgUd3377raupqVatmuvtdiFNcuoZ9+GHH1quXLlC+UN6DG1Xt926dXNDASg5XIHQfffd5wIZ9ZwTDVGg4Oiuu+5yAZ22oTGYtG3VBomGGnjllVdswIAB1rVrVxegTZ8+3fWO8+kxNLRCnTp13NhMGnLgyJEjod50AAAgul3Qtec0OriCFU1/x/jx491tkyZNIpZrWAF/4EkNC6CebO3bt48Y3NKnZjU17WlwSwVTqgVT8PPUU0+FyqgGSwGSxnwaO3asawKcOHFixLAJHTp0sN9++81dgFiBl4Yu0JAIMZPDAQBAdAoUNL300kt2zz33WNasWd3/8bn//vsT1Dx3PnpMjdStKS4lS5Z040fFR4HZ2rVr4y2jpkJNAAAAFxQ0qbanY8eOLoDR//HVQCUkaAIAAEhTQZMuQxLb/wAAANEiwb3nlCt09OjRc5ZrkMjwPCIAAICoDpqefPJJ++uvv85ZrkBK6wAAANKiBAdNSt5W7lJMGn7Av2YcAABA1A45kC9fPhcsaSpXrlxE4KTrtqn2SeMhAQAARHXQpMEeVcukwSHVDKeBJ30aUbtUqVKMng0AANKswEGTBow8ffq0q2Fq1qyZlShRImn3DAAAILXmNGXMmNGNvK3rsgEAAESTBCeC67ps5xtZGwAAwKL92nP33nuvPfTQQ/brr79a7dq13bXewunivQAAABbtQdPtt9/ubsMvl6I8J38oAvWkAwAAsGgPmriMCgAAiEYJDppKliyZNHsCAACQloIm38aNG23nzp128uTJiOU33XRTYuwXAABA6g6atm/fbjfffLOtX78+lMsk/gjh5DQBAIC0KMFDDjzwwANWunRp27dvn2XPnt02bNhgS5cutTp16tiSJUuSZi8BAABSW03TihUrbPHixVawYEFLnz69m66++mobPny461HHGE4AACAtSnBNk5rfcuXK5f5X4LRr165QgviWLVsSfw8BAABSY01TlSpV7Ntvv3VNdHXr1rURI0a4C/a+9tprVqZMmaTZSwAAgNQWNA0aNMiOHDni/n/qqafshhtusEaNGlmBAgVs2rRpSbGPAAAAqS9oat26dej/smXL2ubNm+3PP/+0fPnyhXrQAQAApDUXPE5TuPz58yfGZgAAANJOIjgAAEA0ImgCAAAIgKAJAAAgsYKmWrVq2f79+0M95o4ePRrkbgAAANEVNG3atCk0zMCTTz5pf/31V1LvFwAAQOrrPVejRg3r0qWLu1yKLtD74osvWs6cOWMtO3jw4MTeRwAAgNQRNE2ZMsWGDBlic+bMcWMxffzxx5Yx47l31TqCJgAAELVBU/ny5e29995z/+sCvYsWLbLChQsn9b4BAACk3sEtz549mzR7AgAAkNZGBN+2bZuNGTPGJYhLpUqV7IEHHrDLL788sfcPAAAgdY7TtGDBAhckrVq1yqpVq+amr776yipXrmyffPJJ0uwlAABAaqtpevTRR+3BBx+055577pzljzzyiLVs2TIx9w8AACB11jSpSa5bt27nLO/atatt3LgxsfYLAAAgdQdNhQoVsnXr1p2zXMvoUQcAANKqBAdNPXr0sHvuuceef/55++KLL9ykprp//etfbl1CLF261G688UYrXry4G+Ppgw8+iFjfuXNntzx8uvbaayPK/Pnnn9axY0fLnTu35c2b19WCxRyx/LvvvrNGjRpZ1qxZrUSJEjZixIhz9mXGjBlWoUIFV6Zq1ao2b968BD0XAACQtiU4p+mJJ56wXLly2ciRI23gwIFumYKeoUOH2v3335+gbenSLNWrV3dNe7fcckusZRQkTZ48OTSfJUuWiPUKmHbv3u2S0E+dOuVGLldQN3XqVLf+0KFD1qpVK2vRooVNmDDB1q9f7x5PAZbKyfLly+2OO+6w4cOH2w033ODu265dO1uzZo1VqVIloS8RAABIgxIcNKm2R4ngmg4fPuyWKYi6ENddd52b4qMgqWjRonHmV82fP9++/vprq1Onjlv28ssv2/XXX+8u9aJg7p133rGTJ0/apEmTLHPmzK6Xn5oSR40aFQqaxo4d64Kz/v37u/lhw4a5IOyVV15xgRYAAECCm+fCKVi60IApqCVLlrhcKY1K3qtXL/vjjz9C61asWOFqjPyASVSjpFHLNQyCX6Zx48YuYPK1bt3atmzZYvv37w+V0f3CqYyWAwAAXPDglheLan/UbFe6dGk3oOZjjz3maqYUzGTIkMH27NlzTvK5romXP39+t050q/uHK1KkSGhdvnz53K2/LLyMv43YnDhxwk0+NQMCAIC0K0UHTbfffnvofyVnayBNjTqu2qfmzZsn674p/+nJJ59M1n0AAACppHnuYitTpowVLFjQtm7d6uaV67Rv376IMqdPn3Y96vw8KN3u3bs3oow/f74yceVSiZLgDx48GJp++eWXRHqWAAAg1QdN6p2mGp4ff/zRksOvv/7qcpqKFSvm5uvXr28HDhyw1atXh8osXrzYXVS4bt26oTIa2kD77lOSt3Kk1DTnl1m0aFHEY6mMlseXoK5hDsInAACQdiUoaMqUKZMb8yixaDwl9WTzB8vcsWOH+3/nzp1unXqzrVy50n766ScX1LRt29bKli3rkrSlYsWKLu9J40PpWnhffvml9enTxzXrqeec3HnnnS4JXOM3bdiwwaZNm+Z6y/Xr1y+0H7rYsHrhaRiFzZs3u+ETvvnmG7ctAACAC2qe++c//2lvvPFGorx6Ckxq1qzpJlEgo/8HDx7sEr0VoN10001Wrlw5F/TUrl3bDaYZPlaThhTQoJSqAdNQA1dffbW99tprofV58uSxhQsXuoBM93/ooYfc9v3hBqRBgwZubCbdT+NGzZw50w20yRhNAADgghPBlTOkMY8+/fRTF4TkyJEjYr3GPwqqSZMm5nlenOsXLFhw3m2op5w/kGVclECuYCs+t912m5sAAAASJWj6/vvvrVatWu7/H3744ZyBLwEAANKiBAdNn332WdLsCQAAQFocckDd/tV8duzYMTcfXzMbAABA1AVN6vKvpGslZyvxWhfLFSVqK8kaAAAgLUpw0KQL9WroAQ0LkD179tDyDh06uG77AAAAaVGCc5rUfV/NcpdeemnE8iuuuMJ+/vnnxNw3AACA1FvTdOTIkYgaJp8uXRI+fhIAAEBUB02NGjWyt956K2KYAV22ZMSIEda0adPE3j8AAIDU2Tyn4EiJ4BrN++TJkzZgwAB3eRLVNOkyJgAAAGlRgmuadGkRDWqpy5XoWnBqrrvlllts7dq1dvnllyfNXgIAAKS2mib/em6PP/544u8NAABAWgqa9u/f7y7au2nTJjdfqVIl69Kli7sOHAAAQFqU4Oa5pUuXWqlSpeyll15ywZMm/V+6dGm3DgAAIC1KcE1T79693UCW48ePtwwZMrhlZ86csXvvvdetW79+fVLsJwAAQOqqadI153S5FD9gEv3fr18/tw4AACAtSnDQVKtWrVAuUzgtq169emLtFwAAQOprnvvuu+9C/99///32wAMPuFqlevXquWUrV660cePG2XPPPZd0ewoAAJDSg6YaNWq4kb89zwst06CWMd15550u3wkAACAqg6YdO3Yk/Z4AAACk9qCpZMmSSb8nAAAAaW1wy127dtmyZcts37597mK94ZTzBAAAYNEeNE2ZMsX+9a9/WebMma1AgQIu18mn/wmaAABAWpTgoOmJJ56wwYMH28CBAy19+gSPWAAAAJAqJTjqOXr0qN1+++0ETAAAIKokOGjq1q2bzZgxI2n2BgAAIK00zw0fPtxuuOEGmz9/vlWtWtUyZcoUsX7UqFGJuX8AAACpN2hasGCBlS9f3s3HTAQHAABIixIcNI0cOdImTZpknTt3Tpo9AgAASAs5TVmyZLGGDRsmzd4AAACklaBJF+t9+eWXk2ZvAAAA0krz3KpVq2zx4sU2Z84cq1y58jmJ4LNmzUrM/QMAAEidQVPevHntlltuSZq9AQAASCtB0+TJk5NmTwAAAFIwroMCAACQFDVNpUuXjnc8pu3btyd0kwAAAGkvaOrbt2/E/KlTp2zt2rVuhPD+/fsn5r4BAACk3qBJQw7EZty4cfbNN98kxj4BAACk3Zym6667zt5///3E2hwAAEDaDJpmzpxp+fPnT9B9li5dajfeeKMVL17c5Ul98MEHEes9z7PBgwdbsWLFLFu2bNaiRQv78ccfI8r8+eef1rFjR8udO7cbDqFbt272119/RZT57rvvrFGjRpY1a1YrUaKEjRgx4px9mTFjhlWoUMGV0YWI582bl6DnAgAA0rYEB001a9a0WrVqhSbNK6h57LHH3JQQR44cserVq7umvdgouHnppZdswoQJ9tVXX1mOHDmsdevWdvz48VAZBUwbNmywTz75xA24qUDsnnvuCa0/dOiQtWrVykqWLGmrV6+2F154wYYOHWqvvfZaqMzy5cvtjjvucAGX8rPatWvnpu+//z6hLw8AAEijEpzTpGAiXPr06a1QoULWpEkTV1OT0CY9TbFRLdOYMWNs0KBB1rZtW7fsrbfesiJFirgaqdtvv902bdrkEtC//vprq1OnjiujS7xcf/319uKLL7oarHfeecdOnjzpLjKcOXNmN4r5unXrbNSoUaHgauzYsXbttdeGEtmHDRvmgrBXXnnFBWwAAAAJDpqGDBlyUV61HTt22J49e1yTnC9PnjxWt25dW7FihQuadKsmOT9gEpVXIKeaqZtvvtmVady4sQuYfKqtev75523//v2WL18+V6Zfv34Rj68yMZsLw504ccJN4TVaAAAg7Uqxg1sqYBLVLIXTvL9Ot4ULF45YnzFjRpdbFV4mtm2EP0ZcZfz1sRk+fLgL4vxJuVIAACDtChw0qfYmQ4YM8U4KWKLFwIED7eDBg6Hpl19+Se5dAgAASShwlDN79uw416l5SwnbZ8+eTaz9sqJFi7rbvXv3ukRzn+Zr1KgRKrNv376I+50+fdr1qPPvr1vdJ5w/f74y/vrYZMmSxU0AACA6BK5pUjJ2zEmJ31OmTHFJ17fddptt2bIl0XZMl2tR0LJo0aKIvCHlKtWvX9/N6/bAgQOuV5xv8eLFLnhT7pNfRj3qNHK5T0ne5cuXd/lMfpnwx/HL+I8DAABwQTlNu3btsh49erjxjFSzo95ob775puvWnxAaT0n31eQnf+v/nTt3unGbdMmWp59+2v773//a+vXr7e6773Y94vwefBUrVnS93rQvq1atsi+//NL69OnjksRVTu68806XBK7hBDQ0wbRp01xvufDEb41yrl54I0eOtM2bN7shCTS6ubYFAAAgCUpCUu7Os88+67r1q4lMtTMaNPJCKTBp2rRpaN4PZDp16uRqsAYMGODGctLQAKpRuvrqq11wowEofRpSQMFN8+bNXd5V+/btXVOhT0naCxcutN69e1vt2rWtYMGCbsDM8LGcGjRoYFOnTnXDG2isqSuuuML1nKtSpQrvEgAAkLCgSQNNqpu+mszefffd0NhJf4fGdtJ4THFRbdNTTz3lpriop5wCnvhUq1bNvvjii3jLqHlREwAAwN8Kmh599FF3KZOyZcu6pjhNsZk1a1bQTQIAAKS9oEn5RKr5AQAAiEaBgyblGAEAAESrFDsiOAAAQEpC0AQAABAAQRMAAEAABE0AAAABEDQBAAAEQNAEAAAQAEETAABAAARNAAAAARA0AQAABEDQBAAAEABBEwAAQAAETQAAAAEQNAEAAARA0AQAABAAQRMAAEAABE0AAAABEDQBAAAEQNAEAAAQAEETAABAAARNAAAAARA0AQAABEDQBAAAEABBEwAAQAAETQAAAAEQNAEAAARA0AQAABAAQRMAAEAABE0AAAAETQAAAImDmiYAAIAACJoAAAACIGgCAAAIgKAJAAAgAIImAACA1B40DR061NKlSxcxVahQIbT++PHj1rt3bytQoIDlzJnT2rdvb3v37o3Yxs6dO61NmzaWPXt2K1y4sPXv399Onz4dUWbJkiVWq1Yty5Ili5UtW9amTJly0Z4jAABIHVJ00CSVK1e23bt3h6Zly5aF1j344IP20Ucf2YwZM+zzzz+3Xbt22S233BJaf+bMGRcwnTx50pYvX25vvvmmC4gGDx4cKrNjxw5XpmnTprZu3Trr27evde/e3RYsWHDRnysAAEi5MloKlzFjRitatOg5yw8ePGhvvPGGTZ061Zo1a+aWTZ482SpWrGgrV660evXq2cKFC23jxo326aefWpEiRaxGjRo2bNgwe+SRR1wtVubMmW3ChAlWunRpGzlypNuG7q/AbPTo0da6deuL/nwBAEDKlOJrmn788UcrXry4lSlTxjp27Oia22T16tV26tQpa9GiRaismu4uu+wyW7FihZvXbdWqVV3A5FMgdOjQIduwYUOoTPg2/DL+NuJy4sQJt53wCQAApF0pOmiqW7eua06bP3++jR8/3jWlNWrUyA4fPmx79uxxNUV58+aNuI8CJK0T3YYHTP56f118ZRQEHTt2LM59Gz58uOXJkyc0lShRItGeNwAASHlSdPPcddddF/q/WrVqLogqWbKkTZ8+3bJly5as+zZw4EDr169faF5BFoETAABpV4quaYpJtUrlypWzrVu3ujwnJXgfOHAgoox6z/k5ULqN2ZvOnz9fmdy5c8cbmKmnncqETwAAIO1KVUHTX3/9Zdu2bbNixYpZ7dq1LVOmTLZo0aLQ+i1btricp/r167t53a5fv9727dsXKvPJJ5+4AKdSpUqhMuHb8Mv42wAAAEjxQdPDDz/shhL46aef3JABN998s2XIkMHuuOMOl0fUrVs310T22WefucTwLl26uGBHPeekVatWLji666677Ntvv3XDCAwaNMiN7aSaIunZs6dt377dBgwYYJs3b7ZXX33VNf9pOAMAAIBUkdP066+/ugDpjz/+sEKFCtnVV1/thhPQ/6JhAdKnT+8GtVRvNvV6U9DjU4A1Z84c69WrlwumcuTIYZ06dbKnnnoqVEbDDcydO9cFSWPHjrVLL73UJk6cyHADAAAg9QRN7733Xrzrs2bNauPGjXNTXJQ4Pm/evHi306RJE1u7du0F7ycAAEj7UnTzHAAAQEpB0AQAABAAQRMAAEAABE0AAAABEDQBAAAEQNAEAAAQAEETAABAAARNAAAAARA0AQAABEDQBAAAEABBEwAAQAAETQAAAAEQNAEAAARA0AQAABAAQRMAAEAABE0AAAABEDQBAAAEQNAEAAAQAEETAABAAARNAAAAARA0AQAABEDQBAAAEABBEwAAQAAETQAAAAEQNAEAAARA0AQAABAAQRMAAEAABE0AAAABEDQBAAAEQNAEAAAQAEETAABAAARNAAAAARA0AQAABEDQBAAAEABBEwAAQAAETQAAAAEQNAEAAARA0BTDuHHjrFSpUpY1a1arW7eurVq1KsjrCAAA0jiCpjDTpk2zfv362ZAhQ2zNmjVWvXp1a926te3bty/5jhAAAEgRCJrCjBo1ynr06GFdunSxSpUq2YQJEyx79uw2adKk5DtCAAAgRSBo+n9Onjxpq1evthYtWvz/Fyd9eje/YsWK5Do+AAAghciY3DuQUvz+++925swZK1KkSMRyzW/evPmc8idOnHCT7+DBg+720KFDdrEdPnzYzpw+bQd2/2Snjh+1aHFk/z73vPX8k+N1Ty7ReryFYx5dx5zjzfG+WPxziOd58ZYjaLpAw4cPtyeffPKc5SVKlLBks3yJRaOaNWtaVIrS4y0c8+jC8Y4uNZPxO10/SvPkyRPneoKm/6dgwYKWIUMG27t3b8QLpPmiRYue88INHDjQJY37zp49a3/++acVKFDA0qVLZ9FC0bkCxV9++cVy586d3LuDJMbxjj4c8+gSrcfb8zwXMBUvXjzecgRN/0/mzJmtdu3atmjRImvXrl0oENJ8nz59znnhsmTJ4qZwefPmtWilD1c0fcCiHcc7+nDMo0s0Hu888dQw+QiawqjmqFOnTlanTh276qqrbMyYMXbkyBHXmw4AAEQ3gqYwHTp0sN9++80GDx5se/bssRo1atj8+fPPSQ4HAADRh6ApBjXFxdYch9ipiVKDgcZsqkTaxPGOPhzz6MLxjl8673z96wAAAMDglgAAAEEwIjgAAEAABE1IckOHDnVJ9fHp3LlzaKgHAMlnyZIlbqy5AwcOcBiAGAiaopQuRpwrVy47ffp0aNlff/1lmTJlsiZNmsT6Jbpt27Zk2FP8XeoR2qtXL7vssstckqcGa23durV9+eWXSf7ilipVyg3dgcSjHxj6PPqTBtS99tpr7bvvvkuU7Tdo0MB2794daMwapB5TpkxJtrEEO6ehH8UETVGqadOmLkj65ptvQsu++OILd0L96quv7Pjx46Hln332mTvhXn755Ql6DPUxCA/KkDzat29va9eutTfffNN++OEH++9//+sC4z/++CNJL4CNpKMgSYGNJg3AmzFjRrvhhhsSbaBffQ9E05UNouEHkIbU0ec/Jn0vXHrppRGBeGyTgi4QNEWt8uXLW7FixVwtkk//t23b1kqXLm0rV66MWK4gSxcovv/++61w4cKWNWtWu/rqq+3rr7+OKKcP18cff+xGV9eHetmyZec8ti6MrIFE9atHv5IHDBhw3osk4sKoiUXB8PPPP++OYcmSJd3ArboM0E033eTK6JiNHz/errvuOsuWLZuVKVPGZs6cGbGd9evXW7Nmzdx6HbN77rnHBd0xf0k+88wz7jIEen8pMPv555/twQcfDH3xipbdeOONli9fPsuRI4dVrlzZ5s2bxyFOAP+EqUlN348++qi77IVOqrE1r61bt84t++mnn857DGLe36+hWLBggVWsWNFy5swZCtrCTZw40a3Xd0OFChXs1VdfjQiiNZSLvnO0Xu9DXb9T9NlXE74fCOj9o+8ZJO4PIH129d0d04cffmj33XdfKAjX9NBDD7n3RPgyBV0gaIpqOomqFsmn//UBvOaaa0LLjx075mqeVFbBzfvvv+8+sGvWrLGyZcu6Xzm65l44fYE/99xztmnTJqtWrdo5jzty5Ej3RTxp0iQXVOn+s2fPvgjPOProBKfpgw8+cEFvXJ544gn3hfztt99ax44d7fbbb3fHTzQqvo6zTrAKkmfMmGGffvrpOeOZqcZjy5Yt9sknn9icOXNs1qxZ7hfsU089Ffrild69e7t9Wbp0qQvGFNBpH3FhFLz+5z//cZ9HBbRBJPQYHD161F588UV7++233X127txpDz/8cGj9O++84wYFVtCs982zzz7r3lP6rpCXXnrJneCnT5/u3iMqr6Zb0XfK6NGj7d///rf9+OOP7r1atWpV3g4X8ANIZf71r3+5AZkVnFapUsV9FuNqnlOLwsKFC92PZT8I16T3gmov/XkFW2pmL126tAu+qlevfs4Pqw0bNrjaTl16RakfjRo1OielQ+8hBc56n+o9eOrUqdR3nDVOE6LT66+/7uXIkcM7deqUd+jQIS9jxozevn37vKlTp3qNGzd2ZRYtWqQqIO+nn37yMmXK5L3zzjuh+588edIrXry4N2LECDf/2WefubIffPBBxOMMGTLEq169emi+WLFiofuIHv/SSy/12rZtexGedfSZOXOmly9fPi9r1qxegwYNvIEDB3rffvttaL2OWc+ePSPuU7duXa9Xr17u/9dee83d/6+//gqtnzt3rpc+fXpvz549br5Tp05ekSJFvBMnTkRsp2TJkt7o0aMjllWtWtUbOnRokjzXaKDXOkOGDO6zq0nHT5+p1atXR3wO9+/fH7rP2rVr3bIdO3ac9xjEvP/kyZPd/NatW0Nlxo0b54637/LLL3ffG+GGDRvm1a9f3/1/3333ec2aNfPOnj17zuONHDnSK1eunPs+Qdz0PZkzZ06vb9++3vHjx89Zf+bMGa9evXpe5cqVvYULF3rbtm3zPvroI2/evHmh45gnT56I+8yZM8e99jHF/M5++umnvQoVKnjz589329W2smTJ4i1ZssSt//XX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V4YuE6FgKkeOHK4WSvf566+/3LolS5ZYly5d7ODBg247moYOHerWnThxwh5++GG75JJL3H3r1q3ryod7/fXX3TazZ89uN998s3usmLVW48ePt8svv9wyZ85s5cuXt7fffjtivR5TZW666Sb3OE8//bSVLVvWXnzxxYhy69atc2W3bt2aJK8lgARK7ovfAUBQuiBpunTpvGeffTbecqNHj/YWL17s7dixw1u0aJG70GivXr3cuhMnTriLj+bOndvbvXu3mw4fPuzWde/e3WvQoIG3dOlSd1HTF154wV3YVFdtl2XLlnnp06d3y7ds2eKNGzfOy58/f8TV42fNmuUuaqp1KjNy5EgvQ4YMbn98+uotXLiwN2nSJHdR059//tl75plnvEqVKkU8j/vvv99r3LgxbxAghSBoApBqfPXVVy7gUGCSEDNmzHBXfveFX/Hdp8BFwc3//ve/iOXNmzf3Bg4c6P7v0KGD16ZNm4j1HTt2jNiWgq4ePXpElLntttu866+/PjSv59C3b9+IMnpcPb6eo5w8edIrWLCgN2XKlAQ9VwBJh+Y5AKnG/403zk9XcG/evLlrZsuVK5fddddd9scff9jRo0fjvM/69evtzJkzrrkvZ86coenzzz+3bdu2uTJbtmyxq666KuJ+Mec3bdrkcq7CaV7Lw9WpUydivnjx4tamTRubNGmSm//oo49cc+Ftt90W6DkDSHokggNINa644gqX4xNfsrcSxW+44Qbr1auXPfPMM5Y/f35btmyZdevWzU6ePOlykWKjnKcMGTLY6tWr3W04BU+JTblMMXXv3t0FeKNHj7bJkydbhw4d4txfABcfNU0AUg0FQK1bt7Zx48bZkSNHzll/4MABF/ScPXvWRo4cafXq1XM1R7t27YoopwRt1SqFq1mzplu2b98+l5QdPhUtWtSVUVL3119/HXG/mPMVK1a0L7/8MmKZ5itVqnTe53f99de7YEpJ4vPnz7euXbsGeFUAXCwETQBSFQVMCm7ULPb+++/bjz/+6Jq+XnrpJatfv74LctSF/+WXX7bt27e7nmsTJkyI2EapUqVczZLGdfr9999ds52Cq44dO9rdd99ts2bNsh07drgeesOHD7e5c+e6+2lsqHnz5rkec3rcf//73/bxxx+72i9f//793ThQCnxURmW1PfXKOx/VcHXu3NkGDhzoatX0fACkIEmYLwUASWLXrl1e7969vZIlS3qZM2f2LrnkEu+mm27yPvvsM7d+1KhRXrFixbxs2bJ5rVu39t566y2XfL1///7QNnr27OmSw7V8yJAhoeTrwYMHe6VKlXI94LSNm2++2fvuu+9C93vttdfc42nb7dq1855++mmvaNGiEfv36quvemXKlHHbKFeunHv8cHrM2bNnx/rc1JtO60eMGJGorxmAvy+d/iR34AYAqVWPHj1cjtUXX3yRKNvTdpTE/ssvv1iRIkUSZZsAEgeJ4ACQABqAsmXLli73SE1zb775pr366qt/+zVUT7nffvvNDbSpHnMETEDKQ04TACSA8pwUNGnEceVKKZdKvd7+rnfffddKlizpktlHjBjBMQFSIJrnAAAAAqCmCQAAIACCJgAAgAAImgAAAAIgaAIAAAiAoAkAACAAgiYAAIAACJoAAAACIGgCAAAIgKAJAADAzu//AL1KAUGFs+OSAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Exact counts:\n", + " World: 30,000\n", + " Sports: 30,000\n", + " Business: 30,000\n", + " Sci/Tech: 30,000\n" + ] + } + ], + "source": [ + "# Map numeric labels to readable names for the plot\n", + "label_names = {0: \"World\", 1: \"Sports\", 2: \"Business\", 3: \"Sci/Tech\"}\n", + "\n", + "label_counts = train_df[\"label\"].value_counts().sort_index()\n", + "label_counts.index = [label_names.get(i, i) for i in label_counts.index]\n", + "\n", + "plt.figure(figsize=(6, 4))\n", + "label_counts.plot(kind=\"bar\", edgecolor=\"black\", alpha=0.7)\n", + "plt.xlabel(\"Category\")\n", + "plt.ylabel(\"Number of articles\")\n", + "plt.title(\"Label Distribution (Training Set)\")\n", + "plt.xticks(rotation=0)\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "print(\"\\nExact counts:\")\n", + "for name, count in label_counts.items():\n", + " print(f\" {name}: {count:,}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4d. Sample Texts by Category\n", + "\n", + "Numbers and charts are useful, but nothing beats reading actual examples. Let's look at one random article from each category to build intuition about what the model will be working with." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- World (label=0) ---\n", + "Explosion Rocks Baghdad Neighborhood BAGHDAD, Iraq, August 24 -- A car bomb exploded near the gate of a US-funded Iraqi television network in Baghdad on Tuesday, killing at least two people and woundi...\n", + "\n", + "--- Sports (label=1) ---\n", + "Second Andre win in a row boosts US gold medal hopes Andre Dirrell, fighting with a tattoo of his grandfather #39;s face on his back, assured the United States of at least two boxing medals Wednesday ...\n", + "\n", + "--- Business (label=2) ---\n", + "US house sales fall in July Sales of non-new houses in the US fell last month but still exceeded analyst forecasts....\n", + "\n", + "--- Sci/Tech (label=3) ---\n", + "Gartner optimistic about chip numbers But that optimism isn #39;t matched by Infineon, which said that while the market worldwide remains buoyant, the US is a special case and cautioned that growth mi...\n", + "\n" + ] + } + ], + "source": [ + "label_names = {0: \"World\", 1: \"Sports\", 2: \"Business\", 3: \"Sci/Tech\"}\n", + "\n", + "for label_id, name in label_names.items():\n", + " sample = train_df[train_df[\"label\"] == label_id].sample(1, random_state=42).iloc[0]\n", + " print(f\"--- {name} (label={label_id}) ---\")\n", + " # Show the first 200 characters to keep output manageable\n", + " print(f\"{sample['text'][:200]}...\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 5. Save Shared Objects for Notebook 2\n", + "\n", + "We'll save the DataFrames and config so the next notebook can pick up right where we left off without re-downloading the dataset.\n", + "\n", + "> **Why not just re-run the download?** You could! But saving intermediate results is a good habit — it saves time on large datasets and makes each notebook self-contained." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved DataFrames to /Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template/data/interim/\n", + " train.parquet (120,000 rows)\n", + " test.parquet (7,600 rows)\n" + ] + } + ], + "source": [ + "# Save DataFrames as parquet files (a compact, fast binary format)\n", + "data_dir = PROJECT_ROOT / \"data\" / \"interim\"\n", + "data_dir.mkdir(parents=True, exist_ok=True)\n", + "\n", + "train_df.to_parquet(data_dir / \"train.parquet\", index=False)\n", + "test_df.to_parquet(data_dir / \"test.parquet\", index=False)\n", + "if valid_df is not None:\n", + " valid_df.to_parquet(data_dir / \"valid.parquet\", index=False)\n", + "\n", + "print(f\"Saved DataFrames to {data_dir}/\")\n", + "print(f\" train.parquet ({train_df.shape[0]:,} rows)\")\n", + "print(f\" test.parquet ({test_df.shape[0]:,} rows)\")\n", + "if valid_df is not None:\n", + " print(f\" valid.parquet ({valid_df.shape[0]:,} rows)\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Here's what we accomplished:\n", + "\n", + "- **Set up** a Python virtual environment and installed all dependencies\n", + "- **Loaded** the AG News dataset (120k training articles across 4 categories)\n", + "- **Explored** the data: checked text lengths, verified the labels are balanced, and read sample articles\n", + "- **Saved** the data for the next notebook\n", + "\n", + "**Key takeaways from our EDA:**\n", + "- The dataset is well-balanced (~30k examples per class) — no special handling needed\n", + "- Articles are relatively short (typically 30–50 words) — good for a bag-of-words model\n", + "- The four categories are distinct enough that even a simple model should do reasonably well\n", + "\n", + "**Next up:** [02_train_and_evaluate.ipynb](./02_train_and_evaluate.ipynb) — we'll build a TF-IDF + Logistic Regression classifier and track the experiment with MLflow." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tutorials/setup_template/notebooks/02_train_and_evaluate.ipynb b/tutorials/setup_template/notebooks/02_train_and_evaluate.ipynb new file mode 100644 index 0000000..004b180 --- /dev/null +++ b/tutorials/setup_template/notebooks/02_train_and_evaluate.ipynb @@ -0,0 +1,600 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Notebook 2: Train & Evaluate a Text Classifier\n", + "\n", + "In the previous notebook, we explored the AG News dataset and saved it for reuse. Now it's time to build a model.\n", + "\n", + "**What you'll do in this notebook:**\n", + "\n", + "1. Load the data we saved in notebook 1\n", + "2. Create a train/validation split\n", + "3. Build a TF-IDF + Logistic Regression pipeline\n", + "4. Train the model and evaluate its performance\n", + "5. Track everything with MLflow\n", + "\n", + "**What you'll learn:**\n", + "- How TF-IDF converts raw text into numbers a model can understand\n", + "- How Logistic Regression works as a simple but effective classifier\n", + "- Why we split data into train/validation/test sets\n", + "- How to read a confusion matrix and classification report\n", + "- How MLflow helps you organize and compare experiments\n", + "\n", + "---\n", + "\n", + "### Notebook series\n", + "\n", + "| Notebook | Focus |\n", + "|---|---|\n", + "| 01 — Setup & EDA | Environment, data loading, exploration |\n", + "| **02 — Train & Evaluate** (you are here) | Build, train, and evaluate a text classifier |\n", + "| 03 — Serve & Predict | Load the trained model and make predictions |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Setup\n", + "\n", + "First, let's import our libraries and reload the data from notebook 1." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Project root: /Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template\n", + "Random seed set to 42.\n" + ] + } + ], + "source": [ + "import os, sys, yaml\n", + "from pathlib import Path\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.metrics import (\n", + " accuracy_score, f1_score,\n", + " classification_report, ConfusionMatrixDisplay\n", + ")\n", + "\n", + "import mlflow\n", + "import mlflow.sklearn\n", + "\n", + "# Locate the project root\n", + "PROJECT_ROOT = (\n", + " Path(\"__vsc_ipynb_file__\").resolve().parent.parent\n", + " if \"__vsc_ipynb_file__\" in dir()\n", + " else Path.cwd().parent\n", + ")\n", + "if not (PROJECT_ROOT / \"requirements.txt\").exists():\n", + " PROJECT_ROOT = Path.cwd()\n", + "\n", + "if str(PROJECT_ROOT) not in sys.path:\n", + " sys.path.insert(0, str(PROJECT_ROOT))\n", + "\n", + "from src.utils import set_all_seeds, get_env\n", + "\n", + "set_all_seeds(42)\n", + "print(f\"Project root: {PROJECT_ROOT}\")\n", + "print(\"Random seed set to 42.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load saved data and config" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train: 120,000 rows\n", + "Test: 7,600 rows\n", + "Valid: None (will create below)\n" + ] + } + ], + "source": [ + "# Load config\n", + "cfg_path = PROJECT_ROOT / \"configs\" / \"baseline.yaml\"\n", + "with open(cfg_path) as f:\n", + " cfg = yaml.safe_load(f)\n", + "\n", + "# Load DataFrames saved by notebook 1\n", + "data_dir = PROJECT_ROOT / \"data\" / \"interim\"\n", + "train_df = pd.read_parquet(data_dir / \"train.parquet\")\n", + "test_df = pd.read_parquet(data_dir / \"test.parquet\")\n", + "valid_df = pd.read_parquet(data_dir / \"valid.parquet\") if (data_dir / \"valid.parquet\").exists() else None\n", + "\n", + "print(f\"Train: {len(train_df):,} rows\")\n", + "print(f\"Test: {len(test_df):,} rows\")\n", + "if valid_df is not None:\n", + " print(f\"Valid: {len(valid_df):,} rows\")\n", + "else:\n", + " print(\"Valid: None (will create below)\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Create a Train/Validation Split\n", + "\n", + "AG News doesn't come with a built-in validation set, so we need to create one by setting aside some of the training data.\n", + "\n", + "### Why do we need a validation set?\n", + "\n", + "The **test set** should only be used once to get an honest performance estimate. But during development, you often want to check how well your model is doing (e.g., to try different hyperparameters). That's what the **validation set** is for: a \"practice test\" you can use as often as you like without contaminating your final evaluation.\n", + "\n", + "### What is stratified sampling?\n", + "\n", + "When we split the data, we use `stratify=train_df[\"label\"]`. This ensures each split has the same proportion of each class as the original. Without stratification, random chance might give us a validation set with very few \"Sports\" articles, for example, which would make our validation metrics unreliable." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Split training data into:\n", + " Train: 96,000 rows (80%)\n", + " Validation: 24,000 rows (20%)\n", + "\n", + "Final sizes:\n", + " Train: 96,000\n", + " Validation: 24,000\n", + " Test: 7,600\n" + ] + } + ], + "source": [ + "if valid_df is None:\n", + " train_df, valid_df = train_test_split(\n", + " train_df,\n", + " test_size=cfg[\"test_size\"], # 20% goes to validation, a good rule of thumb is 60% train - 20% validation 20% test\n", + " random_state=cfg[\"random_state\"], # reproducible split\n", + " stratify=train_df[\"label\"] # keep class proportions balanced\n", + " )\n", + " print(f\"Split training data into:\")\n", + " print(f\" Train: {len(train_df):,} rows (80%)\")\n", + " print(f\" Validation: {len(valid_df):,} rows (20%)\")\n", + "else:\n", + " print(f\"Using existing validation split ({len(valid_df):,} rows)\")\n", + "\n", + "# Separate features (X) from labels (y) — standard ML convention\n", + "X_train, y_train = train_df[\"text\"].astype(str), train_df[\"label\"]\n", + "X_valid, y_valid = valid_df[\"text\"].astype(str), valid_df[\"label\"]\n", + "X_test, y_test = test_df[\"text\"].astype(str), test_df[\"label\"]\n", + "\n", + "print(f\"\\nFinal sizes:\")\n", + "print(f\" Train: {len(X_train):,}\")\n", + "print(f\" Validation: {len(X_valid):,}\")\n", + "print(f\" Test: {len(X_test):,}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Understand the Model: TF-IDF + Logistic Regression\n", + "\n", + "Before we build the model, let's understand what it actually does. Our pipeline has two stages:\n", + "\n", + "### Stage 1: TF-IDF (turning text into numbers)\n", + "\n", + "Machine learning models work with numbers, not raw text. **TF-IDF** (Term Frequency - Inverse Document Frequency) converts each article into a vector of numbers by:\n", + "\n", + "1. **Term Frequency (TF):** How often does each word appear in *this* article?\n", + "2. **Inverse Document Frequency (IDF):** How rare is this word across *all* articles?\n", + "\n", + "Words that appear frequently in one article but rarely overall get high TF-IDF scores. Common words like \"the\" and \"is\" get low scores because they appear everywhere and don't help distinguish categories.\n", + "\n", + "**Key settings from our config:**\n", + "- `max_features=30000` — Only keep the 30,000 most informative terms. This reduces noise and speeds up training.\n", + "- `ngram_range=[1, 2]` — Consider both single words (\"market\") and two-word phrases (\"stock market\"). Bigrams capture useful context that single words miss.\n", + "\n", + "### Stage 2: Logistic Regression (making the prediction)\n", + "\n", + "Despite the name, **Logistic Regression** is a *classification* algorithm (not regression). It learns a set of weights — one per feature — and uses them to compute the probability that an article belongs to each class. The class with the highest probability wins.\n", + "\n", + "**Why start with Logistic Regression?**\n", + "- It's fast to train (seconds, not hours)\n", + "- It's interpretable (you can look at which words matter most)\n", + "- It's a strong baseline — often surprisingly competitive\n", + "- It establishes a performance floor before trying more complex models\n", + "\n", + "**Key settings:**\n", + "- `C=2.0` — Controls regularization. Higher C = less regularization = the model fits the training data more closely. Too high and it overfits; too low and it underfits.\n", + "- `max_iter=200` — Maximum number of optimization steps. If the model hasn't converged by 200 iterations, something might be wrong." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Build the sklearn Pipeline\n", + "\n", + "Scikit-learn's `Pipeline` chains the two steps together so they act as a single unit. This is convenient because:\n", + "- Calling `pipe.fit(X, y)` runs TF-IDF fitting *and* model training in one step\n", + "- Calling `pipe.predict(X)` runs TF-IDF transformation *and* prediction\n", + "- You can't accidentally forget to transform your data before predicting" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pipeline structure:\n", + "Pipeline(steps=[('tfidf',\n", + " TfidfVectorizer(max_features=30000, ngram_range=(1, 2))),\n", + " ('clf', LogisticRegression(C=2.0, max_iter=200))])\n" + ] + } + ], + "source": [ + "pipe = Pipeline([\n", + " # Step 1: Convert text -> TF-IDF feature vectors\n", + " (\"tfidf\", TfidfVectorizer(\n", + " max_features=cfg[\"tfidf\"][\"max_features\"],\n", + " ngram_range=tuple(cfg[\"tfidf\"][\"ngram_range\"])\n", + " )),\n", + " # Step 2: Classify the feature vectors\n", + " (\"clf\", LogisticRegression(\n", + " C=cfg[\"model\"][\"C\"],\n", + " max_iter=cfg[\"model\"][\"max_iter\"]\n", + " ))\n", + "])\n", + "\n", + "print(\"Pipeline structure:\")\n", + "print(pipe)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Train the Model with MLflow Tracking\n", + "\n", + "### What is MLflow?\n", + "\n", + "[MLflow](https://mlflow.org/) is an experiment tracking tool. Every time you train a model, it records:\n", + "- **Parameters** — the settings you used (C, max_features, etc.)\n", + "- **Metrics** — how well the model performed (accuracy, F1 score)\n", + "- **Artifacts** — files like the saved model, plots, and reports\n", + "\n", + "This is invaluable when you're experimenting. Instead of trying to remember \"which run had C=2.0 with bigrams?\", MLflow keeps a log of everything.\n", + "\n", + "### Understanding the metrics\n", + "\n", + "- **Accuracy** — What percentage of predictions were correct? Simple and intuitive, but can be misleading if classes are imbalanced.\n", + "- **F1 Score (macro)** — The harmonic mean of precision and recall, averaged equally across all classes. This gives a balanced view of performance even if some classes are harder than others.\n", + " - **Precision** = Of all articles I predicted as \"Sports\", how many actually were?\n", + " - **Recall** = Of all actual \"Sports\" articles, how many did I find?" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "ename": "Exception", + "evalue": "Invalid parent directory '/Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template/mlruns/.trash'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mException\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[35]\u001b[39m\u001b[32m, line 8\u001b[39m\n\u001b[32m 5\u001b[39m tracking_dir.mkdir(exist_ok=\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[32m 7\u001b[39m mlflow.set_tracking_uri(\u001b[38;5;28mstr\u001b[39m(PROJECT_ROOT / tracking_uri))\n\u001b[32m----> \u001b[39m\u001b[32m8\u001b[39m \u001b[43mmlflow\u001b[49m\u001b[43m.\u001b[49m\u001b[43mset_experiment\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcfg\u001b[49m\u001b[43m[\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mexperiment_name\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 10\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mMLflow tracking URI: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mPROJECT_ROOT\u001b[38;5;250m \u001b[39m/\u001b[38;5;250m \u001b[39mtracking_uri\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n\u001b[32m 11\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mExperiment name: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcfg[\u001b[33m'\u001b[39m\u001b[33mexperiment_name\u001b[39m\u001b[33m'\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/tracking/fluent.py:145\u001b[39m, in \u001b[36mset_experiment\u001b[39m\u001b[34m(experiment_name, experiment_id)\u001b[39m\n\u001b[32m 143\u001b[39m client = MlflowClient()\n\u001b[32m 144\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m experiment_id \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m145\u001b[39m experiment = \u001b[43mclient\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget_experiment_by_name\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexperiment_name\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 146\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m experiment:\n\u001b[32m 147\u001b[39m _logger.info(\n\u001b[32m 148\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mExperiment with name \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m does not exist. Creating a new experiment.\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 149\u001b[39m experiment_name,\n\u001b[32m 150\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/tracking/client.py:1249\u001b[39m, in \u001b[36mMlflowClient.get_experiment_by_name\u001b[39m\u001b[34m(self, name)\u001b[39m\n\u001b[32m 1217\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mget_experiment_by_name\u001b[39m(\u001b[38;5;28mself\u001b[39m, name: \u001b[38;5;28mstr\u001b[39m) -> Optional[Experiment]:\n\u001b[32m 1218\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Retrieve an experiment by experiment name from the backend store\u001b[39;00m\n\u001b[32m 1219\u001b[39m \n\u001b[32m 1220\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 1247\u001b[39m \u001b[33;03m Lifecycle_stage: active\u001b[39;00m\n\u001b[32m 1248\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1249\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_tracking_client\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget_experiment_by_name\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/tracking/_tracking_service/client.py:484\u001b[39m, in \u001b[36mTrackingServiceClient.get_experiment_by_name\u001b[39m\u001b[34m(self, name)\u001b[39m\n\u001b[32m 476\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mget_experiment_by_name\u001b[39m(\u001b[38;5;28mself\u001b[39m, name):\n\u001b[32m 477\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 478\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m 479\u001b[39m \u001b[33;03m name: The experiment name.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 482\u001b[39m \u001b[33;03m :py:class:`mlflow.entities.Experiment`\u001b[39;00m\n\u001b[32m 483\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m484\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mstore\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget_experiment_by_name\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/store/tracking/file_store.py:353\u001b[39m, in \u001b[36mFileStore.get_experiment_by_name\u001b[39m\u001b[34m(self, experiment_name)\u001b[39m\n\u001b[32m 345\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpagination_wrapper_func\u001b[39m(number_to_get, next_page_token):\n\u001b[32m 346\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.search_experiments(\n\u001b[32m 347\u001b[39m view_type=ViewType.ALL,\n\u001b[32m 348\u001b[39m max_results=number_to_get,\n\u001b[32m 349\u001b[39m filter_string=\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mname = \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mexperiment_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 350\u001b[39m page_token=next_page_token,\n\u001b[32m 351\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m353\u001b[39m experiments = \u001b[43mget_results_from_paginated_fn\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 354\u001b[39m \u001b[43m \u001b[49m\u001b[43mpaginated_fn\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpagination_wrapper_func\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 355\u001b[39m \u001b[43m \u001b[49m\u001b[43mmax_results_per_page\u001b[49m\u001b[43m=\u001b[49m\u001b[43mSEARCH_MAX_RESULTS_THRESHOLD\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 356\u001b[39m \u001b[43m \u001b[49m\u001b[43mmax_results\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 357\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 358\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m experiments[\u001b[32m0\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(experiments) > \u001b[32m0\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/utils/__init__.py:238\u001b[39m, in \u001b[36mget_results_from_paginated_fn\u001b[39m\u001b[34m(paginated_fn, max_results_per_page, max_results)\u001b[39m\n\u001b[32m 236\u001b[39m page_results = paginated_fn(num_to_get, next_page_token)\n\u001b[32m 237\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m238\u001b[39m page_results = \u001b[43mpaginated_fn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_results_per_page\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnext_page_token\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 239\u001b[39m all_results.extend(page_results)\n\u001b[32m 240\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(page_results, \u001b[33m\"\u001b[39m\u001b[33mtoken\u001b[39m\u001b[33m\"\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m page_results.token:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/store/tracking/file_store.py:346\u001b[39m, in \u001b[36mFileStore.get_experiment_by_name..pagination_wrapper_func\u001b[39m\u001b[34m(number_to_get, next_page_token)\u001b[39m\n\u001b[32m 345\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpagination_wrapper_func\u001b[39m(number_to_get, next_page_token):\n\u001b[32m--> \u001b[39m\u001b[32m346\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43msearch_experiments\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 347\u001b[39m \u001b[43m \u001b[49m\u001b[43mview_type\u001b[49m\u001b[43m=\u001b[49m\u001b[43mViewType\u001b[49m\u001b[43m.\u001b[49m\u001b[43mALL\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 348\u001b[39m \u001b[43m \u001b[49m\u001b[43mmax_results\u001b[49m\u001b[43m=\u001b[49m\u001b[43mnumber_to_get\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 349\u001b[39m \u001b[43m \u001b[49m\u001b[43mfilter_string\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43mf\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mname = \u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mexperiment_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[33;43m'\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 350\u001b[39m \u001b[43m \u001b[49m\u001b[43mpage_token\u001b[49m\u001b[43m=\u001b[49m\u001b[43mnext_page_token\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 351\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/store/tracking/file_store.py:321\u001b[39m, in \u001b[36mFileStore.search_experiments\u001b[39m\u001b[34m(self, view_type, max_results, filter_string, order_by, page_token)\u001b[39m\n\u001b[32m 319\u001b[39m experiment_ids += \u001b[38;5;28mself\u001b[39m._get_active_experiments(full_path=\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[32m 320\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m view_type == ViewType.DELETED_ONLY \u001b[38;5;129;01mor\u001b[39;00m view_type == ViewType.ALL:\n\u001b[32m--> \u001b[39m\u001b[32m321\u001b[39m experiment_ids += \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_deleted_experiments\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfull_path\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[32m 323\u001b[39m experiments = []\n\u001b[32m 324\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m exp_id \u001b[38;5;129;01min\u001b[39;00m experiment_ids:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/store/tracking/file_store.py:293\u001b[39m, in \u001b[36mFileStore._get_deleted_experiments\u001b[39m\u001b[34m(self, full_path)\u001b[39m\n\u001b[32m 292\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_get_deleted_experiments\u001b[39m(\u001b[38;5;28mself\u001b[39m, full_path=\u001b[38;5;28;01mFalse\u001b[39;00m):\n\u001b[32m--> \u001b[39m\u001b[32m293\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mlist_subdirs\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mtrash_folder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfull_path\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/utils/file_utils.py:162\u001b[39m, in \u001b[36mlist_subdirs\u001b[39m\u001b[34m(dir_name, full_path)\u001b[39m\n\u001b[32m 150\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mlist_subdirs\u001b[39m(dir_name, full_path=\u001b[38;5;28;01mFalse\u001b[39;00m):\n\u001b[32m 151\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 152\u001b[39m \u001b[33;03m Equivalent to UNIX command:\u001b[39;00m\n\u001b[32m 153\u001b[39m \u001b[33;03m ``find $dir_name -depth 1 -type d``\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 160\u001b[39m \u001b[33;03m list of all directories directly under 'dir_name'.\u001b[39;00m\n\u001b[32m 161\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m162\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mlist_all\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdir_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mos\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m.\u001b[49m\u001b[43misdir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfull_path\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/utils/file_utils.py:145\u001b[39m, in \u001b[36mlist_all\u001b[39m\u001b[34m(root, filter_func, full_path)\u001b[39m\n\u001b[32m 133\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"List all entities directly under 'dir_name' that satisfy 'filter_func'\u001b[39;00m\n\u001b[32m 134\u001b[39m \n\u001b[32m 135\u001b[39m \u001b[33;03mArgs:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 142\u001b[39m \n\u001b[32m 143\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 144\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_directory(root):\n\u001b[32m--> \u001b[39m\u001b[32m145\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mInvalid parent directory \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mroot\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 146\u001b[39m matches = [x \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m os.listdir(root) \u001b[38;5;28;01mif\u001b[39;00m filter_func(os.path.join(root, x))]\n\u001b[32m 147\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m [os.path.join(root, m) \u001b[38;5;28;01mfor\u001b[39;00m m \u001b[38;5;129;01min\u001b[39;00m matches] \u001b[38;5;28;01mif\u001b[39;00m full_path \u001b[38;5;28;01melse\u001b[39;00m matches\n", + "\u001b[31mException\u001b[39m: Invalid parent directory '/Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template/mlruns/.trash'" + ] + } + ], + "source": [ + "# Point MLflow at our local tracking directory\n", + "tracking_uri = get_env(\"MLFLOW_TRACKING_URI\", \"./mlruns\")\n", + "\n", + "tracking_dir = PROJECT_ROOT / \"mlruns\"\n", + "tracking_dir.mkdir(exist_ok=True)\n", + "\n", + "mlflow.set_tracking_uri(str(PROJECT_ROOT / tracking_uri))\n", + "mlflow.set_experiment(cfg[\"experiment_name\"])\n", + "\n", + "print(f\"MLflow tracking URI: {PROJECT_ROOT / tracking_uri}\")\n", + "print(f\"Experiment name: {cfg['experiment_name']}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with mlflow.start_run() as run:\n", + " # --- Log parameters so we can look them up later ---\n", + " mlflow.log_params({\n", + " \"dataset\": cfg[\"dataset\"],\n", + " \"tfidf_max_features\": cfg[\"tfidf\"][\"max_features\"],\n", + " \"tfidf_ngram_range\": str(cfg[\"tfidf\"][\"ngram_range\"]),\n", + " \"model\": cfg[\"model\"][\"type\"],\n", + " \"C\": cfg[\"model\"][\"C\"],\n", + " \"max_iter\": cfg[\"model\"][\"max_iter\"],\n", + " \"random_state\": cfg[\"random_state\"]\n", + " })\n", + "\n", + " # --- Train the model ---\n", + " print(\"Training... (this may take a minute on the full dataset)\")\n", + " pipe.fit(X_train, y_train)\n", + " print(\"Training complete!\\n\")\n", + "\n", + " # --- Generate predictions on validation and test sets ---\n", + " y_pred_valid = pipe.predict(X_valid)\n", + " y_pred_test = pipe.predict(X_test)\n", + "\n", + " # --- Compute metrics ---\n", + " avg = cfg[\"metrics\"][\"average\"]\n", + " metrics = {\n", + " \"valid_accuracy\": accuracy_score(y_valid, y_pred_valid),\n", + " \"valid_f1_macro\": f1_score(y_valid, y_pred_valid, average=avg),\n", + " \"test_accuracy\": accuracy_score(y_test, y_pred_test),\n", + " \"test_f1_macro\": f1_score(y_test, y_pred_test, average=avg),\n", + " }\n", + " mlflow.log_metrics(metrics)\n", + "\n", + " print(\"Results:\")\n", + " print(f\" Validation — Accuracy: {metrics['valid_accuracy']:.4f}, F1 (macro): {metrics['valid_f1_macro']:.4f}\")\n", + " print(f\" Test — Accuracy: {metrics['test_accuracy']:.4f}, F1 (macro): {metrics['test_f1_macro']:.4f}\")\n", + "\n", + " # --- Save the model as an MLflow artifact ---\n", + " mlflow.sklearn.log_model(pipe, artifact_path=\"model\")\n", + "\n", + " # Keep the run ID — we'll need it to load the model in notebook 3\n", + " RUN_ID = run.info.run_id\n", + " print(f\"\\nMLflow run ID: {RUN_ID}\")\n", + " print(\"Model saved as MLflow artifact.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 5. Evaluate the Model\n", + "\n", + "Overall accuracy tells you *how often* the model is right, but not *where* it goes wrong. That's what the confusion matrix and classification report are for.\n", + "\n", + "### 5a. Confusion Matrix\n", + "\n", + "A confusion matrix is a grid that shows what the model predicted vs. what the actual label was. The diagonal shows correct predictions; off-diagonal cells show mistakes.\n", + "\n", + "**How to read it:**\n", + "- Each **row** is an actual class (what the article really is)\n", + "- Each **column** is a predicted class (what the model guessed)\n", + "- A perfect model would have numbers only on the diagonal\n", + "- Off-diagonal numbers tell you which classes get confused with each other (e.g., \"World\" articles misclassified as \"Business\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "reports_dir = PROJECT_ROOT / \"reports\"\n", + "reports_dir.mkdir(exist_ok=True)\n", + "\n", + "fig, ax = plt.subplots(figsize=(7, 6))\n", + "ConfusionMatrixDisplay.from_predictions(\n", + " y_test, y_pred_test,\n", + " display_labels=[\"World\", \"Sports\", \"Business\", \"Sci/Tech\"],\n", + " ax=ax,\n", + " cmap=\"Blues\"\n", + ")\n", + "ax.set_title(\"Confusion Matrix (Test Set)\")\n", + "\n", + "fig.savefig(reports_dir / \"confusion_matrix.png\", dpi=180, bbox_inches=\"tight\")\n", + "print(f\"Saved: {reports_dir / 'confusion_matrix.png'}\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5b. Classification Report\n", + "\n", + "The classification report gives you per-class precision, recall, and F1 score — a more detailed view than the single F1 number above.\n", + "\n", + "**Reminder of what these mean:**\n", + "\n", + "| Metric | Question it answers |\n", + "|---|---|\n", + "| **Precision** | When the model says \"Sports\", how often is it right? |\n", + "| **Recall** | Of all actual Sports articles, what fraction did the model find? |\n", + "| **F1** | The balance between precision and recall (harmonic mean) |\n", + "| **Support** | How many test examples belong to this class |\n", + "\n", + "If a class has high precision but low recall, the model is cautious — it only predicts that class when it's very confident, but misses many actual examples. The reverse (low precision, high recall) means the model over-predicts that class." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "label_names = {0: \"World\", 1: \"Sports\", 2: \"Business\", 3: \"Sci/Tech\"}\n", + "target_names = [label_names[i] for i in sorted(label_names.keys())]\n", + "\n", + "report = classification_report(y_test, y_pred_test, target_names=target_names)\n", + "print(\"Classification Report (Test Set):\")\n", + "print(report)\n", + "\n", + "# Save the report as a text file\n", + "report_path = reports_dir / \"classification_report.txt\"\n", + "report_path.write_text(report)\n", + "print(f\"Saved: {report_path}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5c. Log Evaluation Artifacts to MLflow\n", + "\n", + "Let's add the confusion matrix and classification report to our MLflow run so they're stored alongside the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Re-open the same run to add artifacts\n", + "with mlflow.start_run(run_id=RUN_ID):\n", + " mlflow.log_artifact(str(reports_dir / \"confusion_matrix.png\"))\n", + " mlflow.log_artifact(str(reports_dir / \"classification_report.txt\"))\n", + " print(\"Logged evaluation artifacts to MLflow.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 6. Explore MLflow Artifacts\n", + "\n", + "Everything we logged is now stored under `mlruns/`. The model artifact includes:\n", + "\n", + "| File | Purpose |\n", + "|---|---|\n", + "| `model/model.pkl` | The serialized sklearn pipeline (TF-IDF + LogReg) |\n", + "| `model/MLmodel` | Metadata about the model (what flavor, how to load it) |\n", + "| `model/conda.yaml` | Conda environment for reproducibility |\n", + "| `model/requirements.txt` | Pip requirements for the model |\n", + "\n", + "You can explore these visually by launching the MLflow UI:\n", + "\n", + "```bash\n", + "mlflow ui --backend-store-uri ./mlruns\n", + "```\n", + "\n", + "Then open http://localhost:5000 in your browser." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 7. Save the Run ID for Notebook 3\n", + "\n", + "Notebook 3 needs to know which MLflow run contains our trained model. We'll save the run ID to a small file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run_id_path = PROJECT_ROOT / \"data\" / \"interim\" / \"latest_run_id.txt\"\n", + "run_id_path.write_text(RUN_ID)\n", + "print(f\"Saved run ID to: {run_id_path}\")\n", + "print(f\"Run ID: {RUN_ID}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Here's what we accomplished:\n", + "\n", + "- **Split** the training data into train (80%) and validation (20%) sets using stratified sampling\n", + "- **Built** a TF-IDF + Logistic Regression pipeline — a fast, interpretable text classifier\n", + "- **Trained** the model and evaluated it on both validation and test sets\n", + "- **Analyzed** errors using a confusion matrix and per-class classification report\n", + "- **Tracked** everything (parameters, metrics, model, plots) with MLflow\n", + "\n", + "**Things to try on your own:**\n", + "- Change `C` in `configs/baseline.yaml` (try 0.1, 1.0, 10.0) and see how it affects performance\n", + "- Set `ngram_range` to `[1, 1]` (unigrams only) — how much do bigrams help?\n", + "- Reduce `max_features` to 5000 — does the model still work well?\n", + "- Compare all your runs in the MLflow UI\n", + "\n", + "**Next up:** [03_serve_and_predict.ipynb](./03_serve_and_predict.ipynb) — we'll load the saved model and use it to classify new text, just like the FastAPI endpoint does." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tutorials/setup_template/notebooks/03_serve_and_predict.ipynb b/tutorials/setup_template/notebooks/03_serve_and_predict.ipynb new file mode 100644 index 0000000..d497e2c --- /dev/null +++ b/tutorials/setup_template/notebooks/03_serve_and_predict.ipynb @@ -0,0 +1,318 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Notebook 3: Serve & Predict\n", + "\n", + "You've explored the data (notebook 1) and trained a model (notebook 2). Now let's put it to work.\n", + "\n", + "**What you'll do in this notebook:**\n", + "\n", + "1. Load the trained model from MLflow\n", + "2. Run predictions on sample texts\n", + "3. Understand how the FastAPI serving endpoint works\n", + "\n", + "**What you'll learn:**\n", + "- How MLflow stores and loads models\n", + "- How to go from a trained model to a prediction in just a few lines\n", + "- How a model gets served as a web API that other applications can call\n", + "\n", + "---\n", + "\n", + "### Notebook series\n", + "\n", + "| Notebook | Focus |\n", + "|---|---|\n", + "| 01 — Setup & EDA | Environment, data loading, exploration |\n", + "| 02 — Train & Evaluate | Build, train, and evaluate a text classifier |\n", + "| **03 — Serve & Predict** (you are here) | Load the trained model and make predictions |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "from pathlib import Path\n", + "\n", + "import mlflow\n", + "import mlflow.pyfunc\n", + "\n", + "# Locate the project root\n", + "PROJECT_ROOT = (\n", + " Path(\"__vsc_ipynb_file__\").resolve().parent.parent\n", + " if \"__vsc_ipynb_file__\" in dir()\n", + " else Path.cwd().parent\n", + ")\n", + "if not (PROJECT_ROOT / \"requirements.txt\").exists():\n", + " PROJECT_ROOT = Path.cwd()\n", + "\n", + "if str(PROJECT_ROOT) not in sys.path:\n", + " sys.path.insert(0, str(PROJECT_ROOT))\n", + "\n", + "from src.utils import get_env\n", + "\n", + "# Point MLflow at our local tracking directory\n", + "tracking_uri = get_env(\"MLFLOW_TRACKING_URI\", \"./mlruns\")\n", + "mlflow.set_tracking_uri(str(PROJECT_ROOT / tracking_uri))\n", + "\n", + "print(f\"Project root: {PROJECT_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the Trained Model\n", + "\n", + "In notebook 2, we saved our trained model as an MLflow artifact and wrote the run ID to a file. Now we'll load it back.\n", + "\n", + "### How MLflow model loading works\n", + "\n", + "MLflow uses a URI format to locate models: `runs://model`. This tells MLflow:\n", + "- Look in the run with this ID\n", + "- Find the artifact named \"model\"\n", + "- Deserialize it back into a working Python object\n", + "\n", + "We use `mlflow.pyfunc.load_model()` which returns a generic \"PyFunc\" wrapper. This is the same interface the FastAPI server uses — so what you see here is exactly how the API serves predictions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Read the run ID saved by notebook 2\n", + "run_id_path = PROJECT_ROOT / \"data\" / \"interim\" / \"latest_run_id.txt\"\n", + "RUN_ID = run_id_path.read_text().strip()\n", + "print(f\"Loading model from MLflow run: {RUN_ID}\")\n", + "\n", + "# Load the model\n", + "model_uri = f\"runs:/{RUN_ID}/model\"\n", + "loaded_model = mlflow.pyfunc.load_model(model_uri)\n", + "\n", + "print(f\"Model loaded successfully from: {model_uri}\")\n", + "print(f\"Model type: {type(loaded_model)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Make Predictions\n", + "\n", + "Let's test the model on some made-up headlines to see if it can correctly categorize them. These are texts the model has never seen before — a simple \"sanity check\" that the model works as expected.\n", + "\n", + "The AG News categories are:\n", + "\n", + "| Label | Category | Example topics |\n", + "|---|---|---|\n", + "| 0 | World | International politics, diplomacy, conflicts |\n", + "| 1 | Sports | Games, scores, athletes, tournaments |\n", + "| 2 | Business | Markets, earnings, mergers, economy |\n", + "| 3 | Sci/Tech | Research, gadgets, software, space |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Some sample headlines spanning all four categories\n", + "sample_texts = [\n", + " \"NASA launches new spacecraft to explore Mars\",\n", + " \"Stock market hits record high amid economic optimism\",\n", + " \"Champions League final draws record viewership\",\n", + " \"Google unveils latest advances in artificial intelligence\",\n", + " \"UN Security Council holds emergency meeting on conflict\",\n", + " \"Lakers defeat Celtics in overtime thriller\",\n", + "]\n", + "\n", + "label_names = {0: \"World\", 1: \"Sports\", 2: \"Business\", 3: \"Sci/Tech\"}\n", + "\n", + "# Run predictions\n", + "predictions = loaded_model.predict(sample_texts)\n", + "\n", + "print(\"Predictions:\\n\")\n", + "for text, pred in zip(sample_texts, predictions):\n", + " label_int = int(pred)\n", + " category = label_names.get(label_int, str(label_int))\n", + " print(f\" [{category:10s}] {text}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Try your own texts\n", + "\n", + "Edit the cell below to test the model on any text you want. Does it get them right? Can you find examples that trick it?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Replace this with any text you want to classify\n", + "your_text = \"Apple announces record quarterly revenue driven by iPhone sales\"\n", + "\n", + "pred = loaded_model.predict([your_text])\n", + "label_int = int(pred[0])\n", + "print(f\"Text: {your_text}\")\n", + "print(f\"Category: {label_names[label_int]} (label {label_int})\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. How the FastAPI Endpoint Works\n", + "\n", + "In a real application, you wouldn't open a notebook every time you want a prediction. Instead, you'd serve the model as a **web API** — a URL that other programs can send text to and get predictions back.\n", + "\n", + "This project includes a FastAPI server in `src/serve.py` that does exactly what we just did above, but over HTTP.\n", + "\n", + "### The key idea\n", + "\n", + "The serving code is surprisingly short:\n", + "\n", + "```python\n", + "# 1. Load the model once at startup\n", + "model = mlflow.pyfunc.load_model(model_path)\n", + "\n", + "# 2. For each incoming request, run a prediction\n", + "@app.post(\"/infer\")\n", + "def infer(payload: InferRequest):\n", + " pred = model.predict([payload.text])\n", + " return {\"label\": int(pred[0])}\n", + "```\n", + "\n", + "That's it — the same `model.predict()` call we used above, wrapped in a web endpoint.\n", + "\n", + "### How to run it\n", + "\n", + "From the project root (not from this notebook), run:\n", + "\n", + "```bash\n", + "uvicorn src.serve:app --reload\n", + "```\n", + "\n", + "Then send it a request:\n", + "\n", + "```bash\n", + "curl -X POST http://localhost:8000/infer \\\n", + " -H \"Content-Type: application/json\" \\\n", + " -d '{\"text\": \"NASA launches new spacecraft to explore Mars\"}'\n", + "```\n", + "\n", + "You should get back something like:\n", + "```json\n", + "{\"label\": 3}\n", + "```\n", + "\n", + "### What `--reload` does\n", + "\n", + "The `--reload` flag tells uvicorn to watch for file changes and automatically restart the server. This is handy during development but should be turned off in production.\n", + "\n", + "### Why FastAPI?\n", + "\n", + "FastAPI is a popular Python web framework that's:\n", + "- **Fast** — built on async Python for high throughput\n", + "- **Self-documenting** — automatically generates API docs at `/docs`\n", + "- **Type-safe** — uses Pydantic for request/response validation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 5. Look at the Source Code\n", + "\n", + "Throughout these notebooks, we inlined all the logic so you could see every step. But the project also has equivalent module files in `src/` that are ready for production use:\n", + "\n", + "| Module | What it does | Notebook equivalent |\n", + "|---|---|---|\n", + "| `src/data.py` | Loads HF datasets into DataFrames | Notebook 1, section 3 |\n", + "| `src/eda.py` | Prints stats and saves plots | Notebook 1, section 4 |\n", + "| `src/baseline.py` | Trains TF-IDF + LogReg with MLflow | Notebook 2, sections 3–5 |\n", + "| `src/serve.py` | FastAPI inference endpoint | This notebook, section 4 |\n", + "| `src/utils.py` | `set_all_seeds()` and `get_env()` helpers | Used everywhere |\n", + "\n", + "You can run these from the terminal as modules:\n", + "\n", + "```bash\n", + "python -m src.eda # Run EDA\n", + "python -m src.baseline # Train the model\n", + "uvicorn src.serve:app # Serve predictions\n", + "```\n", + "\n", + "The notebooks are for learning and exploration; the `src/` modules are for repeatable, scriptable workflows." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Here's what we accomplished across all three notebooks:\n", + "\n", + "1. **Setup & EDA** — Installed dependencies, loaded AG News, explored the data\n", + "2. **Train & Evaluate** — Built a TF-IDF + Logistic Regression pipeline, trained it, and evaluated with a confusion matrix and classification report\n", + "3. **Serve & Predict** — Loaded the saved model, made predictions, and learned how the FastAPI endpoint works\n", + "\n", + "### What to explore next\n", + "\n", + "- **Try a different dataset** — Change `dataset` in `configs/baseline.yaml` to `imdb`, `rotten_tomatoes`, or another HF text classification dataset\n", + "- **Tune hyperparameters** — Adjust `C`, `max_iter`, `max_features`, or `ngram_range` and compare runs in MLflow\n", + "- **Swap the model** — Replace `LogisticRegression` with `SGDClassifier` or `RandomForestClassifier`\n", + "- **Launch the API** — Run `uvicorn src.serve:app --reload` and try it with real queries\n", + "- **Browse MLflow** — Run `mlflow ui --backend-store-uri ./mlruns` and explore your experiment history\n", + "\n", + "Happy hacking!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tutorials/setup_template/notebooks/shell1.png b/tutorials/setup_template/notebooks/shell1.png new file mode 100644 index 0000000000000000000000000000000000000000..313e8de5f029cc4c43671900d31eccbf7870b836 GIT binary patch literal 298842 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
4K6~u6wq^SULkY`Fp`GIdL|;#nTV$% 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

^EoI30+HPt(e7alF`uVlMO@jzq_`a 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 literal 0 HcmV?d00001 diff --git a/tutorials/setup_template/requirements.txt b/tutorials/setup_template/requirements.txt new file mode 100644 index 0000000..ce7c82d --- /dev/null +++ b/tutorials/setup_template/requirements.txt @@ -0,0 +1,13 @@ +pandas==2.2.2 +scikit-learn==1.5.2 +spacy==3.7.6 +matplotlib==3.9.2 +datasets==3.0.1 +transformers==4.44.2 +mlflow==2.16.2 +numpy==1.26.4 +pyyaml==6.0.2 +python-dotenv==1.0.1 +pydantic==2.9.2 +fastapi==0.115.0 +uvicorn==0.30.6 diff --git a/tutorials/setup_template/src/__init__.py b/tutorials/setup_template/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tutorials/setup_template/src/baseline.py b/tutorials/setup_template/src/baseline.py new file mode 100644 index 0000000..c127328 --- /dev/null +++ b/tutorials/setup_template/src/baseline.py @@ -0,0 +1,92 @@ + +import os, yaml, mlflow, mlflow.sklearn +from src.utils import set_all_seeds, get_env +from src.data import load_text_classification +from sklearn.model_selection import train_test_split +from sklearn.pipeline import Pipeline +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.linear_model import LogisticRegression +from sklearn.metrics import accuracy_score, f1_score, classification_report, ConfusionMatrixDisplay +import matplotlib.pyplot as plt + +def run_baseline(cfg_path="configs/baseline.yaml"): + set_all_seeds(42) + cfg = yaml.safe_load(open(cfg_path)) + + mlflow.set_tracking_uri(get_env("MLFLOW_TRACKING_URI", "./mlruns")) + mlflow.set_experiment(cfg["experiment_name"]) + + train_df, valid_df, test_df = load_text_classification( + cfg["dataset"], cache_dir=get_env("DATA_CACHE_DIR", "./.hf_cache") + ) + + if valid_df is None: + train_df, valid_df = train_test_split( + train_df, test_size=cfg["test_size"], random_state=cfg["random_state"], stratify=train_df["label"] + ) + + X_train, y_train = train_df["text"].astype(str), train_df["label"] + X_valid, y_valid = valid_df["text"].astype(str), valid_df["label"] + X_test, y_test = test_df["text"].astype(str), test_df["label"] + + pipe = Pipeline([ + ("tfidf", TfidfVectorizer( + max_features=cfg["tfidf"]["max_features"], + ngram_range=tuple(cfg["tfidf"]["ngram_range"]) + )), + ("clf", LogisticRegression( + C=cfg["model"]["C"], + max_iter=cfg["model"]["max_iter"] + )) + ]) + + with mlflow.start_run(): + # log params + mlflow.log_params({ + "dataset": cfg["dataset"], + "tfidf_max_features": cfg["tfidf"]["max_features"], + "tfidf_ngram_range": str(cfg["tfidf"]["ngram_range"]), + "model": cfg["model"]["type"], + "C": cfg["model"]["C"], + "max_iter": cfg["model"]["max_iter"], + "random_state": cfg["random_state"] + }) + + pipe.fit(X_train, y_train) + y_pred_valid = pipe.predict(X_valid) + y_pred_test = pipe.predict(X_test) + + # metrics + acc_valid = accuracy_score(y_valid, y_pred_valid) + f1_valid = f1_score(y_valid, y_pred_valid, average=cfg["metrics"]["average"]) + acc_test = accuracy_score(y_test, y_pred_test) + f1_test = f1_score(y_test, y_pred_test, average=cfg["metrics"]["average"]) + + mlflow.log_metrics({ + "valid_accuracy": acc_valid, + "valid_f1_macro": f1_valid, + "test_accuracy": acc_test, + "test_f1_macro": f1_test + }) + + # save confusion matrix + os.makedirs("reports", exist_ok=True) + fig = ConfusionMatrixDisplay.from_predictions(y_test, y_pred_test).figure_ + fig.savefig("reports/confusion_matrix.png", dpi=180, bbox_inches="tight") + mlflow.log_artifact("reports/confusion_matrix.png") + + # save text report + report = classification_report(y_test, y_pred_test) + with open("reports/classification_report.txt", "w") as f: + f.write(report) + mlflow.log_artifact("reports/classification_report.txt") + + # save model + mlflow.sklearn.log_model(pipe, artifact_path="model") + + print("Validation -> acc:", acc_valid, "f1_macro:", f1_valid) + print("Test -> acc:", acc_test, "f1_macro:", f1_test) + print("\nClassification report saved at reports/classification_report.txt") + +if __name__ == "__main__": + run_baseline() diff --git a/tutorials/setup_template/src/data.py b/tutorials/setup_template/src/data.py new file mode 100644 index 0000000..009d4dd --- /dev/null +++ b/tutorials/setup_template/src/data.py @@ -0,0 +1,24 @@ +from datasets import load_dataset +import pandas as pd +from collections import Counter + +def load_text_classification(name, cache_dir=None): + """ + Loads a Hugging Face dataset and returns 3 DataFrames: + train_df, valid_df (or None), test_df with columns: text, label + """ + ds = load_dataset(name, cache_dir=cache_dir) + train_df = pd.DataFrame(ds["train"]) + test_df = pd.DataFrame(ds["test"]) + valid_df = pd.DataFrame(ds["validation"]) if "validation" in ds else None + return train_df, valid_df, test_df + +def describe_dataset(df, text_col="text", label_col="label"): + lengths = df[text_col].astype(str).str.split().map(len) + counts = Counter(df[label_col]) + return { + "rows": len(df), + "avg_tokens": float(lengths.mean()), + "median_tokens": float(lengths.median()), + "label_counts": dict(counts), + } diff --git a/tutorials/setup_template/src/eda.py b/tutorials/setup_template/src/eda.py new file mode 100644 index 0000000..6a83c21 --- /dev/null +++ b/tutorials/setup_template/src/eda.py @@ -0,0 +1,31 @@ + +# Quick, beginner-friendly EDA that saves pictures into reports/ +import os, yaml +import matplotlib.pyplot as plt +from src.utils import set_all_seeds, get_env +from src.data import load_text_classification, describe_dataset + +def main(cfg_path="configs/baseline.yaml"): + set_all_seeds(42) + cfg = yaml.safe_load(open(cfg_path)) + cache = get_env("DATA_CACHE_DIR", "./.hf_cache") + + train_df, valid_df, test_df = load_text_classification(cfg["dataset"], cache_dir=cache) + + # 1) Print simple stats + print("TRAIN:", describe_dataset(train_df)) + if valid_df is not None: + print("VALID:", describe_dataset(valid_df)) + print("TEST :", describe_dataset(test_df)) + + # 2) Plot token length histogram (train) + lengths = train_df["text"].astype(str).str.split().map(len) + plt.figure() + lengths.hist(bins=50) + plt.xlabel("Tokens per example"); plt.ylabel("Count"); plt.title("Token Lengths (train)") + os.makedirs("reports", exist_ok=True) + plt.savefig("reports/eda_token_lengths.png", dpi=160, bbox_inches="tight") + print("Saved: reports/eda_token_lengths.png") + +if __name__ == "__main__": + main() diff --git a/tutorials/setup_template/src/serve.py b/tutorials/setup_template/src/serve.py new file mode 100644 index 0000000..1b38e2e --- /dev/null +++ b/tutorials/setup_template/src/serve.py @@ -0,0 +1,22 @@ + +from fastapi import FastAPI +from pydantic import BaseModel +import mlflow.pyfunc, glob + +app = FastAPI(title="T0 Baseline Inference") + +class InferRequest(BaseModel): + text: str + +def _latest_model_path(): + # look for the newest model saved by MLflow locally + candidates = sorted(glob.glob("mlruns/*/*/artifacts/model")) + if not candidates: + raise RuntimeError("No model artifacts found. Run baseline first.") + return candidates[-1] + +@app.post("/infer") +def infer(payload: InferRequest): + model = mlflow.pyfunc.load_model(_latest_model_path()) + pred = model.predict([payload.text]) + return {"label": int(pred[0])} diff --git a/tutorials/setup_template/src/utils.py b/tutorials/setup_template/src/utils.py new file mode 100644 index 0000000..08b2803 --- /dev/null +++ b/tutorials/setup_template/src/utils.py @@ -0,0 +1,23 @@ +import os +import random +import numpy as np + + +def set_all_seeds(seed: int = 42): + random.seed(seed) + np.random.seed(seed) + try: + import torch + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + except Exception: + pass + +def get_env(name: str, default: str = "") -> str: + from dotenv import load_dotenv + load_dotenv() + return os.getenv(name, default) + + From c2aed37440a8874417af9535ec614fc5bd5708c6 Mon Sep 17 00:00:00 2001 From: Nathan Bartley Date: Mon, 23 Feb 2026 18:25:52 -0800 Subject: [PATCH 2/2] update mlruns trash directory --- .../notebooks/02_train_and_evaluate.ipynb | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/tutorials/setup_template/notebooks/02_train_and_evaluate.ipynb b/tutorials/setup_template/notebooks/02_train_and_evaluate.ipynb index 004b180..ade871e 100644 --- a/tutorials/setup_template/notebooks/02_train_and_evaluate.ipynb +++ b/tutorials/setup_template/notebooks/02_train_and_evaluate.ipynb @@ -46,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -159,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -253,7 +253,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -311,28 +311,22 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 41, "metadata": {}, "outputs": [ { - "ename": "Exception", - "evalue": "Invalid parent directory '/Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template/mlruns/.trash'", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mException\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[35]\u001b[39m\u001b[32m, line 8\u001b[39m\n\u001b[32m 5\u001b[39m tracking_dir.mkdir(exist_ok=\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[32m 7\u001b[39m mlflow.set_tracking_uri(\u001b[38;5;28mstr\u001b[39m(PROJECT_ROOT / tracking_uri))\n\u001b[32m----> \u001b[39m\u001b[32m8\u001b[39m \u001b[43mmlflow\u001b[49m\u001b[43m.\u001b[49m\u001b[43mset_experiment\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcfg\u001b[49m\u001b[43m[\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mexperiment_name\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 10\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mMLflow tracking URI: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mPROJECT_ROOT\u001b[38;5;250m \u001b[39m/\u001b[38;5;250m \u001b[39mtracking_uri\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n\u001b[32m 11\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mExperiment name: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcfg[\u001b[33m'\u001b[39m\u001b[33mexperiment_name\u001b[39m\u001b[33m'\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/tracking/fluent.py:145\u001b[39m, in \u001b[36mset_experiment\u001b[39m\u001b[34m(experiment_name, experiment_id)\u001b[39m\n\u001b[32m 143\u001b[39m client = MlflowClient()\n\u001b[32m 144\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m experiment_id \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m145\u001b[39m experiment = \u001b[43mclient\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget_experiment_by_name\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexperiment_name\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 146\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m experiment:\n\u001b[32m 147\u001b[39m _logger.info(\n\u001b[32m 148\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mExperiment with name \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m does not exist. Creating a new experiment.\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 149\u001b[39m experiment_name,\n\u001b[32m 150\u001b[39m )\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/tracking/client.py:1249\u001b[39m, in \u001b[36mMlflowClient.get_experiment_by_name\u001b[39m\u001b[34m(self, name)\u001b[39m\n\u001b[32m 1217\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mget_experiment_by_name\u001b[39m(\u001b[38;5;28mself\u001b[39m, name: \u001b[38;5;28mstr\u001b[39m) -> Optional[Experiment]:\n\u001b[32m 1218\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Retrieve an experiment by experiment name from the backend store\u001b[39;00m\n\u001b[32m 1219\u001b[39m \n\u001b[32m 1220\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 1247\u001b[39m \u001b[33;03m Lifecycle_stage: active\u001b[39;00m\n\u001b[32m 1248\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1249\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_tracking_client\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget_experiment_by_name\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/tracking/_tracking_service/client.py:484\u001b[39m, in \u001b[36mTrackingServiceClient.get_experiment_by_name\u001b[39m\u001b[34m(self, name)\u001b[39m\n\u001b[32m 476\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mget_experiment_by_name\u001b[39m(\u001b[38;5;28mself\u001b[39m, name):\n\u001b[32m 477\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 478\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m 479\u001b[39m \u001b[33;03m name: The experiment name.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 482\u001b[39m \u001b[33;03m :py:class:`mlflow.entities.Experiment`\u001b[39;00m\n\u001b[32m 483\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m484\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mstore\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget_experiment_by_name\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/store/tracking/file_store.py:353\u001b[39m, in \u001b[36mFileStore.get_experiment_by_name\u001b[39m\u001b[34m(self, experiment_name)\u001b[39m\n\u001b[32m 345\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpagination_wrapper_func\u001b[39m(number_to_get, next_page_token):\n\u001b[32m 346\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.search_experiments(\n\u001b[32m 347\u001b[39m view_type=ViewType.ALL,\n\u001b[32m 348\u001b[39m max_results=number_to_get,\n\u001b[32m 349\u001b[39m filter_string=\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mname = \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mexperiment_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 350\u001b[39m page_token=next_page_token,\n\u001b[32m 351\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m353\u001b[39m experiments = \u001b[43mget_results_from_paginated_fn\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 354\u001b[39m \u001b[43m \u001b[49m\u001b[43mpaginated_fn\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpagination_wrapper_func\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 355\u001b[39m \u001b[43m \u001b[49m\u001b[43mmax_results_per_page\u001b[49m\u001b[43m=\u001b[49m\u001b[43mSEARCH_MAX_RESULTS_THRESHOLD\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 356\u001b[39m \u001b[43m \u001b[49m\u001b[43mmax_results\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 357\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 358\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m experiments[\u001b[32m0\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(experiments) > \u001b[32m0\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/utils/__init__.py:238\u001b[39m, in \u001b[36mget_results_from_paginated_fn\u001b[39m\u001b[34m(paginated_fn, max_results_per_page, max_results)\u001b[39m\n\u001b[32m 236\u001b[39m page_results = paginated_fn(num_to_get, next_page_token)\n\u001b[32m 237\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m238\u001b[39m page_results = \u001b[43mpaginated_fn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_results_per_page\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnext_page_token\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 239\u001b[39m all_results.extend(page_results)\n\u001b[32m 240\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(page_results, \u001b[33m\"\u001b[39m\u001b[33mtoken\u001b[39m\u001b[33m\"\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m page_results.token:\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/store/tracking/file_store.py:346\u001b[39m, in \u001b[36mFileStore.get_experiment_by_name..pagination_wrapper_func\u001b[39m\u001b[34m(number_to_get, next_page_token)\u001b[39m\n\u001b[32m 345\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpagination_wrapper_func\u001b[39m(number_to_get, next_page_token):\n\u001b[32m--> \u001b[39m\u001b[32m346\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43msearch_experiments\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 347\u001b[39m \u001b[43m \u001b[49m\u001b[43mview_type\u001b[49m\u001b[43m=\u001b[49m\u001b[43mViewType\u001b[49m\u001b[43m.\u001b[49m\u001b[43mALL\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 348\u001b[39m \u001b[43m \u001b[49m\u001b[43mmax_results\u001b[49m\u001b[43m=\u001b[49m\u001b[43mnumber_to_get\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 349\u001b[39m \u001b[43m \u001b[49m\u001b[43mfilter_string\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43mf\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mname = \u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mexperiment_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[33;43m'\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 350\u001b[39m \u001b[43m \u001b[49m\u001b[43mpage_token\u001b[49m\u001b[43m=\u001b[49m\u001b[43mnext_page_token\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 351\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/store/tracking/file_store.py:321\u001b[39m, in \u001b[36mFileStore.search_experiments\u001b[39m\u001b[34m(self, view_type, max_results, filter_string, order_by, page_token)\u001b[39m\n\u001b[32m 319\u001b[39m experiment_ids += \u001b[38;5;28mself\u001b[39m._get_active_experiments(full_path=\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[32m 320\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m view_type == ViewType.DELETED_ONLY \u001b[38;5;129;01mor\u001b[39;00m view_type == ViewType.ALL:\n\u001b[32m--> \u001b[39m\u001b[32m321\u001b[39m experiment_ids += \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_deleted_experiments\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfull_path\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[32m 323\u001b[39m experiments = []\n\u001b[32m 324\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m exp_id \u001b[38;5;129;01min\u001b[39;00m experiment_ids:\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/store/tracking/file_store.py:293\u001b[39m, in \u001b[36mFileStore._get_deleted_experiments\u001b[39m\u001b[34m(self, full_path)\u001b[39m\n\u001b[32m 292\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_get_deleted_experiments\u001b[39m(\u001b[38;5;28mself\u001b[39m, full_path=\u001b[38;5;28;01mFalse\u001b[39;00m):\n\u001b[32m--> \u001b[39m\u001b[32m293\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mlist_subdirs\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mtrash_folder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfull_path\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/utils/file_utils.py:162\u001b[39m, in \u001b[36mlist_subdirs\u001b[39m\u001b[34m(dir_name, full_path)\u001b[39m\n\u001b[32m 150\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mlist_subdirs\u001b[39m(dir_name, full_path=\u001b[38;5;28;01mFalse\u001b[39;00m):\n\u001b[32m 151\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 152\u001b[39m \u001b[33;03m Equivalent to UNIX command:\u001b[39;00m\n\u001b[32m 153\u001b[39m \u001b[33;03m ``find $dir_name -depth 1 -type d``\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 160\u001b[39m \u001b[33;03m list of all directories directly under 'dir_name'.\u001b[39;00m\n\u001b[32m 161\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m162\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mlist_all\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdir_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mos\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m.\u001b[49m\u001b[43misdir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfull_path\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/mlflow/utils/file_utils.py:145\u001b[39m, in \u001b[36mlist_all\u001b[39m\u001b[34m(root, filter_func, full_path)\u001b[39m\n\u001b[32m 133\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"List all entities directly under 'dir_name' that satisfy 'filter_func'\u001b[39;00m\n\u001b[32m 134\u001b[39m \n\u001b[32m 135\u001b[39m \u001b[33;03mArgs:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 142\u001b[39m \n\u001b[32m 143\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 144\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_directory(root):\n\u001b[32m--> \u001b[39m\u001b[32m145\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mInvalid parent directory \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mroot\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 146\u001b[39m matches = [x \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m os.listdir(root) \u001b[38;5;28;01mif\u001b[39;00m filter_func(os.path.join(root, x))]\n\u001b[32m 147\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m [os.path.join(root, m) \u001b[38;5;28;01mfor\u001b[39;00m m \u001b[38;5;129;01min\u001b[39;00m matches] \u001b[38;5;28;01mif\u001b[39;00m full_path \u001b[38;5;28;01melse\u001b[39;00m matches\n", - "\u001b[31mException\u001b[39m: Invalid parent directory '/Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template/mlruns/.trash'" + "name": "stderr", + "output_type": "stream", + "text": [ + "2026/02/23 18:25:31 INFO mlflow.tracking.fluent: Experiment with name 't0_setup_template' does not exist. Creating a new experiment.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MLflow tracking URI: /Users/Bartley/Documents/personal_dev/h4la/repos/data-science/tutorials/setup_template/mlruns\n", + "Experiment name: t0_setup_template\n" ] } ], @@ -343,6 +337,9 @@ "tracking_dir = PROJECT_ROOT / \"mlruns\"\n", "tracking_dir.mkdir(exist_ok=True)\n", "\n", + "trash_dir = tracking_dir / \".trash\"\n", + "trash_dir.mkdir(exist_ok=True)\n", + "\n", "mlflow.set_tracking_uri(str(PROJECT_ROOT / tracking_uri))\n", "mlflow.set_experiment(cfg[\"experiment_name\"])\n", "\n",