{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Sweeping method for TN training\n", "***Classification of Breast Cancer dataset using Sweeping method***" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "nbsphinx": { "title": "Anomaly detection with Spaced MPO" } }, "outputs": [], "source": [ "import os\n", "from pathlib import Path\n", "\n", "os.environ[\"KMP_WARNINGS\"] = \"0\"\n", "\n", "import jax\n", "import jax.numpy as jnp\n", "import numpy as np\n", "import optax\n", "import pandas as pd\n", "from jax.nn.initializers import *\n", "from sklearn.datasets import load_breast_cancer\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.utils.class_weight import compute_class_weight\n", "\n", "from tn4ml.embeddings import *\n", "from tn4ml.eval import *\n", "from tn4ml.initializers import *\n", "from tn4ml.metrics import *\n", "from tn4ml.models.model import *\n", "from tn4ml.models.mps import *\n", "from tn4ml.util import *" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Enable 64-bit precision and set matmul precision to highest\n", "jax.config.update(\"jax_enable_x64\", True)\n", "jax.config.update(\"jax_default_matmul_precision\", \"highest\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load dataset\n", "\n", "The dataset can be download from [kaggle.com/breast-cancer/data](https://www.kaggle.com/datasets/rahmasleam/breast-cancer/data)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "load_dir = \"data\"\n", "save_dir = \"results\"\n", "n_classes = 2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train data shape: (364, 30)\n", "Validation data shape: (91, 30)\n", "Test data shape: (114, 30)\n", "Classes: [0 1]\n", "Class weights: [0.78787879 1.36842105]\n" ] } ], "source": [ "# Load data\n", "breast_cancer_path = Path(load_dir) / \"breast-cancer.csv\"\n", "if breast_cancer_path.exists():\n", " data = pd.read_csv(breast_cancer_path)\n", "else:\n", " breast_cancer = load_breast_cancer(as_frame=True)\n", " data = breast_cancer.frame.copy()\n", " data.insert(0, \"id\", np.arange(len(data)))\n", " data[\"diagnosis\"] = data[\"target\"].map({1: \"B\", 0: \"M\"})\n", " data = data.drop(columns=[\"target\"])\n", "\n", "data[\"diagnosis\"] = data[\"diagnosis\"].map({\"M\": 1, \"B\": 0})\n", "\n", "X = data.drop([\"id\", \"diagnosis\"], axis=1)\n", "y = data[\"diagnosis\"].to_numpy()\n", "\n", "feature_min = X.min()\n", "feature_max = X.max()\n", "\n", "X_normalized = (X - feature_min) / (feature_max - feature_min)\n", "X_numpy = X_normalized.to_numpy()\n", "\n", "if os.environ.get(\"CI\"):\n", " X_numpy = X_numpy[:, :2]\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " X_numpy, y, test_size=0.2, random_state=42\n", ")\n", "X_train, X_valid, y_train, y_valid = train_test_split(\n", " X_train, y_train, test_size=0.2, random_state=42\n", ")\n", "\n", "if os.environ.get(\"CI\"):\n", " X_train, y_train = X_train[:4], y_train[:4]\n", " X_valid, y_valid = X_valid[:4], y_valid[:4]\n", " X_test, y_test = X_test[:4], y_test[:4]\n", "\n", "print(\"Train data shape: \", X_train.shape)\n", "print(\"Validation data shape: \", X_valid.shape)\n", "print(\"Test data shape: \", X_test.shape)\n", "\n", "classes = np.unique(y_train)\n", "print(\"Classes: \", classes)\n", "class_weights = compute_class_weight(\n", " class_weight=\"balanced\", classes=classes, y=y_train\n", ")\n", "print(\"Class weights: \", class_weights)\n", "\n", "y_train = integer_to_one_hot(y_train, n_classes)\n", "y_valid = integer_to_one_hot(y_valid, n_classes)\n", "y_test = integer_to_one_hot(y_test, n_classes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define model parameters" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of tensors: 30\n" ] } ], "source": [ "key = jax.random.key(42)\n", "L = X_train.shape[1]\n", "print(\"Number of tensors: \", L)\n", "class_index = int(L // 2)\n", "shape_method = \"noteven\" # default method\n", "compress = False # connected with shape method\n", "embedding = PolynomialEmbedding(\n", " degree=2, n=1, include_bias=True\n", ") # polynomial embedding of degree 2\n", "phys_dim = 3\n", "initializer = randn(0.9)\n", "bond_dim = 1 if os.environ.get(\"CI\") else 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize the MPS model" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "model = MPS_initialize(\n", " L=L,\n", " initializer=initializer,\n", " key=key,\n", " shape_method=shape_method,\n", " compress=compress,\n", " cyclic=False,\n", " phys_dim=phys_dim,\n", " bond_dim=bond_dim,\n", " class_index=class_index,\n", " canonical_center=class_index,\n", " class_dim=n_classes,\n", " add_identity=True,\n", " boundary=\"obc\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define training parameters" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def weighted_crossentropy_loss(*args, **kwargs):\n", " \"\"\"Compute weighted cross-entropy loss.\"\"\"\n", " return CrossEntropyWeighted(class_weights=class_weights)(*args, **kwargs).mean()\n", "\n", "\n", "def crossentropy_loss(*args, **kwargs):\n", " \"\"\"Compute softmax cross-entropy loss.\"\"\"\n", " return OptaxWrapper(optax.softmax_cross_entropy)(*args, **kwargs).mean()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "learning_rate = 1e-4\n", "optimizer = optax.adam\n", "strategy = \"global\" if os.environ.get(\"CI\") else \"sweeps\"\n", "loss = weighted_crossentropy_loss\n", "train_type = TrainingType.SUPERVISED\n", "earlystop = EarlyStopping(min_delta=0, patience=5, monitor=\"loss\", mode=\"min\")\n", "epochs = 1 if os.environ.get(\"CI\") else 20\n", "batch_size = 2 if os.environ.get(\"CI\") else 128\n", "val_batch_size = 2 if os.environ.get(\"CI\") else 30\n", "train_dtype = jnp.float32 if os.environ.get(\"CI\") else jnp.float64\n", "\n", "model.configure(\n", " optimizer=optimizer,\n", " strategy=strategy,\n", " loss=loss,\n", " train_type=train_type,\n", " learning_rate=learning_rate,\n", ")" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "epoch: 100%|██████████ 20/20 , loss=0.8486, val_loss=0.3949, val_acc=0.8889\n" ] } ], "source": [ "history = model.train(\n", " X_train,\n", " targets=y_train,\n", " val_inputs=X_valid,\n", " val_targets=y_valid,\n", " epochs=epochs,\n", " batch_size=batch_size,\n", " embedding=embedding,\n", " normalize=True,\n", " dtype=train_dtype,\n", " earlystop=earlystop,\n", " canonize=(True, class_index),\n", " display_val_acc=not bool(os.environ.get(\"CI\")),\n", " eval_metric=crossentropy_loss,\n", " val_batch_size=val_batch_size,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot loss" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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sds1bNgwrVixotJjvvzySw0ePFhTpkxRVFSUevXqpeeff97tFceKioqUnZ1dYQMAAEDD4LEwm5GRIYfDoaioqArtUVFRSktLq/SY3bt3a8GCBXI4HFq0aJGeeOIJ/f3vf9ef//znKp9n+vTpCgsLc21xcXG1+joAAADgOR6fAFYTTqdTkZGReuONNzRgwACNGzdOjz32mGbNmlXlMdOmTVNWVpZrS05OrseKAQAAUJc8NgEsIiJCPj4+Sk9Pr9Cenp6u6OjoSo+JiYmRn5+ffHx8XG3du3dXWlqaiouL5e/vf9IxAQEBCggIqN3iAQAA4BU81jPr7++vAQMGaOnSpa42p9OppUuXavDgwZUec84552jnzp1yOp2utu3btysmJqbSIAsAAICGzaPDDKZOnao333xT7777rrZu3aq7775beXl5mjx5siRp4sSJmjZtmmv/u+++W0eOHNF9992n7du36+uvv9bzzz+vKVOmeOolAAAAwIM8us7suHHjdOjQIT355JNKS0tT3759tXjxYteksH379sluL8/bcXFx+vbbb/XAAw+oT58+atWqle677z49/PDDnnoJAAAA8CCPrjPrCawzCwAA4N0ssc4sAAAAcKYIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLM1rXSYmnVm5LT6elKAAAAGhzCbF0yDOnTW6VFD0lfTJGcDk9XBAAA0KAQZuuSzSb1vEqy+UjrP5Q+/wOBFgAAoBYRZutar6ulsXMku6+04WPpszslR6mnqwIAAGgQCLP1oecYaezbZqDdOF/67A4CLQAAQC0gzNaXHqOka9+V7H7Spk+lhbdJjhJPVwUAAGBphNn61P1Kadz7ZqDd/Jm04BYCLQAAwBkg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T+W+/fZbQ5KRmJh40n2N9Vz64YcfKv05O/ZeOJ1O44knnjCioqKMgIAA4+KLLz7p/Wvbtq3x1FNPVWhz9zvOity9T3v27Kny99UPP/zgeowT36dT/exalbv3Kj8/37j00kuNli1bGn5+fkbbtm2N22+//aRQ2tjPqWNef/11IygoyMjMzKz0MRrLOVUXbIZhGHXa9QsAAADUEcbMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAI2IzWbT559/7ukyAKDWEGYBoJ5MmjRJNpvtpG3EiBGeLg0ALMvX0wUAQGMyYsQIvf322xXaAgICPFQNAFgfPbMAUI8CAgIUHR1dYWvWrJkkcwjAzJkzddlllykoKEgdOnTQggULKhy/ceNGXXTRRQoKClKLFi10xx13KDc3t8I+c+bMUc+ePRUQEKCYmBjdc889Fe7PyMjQVVddpeDgYHXu3Flffvml676jR49q/PjxatmypYKCgtS5c+eTwjcAeBPCLAB4kSeeeELXXHON1q9fr/Hjx+v666/X1q1bJUl5eXkaPny4mjVrpt9//13z58/X999/XyGszpw5U1OmTNEdd9yhjRs36ssvv1SnTp0qPMczzzyj6667Ths2bNDll1+u8ePH68iRI67n37Jli7755htt3bpVM2fOVERERP29AQBQQzbDMAxPFwEAjcGkSZM0d+5cBQYGVmh/9NFH9eijj8pms+muu+7SzJkzXfedffbZ6t+/v/7973/rzTff1MMPP6zk5GQ1adJEkrRo0SKNHDlSBw4cUFRUlFq1aqXJkyfrz3/+c6U12Gw2Pf7443ruueckmQG5adOm+uabbzRixAiNGjVKERERmjNnTh29CwBQuxgzCwD16MILL6wQViWpefPmru8HDx5c4b7Bgwdr3bp1kqStW7cqPj7eFWQl6ZxzzpHT6VRiYqJsNpsOHDigiy++2G0Nffr0cX3fpEkThYaG6uDBg5Kku+++W9dcc43WrFmjSy+9VGPGjNGQIUNO67UCQH0gzAJAPWrSpMlJH/vXlqCgoGrt5+fnV+G2zWaT0+mUJF122WVKSkrSokWLtGTJEl188cWaMmWK/va3v9V6vQBQGxgzCwBe5Lfffjvpdvfu3SVJ3bt31/r165WXl+e6f/ny5bLb7eratatCQkLUrl07LV269IxqaNmypW6++WbNnTtXM2bM0BtvvHFGjwcAdYmeWQCoR0VFRUpLS6vQ5uvr65pkNX/+fJ111lkaOnSoPvjgA61atUqzZ8+WJI0fP15PPfWUbr75Zj399NM6dOiQ7r33Xk2YMEFRUVGSpKefflp33XWXIiMjddlllyknJ0fLly/XvffeW636nnzySQ0YMEA9e/ZUUVGRvvrqK1eYBgBvRJgFgHq0ePFixcTEVGjr2rWrtm3bJslcaeDjjz/WH/7wB8XExOijjz5Sjx49JEnBwcH69ttvdd9992ngwIEKDg7WNddco5dfftn1WDfffLMKCwv1j3/8Qw899JAiIiI0duzYatfn7++vadOmae/evQoKCtK5556rjz/+uBZeOQDUDVYzAAAvYbPZ9Nlnn2nMmDGeLgUALIMxswAAALAswiwAAAAsizGzAOAlGPUFADVHzywAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAsizALAAAAyyLMAgAAwLIIswAAALAswiwAAAAs6/8BvJs5RhSHRyIAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_loss(history, validation=True, figsize=(8, 6))" ] } ], "metadata": {}, "nbformat": 4, "nbformat_minor": 2 }