{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "b773bf8e-c420-44e1-80a6-99f75dd12268", "metadata": {}, "source": [ "# 3. Using Pytorch with CapyMOA\n", "* This notebook demonstrates how use Pytorch with CapyMOA.\n", "* It contains examples showing \n", " * How to define a Pytorch Network to be used with CapyMOA\n", " * How a simple Pytorch model can be used in a CapyMOA ```Instance``` loop\n", " * How to define a Pytorch CapyMOA Classifier based on CapyMOA ```Classifier``` framework and how to use it with ```prequential_evaluation()```\n", " * How to use a Pytorch dataset with a CapyMOA classifier\n", "* **Tutorial 6**: `Exploring Advanced Features` includes an example using TensorBoard and a `PyTorchClassifier`\n", " \n", "---\n", "\n", "*More information about CapyMOA can be found in* https://www.capymoa.org\n", "\n", "**last update on 25/07/2024**" ] }, { "attachments": {}, "cell_type": "markdown", "id": "cd9a931c-7b86-4bd6-8cda-179154e4b513", "metadata": {}, "source": [ "## 1. Setup\n", "* Sets random seed for reproducibility\n", "* Sets Pytorch network " ] }, { "attachments": {}, "cell_type": "markdown", "id": "9b6d4a63467b23b5", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "source": [ "### 1.1 Set random seeds" ] }, { "cell_type": "code", "execution_count": 1, "id": "2242896e95964ef4", "metadata": { "ExecuteTime": { "end_time": "2024-04-29T11:56:23.668712Z", "start_time": "2024-04-29T11:56:23.659844Z" }, "collapsed": false, "execution": { "iopub.execute_input": "2025-02-02T01:06:47.799395Z", "iopub.status.busy": "2025-02-02T01:06:47.798867Z", "iopub.status.idle": "2025-02-02T01:06:47.807817Z", "shell.execute_reply": "2025-02-02T01:06:47.806252Z" }, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "import random\n", "\n", "random_seed = 1\n", "random.seed(random_seed)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ccbccfce41f2f18", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "source": [ "### 1.2 Define network structure\n", "* Here, network uses the CPU device" ] }, { "cell_type": "code", "execution_count": 2, "id": "fbcd4d91-2b00-4d5a-9c54-f9dd6a291aa5", "metadata": { "ExecuteTime": { "end_time": "2024-04-29T11:24:39.060139Z", "start_time": "2024-04-29T11:24:39.035090Z" }, "execution": { "iopub.execute_input": "2025-02-02T01:06:47.812343Z", "iopub.status.busy": "2025-02-02T01:06:47.811873Z", "iopub.status.idle": "2025-02-02T01:06:48.518604Z", "shell.execute_reply": "2025-02-02T01:06:48.518025Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using cpu device\n" ] } ], "source": [ "import torch\n", "from torch import nn\n", "\n", "torch.manual_seed(random_seed)\n", "torch.use_deterministic_algorithms(True)\n", "\n", "# Get cpu device for training.\n", "device = \"cpu\"\n", "print(f\"Using {device} device\")\n", "\n", "\n", "# Define model\n", "class NeuralNetwork(nn.Module):\n", " def __init__(self, input_size=0, number_of_classes=0):\n", " super().__init__()\n", " self.flatten = nn.Flatten()\n", " self.linear_relu_stack = nn.Sequential(\n", " nn.Linear(input_size, 512),\n", " nn.ReLU(),\n", " nn.Linear(512, 512),\n", " nn.ReLU(),\n", " nn.Linear(512, number_of_classes),\n", " )\n", "\n", " def forward(self, x):\n", " x = self.flatten(x)\n", " logits = self.linear_relu_stack(x)\n", " return logits" ] }, { "attachments": {}, "cell_type": "markdown", "id": "882b6b292a2de100", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "source": [ "### 1.3 Using instance loop\n", "* Model is initialized after receiving the first instance" ] }, { "cell_type": "code", "execution_count": 3, "id": "81092940-5a6b-4377-b550-ed6f5fee711a", "metadata": { "ExecuteTime": { "end_time": "2024-04-29T11:24:41.344634Z", "start_time": "2024-04-29T11:24:39.063330Z" }, "execution": { "iopub.execute_input": "2025-02-02T01:06:48.519893Z", "iopub.status.busy": "2025-02-02T01:06:48.519778Z", "iopub.status.idle": "2025-02-02T01:06:50.861516Z", "shell.execute_reply": "2025-02-02T01:06:50.861237Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "NeuralNetwork(\n", " (flatten): Flatten(start_dim=1, end_dim=-1)\n", " (linear_relu_stack): Sequential(\n", " (0): Linear(in_features=6, out_features=512, bias=True)\n", " (1): ReLU()\n", " (2): Linear(in_features=512, out_features=512, bias=True)\n", " (3): ReLU()\n", " (4): Linear(in_features=512, out_features=2, bias=True)\n", " )\n", ")\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy at 500 : 50.4\n", "Accuracy at 1000 : 55.2\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Accuracy at 1500 : 61.199999999999996\n", "Accuracy at 2000 : 61.1\n", "Accuracy at 2000 : 61.1\n" ] } ], "source": [ "from capymoa.evaluation import ClassificationEvaluator\n", "from capymoa.datasets import ElectricityTiny\n", "\n", "elec_stream = ElectricityTiny()\n", "\n", "# Creating the evaluator\n", "evaluator = ClassificationEvaluator(schema=elec_stream.get_schema())\n", "\n", "model = None\n", "optimizer = None\n", "loss_fn = nn.CrossEntropyLoss()\n", "\n", "i = 0\n", "while elec_stream.has_more_instances():\n", " i += 1\n", " instance = elec_stream.next_instance()\n", " if model is None:\n", " moa_instance = instance.java_instance.getData()\n", " # initialize the model and send it to the device\n", " model = NeuralNetwork(\n", " input_size=elec_stream.get_schema().get_num_attributes(),\n", " number_of_classes=elec_stream.get_schema().get_num_classes(),\n", " ).to(device)\n", " # set the optimizer\n", " optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)\n", " print(model)\n", "\n", " X = torch.tensor(instance.x, dtype=torch.float32)\n", " y = torch.tensor(instance.y_index, dtype=torch.long)\n", " # set the device and add a dimension to the tensor\n", " X, y = torch.unsqueeze(X.to(device), 0), torch.unsqueeze(y.to(device), 0)\n", "\n", " # turn off gradient collection for test\n", " with torch.no_grad():\n", " pred = model(X)\n", " prediction = torch.argmax(pred)\n", "\n", " # update evaluator with predicted class\n", " evaluator.update(instance.y_index, prediction.item())\n", "\n", " # Compute prediction error\n", " pred = model(X)\n", " loss = loss_fn(pred, y)\n", "\n", " # Backpropagation\n", " loss.backward()\n", " optimizer.step()\n", " optimizer.zero_grad()\n", "\n", " if i % 500 == 0:\n", " print(f\"Accuracy at {i} : {evaluator.accuracy()}\")\n", "\n", "print(f\"Accuracy at {i} : {evaluator.accuracy()}\")" ] }, { "attachments": {}, "cell_type": "markdown", "id": "2803eaab-eb2b-4c6e-a246-67f9ac71f70f", "metadata": {}, "source": [ "## 2. PyTorchClassifier\n", "* Defining a `PyTorchClassifier` using CapyMOA API makes it **compatibility** with CapyMOA functions like `prequential_evaluation()` without losing the **flexibility** of specifying the `architecture` and the `training` method\n", "* Model is initialized after receiving the first instance\n", "* `PyTorchClassifier` is based on `capymoa.base` ```Classifier``` abstract class\n", "\n", "* **Important**: We can access information about the stream through any of its instances. See `set_model(self, instance)` for an example: \n", "\n", "```python\n", "...\n", "moa_instance = instance.java_instance.getData()\n", "self.model = NeuralNetwork(input_size=moa_instance.get_num_attributes(), \n", " number_of_classes=moa_instance.get_num_classes()).to(self.device)\n", "...\n", "```" ] }, { "cell_type": "code", "execution_count": 4, "id": "1c75513c-58e8-4499-bb19-2c58aea4567b", "metadata": { "ExecuteTime": { "end_time": "2024-04-29T11:24:41.367535Z", "start_time": "2024-04-29T11:24:41.347463Z" }, "execution": { "iopub.execute_input": "2025-02-02T01:06:50.862665Z", "iopub.status.busy": "2025-02-02T01:06:50.862388Z", "iopub.status.idle": "2025-02-02T01:06:50.868160Z", "shell.execute_reply": "2025-02-02T01:06:50.867790Z" } }, "outputs": [], "source": [ "from capymoa.base import Classifier\n", "import numpy as np\n", "\n", "\n", "class PyTorchClassifier(Classifier):\n", " def __init__(\n", " self,\n", " schema=None,\n", " random_seed=1,\n", " nn_model: nn.Module = None,\n", " optimizer=None,\n", " loss_fn=nn.CrossEntropyLoss(),\n", " device=(\"cpu\"),\n", " lr=1e-3,\n", " ):\n", " super().__init__(schema, random_seed)\n", " self.model = None\n", " self.optimizer = None\n", " self.loss_fn = loss_fn\n", " self.lr = lr\n", " self.device = device\n", "\n", " torch.manual_seed(random_seed)\n", "\n", " if nn_model is None:\n", " self.set_model(None)\n", " else:\n", " self.model = nn_model.to(device)\n", " if optimizer is None:\n", " if self.model is not None:\n", " self.optimizer = torch.optim.SGD(self.model.parameters(), lr=lr)\n", " else:\n", " self.optimizer = optimizer\n", "\n", " def __str__(self):\n", " return str(self.model)\n", "\n", " def CLI_help(self):\n", " return str(\n", " 'schema=None, random_seed=1, nn_model: nn.Module = None, optimizer=None, loss_fn=nn.CrossEntropyLoss(), device=(\"cpu\"), lr=1e-3'\n", " )\n", "\n", " def set_model(self, instance):\n", " if self.schema is None:\n", " moa_instance = instance.java_instance.getData()\n", " self.model = NeuralNetwork(\n", " input_size=moa_instance.get_num_attributes(),\n", " number_of_classes=moa_instance.get_num_classes(),\n", " ).to(self.device)\n", " elif instance is not None:\n", " self.model = NeuralNetwork(\n", " input_size=self.schema.get_num_attributes(),\n", " number_of_classes=self.schema.get_num_classes(),\n", " ).to(self.device)\n", "\n", " def train(self, instance):\n", " if self.model is None:\n", " self.set_model(instance)\n", "\n", " X = torch.tensor(instance.x, dtype=torch.float32)\n", " y = torch.tensor(instance.y_index, dtype=torch.long)\n", " # set the device and add a dimension to the tensor\n", " X, y = (\n", " torch.unsqueeze(X.to(self.device), 0),\n", " torch.unsqueeze(y.to(self.device), 0),\n", " )\n", "\n", " # Compute prediction error\n", " pred = self.model(X)\n", " loss = self.loss_fn(pred, y)\n", "\n", " # Backpropagation\n", " loss.backward()\n", " self.optimizer.step()\n", " self.optimizer.zero_grad()\n", "\n", " def predict(self, instance):\n", " return np.argmax(self.predict_proba(instance))\n", "\n", " def predict_proba(self, instance):\n", " if self.model is None:\n", " self.set_model(instance)\n", " X = torch.unsqueeze(\n", " torch.tensor(instance.x, dtype=torch.float32).to(self.device), 0\n", " )\n", " # turn off gradient collection\n", " with torch.no_grad():\n", " pred = np.asarray(self.model(X).numpy(), dtype=np.double)\n", " return pred" ] }, { "attachments": {}, "cell_type": "markdown", "id": "75ee1eb154c01996", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "source": [ "### 2.2 Using PyTorchClassifier + prequential_evaluation\n", "\n", "* We can access information about the stream through the `schema` directly, from the example below: \n", "```python\n", "...\n", "nn_model=NeuralNetwork(input_size=elec_stream.get_schema().get_num_attributes(),\n", " number_of_classes=elec_stream.get_schema().get_num_classes()).to(device)\n", "...\n", "```" ] }, { "cell_type": "code", "execution_count": 5, "id": "ece5b5ff-be24-439c-bf53-7bf5d4fbf858", "metadata": { "ExecuteTime": { "end_time": "2024-04-29T11:24:43.665700Z", "start_time": "2024-04-29T11:24:41.371991Z" }, "execution": { "iopub.execute_input": "2025-02-02T01:06:50.869405Z", "iopub.status.busy": "2025-02-02T01:06:50.869261Z", "iopub.status.idle": "2025-02-02T01:06:52.619657Z", "shell.execute_reply": "2025-02-02T01:06:52.619384Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 62.849999999999994\n" ] } ], "source": [ "from capymoa.evaluation import prequential_evaluation\n", "\n", "## Opening a file as a stream\n", "elec_stream = ElectricityTiny()\n", "\n", "# Creating a learner\n", "simple_pyTorch_classifier = PyTorchClassifier(\n", " schema=elec_stream.get_schema(),\n", " nn_model=NeuralNetwork(\n", " input_size=elec_stream.get_schema().get_num_attributes(),\n", " number_of_classes=elec_stream.get_schema().get_num_classes(),\n", " ).to(device),\n", ")\n", "\n", "evaluator = prequential_evaluation(\n", " stream=elec_stream,\n", " learner=simple_pyTorch_classifier,\n", " window_size=4500,\n", " optimise=False,\n", ")\n", "\n", "print(f\"Accuracy: {evaluator.cumulative.accuracy()}\")" ] }, { "cell_type": "markdown", "id": "a3a752afb7e7698d", "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "source": [ "## 3. How to use a Pytorch dataset with a CapyMOA classifier\n", "* One may want to use various Pytorch datasets with different CapyMOA classifiers\n", "* In this example we use Pytorch Dataset + prequential evaluation + CapyMOA Classifier\n", "\n", "**Observation**: *Using a learner like Online Bagging without any feature extraction is not going to yield meaningful performance*" ] }, { "cell_type": "code", "execution_count": 6, "id": "8a6fdd873625b07b", "metadata": { "ExecuteTime": { "end_time": "2024-04-29T11:24:56.571969Z", "start_time": "2024-04-29T11:24:49.646899Z" }, "execution": { "iopub.execute_input": "2025-02-02T01:06:52.620759Z", "iopub.status.busy": "2025-02-02T01:06:52.620652Z", "iopub.status.idle": "2025-02-02T01:06:55.929401Z", "shell.execute_reply": "2025-02-02T01:06:55.929036Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 43.5\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
instancesaccuracykappakappa_tkappa_mf1_scoref1_score_0f1_score_1f1_score_2f1_score_3...recall_0recall_1recall_2recall_3recall_4recall_5recall_6recall_7recall_8recall_9
0100.017.06.2676450.0000000.000000NaN23.18840630.76923146.15384612.500000...66.66666718.18181833.3333336.6666670.0000000.0000000.00000012.5000000.00000018.181818
1200.041.033.28810532.95454530.58823545.87966639.13043557.14285736.363636NaN...75.00000040.00000022.2222220.00000022.22222222.22222263.63636423.07692375.00000012.500000
2300.030.022.12704423.07692323.076923NaN24.39024472.72727351.851852NaN...62.50000057.14285753.8461540.0000009.09090918.18181833.33333322.22222218.18181850.000000
3400.048.041.77583743.47826142.22222254.21695836.36363670.58823522.22222215.384615...72.72727354.54545525.0000008.33333325.00000066.66666750.00000063.63636466.66666733.333333
4500.051.045.59182845.55555642.35294156.93295839.02439050.00000023.52941222.222222...88.88888940.00000016.66666712.50000050.00000075.00000025.00000062.50000078.57142954.545455
5600.048.042.16438739.53488436.585366NaN38.88888950.00000047.058824NaN...70.00000033.33333340.0000000.00000050.00000071.42857146.15384650.00000062.50000061.538462
6700.046.039.36671936.47058829.870130NaN42.10526380.00000050.000000NaN...88.88888966.66666757.1428570.00000061.53846225.00000033.33333322.22222268.75000042.857143
7800.055.049.30148749.43820247.058824NaN58.82352996.55172460.000000NaN...90.90909193.33333350.0000000.00000066.66666753.84615427.27272720.00000063.63636437.500000
8900.050.043.81391245.65217442.52873648.26127666.66666781.81818215.38461562.500000...87.50000069.23076916.66666745.45454516.66666750.00000033.33333330.00000044.44444450.000000
91000.049.043.11844746.87500042.04545554.45583059.25925985.71428655.55555622.222222...88.88888985.71428650.00000012.50000075.00000066.66666727.27272712.50000087.50000012.500000
\n", "

10 rows × 38 columns

\n", "
" ], "text/plain": [ " instances accuracy kappa kappa_t kappa_m f1_score \\\n", "0 100.0 17.0 6.267645 0.000000 0.000000 NaN \n", "1 200.0 41.0 33.288105 32.954545 30.588235 45.879666 \n", "2 300.0 30.0 22.127044 23.076923 23.076923 NaN \n", "3 400.0 48.0 41.775837 43.478261 42.222222 54.216958 \n", "4 500.0 51.0 45.591828 45.555556 42.352941 56.932958 \n", "5 600.0 48.0 42.164387 39.534884 36.585366 NaN \n", "6 700.0 46.0 39.366719 36.470588 29.870130 NaN \n", "7 800.0 55.0 49.301487 49.438202 47.058824 NaN \n", "8 900.0 50.0 43.813912 45.652174 42.528736 48.261276 \n", "9 1000.0 49.0 43.118447 46.875000 42.045455 54.455830 \n", "\n", " f1_score_0 f1_score_1 f1_score_2 f1_score_3 ... recall_0 recall_1 \\\n", "0 23.188406 30.769231 46.153846 12.500000 ... 66.666667 18.181818 \n", "1 39.130435 57.142857 36.363636 NaN ... 75.000000 40.000000 \n", "2 24.390244 72.727273 51.851852 NaN ... 62.500000 57.142857 \n", "3 36.363636 70.588235 22.222222 15.384615 ... 72.727273 54.545455 \n", "4 39.024390 50.000000 23.529412 22.222222 ... 88.888889 40.000000 \n", "5 38.888889 50.000000 47.058824 NaN ... 70.000000 33.333333 \n", "6 42.105263 80.000000 50.000000 NaN ... 88.888889 66.666667 \n", "7 58.823529 96.551724 60.000000 NaN ... 90.909091 93.333333 \n", "8 66.666667 81.818182 15.384615 62.500000 ... 87.500000 69.230769 \n", "9 59.259259 85.714286 55.555556 22.222222 ... 88.888889 85.714286 \n", "\n", " recall_2 recall_3 recall_4 recall_5 recall_6 recall_7 \\\n", "0 33.333333 6.666667 0.000000 0.000000 0.000000 12.500000 \n", "1 22.222222 0.000000 22.222222 22.222222 63.636364 23.076923 \n", "2 53.846154 0.000000 9.090909 18.181818 33.333333 22.222222 \n", "3 25.000000 8.333333 25.000000 66.666667 50.000000 63.636364 \n", "4 16.666667 12.500000 50.000000 75.000000 25.000000 62.500000 \n", "5 40.000000 0.000000 50.000000 71.428571 46.153846 50.000000 \n", "6 57.142857 0.000000 61.538462 25.000000 33.333333 22.222222 \n", "7 50.000000 0.000000 66.666667 53.846154 27.272727 20.000000 \n", "8 16.666667 45.454545 16.666667 50.000000 33.333333 30.000000 \n", "9 50.000000 12.500000 75.000000 66.666667 27.272727 12.500000 \n", "\n", " recall_8 recall_9 \n", "0 0.000000 18.181818 \n", "1 75.000000 12.500000 \n", "2 18.181818 50.000000 \n", "3 66.666667 33.333333 \n", "4 78.571429 54.545455 \n", "5 62.500000 61.538462 \n", "6 68.750000 42.857143 \n", "7 63.636364 37.500000 \n", "8 44.444444 50.000000 \n", "9 87.500000 12.500000 \n", "\n", "[10 rows x 38 columns]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+QAAAHWCAYAAAD+cEOeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgcNJREFUeJzs3Xd4VFXixvH3TjLpjRQSSiqhN2nSwQKiYkcURbFiwwarP+wdFevaAUVcXBAL9rVRpPfeW0gglISEkN4mmfv7I5A1CwiEJDeZfD/PwwOZubnzDhxj3px7zzFM0zQFAAAAAABqlM3qAAAAAAAA1EcUcgAAAAAALEAhBwAAAADAAhRyAAAAAAAsQCEHAAAAAMACFHIAAAAAACxAIQcAAAAAwAIUcgAAAAAALEAhBwAAAADAAhRyAAAAAAAsQCEHAAAAAMACFHIAAAAAACxAIQcAAJWSl5dndQQAAOo0CjkAALXEnj17dN9996lly5by9vZWSEiIhg4dqqSkpOOOzczM1OjRoxUTEyNPT081bdpUI0aMUHp6evkxhYWFeu6559SiRQt5eXmpUaNGuuaaa5SQkCBJmjdvngzD0Lx58yqcOykpSYZh6LPPPit/7NZbb5Wfn58SEhJ06aWXyt/fX8OHD5ckLVy4UEOHDlVUVJQ8PT0VGRmp0aNHq6Cg4Ljc27Zt03XXXaewsDB5e3urZcuWevLJJyVJf/75pwzD0HfffXfc502fPl2GYWjp0qVn+tcKAECt5W51AAAAUGblypVasmSJhg0bpqZNmyopKUkfffSRzjvvPG3ZskU+Pj6SpNzcXPXt21dbt27V7bffrs6dOys9PV0//vij9u3bp9DQUJWWluqyyy7TnDlzNGzYMD300EPKycnRrFmztGnTJjVr1uyM85WUlGjQoEHq06eP3njjjfI8X3/9tfLz83XvvfcqJCREK1as0Hvvvad9+/bp66+/Lv/8DRs2qG/fvrLb7brrrrsUExOjhIQE/fTTTxo3bpzOO+88RUZGatq0abr66qsrvPa0adPUrFkz9ezZ8yz+hgEAqF0o5AAA1BKDBw/WtddeW+Gxyy+/XD179tTMmTN18803S5Jef/11bdq0Sd9++22F4vrUU0/JNE1J0tSpUzVnzhy99dZbGj16dPkxjz32WPkxZ6qoqEhDhw7VK6+8UuHx8ePHy9vbu/zju+66S/Hx8XriiSe0d+9eRUVFSZIeeOABmaapNWvWlD8mSa+++qokyTAM3XTTTXrrrbeUlZWlwMBASVJaWpr++OOP8pl0AABcBZesAwBQS/y11DocDh0+fFjx8fEKCgrSmjVryp+bOXOmOnbseNwsslRWao8dExoaqgceeOCkx1TGvffe+7e58/LylJ6erl69esk0Ta1du1ZSWalesGCBbr/99gpl/H/zjBgxQkVFRfrmm2/KH/vyyy9VUlKim266qdK5AQCojSjkAADUEgUFBXrmmWcUGRkpT09PhYaGKiwsTJmZmcrKyio/LiEhQe3atfvbcyUkJKhly5Zyd6+6i+Hc3d3VtGnT4x7fu3evbr31VgUHB8vPz09hYWHq37+/JJXn3r17tySdMnerVq3UrVs3TZs2rfyxadOmqUePHoqPj6+qtwIAQK3AJesAANQSDzzwgKZMmaKHH35YPXv2VGBgoAzD0LBhw+R0Oqv89U42U15aWnrCxz09PWWz2Y47duDAgcrIyNDYsWPVqlUr+fr6av/+/br11lsrlXvEiBF66KGHtG/fPhUVFWnZsmV6//33z/g8AADUdhRyAABqiW+++Ua33HKL3nzzzfLHCgsLlZmZWeG4Zs2aadOmTX97rmbNmmn58uVyOByy2+0nPKZBgwaSdNz59+zZc9qZN27cqB07duhf//qXRowYUf74rFmzKhwXFxcnSafMLUnDhg3TmDFj9MUXX6igoEB2u13XX3/9aWcCAKCu4JJ1AABqCTc3t+MWXHvvvfeOm7EeMmSI1q9ff8LtwY59/pAhQ5Senn7CmeVjx0RHR8vNzU0LFiyo8PyHH354Rpn/es5jf37nnXcqHBcWFqZ+/frp008/1d69e0+Y55jQ0FBdcskl+ve//61p06bp4osvVmho6GlnAgCgrmCGHACAWuKyyy7T559/rsDAQLVp00ZLly7V7NmzFRISUuG4Rx99VN98842GDh2q22+/XV26dFFGRoZ+/PFHTZgwQR07dtSIESM0depUjRkzRitWrFDfvn2Vl5en2bNn67777tOVV16pwMBADR06VO+9954Mw1CzZs30888/69ChQ6eduVWrVmrWrJkeeeQR7d+/XwEBAZo5c6aOHDly3LHvvvuu+vTpo86dO+uuu+5SbGyskpKS9J///Efr1q2rcOyIESPKV5x/8cUXz/wvEwCAOoBCDgBALfHOO+/Izc1N06ZNU2FhoXr37q3Zs2dr0KBBFY7z8/PTwoUL9eyzz+q7777Tv/71LzVs2FAXXnhh+aJrbm5u+uWXXzRu3DhNnz5dM2fOVEhIiPr06aP27duXn+u9996Tw+HQhAkT5Onpqeuuu06vv/76KRdfO8Zut+unn37Sgw8+qFdeeUVeXl66+uqrdf/996tjx44Vju3YsaOWLVump59+Wh999JEKCwsVHR2t66677rjzXn755WrQoIGcTqeuuOKKM/2rBACgTjDMym5GCgAAUE1KSkrUuHFjXX755Zo8ebLVcQAAqBbcQw4AAGqd77//XmlpaRUWigMAwNUwQw4AAGqN5cuXa8OGDXrxxRcVGhqqNWvWWB0JAIBqwww5AACoNT766CPde++9atiwoaZOnWp1HAAAqhUz5AAAAAAAWIAZcgAAAAAALEAhBwAAAADAAi6/D7nT6dSBAwfk7+8vwzCsjgMAAAAAcHGmaSonJ0eNGzeWzXbyeXCXL+QHDhxQZGSk1TEAAAAAAPVMcnKymjZtetLnXb6Q+/v7Syr7iwgICLA4DWobh8OhP/74QxdddJHsdrvVcYBqxXhHfcJ4R33CeEd9UlfGe3Z2tiIjI8v76Mm4fCE/dpl6QEAAhRzHcTgc8vHxUUBAQK3+DxqoCox31CeMd9QnjHfUJ3VtvJ/qtmkWdQMAAAAAwAIUcgAAAAAALEAhBwAAAADAAi5/DzkAAACA+q20tFQOh8PqGKgCDodD7u7uKiwsVGlpqWU53Nzc5O7uftZba1PIAQAAALis3Nxc7du3T6ZpWh0FVcA0TUVERCg5Ofmsy/DZ8vHxUaNGjeTh4VHpc1DIAQAAALik0tJS7du3Tz4+PgoLC7O8wOHsOZ1O5ebmys/PTzabNXdgm6ap4uJipaWlKTExUc2bN690Fgo5AAAAAJfkcDhkmqbCwsLk7e1tdRxUAafTqeLiYnl5eVlWyCXJ29tbdrtde/bsKc9TGSzqBgAAAMClMTOO6lAVPxCgkAMAAAAAYAEKOQAAAAAAFqCQAwAAAICLSkpKkmEYWrdunSRp3rx5MgxDmZmZluaqTv/7nmszCjkAAAAA/I3E9DyN/22bHvhircb/tk2J6Xk18rrJycm6/fbb1bhxY3l4eCg6OloPPfSQDh8+XOlz9urVSwcPHlRgYGAVJi27T//YL3d3d0VFRWnMmDEqKiqq0tc5HZGRkTp48KDatWtX4699plhlHQAAAABO4qtVyXps5gYZhiHTNGUYhibOT9D4IR00tGtktb3u7t271bNnT7Vo0UJffPGFYmNjtXnzZj366KP69ddftWzZMgUHB5/xeT08PBQREVENiaUpU6bo4osvlsPh0Pr163XbbbfJ19dXL774YrW83sm4ublV23usasyQAwAAAKgXTNNUfnHJaf/acjBLj83cIKcplTrNCr+PnblBWw9mnfa5TNM8o6yjRo2Sh4eH/vjjD/Xv319RUVG65JJLNHv2bO3fv19PPvmkJCkmJkYvv/yybr/9dvn7+ysqKkqTJk066Xn/95L1zz77TEFBQfr999/VunVr+fn56eKLL9bBgwcrfN4nn3yi1q1by8vLS61atdKHH3543LmDgoIUERGhyMhIXXbZZbryyiu1Zs2a8ucTEhJ05ZVXKjw8XH5+furWrZtmz55d4RwHDx7U4MGD5e3trdjYWE2fPl0xMTH65z//WX7Mjh071K9fP3l5ealNmzaaPXu2DMPQ999/L+nkl+nPmTNHXbt2lY+Pj3r16qXt27dXeO2XXnpJDRs2lL+/v+6880499thjOuecc/7un+msMUMOAAAAoF4ocJSqzTO/V8m5nKZ0yTuLTvv4LS8Mko/H6dWvjIwM/f777xo3btxx+6dHRERo+PDh+vLLL8tL8ZtvvqkXX3xRTzzxhL755hvde++96t+/v1q2bHlar5efn6833nhDn3/+uWw2m2666SY98sgjmjZtmiRp2rRpeuaZZ/T++++rU6dOWrt2rUaOHClfX1/dcsstJzznjh07NHfuXN16663lj+Xm5urSSy/VuHHj5OnpqalTp+ryyy/X9u3bFRUVJUkaMWKE0tPTNW/ePNntdo0ZM0aHDh0qP0dpaaluuukmRUdHa/ny5crJydE//vGP03qfTz75pN58802FhYXpnnvu0e23367FixeXv8dx48bpww8/VO/evTVjxgy9+eabio2NPa1zVxaFHAAAAABqkZ07d8o0TbVu3fqEz7du3VpHjhxRWlqaJOnSSy/VfffdJ0kaO3as3n77bf3555+nXcgdDocmTJigZs2aSZLuv/9+vfDCC+XPP/vss3rzzTd1zTXXSJJiY2O1ZcsWTZw4sUIhv+GGG+Tm5qaSkhIVFRXp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KC1btkyzZs2Sw+HQRRddpLy8vPJjRo8erZ9++klff/215s+frwMHDuiaa64pf760tFSDBw9WcXGxlixZon/961/67LPP9Mwzz1jxloBTWrlypSZOnKgOHTpUeJyxDldy5MgR9e7dW3a7Xb/++qu2bNmiN998Uw0aNCg/5rXXXtO7776rCRMmaPny5fL19dWgQYNUWFhYfszw4cO1efNmzZo1Sz///LMWLFigu+66y4q3BJzQ+PHj9dFHH+n999/X1q1bNX78eL322mt67733yo9hrKMuy8vLU8eOHfXBBx+c8PmqGN/Z2dm66KKLFB0drdWrV+v111/Xc889p0mTJlX7+zsjJuDiDh06ZEoy58+fb5qmaWZmZpp2u938+uuvy4/ZunWrKclcunSpaZqm+csvv5g2m81MSUkpP+ajjz4yAwICzKKiopp9A8Ap5OTkmM2bNzdnzZpl9u/f33zooYdM02Ssw/WMHTvW7NOnz0mfdzqdZkREhPn666+XP5aZmWl6enqaX3zxhWmaprllyxZTkrly5cryY3799VfTMAxz//791RceOAODBw82b7/99gqPXXPNNebw4cNN02Ssw7VIMr/77rvyj6tqfH/44YdmgwYNKnw/M3bsWLNly5bV/I7ODDPkcHlZWVmSpODgYEnS6tWr5XA4NGDAgPJjWrVqpaioKC1dulSStHTpUrVv317h4eHlxwwaNEjZ2dnavHlzDaYHTm3UqFEaPHhwhTEtMdbhen788Ud17dpVQ4cOVcOGDdWpUyd9/PHH5c8nJiYqJSWlwpgPDAxU9+7dK4z5oKAgde3atfyYAQMGyGazafny5TX3ZoC/0atXL82ZM0c7duyQJK1fv16LFi3SJZdcIomxDtdWVeN76dKl6tevnzw8PMqPGTRokLZv364jR47U0Ls5NXerAwDVyel06uGHH1bv3r3Vrl07SVJKSoo8PDwUFBRU4djw8HClpKSUH/PXgnLs+WPPAbXFjBkztGbNGq1cufK45xjrcDW7d+/WRx99pDFjxuiJJ57QypUr9eCDD8rDw0O33HJL+Zg90Zj+65hv2LBhhefd3d0VHBzMmEet8dhjjyk7O1utWrWSm5ubSktLNW7cOA0fPlySGOtwaVU1vlNSUhQbG3vcOY4999fbnaxEIYdLGzVqlDZt2qRFixZZHQWocsnJyXrooYc0a9Ys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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from capymoa.classifier import OnlineBagging\n", "from capymoa.stream import TorchClassifyStream\n", "from capymoa.evaluation import prequential_evaluation\n", "from capymoa.evaluation.visualization import plot_windowed_results\n", "\n", "from torchvision import datasets\n", "from torchvision.transforms import ToTensor\n", "\n", "pytorchDtaset = datasets.FashionMNIST(\n", " root=\"data\", train=True, download=True, transform=ToTensor()\n", ")\n", "pytorch_stream = TorchClassifyStream(dataset=pytorchDtaset, num_classes=10)\n", "\n", "# Creating a learner\n", "ob_learner = OnlineBagging(schema=pytorch_stream.get_schema(), ensemble_size=5)\n", "\n", "results_ob_learner = prequential_evaluation(\n", " stream=pytorch_stream, learner=ob_learner, window_size=100, max_instances=1000\n", ")\n", "\n", "print(f\"Accuracy: {results_ob_learner.cumulative.accuracy()}\")\n", "display(results_ob_learner.windowed.metrics_per_window())\n", "plot_windowed_results(results_ob_learner, metric=\"accuracy\")" ] } ], "metadata": { "kernelspec": { "display_name": "capymoa", "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.8" } }, "nbformat": 4, "nbformat_minor": 5 }