diff --git a/.github/utilities/run_examples.sh b/.github/utilities/run_examples.sh index 3eeac963a3..fd7376c05b 100755 --- a/.github/utilities/run_examples.sh +++ b/.github/utilities/run_examples.sh @@ -9,6 +9,7 @@ excluded=() if [ "$1" = true ]; then excluded+=( "examples/datasets/load_data_from_web.ipynb" + "examples/benchmarking/published_results.ipynb" "examples/benchmarking/reference_results.ipynb" "examples/benchmarking/bakeoff_results.ipynb" "examples/benchmarking/regression.ipynb" @@ -21,6 +22,7 @@ if [ "$1" = true ]; then "examples/classification/interval_based.ipynb" "examples/classification/shapelet_based.ipynb" "examples/classification/convolution_based.ipynb" + "examples/similarity_search/code_speed.ipynb" ) fi diff --git a/examples/networks/deep_learning.ipynb b/examples/networks/deep_learning.ipynb index 9e06feabbb..7cf092f7f3 100644 --- a/examples/networks/deep_learning.ipynb +++ b/examples/networks/deep_learning.ipynb @@ -64,8 +64,8 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2024-11-21T11:14:08.477299Z", - "start_time": "2024-11-21T11:14:08.433390Z" + "end_time": "2024-11-25T16:48:00.794715Z", + "start_time": "2024-11-25T16:48:00.780244Z" } }, "source": [ @@ -97,7 +97,7 @@ "from aeon.regression.deep_learning import InceptionTimeRegressor" ], "outputs": [], - "execution_count": 7 + "execution_count": 12 }, { "attachments": {}, @@ -116,17 +116,18 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2024-11-21T11:12:15.141664Z", - "start_time": "2024-11-21T11:12:02.084792Z" + "end_time": "2024-11-25T16:48:20.910216Z", + "start_time": "2024-11-25T16:48:02.721649Z" } }, "source": [ - "xtrain, ytrain = load_classification(name=\"ArrowHead\", split=\"train\")\n", - "xtest, ytest = load_classification(name=\"ArrowHead\", split=\"test\")\n", - "\n", - "inc = InceptionTimeClassifier(n_classifiers=5, use_custom_filters=False, n_epochs=3)\n", + "xtrain, ytrain = load_classification(name=\"GunPoint\", split=\"train\")\n", + "xtest, ytest = load_classification(name=\"GunPoint\", split=\"test\")\n", + "xtrain = xtrain[:10, :, :]\n", + "ytrain = ytrain[:10]\n", + "inc = InceptionTimeClassifier(n_classifiers=2, use_custom_filters=False, n_epochs=2)\n", "inc.fit(X=xtrain, y=ytrain)\n", - "ypred = inc.predict(X=xtest)\n", + "ypred = inc.predict(X=xtest[0:5, :, :])\n", "\n", "print(\"Predictions: \", ypred[0:5])\n", "print(\"Ground Truth: \", ytest[0:5])" @@ -136,17 +137,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 72ms/step\n", - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 78ms/step\n", - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 72ms/step\n", - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 74ms/step\n", - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 82ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 358ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 386ms/step\n", "Predictions: ['2' '2' '2' '2' '2']\n", - "Ground Truth: ['0' '0' '0' '0' '0']\n" + "Ground Truth: ['1' '2' '2' '1' '1']\n" ] } ], - "execution_count": 2 + "execution_count": 13 }, { "attachments": {}, @@ -170,17 +168,14 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2024-11-21T11:12:30.252190Z", - "start_time": "2024-11-21T11:12:15.222773Z" + "end_time": "2024-11-25T16:48:52.055955Z", + "start_time": "2024-11-25T16:48:31.172431Z" } }, "source": [ - "xtrain, ytrain = load_classification(name=\"ArrowHead\", split=\"train\")\n", - "xtest, ytest = load_classification(name=\"ArrowHead\", split=\"test\")\n", - "\n", - "inc = InceptionTimeClassifier(n_classifiers=5, use_custom_filters=True, n_epochs=3)\n", + "inc = InceptionTimeClassifier(n_classifiers=2, use_custom_filters=True, n_epochs=2)\n", "inc.fit(X=xtrain, y=ytrain)\n", - "ypred = inc.predict(X=xtest)\n", + "ypred = inc.predict(X=xtest[0:5, :, :])\n", "\n", "print(\"Predictions: \", ypred[0:5])\n", "print(\"Ground Truth: \", ytest[0:5])" @@ -190,17 +185,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 94ms/step\n", - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 91ms/step\n", - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 94ms/step\n", - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 97ms/step\n", - "\u001B[1m3/3\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 96ms/step\n", - "Predictions: ['0' '0' '0' '0' '0']\n", - "Ground Truth: ['0' '0' '0' '0' '0']\n" + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 557ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 1s/step\n", + "Predictions: ['2' '2' '2' '2' '2']\n", + "Ground Truth: ['1' '2' '2' '1' '1']\n" ] } ], - "execution_count": 3 + "execution_count": 14 }, { "cell_type": "markdown", @@ -217,37 +209,36 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2024-11-21T11:12:43.183566Z", - "start_time": "2024-11-21T11:12:30.257417Z" + "end_time": "2024-11-25T16:49:32.976474Z", + "start_time": "2024-11-25T16:49:14.568788Z" } }, "source": [ - "xtrain, ytrain = load_regression(name=\"Covid3Month\", split=\"train\")\n", - "xtest, ytest = load_regression(name=\"Covid3Month\", split=\"test\")\n", + "x_train, y_train = load_regression(name=\"Covid3Month\", split=\"train\")\n", + "x_test, y_test = load_regression(name=\"Covid3Month\", split=\"test\")\n", + "x_train = x_train[:10, :, :]\n", + "y_train = y_train[:10]\n", "\n", - "inc = InceptionTimeRegressor(n_regressors=5, n_epochs=1, use_custom_filters=False)\n", - "inc.fit(X=xtrain, y=ytrain)\n", - "ypred = inc.predict(X=xtest)\n", + "inc = InceptionTimeRegressor(n_regressors=2, n_epochs=1, use_custom_filters=False)\n", + "inc.fit(X=x_train, y=y_train)\n", + "ypred = inc.predict(X=x_test[0:5, :, :])\n", "\n", "print(\"Predictions: \", ypred[0:5])\n", - "print(\"Ground Truth: \", ytest[0:5])" + "print(\"Ground Truth: \", y_train[0:5])" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001B[1m1/1\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 107ms/step\n", - "\u001B[1m1/1\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 109ms/step\n", - "\u001B[1m1/1\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 112ms/step\n", - "\u001B[1m1/1\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 114ms/step\n", - "\u001B[1m1/1\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 108ms/step\n", - "Predictions: [-0.4258549 -0.0387525 -0.01732254 -0.60533425 -4.51287463]\n", - "Ground Truth: [0.0118838 0.00379507 0.08298755 0.04510921 0.12783075]\n" + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 374ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 368ms/step\n", + "Predictions: [ -3.88514614 -0.3810918 -0.2344005 -5.31711912 -37.39011002]\n", + "Ground Truth: [0. 0.07758621 0. 0. 0.15400309]\n" ] } ], - "execution_count": 4 + "execution_count": 15 }, { "attachments": {}, @@ -274,18 +265,15 @@ "cell_type": "code", "metadata": { "ExecuteTime": { - "end_time": "2024-11-21T11:14:19.577898Z", - "start_time": "2024-11-21T11:14:16.120345Z" + "end_time": "2024-11-25T16:49:45.025079Z", + "start_time": "2024-11-25T16:49:38.455222Z" } }, "source": [ - "xtrain, _ = load_classification(name=\"ArrowHead\", split=\"train\")\n", - "xtest, ytest = load_classification(name=\"ArrowHead\", split=\"test\")\n", - "\n", "aefcn = AEFCNClusterer(\n", " temporal_latent_space=False,\n", " estimator=KMeans(n_clusters=3),\n", - " n_epochs=10,\n", + " n_epochs=3,\n", ")\n", "\n", "aefcn.fit(X=xtrain)\n", @@ -298,14 +286,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001B[1m2/2\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 27ms/step\n", - "\u001B[1m6/6\u001B[0m \u001B[32m━━━━━━━━━━━━━━━━━━━━\u001B[0m\u001B[37m\u001B[0m \u001B[1m0s\u001B[0m 8ms/step \n", - "Predictions: [2 0 2 2 2]\n", - "Ground Truth: ['0' '0' '0' '0' '0']\n" + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 99ms/step\n", + "\u001b[1m5/5\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Predictions: [1 0 1 1 0]\n", + "Ground Truth: ['1' '2' '2' '1' '1']\n" ] } ], - "execution_count": 8 + "execution_count": 16 }, { "attachments": {}, @@ -332,42 +320,13 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "11/11 [==============================] - 0s 29ms/step\n", - "11/11 [==============================] - 0s 29ms/step\n", - "['1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1']\n", - "['1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", - " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1']\n" - ] + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:49:51.216960Z", + "start_time": "2024-11-25T16:49:47.246635Z" } - ], + }, "source": [ - "xtrain, ytrain = load_classification(name=\"ArrowHead\", split=\"train\")\n", - "xtest, ytest = load_classification(name=\"ArrowHead\", split=\"test\")\n", - "\n", "fcn = FCNClassifier(\n", " save_best_model=True,\n", " save_last_model=True,\n", @@ -392,7 +351,36 @@ "\n", "os.remove(\"./best_fcn.keras\")\n", "os.remove(\"./last_fcn.keras\")" - ] + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "['1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1']\n", + "['1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1'\n", + " '1' '1' '1' '1' '1' '1']\n" + ] + } + ], + "execution_count": 17 }, { "attachments": {}, @@ -409,24 +397,23 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:50:17.048341Z", + "start_time": "2024-11-25T16:50:17.030069Z" + } + }, "source": [ "# define self-supervised space dimension\n", "\n", "n_dim = 16\n", - "\n", - "# load the data\n", - "\n", - "xtrain, ytrain = load_classification(name=\"ArrowHead\", split=\"train\")\n", - "xtest, ytest = load_classification(name=\"ArrowHead\", split=\"test\")\n", - "\n", "# Flip axis to be handled correctly in tensorflow\n", "\n", "xtrain = np.transpose(xtrain, axes=(0, 2, 1))\n", "xtest = np.transpose(xtest, axes=(0, 2, 1))" - ] + ], + "outputs": [], + "execution_count": 18 }, { "cell_type": "markdown", @@ -437,9 +424,12 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:50:22.513036Z", + "start_time": "2024-11-25T16:50:22.499412Z" + } + }, "source": [ "def triplet_loss_function(alpha):\n", " \"\"\"Create a triplet loss function for triplet-based training.\"\"\"\n", @@ -466,7 +456,9 @@ " return loss\n", "\n", " return temp" - ] + ], + "outputs": [], + "execution_count": 19 }, { "cell_type": "markdown", @@ -477,9 +469,12 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:50:26.420369Z", + "start_time": "2024-11-25T16:50:26.207821Z" + } + }, "source": [ "# Define the triplets input layers\n", "\n", @@ -512,7 +507,9 @@ ")\n", "\n", "SSL_model.compile(loss=triplet_loss_function(alpha=1e-5))" - ] + ], + "outputs": [], + "execution_count": 20 }, { "cell_type": "markdown", @@ -523,9 +520,12 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:50:28.681579Z", + "start_time": "2024-11-25T16:50:28.664819Z" + } + }, "source": [ "def triplet_generation(x):\n", " \"\"\"Generate triplet samples (ref, pos, neg) for triplet loss training.\"\"\"\n", @@ -570,7 +570,9 @@ " neg[i] = w1 * nota + w2 * b2 + w2 * c2\n", "\n", " return ref, pos, neg" - ] + ], + "outputs": [], + "execution_count": 21 }, { "cell_type": "markdown", @@ -581,12 +583,17 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:50:30.987857Z", + "start_time": "2024-11-25T16:50:30.983090Z" + } + }, "source": [ "xtrain_ref, xtrain_pos, xtrain_neg = triplet_generation(x=xtrain)" - ] + ], + "outputs": [], + "execution_count": 22 }, { "cell_type": "markdown", @@ -597,9 +604,12 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:50:35.325071Z", + "start_time": "2024-11-25T16:50:35.314592Z" + } + }, "source": [ "reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(\n", " monitor=\"loss\", factor=0.5, patience=50, min_lr=0.0001\n", @@ -612,7 +622,9 @@ ")\n", "\n", "callbacks = [reduce_lr, model_checkpoint]" - ] + ], + "outputs": [], + "execution_count": 23 }, { "cell_type": "markdown", @@ -623,25 +635,17 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAzeUlEQVR4nO3de3xU9Z3/8fckkAmXZMJFkgDhoiCEOyKXhN8KajQiS0m7i0jdBi2y1YUKS+0qPqxU3W5sEZUqcqmFVBHxCmwRpSEKKkTl2gV0WbGRYE2CIswkARLMnN8fwsCETDJnbieTvJ6Px3k8PN/5nnM+x5Nx3n7nzPnaDMMwBAAAYJEYqwsAAAAtG2EEAABYijACAAAsRRgBAACWIowAAABLEUYAAIClCCMAAMBShBEAAGCpVlYX4A+3262vvvpKCQkJstlsVpcDAAD8YBiGKioq1LVrV8XE+B7/iIow8tVXXyktLc3qMgAAQACOHj2q7t27+3w9KsJIQkKCpO9PJjEx0eJqAACAP1wul9LS0jyf475ERRg5/9VMYmIiYQQAgCjT2C0WQd3A+thjj8lms2nu3LkN9nv11VfVv39/xcfHa/Dgwdq0aVMwhwUAAM1IwGFk586dWr58uYYMGdJgvx07dmjatGmaMWOG9u7dq5ycHOXk5OjAgQOBHhoAADQjAYWRyspK3XbbbfrDH/6gDh06NNh38eLFuummm/TLX/5S6enpevTRR3XVVVfpmWeeCahgAADQvAR0z8isWbM0ceJEZWVl6T//8z8b7FtUVKR58+Z5tWVnZ2v9+vU+t6murlZ1dbVn3eVyBVImACDEDMPQd999p9raWqtLQRMQGxurVq1aBf3YDdNhZO3atdqzZ4927tzpV/+ysjIlJyd7tSUnJ6usrMznNnl5eXr44YfNlgYACKOamhqVlpbq1KlTVpeCJqRt27ZKTU1VXFxcwPswFUaOHj2qOXPmqKCgQPHx8QEftDHz58/3Gk05/9MgAIA13G63iouLFRsbq65duyouLo6HULZwhmGopqZGX3/9tYqLi9W3b98GH2zWEFNhZPfu3Tp27JiuuuoqT1ttba3ee+89PfPMM6qurlZsbKzXNikpKSovL/dqKy8vV0pKis/j2O122e12M6UBAMKopqZGbrdbaWlpatu2rdXloIlo06aNWrdurSNHjqimpibggQpTEeb666/X/v37tW/fPs9y9dVX67bbbtO+ffsuCSKSlJGRocLCQq+2goICZWRkBFQwAMA6gf6fL5qvUPxNmBoZSUhI0KBBg7za2rVrp06dOnnac3Nz1a1bN+Xl5UmS5syZo3HjxmnRokWaOHGi1q5dq127dmnFihVBFw8AAKJfyCNuSUmJSktLPeuZmZlas2aNVqxYoaFDh+q1117T+vXrLwk1AAA0db169dJTTz3ld/+tW7fKZrPp5MmTYatJkvLz85WUlBTWY4RT0I+D37p1a4PrkjRlyhRNmTIl2EMBAGDK+PHjNWzYMFMBoiE7d+5Uu3bt/O6fmZmp0tJSORyOkBy/uYqKuWnC4Xe/k0pLpW+//X557DFp4ECrqwIARJphGKqtrVWrVo1/JF522WWm9h0XF9fgDzbwvRZ7J9Lvfy899ZT0/PPSxo1SSYnVFQFAdHC7pa+/tnZxuxuv8/bbb9e2bdu0ePFi2Ww22Ww2ffHFF56vTt566y2NGDFCdrtdH3zwgT7//HNNnjxZycnJat++vUaOHKktW7Z47bPu1zQ2m03PPfecfvjDH6pt27bq27ev/vu//9vzet2vac5/nbJ582alp6erffv2uummm7xub/juu+90zz33KCkpSZ06ddJ9992n6dOnKycnx9R1Wrp0qa644grFxcWpX79+euGFFzyvGYahX//61+rRo4fsdru6du2qe+65x/P6s88+q759+yo+Pl7Jycn653/+Z1PHNqvFjox07Cj9/e8X1r/91rpaACCaHD8udelibQ3HjkmNDVIsXrxY//d//6dBgwbpkUcekfT9yMYXX3whSbr//vv1+OOP6/LLL1eHDh109OhR3XzzzfrNb34ju92u559/XpMmTdKhQ4fUo0cPn8d5+OGH9bvf/U4LFy7U008/rdtuu01HjhxRx44d6+1/6tQpPf7443rhhRcUExOjf/mXf9G9996rF198UZL029/+Vi+++KJWrVql9PR0LV68WOvXr9e1117r97+fdevWac6cOXrqqaeUlZWljRs36o477lD37t117bXX6vXXX9eTTz6ptWvXauDAgSorK9Nf//pXSdKuXbt0zz336IUXXlBmZqa+/fZbvf/++34fOyBGFHA6nYYkw+l0hmyf48YZhnRh+f3vQ7ZrAGh2Tp8+bXzyySfG6dOnjWPHvP/7acVy7Jh/dY8b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P9/45JNPjH/91381kpKSjLKyMsMwDOMnP/mJcf/993v6b9++3WjVqpXx+OOPG59++qmxYMECo3Xr1sb+/futOgW/3X333YbD4TC2bt1qlJaWepZTp055+tQ934cfftjYvHmz8fnnnxu7d+82br31ViM+Pt44ePCgFafgt1/84hfG1q1bjeLiYmP79u1GVlaW0blzZ+PYsWOGYTSv62oY3/9qoEePHsZ99913yWvRfk0rKiqMvXv3Gnv37jUkGU888YSxd+9ezy9IHnvsMSMpKcnYsGGD8T//8z/G5MmTjd69exunT5/27OO6664znn76ac96Y+97qzR0rjU1NcYPfvADo3v37sa+ffu83sPV1dWefdQ918beC1Zp6FwrKiqMe++91ygqKjKKi4uNLVu2GFdddZXRt29f48yZM559RMt1NYzG/44NwzCcTqfRtm1bY+nSpfXuI1qubbg06zBiGIbx9NNPGz169DDi4uKMUaNGGR9++KHntXHjxhnTp0/36v/KK68YV155pREXF2cMHDjQePPNNyNccWAk1busWrXK06fu+c6dO9fz7yY5Odm4+eabjT179kS+eJOmTp1qpKamGnFxcUa3bt2MqVOnGocPH/a83pyuq2EYxubNmw1JxqFDhy55Ldqv6bvvvlvv3+35c3K73cavfvUrIzk52bDb7cb1119/yb+Hnj17GgsWLPBqa+h9b5WGzrW4uNjne/jdd9/17KPuuTb2XrBKQ+d66tQp48YbbzQuu+wyo3Xr1kbPnj2NmTNnXhIqouW6Gkbjf8eGYRjLly832rRpY5w8ebLefUTLtQ0Xm2EYRliHXgAAABrQbO8ZAQAA0YEwAgAALEUYAQAAliKMAAAASxFGAACApQgjAADAUoQRAABgKcIIAACwFGEEAABYijACAAAsRRgBAACWIowAAABL/X99WhCz4otkVAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:50:53.529773Z", + "start_time": "2024-11-25T16:50:44.026512Z" } - ], + }, "source": [ "history = SSL_model.fit(\n", " [xtrain_ref, xtrain_pos, xtrain_neg],\n", " np.zeros(shape=len(xtrain)),\n", - " epochs=20,\n", + " epochs=4,\n", " callbacks=callbacks,\n", " verbose=False,\n", ")\n", @@ -650,7 +654,20 @@ "plt.plot(history.history[\"loss\"], lw=3, color=\"blue\", label=\"training loss\")\n", "plt.legend()\n", "plt.show()" - ] + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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UyfNnTtXv/vd7ywmQyjr2LGjOnbsWL3dt29fff311yooKNCiRYssJgus0aNH64svvtAnn3xiO0rQa+ixiuTnrI4dO2rbtm0qKSnRm2++qeHDh2v9+vX1lgsbQuKMxUUXXaTo6GgdOnTIMT906JDS09PP+j3p6ele7R8uGnOs6oqNjVX37t311Vdf+SNiSKvvcZWcnKzmzZtbShU6evfuHVGPq5ycHL3zzjtau3atMjIyzrlvpD5nnebNsaorkp6z4uLidPnll6tnz57Kzc1V165dNXXq1LPua+sxFRLFIi4uTj179tTq1aurZ263W6tXr673taWsrCzH/pK0atWqevcPF405VnVVVVWpqKhIrVu39lfMkBWpjytf2bZtW0Q8rowxysnJ0fLly7VmzRpdeuml5/2eSH1sNeZY1RXJz1lut1vl5eVn/Zq1x5RfLw31oSVLlpj4+HizcOFC849//MM88cQTJjU11RQXFxtjjBk2bJiZNGlS9f4bNmwwMTEx5o9//KPZsWOHee6550xsbKwpKiqy9SsEjLfH6re//a354IMPzNdff222bNli7r33XtOsWTOzfft2W79CwBw/ftxs3brVbN261Ugy+fn5ZuvWrWbfvn3GGGMmTZpkhg0bVr3/7t27TUJCgvnlL39pduzYYWbOnGmio6PN+++/b+tXCBhvj1VBQYFZsWKF+fLLL01RUZEZN26ciYqKMh999JGtXyFgnnzySZOSkmLWrVtnDh48WH374YcfqvfhOcujMccqUp+zJk2aZNavX2/27Nlj/v73v5tJkyYZl8tlPvzwQ2NM8DymQqZYGGPM9OnTzSWXXGLi4uJM7969zaZNm6q/1r9/fzN8+HDH/q+//rq54oorTFxcnOncubN59913A5zYHm+O1fjx46v3TUtLM7feeqspLCy0kDrwTr8lsu7t9PEZPny46d+//xnf061bNxMXF2fat29vFixYEPDcNnh7rP77v//bXHbZZaZZs2amRYsWZsCAAWbNmjV2wgfY2Y6TJMdjhecsj8Ycq0h9znrkkUdM27ZtTVxcnGnVqpW54YYbqkuFMcHzmOJj0wEAgM+ExDUWAAAgNFAsAACAz1AsAACAz1AsAACAz1AsAACAz1AsAACAz1AsAACAz1AsAACAz1AsAACAz1AsAACAz1AsAACAz1AsAACAz/x/e/fSxE7DarcAAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 24 }, { "cell_type": "markdown", @@ -661,27 +678,12 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2/2 [==============================] - 1s 10ms/step\n" - ] - }, - { - "data": { - "image/png": "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2TfffFNPPPGEli5dqm3btqm6ulpLlixRW1ubp8z69etVVVWl6dOna/PmzRo/frx27twpSXrmmWd08OBB3X777Xr//fd13XXX6e2335YkVVdXe7bnnnvOvxfZC3RRAQHgqHEovyxfx5znv9El25JVklOi3LTA9MEDCKLu3uw5ADeFHjdunAYNGqTy8nLde++9XZbdsWOHpk+frocfftiz78JWmA5TpkzRlClTVFRUpIyMDJWWluo73/mOJGn8+PEaP368HnvsMc2fP1/r16/X//7f/1tjx47174X1ES04gJ85ahzK25LnFW4kqcHZoLwteXLUBHY2BYAgyMyUkpPdY218sViklBR3OT+LjY3VU089peXLl+uNN97Q4cOHtXPnTv3617++pOy4ceO0d+9evfvuu/rLX/6ip59+Wnv27PE8X1tbq6KiIlVVVeno0aPatm2bPvnkE6Wlpemrr77SsmXLVFFRoaNHj2rHjh3as2eP1xgdXzpadU6dOqXPP/9c1dXV+vjjj/3+e7gYLTiAH7naXcovy5ehSwcaGjJkkUUFZQWaPWG2rFH+HWgIIIisVqmkxD1bymLxHmzcEXqKi/0+wLjD008/rQEDBmjlypX67LPPZLfbfY6DeeCBB3TgwAHNmzdPFotF8+fP18MPP6zf//73kqTBgwfr0KFD2rhxo06cOCG73a5HHnlEDzzwgM6dO6cTJ05o4cKFam5u1vDhw5Wbm+s1aNmXKVOmeP573759Ki0t1TXXXHPJAGh/42ab3GwTflRxpEKzNs66bLnti7ZrZurMwFcIQLf55WabDod7NtWFA45TUtzhJkBTxM3GXzfbpAUH8KPG1u4NIOxuOQBhJjfXPRW8stI9oNhud3dLBajlBp0j4AB+ZB/avQGE3S0HIAxZrdLMmcGuRcRjkDHgR5mjMpVsS5ZFvgcaWmRRii1FmaP8P9AQAHAeAQfwI2uUVSU57vu6XBxyOh4X5xQzwBgAAoyAA/hZblquts7dqpG2kV77k23J2jp3K+vgAEA/YAwOEAC5abmaPWG2Kusq1djaKPtQuzJHZdJyAwD9hIADBIg1yspUcAAIErqoAACA6RBwAACA6RBwAAAwqSNHjshisai6ujrYVel3BBwAABAQDodDf/u3f6sRI0bIZrMpIyND7777br+8NgEHAAA/crW7VHGkQps+2qSKIxVytbuCXaWg+eCDD/S3f/u3euedd7Rv3z7NmjVLd955pw4cOBDw1ybgAADgJ44ah1JLUjVr4yzd47hHszbOUmpJqhw1joC+bnt7u1544QWNHTtWMTExGjVqlH7yk59cUs7lcmnp0qUaPXq0Bg0apAkTJqikpMSrTEVFhaZNm6YrrrhC8fHx+u53v6ujR49Kkv7whz9o1qxZGjp0qGw2m6ZOnaq9e/d2Wq/i4mItX75cN998s8aNG6ef/vSnGjdunP7t3/7Nv78AH5gmDgCAHzhqHMrbkidDhtf+BmeD8rbkBXShz6KiIr322mt68cUXNWPGDDU2NurQoUOXlGtvb1dycrLeeustXXXVVfrwww91//33y263a+7cuTp37pzmzJmj++67T5s2bVJbW5t2794ti8W9EvuCBQs0ZcoUvfzyy7JaraqurtbAgQO7Xc/29na1trZq2LBhfrv2zhBwAADoI1e7S/ll+ZeEG0kyZMgiiwrKCjR7wmy/L/jZ2tqqkpISvfTSS1q0aJEk6dprr9WMGTN05MgRr7IDBw7Us88+63k8evRoVVVVacuWLZo7d66cTqdaWlp0xx136Nprr5UkpaWlecrX1dXpySef1MSJEyVJ48aN61Fd165dq1OnTmnu3Lm9udQeoYsKAIA+qqyr1DHnsU6fN2So3lmvyrpKv792TU2Nzp49q1tvvbVb5detW6epU6dqxIgRGjJkiF599VXV1dVJkoYNG6bFixcrOztbd955p0pKStTY2Og5trCwUPfee6+ysrK0Zs0aHT582PPckCFDPNuDDz54yeuWlpbq2Wef1ZYtW3T11Vf38aovj4ADAEAfNbY2Xr5QD8r1xKBBg7pd9s0339QTTzyhpUuXatu2baqurtaSJUvU1tbmKbN+/XpVVVVp+vTp2rx5s8aPH6+dO3dKkp555hkdPHhQt99+u95//31dd911evvttyVJ1dXVnu2555675HXvvfdebdmyRVlZWX646ssj4AAA0Ef2oXa/luuJcePGadCgQSovL79s2R07dmj69Ol6+OGHNWXKFI0dO9arFabDlClTVFRUpA8//FDXX3+9SktLPc+NHz9ejz32mLZt26bc3FytX79ekjR27FjPdmELzaZNm7RkyRJt2rRJt99+ux+uuHsIOAAA9FHmqEwl25JlkcXn8xZZlGJLUeaoTL+/dmxsrJ56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LNDBgwf13nvv6Xe/+50++OAD3X///Zc97r777lNjY6Nne+GFF/qhtpFn8+bNKiws1KpVq7R//35NmjRJ2dnZOn78uM/yH374oebPn6+lS5fqwIEDmjNnjubMmaM//elP/VzzyNTT90tyr5J74d/S0aNH+7HGkev06dOaNGmS1q1b163ytbW1uv322zVr1ixVV1eroKBA9957r959990A1xR+Z8D0Pv74Y0OSsWfPHs++3//+94bFYjEaGho6Pe6WW24x8vPz+6GGmDZtmvHII494HrtcLiMpKclYvXq1z/Jz5841br/9dq996enpxgMPPBDQesKtp+/X+vXrjbi4uH6qHTojyXj77be7LLN8+XLjW9/6lte+efPmGdnZ2QGsGQKBFpwIUFVVpfj4eN10002efVlZWYqKitKuXbu6PPY3v/mNhg8fruuvv15FRUU6c+ZMoKsbcdra2rRv3z5lZWV59kVFRSkrK0tVVVU+j6mqqvIqL0nZ2dmdlof/9Ob9kqRTp07pmmuuUUpKimbPnq2DBw/2R3XRQ/xtmUdE3mwz0jQ1Nenqq6/22jdgwAANGzZMTU1NnR53zz336JprrlFSUpL++Mc/6qmnntKf//xnORyOQFc5onzxxRdyuVxKSEjw2p+QkKBDhw75PKapqcln+a7eT/hHb96vCRMm6PXXX9eNN96olpYWrV27VtOnT9fBgwe58W+I6exvy+l06quvvtKgQYOCVDP0FAEnjK1YsUI/+9nPuixTU1PT6/NfOEbnhhtukN1u16233qrDhw/r2muv7fV5gUiTkZGhjIwMz+Pp06crLS1Nv/rVr/T8888HsWaAeRFwwtjjjz+uxYsXd1lmzJgxSkxMvGTw47lz5/Tll18qMTGx26+Xnp4uSfr0008JOH40fPhwWa1WNTc3e+1vbm7u9P1JTEzsUXn4T2/er4sNHDhQU6ZM0aeffhqIKqIPOvvbstlstN6EGcbghLERI0Zo4sSJXW7R0dHKyMjQyZMntW/fPs+x77//vtrb2z2hpTuqq6slSXa73d+XEtGio6M1depUlZeXe/a1t7ervLzc61v/hTIyMrzKS9J7773XaXn4T2/er4u5XC599NFH/C2FIP62TCTYo5zRP3JycowpU6YYu3btMv7rv/7LGDdunDF//nzP88eOHTMmTJhg7Nq1yzAMw/j000+N5557zti7d69RW1tr/Ou//qsxZswY43vf+16wLsHU3nzzTSMmJsbYsGGD8fHHHxv333+/ER8fbzQ1NRmGYRh/93d/Z6xYscJTfseOHcaAAQOMtWvXGjU1NcaqVauMgQMHGh999FGwLiGi9PT9evbZZ413333XOHz4sLFv3z7j7rvvNmJjY42DBw8G6xIiRmtrq3HgwAHjwIEDhiTjF7/4hXHgwAHj6NGjhmEYxooVK4y/+7u/85T/7//+b2Pw4MHGk08+adTU1Bjr1q0zrFarUVZWFqxLQC8RcCLEiRMnjPnz5xtDhgwxbDabsWTJEqO1tdXzfG1trSHJ2L59u2EYhlFXV2d873vfM4YNG2bExMQYY8eONZ588kmjpaUlSFdgfv/4j/9ojBo1yoiOjjamTZtm7Ny50/PcLbfcYixatMir/JYtW4zx48cb0dHRxre+9S3j3//93/u5xpGtJ+9XQUGBp2xCQoLxgx/8wNi/f38Qah15tm/fbki6ZOt4fxYtWmTccsstlxwzefJkIzo62hgzZoyxfv36fq83+s5iGIYRxAYkAAAAv2MMDgAAMB0CDgAAMB0CDgAAMB0CDgAAMB0CDgAAMB0CDgAAMB0CDgAAMB0CDgAAMB0CDgAAMB0CDgAAMB0CDgAAMB0CDgAAMJ3/HzMY1LEzIuyPAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:50:57.858973Z", + "start_time": "2024-11-25T16:50:56.487914Z" } - ], + }, "source": [ "plt.cla()\n", "plt.clf()\n", @@ -711,16 +713,41 @@ "\n", "plt.legend()\n", "plt.show()" - ] + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 931ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAGhCAYAAABs9M7gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA3FElEQVR4nO3de3RU5b3/8c/kzsUkQiATIJAIwUBBggFCKC0qWYaWVlLwECNtMI1cKiISRQk/BLS1UXsopIXKoccLVhGkB2mLFKVBLDXDLZD2gECVBYTbTLgsMhAkgcz+/ZHD6MgQbtm5bN6vtfaCeea7936ebMP+uK82wzAMAQAAWEhAY3cAAACgvhFwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5TRIwFm4cKHi4uIUFhamlJQUbdmypc76FStWKDExUWFhYerdu7fWrFlzWc3u3bv1wAMPKCIiQq1atVL//v1VVlZm1hAAAEAzYnrAWb58ufLy8jR79mxt375dffr0UXp6usrLy/3WFxcXKysrS7m5udqxY4cyMjKUkZGhnTt3emv27dunwYMHKzExURs2bNC//vUvPffccwoLCzN7OAAAoBmwmf2yzZSUFPXv318LFiyQJHk8HsXGxmry5MmaPn36ZfWZmZmqrKzU6tWrvW0DBw5UUlKSFi1aJEl66KGHFBwcrD/84Q831CePx6OjR4/qtttuk81mu6FlAACAhmUYhs6cOaMOHTooIOAqx2gME1VVVRmBgYHG+++/79OenZ1tPPDAA37niY2NNebNm+fTNmvWLOOuu+4yDMMwampqjNatWxsvvPCCcf/99xvt2rUzBgwYcNk6vu78+fNGRUWFd/rss88MSUxMTExMTEzNcDp06NBVM0iQTHTixAnV1NQoOjrapz06Olp79uzxO4/T6fRb73Q6JUnl5eU6e/asXnrpJf3iF7/Qyy+/rLVr12rkyJH6+OOPNWTIkMuWWVBQoOeff/6y9kOHDik8PPxGhwcAABqQ2+1WbGysbrvttqvWmhpwzODxeCRJI0aM0NSpUyVJSUlJKi4u1qJFi/wGnPz8fOXl5Xk/X/oBhYeHE3AAAGhmruXyElMDTlRUlAIDA+VyuXzaXS6X7Ha733nsdnud9VFRUQoKClLPnj19anr06KF//OMffpcZGhqq0NDQGx0GAABoZky9iyokJETJyckqKirytnk8HhUVFSk1NdXvPKmpqT71krRu3TpvfUhIiPr376+9e/f61Pz73/9Wly5d6nkEAACgOTL9FFVeXp7Gjh2rfv36acCAAZo/f74qKyuVk5MjScrOzlbHjh1VUFAgSZoyZYqGDBmiuXPnavjw4Vq2bJm2bdumxYsXe5c5bdo0ZWZm6rvf/a7uvfderV27Vn/5y1+0YcMGs4cDAACaAdMDTmZmpo4fP65Zs2bJ6XQqKSlJa9eu9V5IXFZW5nOr16BBg7R06VLNnDlTM2bMUEJCglatWqVevXp5a370ox9p0aJFKigo0BNPPKE777xT//M//6PBgwfXW78Nw9DFixdVU1NTb8vEtQkMDFRQUBC38AMAbpjpz8FpitxutyIiIlRRUeH3IuPq6modO3ZM586da4TeQZJatmypmJgYhYSENHZXAABNxNX231/X7O6iMpvH49H+/fsVGBioDh06KCQkhCMJDcgwDFVXV+v48ePav3+/EhISrv4wJwAAvoGA8w3V1dXepy23bNmysbtzS2rRooWCg4N18OBBVVdX8woOAMB143+Nr4CjBo2Lnz8A4GZwBAcAANSfmhpp40bp2DEpJkb6znekwMAG7wb/m3wLOHDggGw2m0pLSxu7KwAAK1u5UoqLk+69V3r44do/4+Jq2xsYAQcNYsOGDbr77rsVGhqqbt266c0332zsLgEA6tPKldKDD0qHD/u2HzlS297AIYeAA9Pt379fw4cP17333qvS0lI9+eSTevTRR/Xhhx82dtcAAPWhpkaaMkXy9+SZS21PPllb10AIOCapqZE2bJDefbf2z4bYph6PR6+88oq6deum0NBQde7cWS+++KKfvtUoNzdX8fHxatGihe68804VFhb61GzYsEEDBgxQq1atFBkZqW9/+9s6ePCgJOmf//yn7r33Xt12220KDw9XcnKytm3bdsV+LVq0SPHx8Zo7d6569Oihxx9/XA8++KDmzZtXvz8AAEDj2Ljx8iM3X2cY0qFDtXUNhIuMTbByZW2Q/fq27tRJKiyURo40b735+fn6/e9/r3nz5mnw4ME6duyY9uzZc1mdx+NRp06dtGLFCrVt21bFxcUaP368YmJiNHr0aF28eFEZGRkaN26c3n33XVVXV2vLli3e5wGNGTNGffv21auvvqrAwECVlpYqODj4iv1yOBxKS0vzaUtPT9eTTz5Zr+MHADSSY8fqt64eEHDq2aVTkN88SnfpFOQf/2hOyDlz5owKCwu1YMECjR07VpLUtWtXDR48WAcOHPCpDQ4O1vPPP+/9HB8fL4fDoffee0+jR4+W2+1WRUWFfvCDH6hr166Sat/WfklZWZmmTZumxMRESVJCQkKdfXM6nd5Xc1wSHR0tt9utL7/8Ui1atLjhcQMAmoCYmPqtqwecoqpHjXkKcvfu3aqqqtLQoUOvqX7hwoVKTk5Wu3bt1Lp1ay1evFhlZWWSpDZt2uiRRx5Renq6fvjDH6qwsFDHvpa68/Ly9OijjyotLU0vvfSS9u3b5/2udevW3mnixIn1O0gAQNP0ne/Unqq40pP/bTYpNra2roEQcOpRY56CvJ6jIMuWLdPTTz+t3NxcffTRRyotLVVOTo6qq6u9NW+88YYcDocGDRqk5cuXq3v37tq0aZMkac6cOdq1a5eGDx+u9evXq2fPnnr//fclSaWlpd7phRdekCTZ7Xa5XC6fPrhcLoWHh3P0BgCsIDCw9joM6fKQc+nz/PkN+jwcAk49asxTkAkJCWrRooWKioquWvvpp59q0KBBeuyxx9S3b19169bN5yjMJX379lV+fr6Ki4vVq1cvLV261Ptd9+7dNXXqVH300UcaOXKk3njjDUlSt27dvFP79u0lSampqZf1a926dUpNTb2ZIQMAmpKRI2uvw+jY0be9Uyfzrs+oA9fg1KPGPAUZFhamZ599Vs8884xCQkL07W9/W8ePH9euXbsuO22VkJCgt956Sx9++KHi4+P1hz/8QVu3blV8fLyk2tu6Fy9erAceeEAdOnTQ3r179fnnnys7O1tffvmlpk2bpgcffFDx8fE6fPiwtm7dqlGjRl2xbxMnTtSCBQv0zDPP6Kc//anWr1+v9957Tx988EH9/yAAAI1n5EhpxIgm8SRjAk49unQK8sgR/9fh2Gy135t1CvK5555TUFCQZs2apaNHjyomJsbvdTATJkzQjh07lJmZKZvNpqysLD322GP661//Kklq2bKl9uzZoyVLlujkyZOKiYnRpEmTNGHCBF28eFEnT55Udna2XC6XoqKiNHLkSJ+Llr8pPj5eH3zwgaZOnarCwkJ16tRJ//3f/6309HRzfhAAgMYTGCjdc09j90I2w/C3K7Y2t9utiIgIVVRUKDw83Oe78+fPa//+/YqPj7+ht1hfuotK8g05l05BNsJRumbpZrcDAMB66tp/fxPX4NSzJnYKEgCAWxKnqEzQhE5BAgBwSyLgmKSJnIIEAOCWxCkqAABgOQQcAABgOQQcAABgOQQcAABgOQQcAABgOQQcAABgOQScW8CBAwdks9lUWlra2F0BAKBBEHBgumPHjunhhx9W9+7dFRAQoCeffLKxuwQAsDgCjllqaqQNG6R33639s6amsXvUaKqqqtSuXTvNnDlTffr0aezuAABuAQQcM6xcKcXFSffeKz38cO2fcXG17SbyeDx65ZVX1K1bN4WGhqpz58568cUXL6urqalRbm6u4uPj1aJFC915550qLCz0qdmwYYMGDBigVq1aKTIyUt/+9rd18OBBSdI///lP3XvvvbrtttsUHh6u5ORkbdu27Yr9iouLU2FhobKzsxUREVG/gwYAwA9e1VDfLr1O/JsvaT9ypLbdxDdu5ufn6/e//73mzZunwYMH69ixY9qzZ89ldR6PR506ddKKFSvUtm1bFRcXa/z48YqJidHo0aN18eJFZWRkaNy4cXr33XdVXV2tLVu2yPZ/r0QfM2aM+vbtq1dffVWBgYEqLS1VcHCwKWMCAOBGEHDqU02NNGXK5eFGqm2z2aQnn6x9E2c9v3nzzJkzKiws1IIFCzR27FhJUteuXTV48GAdOHDApzY4OFjPP/+893N8fLwcDofee+89jR49Wm63WxUVFfrBD36grl27SpJ69OjhrS8rK9O0adOUmJgoSUpISKjXsQAAcLM4RVWfNm6UDh++8veGIR06VFtXz3bv3q2qqioNHTr0muoXLlyo5ORktWvXTq1bt9bixYtVVlYmSWrTpo0eeeQRpaen64c//KEKCwt17Ngx77x5eXl69NFHlZaWppdeekn79u3zfte6dWvvNHHixPodJAAA16hBAs7ChQsVFxensLAwpaSkaMuWLXXWr1ixQomJiQoLC1Pv3r21Zs0an+8feeQR2Ww2n2nYsGFmDuHafC0E1EvddWjRosU11y5btkxPP/20cnNz9dFHH6m0tFQ5OTmqrq721rzxxhtyOBwaNGiQli9fru7du2vTpk2SpDlz5mjXrl0aPny41q9fr549e+r999+XJJWWlnqnF154oX4HCQDANTI94Cxfvlx5eXmaPXu2tm/frj59+ig9PV3l5eV+64uLi5WVlaXc3Fzt2LFDGRkZysjI0M6dO33qhg0bpmPHjnmnd9991+yhXF1MTP3WXYeEhAS1aNFCRUVFV6399NNPNWjQID322GPq27evunXr5nMU5pK+ffsqPz9fxcXF6tWrl5YuXer9rnv37po6dao++ugjjRw5Um+88YYkqVu3bt6pffv29TdAAACug+kB59e//rXGjRunnJwc9ezZU4sWLVLLli31+uuv+60vLCzUsGHDNG3aNPXo0UM///nPdffdd2vBggU+daGhobLb7d7p9ttvN3soV/ed70idOtVea+OPzSbFxtbW1bOwsDA9++yzeuaZZ/TWW29p37592rRpk1577bXLahMSErRt2zZ9+OGH+ve//63nnntOW7du9X6/f/9+5efny+Fw6ODBg/roo4/0+eefq0ePHvryyy/1+OOPa8OGDTp48KA+/fRTbd261ecaHX8uHdU5e/asjh8/rtLSUn322Wf1/nMAAEAy+SLj6upqlZSUKD8/39sWEBCgtLQ0ORwOv/M4HA7l5eX5tKWnp2vVqlU+bRs2bFD79u11++2367777tMvfvELtW3b1u8yq6qqVFVV5f3sdrtvcERXERgoFRbW3i1ls/lebHwp9MyfX+8XGF/y3HPPKSgoSLNmzdLRo0cVExPj9zqYCRMmaMeOHcrMzJTNZlNWVpYee+wx/fWvf5UktWzZUnv27NGSJUt08uRJxcTEaNKkSZowYYIuXryokydPKjs7Wy6XS1FRURo5cqTPRcv+9O3b1/v3kpISLV26VF26dLnsAmgAAOqDzTD83fJTP44ePaqOHTuquLhYqamp3vZnnnlGn3zyiTZv3nzZPCEhIVqyZImysrK8bb/73e/0/PPPy+VySaq9hqRly5aKj4/Xvn37NGPGDLVu3VoOh0OBfsLDnDlz/O6AKyoqFB4e7tN2/vx57d+/X/Hx8QoLC7uxga9cWXs31dcvOI6NrQ03Jt0ibjX1sh0AAJbidrsVERHhd//9Tc3yNvGHHnrI+/fevXvrrrvuUteuXbVhwwa/dxHl5+f7HBVyu92KjY01r4MjR9beCr5xY+0FxTExtaelTDpyAwAAfJkacKKiohQYGOg98nKJy+WS3W73O4/dbr+uekm64447FBUVpS+++MJvwAkNDVVoaOgNjOAmBAZK99zTsOsEAACS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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 25 }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-25T16:51:00.107975Z", + "start_time": "2024-11-25T16:51:00.093491Z" + } + }, "source": [ "os.remove(\"./best_ssl_model.keras\")" - ] + ], + "outputs": [], + "execution_count": 26 }, { "attachments": {}, diff --git a/examples/transformations/rocket.ipynb b/examples/transformations/rocket.ipynb index 3e1ed7db1d..c992fc1952 100644 --- a/examples/transformations/rocket.ipynb +++ b/examples/transformations/rocket.ipynb @@ -32,41 +32,49 @@ }, { "cell_type": "code", - "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:46.441933Z", "iopub.status.busy": "2020-12-19T14:32:46.441213Z", "iopub.status.idle": "2020-12-19T14:32:46.443225Z", "shell.execute_reply": "2020-12-19T14:32:46.444014Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:32.515016Z", + "start_time": "2024-11-25T17:01:32.504509Z" } }, - "outputs": [], "source": [ "# !pip install --upgrade numba" - ] + ], + "outputs": [], + "execution_count": 33 }, { "cell_type": "code", - "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:46.448396Z", "iopub.status.busy": "2020-12-19T14:32:46.447602Z", "iopub.status.idle": "2020-12-19T14:32:51.904418Z", "shell.execute_reply": "2020-12-19T14:32:51.905034Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:33.167188Z", + "start_time": "2024-11-25T17:01:33.161609Z" } }, - "outputs": [], "source": [ "import numpy as np\n", "from sklearn.linear_model import RidgeClassifierCV\n", "from sklearn.pipeline import make_pipeline\n", "\n", - "from aeon.datasets import load_arrow_head # univariate dataset\n", "from aeon.datasets import load_basic_motions # multivariate dataset\n", + "from aeon.datasets import load_gunpoint # univariate dataset\n", "from aeon.transformations.collection.convolution_based import Rocket" - ] + ], + "outputs": [], + "execution_count": 34 }, { "cell_type": "markdown", @@ -83,19 +91,34 @@ }, { "cell_type": "code", - "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:51.908710Z", "iopub.status.busy": "2020-12-19T14:32:51.908101Z", "iopub.status.idle": "2020-12-19T14:32:51.918987Z", "shell.execute_reply": "2020-12-19T14:32:51.919508Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:34.603321Z", + "start_time": "2024-11-25T17:01:34.573759Z" } }, - "outputs": [], "source": [ - "X_train, y_train = load_arrow_head(split=\"train\")" - ] + "X_train, y_train = load_gunpoint(split=\"train\")\n", + "X_train = X_train[:5, :, :]\n", + "y_train = y_train[:5]\n", + "print(X_train.shape)" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(5, 1, 150)\n" + ] + } + ], + "execution_count": 35 }, { "cell_type": "markdown", @@ -106,21 +129,34 @@ }, { "cell_type": "code", - "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:51.923023Z", "iopub.status.busy": "2020-12-19T14:32:51.922451Z", "iopub.status.idle": "2020-12-19T14:32:52.164365Z", "shell.execute_reply": "2020-12-19T14:32:52.164864Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:35.852821Z", + "start_time": "2024-11-25T17:01:35.837832Z" } }, - "outputs": [], "source": [ - "rocket = Rocket() # by default, ROCKET uses 10,000 kernels\n", + "rocket = Rocket(n_kernels=100) # by default, ROCKET uses 10,000 kernels\n", "rocket.fit(X_train)\n", - "X_train_transform = rocket.transform(X_train)" - ] + "X_train_transform = rocket.transform(X_train)\n", + "print(X_train_transform.shape)" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(5, 200)\n" + ] + } + ], + "execution_count": 36 }, { "cell_type": "markdown", @@ -138,30 +174,448 @@ }, { "cell_type": "code", - "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:52.168847Z", "iopub.status.busy": "2020-12-19T14:32:52.168155Z", "iopub.status.idle": "2020-12-19T14:32:52.284816Z", "shell.execute_reply": "2020-12-19T14:32:52.285506Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:38.060428Z", + "start_time": "2024-11-25T17:01:38.038775Z" } }, + "source": [ + "classifier = RidgeClassifierCV(alphas=np.logspace(-3, 3, 10))\n", + "classifier.fit(X_train_transform, y_train)" + ], "outputs": [ { "data": { - "text/plain": "RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n 4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n 2.15443469e+02, 1.00000000e+03]))", - "text/html": "
RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n       4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n       2.15443469e+02, 1.00000000e+03]))
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + "text/plain": [ + "RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n", + " 4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n", + " 2.15443469e+02, 1.00000000e+03]))" + ], + "text/html": [ + "
RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n",
+       "       4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n",
+       "       2.15443469e+02, 1.00000000e+03]))
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ] }, - "execution_count": 5, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "classifier = RidgeClassifierCV(alphas=np.logspace(-3, 3, 10))\n", - "classifier.fit(X_train_transform, y_train)" - ] + "execution_count": 37 }, { "cell_type": "markdown", @@ -172,20 +626,24 @@ }, { "cell_type": "code", - "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:52.289448Z", "iopub.status.busy": "2020-12-19T14:32:52.288717Z", "iopub.status.idle": "2020-12-19T14:32:53.307829Z", "shell.execute_reply": "2020-12-19T14:32:53.308341Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:39.178929Z", + "start_time": "2024-11-25T17:01:39.136007Z" } }, - "outputs": [], "source": [ - "X_test, y_test = load_arrow_head(split=\"test\")\n", + "X_test, y_test = load_gunpoint(split=\"test\")\n", "X_test_transform = rocket.transform(X_test)" - ] + ], + "outputs": [], + "execution_count": 38 }, { "cell_type": "markdown", @@ -196,7 +654,6 @@ }, { "cell_type": "code", - "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:53.312125Z", @@ -204,21 +661,28 @@ "iopub.status.idle": "2020-12-19T14:32:53.409775Z", "shell.execute_reply": "2020-12-19T14:32:53.410342Z" }, - "scrolled": true + "scrolled": true, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:40.547350Z", + "start_time": "2024-11-25T17:01:40.533334Z" + } }, + "source": [ + "classifier.score(X_test_transform, y_test)" + ], "outputs": [ { "data": { - "text/plain": "0.7771428571428571" + "text/plain": [ + "0.64" + ] }, - "execution_count": 7, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "classifier.score(X_test_transform, y_test)" - ] + "execution_count": 39 }, { "cell_type": "markdown", @@ -235,19 +699,23 @@ }, { "cell_type": "code", - "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:53.413597Z", "iopub.status.busy": "2020-12-19T14:32:53.412786Z", "iopub.status.idle": "2020-12-19T14:32:53.775638Z", "shell.execute_reply": "2020-12-19T14:32:53.776690Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:41.782580Z", + "start_time": "2024-11-25T17:01:41.767897Z" } }, - "outputs": [], "source": [ "X_train, y_train = load_basic_motions(split=\"train\")" - ] + ], + "outputs": [], + "execution_count": 40 }, { "cell_type": "markdown", @@ -258,21 +726,37 @@ }, { "cell_type": "code", - "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:53.794896Z", "iopub.status.busy": "2020-12-19T14:32:53.794345Z", "iopub.status.idle": "2020-12-19T14:32:54.613570Z", "shell.execute_reply": "2020-12-19T14:32:54.614198Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:42.949980Z", + "start_time": "2024-11-25T17:01:42.918211Z" } }, - "outputs": [], "source": [ - "rocket = Rocket()\n", + "rocket = Rocket(n_kernels=100) # by default, ROCKET uses 10,000 kernels\n", "rocket.fit(X_train)\n", - "X_train_transform = rocket.transform(X_train)" - ] + "X_train_transform = rocket.transform(X_train)\n", + "X_train_transform.shape" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "(40, 200)" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 41 }, { "cell_type": "markdown", @@ -283,30 +767,448 @@ }, { "cell_type": "code", - "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:54.618359Z", "iopub.status.busy": "2020-12-19T14:32:54.617890Z", "iopub.status.idle": "2020-12-19T14:32:54.836560Z", "shell.execute_reply": "2020-12-19T14:32:54.837249Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:44.038154Z", + "start_time": "2024-11-25T17:01:44.002549Z" } }, + "source": [ + "classifier = RidgeClassifierCV(alphas=np.logspace(-3, 3, 10))\n", + "classifier.fit(X_train_transform, y_train)" + ], "outputs": [ { "data": { - "text/plain": "RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n 4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n 2.15443469e+02, 1.00000000e+03]))", - "text/html": "
RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n       4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n       2.15443469e+02, 1.00000000e+03]))
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + "text/plain": [ + "RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n", + " 4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n", + " 2.15443469e+02, 1.00000000e+03]))" + ], + "text/html": [ + "
RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n",
+       "       4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n",
+       "       2.15443469e+02, 1.00000000e+03]))
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ] }, - "execution_count": 10, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "classifier = RidgeClassifierCV(alphas=np.logspace(-3, 3, 10))\n", - "classifier.fit(X_train_transform, y_train)" - ] + "execution_count": 42 }, { "cell_type": "markdown", @@ -317,20 +1219,24 @@ }, { "cell_type": "code", - "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:54.841004Z", "iopub.status.busy": "2020-12-19T14:32:54.840351Z", "iopub.status.idle": "2020-12-19T14:32:55.906455Z", "shell.execute_reply": "2020-12-19T14:32:55.907064Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:45.150937Z", + "start_time": "2024-11-25T17:01:45.106121Z" } }, - "outputs": [], "source": [ "X_test, y_test = load_basic_motions(split=\"test\")\n", "X_test_transform = rocket.transform(X_test)" - ] + ], + "outputs": [], + "execution_count": 43 }, { "cell_type": "markdown", @@ -341,7 +1247,6 @@ }, { "cell_type": "code", - "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:55.910253Z", @@ -349,21 +1254,28 @@ "iopub.status.idle": "2020-12-19T14:32:56.008364Z", "shell.execute_reply": "2020-12-19T14:32:56.008931Z" }, - "scrolled": true + "scrolled": true, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:46.229312Z", + "start_time": "2024-11-25T17:01:46.215072Z" + } }, + "source": [ + "classifier.score(X_test_transform, y_test)" + ], "outputs": [ { "data": { - "text/plain": "0.975" + "text/plain": [ + "0.975" + ] }, - "execution_count": 12, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "classifier.score(X_test_transform, y_test)" - ] + "execution_count": 44 }, { "cell_type": "markdown", @@ -380,21 +1292,25 @@ }, { "cell_type": "code", - "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:56.012465Z", "iopub.status.busy": "2020-12-19T14:32:56.011939Z", "iopub.status.idle": "2020-12-19T14:32:56.013801Z", "shell.execute_reply": "2020-12-19T14:32:56.014399Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:47.349648Z", + "start_time": "2024-11-25T17:01:47.345129Z" } }, - "outputs": [], "source": [ "rocket_pipeline = make_pipeline(\n", " Rocket(), RidgeClassifierCV(alphas=np.logspace(-3, 3, 10))\n", ")" - ] + ], + "outputs": [], + "execution_count": 45 }, { "cell_type": "markdown", @@ -405,33 +1321,457 @@ }, { "cell_type": "code", - "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:56.017692Z", "iopub.status.busy": "2020-12-19T14:32:56.017166Z", "iopub.status.idle": "2020-12-19T14:32:56.420648Z", "shell.execute_reply": "2020-12-19T14:32:56.421247Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:49.740497Z", + "start_time": "2024-11-25T17:01:48.459632Z" } }, + "source": [ + "# it is necessary to pass y_train to the pipeline\n", + "# y_train is not used for the transform, but it is used by the classifier\n", + "rocket_pipeline.fit(X_train, y_train)" + ], "outputs": [ { "data": { - "text/plain": "Pipeline(steps=[('rocket', Rocket()),\n ('ridgeclassifiercv',\n RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n 4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n 2.15443469e+02, 1.00000000e+03])))])", - "text/html": "
Pipeline(steps=[('rocket', Rocket()),\n                ('ridgeclassifiercv',\n                 RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n       4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n       2.15443469e+02, 1.00000000e+03])))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + "text/plain": [ + "Pipeline(steps=[('rocket', Rocket()),\n", + " ('ridgeclassifiercv',\n", + " RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n", + " 4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n", + " 2.15443469e+02, 1.00000000e+03])))])" + ], + "text/html": [ + "
Pipeline(steps=[('rocket', Rocket()),\n",
+       "                ('ridgeclassifiercv',\n",
+       "                 RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,\n",
+       "       4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,\n",
+       "       2.15443469e+02, 1.00000000e+03])))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ] }, - "execution_count": 14, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "X_train, y_train = load_arrow_head(split=\"train\")\n", - "\n", - "# it is necessary to pass y_train to the pipeline\n", - "# y_train is not used for the transform, but it is used by the classifier\n", - "rocket_pipeline.fit(X_train, y_train)" - ] + "execution_count": 46 }, { "cell_type": "markdown", @@ -442,30 +1782,41 @@ }, { "cell_type": "code", - "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:32:56.425026Z", "iopub.status.busy": "2020-12-19T14:32:56.424348Z", "iopub.status.idle": "2020-12-19T14:32:57.602704Z", "shell.execute_reply": "2020-12-19T14:32:57.603291Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T17:01:50.960464Z", + "start_time": "2024-11-25T17:01:49.763086Z" } }, + "source": [ + "rocket_pipeline.score(X_test, y_test)" + ], "outputs": [ { "data": { - "text/plain": "0.7885714285714286" + "text/plain": [ + "0.975" + ] }, - "execution_count": 15, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "X_test, y_test = load_arrow_head(split=\"test\")\n", - "\n", - "rocket_pipeline.score(X_test, y_test)" - ] + "execution_count": 47 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "" } ], "metadata": { diff --git a/examples/transformations/tsfresh.ipynb b/examples/transformations/tsfresh.ipynb index da00e2f48e..d1d37d1761 100644 --- a/examples/transformations/tsfresh.ipynb +++ b/examples/transformations/tsfresh.ipynb @@ -17,39 +17,47 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:30:39.713903Z", "iopub.status.busy": "2020-12-19T14:30:39.713342Z", "iopub.status.idle": "2020-12-19T14:30:39.715128Z", "shell.execute_reply": "2020-12-19T14:30:39.715641Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T14:07:05.457198Z", + "start_time": "2024-11-25T14:07:05.449815Z" } }, - "outputs": [], "source": [ "# !pip install --upgrade tsfresh" - ] + ], + "outputs": [], + "execution_count": 1 }, { "cell_type": "code", - "execution_count": null, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:30:39.719083Z", "iopub.status.busy": "2020-12-19T14:30:39.718586Z", "iopub.status.idle": "2020-12-19T14:30:40.743724Z", "shell.execute_reply": "2020-12-19T14:30:40.744213Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T14:07:07.829632Z", + "start_time": "2024-11-25T14:07:06.056664Z" } }, - "outputs": [], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.pipeline import make_pipeline\n", "\n", "from aeon.datasets import load_arrow_head, load_basic_motions\n", "from aeon.transformations.collection.feature_based import TSFresh, TSFreshRelevant" - ] + ], + "outputs": [], + "execution_count": 2 }, { "cell_type": "markdown", @@ -59,46 +67,43 @@ "\n", "We use the ArrowHead data from the [UCR TSC archive](https://timeseriesclassification.com).\n", "as an example dataset. See\n", - "[dataset notebook](https://github.com/aeon-toolkit/aeon/blob/main/examples/datasets\n", - "/provided_data.ipynb) for more details." + "[dataset notebook](https://github.com/aeon-toolkit/aeon/blob/main/examples/datasets/provided_data.ipynb) for more details. We only use the first few cases for examples to speed up the \n", + "notebook. " ] }, { "cell_type": "code", - "execution_count": null, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:30:40.748159Z", "iopub.status.busy": "2020-12-19T14:30:40.747656Z", "iopub.status.idle": "2020-12-19T14:30:40.795200Z", "shell.execute_reply": "2020-12-19T14:30:40.795889Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T14:07:09.120656Z", + "start_time": "2024-11-25T14:07:09.090118Z" } }, - "outputs": [], "source": [ - "X_train, y_train = load_arrow_head(split=\"train\")\n", - "X_test, y_test = load_arrow_head(split=\"test\")\n", + "X, y = load_arrow_head()\n", + "n_cases = 24\n", + "X_train = X[:n_cases, :, :]\n", + "y_train = y[:n_cases]\n", + "X_test = X[n_cases : 2 * n_cases, :, :]\n", + "y_test = y[n_cases : 2 * n_cases]\n", "print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "execution": { - "iopub.execute_input": "2020-12-19T14:30:40.808841Z", - "iopub.status.busy": "2020-12-19T14:30:40.808198Z", - "iopub.status.idle": "2020-12-19T14:30:40.816155Z", - "shell.execute_reply": "2020-12-19T14:30:40.816682Z" - }, - "jupyter": { - "outputs_hidden": false + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(24, 1, 251) (24,) (24, 1, 251) (24,)\n" + ] } - }, - "outputs": [], - "source": [ - "X_train[0]" - ] + ], + "execution_count": 3 }, { "cell_type": "markdown", @@ -114,22 +119,34 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:30:40.829452Z", "iopub.status.busy": "2020-12-19T14:30:40.828907Z", "iopub.status.idle": "2020-12-19T14:30:53.049755Z", "shell.execute_reply": "2020-12-19T14:30:53.050249Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T14:07:16.339473Z", + "start_time": "2024-11-25T14:07:11.573523Z" } }, - "outputs": [], "source": [ "t = TSFresh()\n", "Xt = t.fit_transform(X_train)\n", - "Xt.shape\n", - "Xt2 = t.transform(X_test)" - ] + "Xt2 = t.transform(X_test)\n", + "print(f\"Train shape = {Xt.shape} test shape = {Xt2.shape}\")" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train shape = (24, 777) test shape = (24, 777)\n" + ] + } + ], + "execution_count": 4 }, { "cell_type": "markdown", @@ -143,8 +160,6 @@ }, { "cell_type": "code", - "execution_count": null, - "outputs": [], "source": [ "t = TSFreshRelevant()\n", "t.fit(X_train, y_train)\n", @@ -152,8 +167,25 @@ "Xt.shape" ], "metadata": { - "collapsed": false - } + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-11-25T14:07:32.455607Z", + "start_time": "2024-11-25T14:07:26.124172Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(24, 75)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 5 }, { "cell_type": "markdown", @@ -166,16 +198,18 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:30:53.062147Z", "iopub.status.busy": "2020-12-19T14:30:53.061631Z", "iopub.status.idle": "2020-12-19T14:31:09.307275Z", "shell.execute_reply": "2020-12-19T14:31:09.307781Z" + }, + "ExecuteTime": { + "end_time": "2024-11-25T14:07:41.090159Z", + "start_time": "2024-11-25T14:07:36.403997Z" } }, - "outputs": [], "source": [ "classifier = make_pipeline(\n", " TSFresh(default_fc_parameters=\"efficient\", show_warnings=False),\n", @@ -183,7 +217,20 @@ ")\n", "classifier.fit(X_train, y_train)\n", "classifier.score(X_test, y_test)" - ] + ], + "outputs": [ + { + "data": { + "text/plain": [ + "0.625" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 6 }, { "cell_type": "markdown", @@ -197,26 +244,12 @@ }, { "cell_type": "code", - "execution_count": null, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[7 1 4 4 0 4 4 5 2 1 5 7 4 4 5 0 0 6 6 0 6 4 5 6 3 6 7 1 6 4 4 1 5 0 4 4 7\n", - " 6 6 2 1 0 0 4 6 5 4 6 4 6 6 0 4 6 1 1 4 1 4 1 4 0 1 4 1 5 4 7 4 7 6 4 6 1\n", - " 6 4 6 7 4 6 6 1 6 1 4 7 6 4 6 0 4 6 4 6 6 4 0 3 4 6 4 1 0 0 4 4 6 1 0 7 4\n", - " 6 0 4 4 0 1 6 6 0 2 0 6 0 3 6 5 7 6 4 4 3 6 6 6 1 7 4 6 6 4 4 6 6 0 4 6 4\n", - " 5 0 4 4 6 4 6 1 5 6 6 0 6 0 3 4 4 6 1 5 3 7 6 6 6 7 4]\n" - ] - } - ], "source": [ "from aeon.classification.feature_based import TSFreshClassifier\n", "from aeon.clustering.feature_based import TSFreshClusterer\n", "\n", - "cls = TSFreshClassifier()\n", - "clst = TSFreshClusterer()\n", + "cls = TSFreshClassifier(relevant_feature_extractor=False)\n", + "clst = TSFreshClusterer(n_clusters=2)\n", "\n", "cls.fit(X_train, y_train)\n", "cls.score(X_test, y_test)\n", @@ -225,8 +258,24 @@ "print(clst.predict(X_test))" ], "metadata": { - "collapsed": false - } + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-11-25T14:08:02.405107Z", + "start_time": "2024-11-25T14:07:50.878523Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['0' '1' '0' '1' '1' '2' '0' '1' '1' '0' '1' '1' '0' '2' '0' '0' '0' '2'\n", + " '2' '1' '0' '0' '0' '0']\n", + "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0]\n" + ] + } + ], + "execution_count": 7 }, { "cell_type": "markdown", @@ -242,29 +291,33 @@ }, { "cell_type": "code", - "execution_count": null, + "source": [ + "from aeon.classification.sklearn import RotationForestClassifier\n", + "\n", + "cls = TSFreshClassifier(estimator=RotationForestClassifier(n_estimators=5))\n", + "cls.fit(X_train, y_train)\n", + "cls.score(X_test, y_test)" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-11-25T14:08:13.304452Z", + "start_time": "2024-11-25T14:08:06.677532Z" + } + }, "outputs": [ { "data": { - "text/plain": "0.5771428571428572" + "text/plain": [ + "0.5833333333333334" + ] }, - "execution_count": 9, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "from aeon.classification.sklearn import RotationForestClassifier\n", - "\n", - "cls = TSFreshClassifier(\n", - " relevant_feature_extractor=False, estimator=RotationForestClassifier(n_estimators=5)\n", - ") #\n", - "cls.fit(X_train, y_train)\n", - "cls.score(X_test, y_test)" - ], - "metadata": { - "collapsed": false - } + "execution_count": 8 }, { "cell_type": "markdown", @@ -279,20 +332,6 @@ }, { "cell_type": "code", - "execution_count": null, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1 0 1 1 1 1 1 0 2 0 0 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1\n", - " 1 1 2 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1\n", - " 1 1 1 1 1 1 1 1 1 0 1 2 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1\n", - " 1 1 1 1 1 0 1 1 1 2 1 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", - " 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1]\n" - ] - } - ], "source": [ "from sklearn.cluster import KMeans\n", "\n", @@ -301,8 +340,22 @@ "print(clst.predict(X_test))" ], "metadata": { - "collapsed": false - } + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-11-25T14:08:38.025066Z", + "start_time": "2024-11-25T14:08:33.300907Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 2 0 0 1]\n" + ] + } + ], + "execution_count": 9 }, { "cell_type": "markdown", @@ -316,39 +369,442 @@ }, { "cell_type": "code", - "execution_count": null, - "outputs": [ - { - "data": { - "text/plain": "TSFreshRegressor()", - "text/html": "
TSFreshRegressor()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": "TSFreshRegressor()", - "text/html": "
TSFreshRegressor()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ "from aeon.regression.feature_based import TSFreshRegressor\n", "\n", - "reg = TSFreshRegressor()\n", + "reg = TSFreshRegressor(relevant_feature_extractor=False)\n", "from aeon.datasets import load_covid_3month\n", "\n", - "X, y = load_covid_3month()\n", + "X, y = load_covid_3month(split=\"train\")\n", "reg.fit(X, y)" ], "metadata": { - "collapsed": false - } + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-11-25T14:09:11.745540Z", + "start_time": "2024-11-25T14:08:56.573376Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "TSFreshRegressor(relevant_feature_extractor=False)" + ], + "text/html": [ + "
TSFreshRegressor(relevant_feature_extractor=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 10 }, { "cell_type": "markdown", @@ -363,14 +819,13 @@ "source": [ "## TSFresh with multivariate time series data\n", "\n", - "All three estimators can be used with multivariate time series. The estimators\n", - "calculate the features on each channel independently then concatenate the results.\n", - "The full transform creates `777*n_channels` features." + "``TSFresh`` transformers and all three estimators can be used with multivariate time \n", + "series. The transform calculates the features on each channel independently then \n", + "concatenate the results. The full transform creates `777*n_channels` features." ] }, { "cell_type": "code", - "execution_count": null, "metadata": { "execution": { "iopub.execute_input": "2020-12-19T14:31:09.311742Z", @@ -378,8 +833,17 @@ "iopub.status.idle": "2020-12-19T14:31:09.380791Z", "shell.execute_reply": "2020-12-19T14:31:09.381304Z" }, - "scrolled": true + "scrolled": true, + "ExecuteTime": { + "end_time": "2024-11-25T14:11:57.583864Z", + "start_time": "2024-11-25T14:11:57.545946Z" + } }, + "source": [ + "X_train, y_train = load_basic_motions(split=\"train\")\n", + "X_test, y_test = load_basic_motions(split=\"test\")\n", + "print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)" + ], "outputs": [ { "name": "stdout", @@ -389,16 +853,10 @@ ] } ], - "source": [ - "X_train, y_train = load_basic_motions(split=\"train\")\n", - "X_test, y_test = load_basic_motions(split=\"test\")\n", - "print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)" - ] + "execution_count": 14 }, { "cell_type": "code", - "execution_count": null, - "outputs": [], "source": [ "tsfresh = TSFresh()\n", "X = tsfresh.fit_transform(X_train, y_train)\n", @@ -408,24 +866,32 @@ "collapsed": false, "pycharm": { "is_executing": true + }, + "ExecuteTime": { + "end_time": "2024-11-25T14:12:19.453228Z", + "start_time": "2024-11-25T14:11:58.795027Z" } - } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(40, 4662)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 15 }, { + "metadata": {}, "cell_type": "code", - "execution_count": null, "outputs": [], - "source": [ - "cls = TSFreshClassifier()\n", - "clst = TSFreshClusterer(estimator=KMeans(n_clusters=4))\n", - "cls.fit(X_train, y_train)\n", - "cls.score(X_test, y_test)\n", - "clst.fit(X_train)\n", - "print(cls.predict(X_test))" - ], - "metadata": { - "collapsed": false - } + "execution_count": null, + "source": "" } ], "metadata": {