diff --git a/POET_Training.ipynb b/POET_Training.ipynb index 22262c4..99e33c2 100644 --- a/POET_Training.ipynb +++ b/POET_Training.ipynb @@ -27,28 +27,12 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 197, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2025-01-23 14:37:53.766781: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", - "2025-01-23 14:37:53.786741: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", - "To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Running Keras in version 3.8.0\n" - ] - } - ], + "outputs": [], "source": [ "import keras\n", + "import tensorflow as tf\n", "import h5py\n", "import numpy as np\n", "import pandas as pd\n", @@ -71,9 +55,18 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 136, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ "%load_ext autoreload\n", "%autoreload 2" @@ -88,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -111,7 +104,7 @@ "optimizer_paper = keras.optimizers.Adam(learning_rate=lr_schedule)\n", "\n", "\n", - "loss = keras.losses.MeanSquaredError()\n", + "loss = keras.losses.Huber()\n", "\n", "sample_fraction = 0.8" ] @@ -125,17 +118,17 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 150, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
Model: \"sequential_2\"\n",
+       "
Model: \"sequential_7\"\n",
        "
\n" ], "text/plain": [ - "\u001b[1mModel: \"sequential_2\"\u001b[0m\n" + "\u001b[1mModel: \"sequential_7\"\u001b[0m\n" ] }, "metadata": {}, @@ -147,11 +140,11 @@ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
        "┃ Layer (type)                     Output Shape                  Param # ┃\n",
        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
-       "│ dense_7 (Dense)                 │ (None, 128)            │         1,664 │\n",
+       "│ dense_27 (Dense)                │ (None, 128)            │         1,280 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_8 (Dense)                 │ (None, 128)            │        16,512 │\n",
+       "│ dense_28 (Dense)                │ (None, 128)            │        16,512 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_9 (Dense)                 │ (None, 12)             │         1,548 │\n",
+       "│ dense_29 (Dense)                │ (None, 9)              │         1,161 │\n",
        "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
        "
\n" ], @@ -159,11 +152,11 @@ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", - "│ dense_7 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,664\u001b[0m │\n", + "│ dense_27 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,280\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_8 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m16,512\u001b[0m │\n", + "│ dense_28 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m16,512\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_9 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m1,548\u001b[0m │\n", + "│ dense_29 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m9\u001b[0m) │ \u001b[38;5;34m1,161\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ] }, @@ -173,11 +166,11 @@ { "data": { "text/html": [ - "
 Total params: 19,724 (77.05 KB)\n",
+       "
 Total params: 18,953 (74.04 KB)\n",
        "
\n" ], "text/plain": [ - "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m19,724\u001b[0m (77.05 KB)\n" + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m18,953\u001b[0m (74.04 KB)\n" ] }, "metadata": {}, @@ -186,11 +179,11 @@ { "data": { "text/html": [ - "
 Trainable params: 19,724 (77.05 KB)\n",
+       "
 Trainable params: 18,953 (74.04 KB)\n",
        "
\n" ], "text/plain": [ - "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m19,724\u001b[0m (77.05 KB)\n" + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m18,953\u001b[0m (74.04 KB)\n" ] }, "metadata": {}, @@ -214,10 +207,10 @@ "# small model\n", "model_simple = keras.Sequential(\n", " [\n", - " keras.Input(shape = (12,), dtype = \"float32\"),\n", + " keras.Input(shape = (9,), dtype = \"float32\"),\n", " keras.layers.Dense(units = 128, activation = \"relu\", dtype = \"float32\"),\n", " keras.layers.Dense(units = 128, activation = \"relu\", dtype = \"float32\"),\n", - " keras.layers.Dense(units = 12, dtype = \"float32\")\n", + " keras.layers.Dense(units = 9, dtype = \"float32\")\n", " ]\n", ")\n", "\n", @@ -227,17 +220,17 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 161, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
Model: \"sequential_5\"\n",
+       "
Model: \"sequential_8\"\n",
        "
\n" ], "text/plain": [ - "\u001b[1mModel: \"sequential_5\"\u001b[0m\n" + "\u001b[1mModel: \"sequential_8\"\u001b[0m\n" ] }, "metadata": {}, @@ -249,13 +242,13 @@ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
        "┃ Layer (type)                     Output Shape                  Param # ┃\n",
        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
-       "│ dense_20 (Dense)                │ (None, 512)            │         6,656 │\n",
+       "│ dense_30 (Dense)                │ (None, 512)            │         5,120 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_21 (Dense)                │ (None, 1024)           │       525,312 │\n",
+       "│ dense_31 (Dense)                │ (None, 1024)           │       525,312 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_22 (Dense)                │ (None, 512)            │       524,800 │\n",
+       "│ dense_32 (Dense)                │ (None, 512)            │       524,800 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_23 (Dense)                │ (None, 12)             │         6,156 │\n",
+       "│ dense_33 (Dense)                │ (None, 9)              │         4,617 │\n",
        "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
        "
\n" ], @@ -263,13 +256,13 @@ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", - "│ dense_20 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m6,656\u001b[0m │\n", + "│ dense_30 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m5,120\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_21 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m525,312\u001b[0m │\n", + "│ dense_31 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m525,312\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_22 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m524,800\u001b[0m │\n", + "│ dense_32 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m524,800\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_23 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m6,156\u001b[0m │\n", + "│ dense_33 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m9\u001b[0m) │ \u001b[38;5;34m4,617\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ] }, @@ -279,11 +272,11 @@ { "data": { "text/html": [ - "
 Total params: 1,062,924 (4.05 MB)\n",
+       "
 Total params: 1,059,849 (4.04 MB)\n",
        "
\n" ], "text/plain": [ - "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m1,062,924\u001b[0m (4.05 MB)\n" + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m1,059,849\u001b[0m (4.04 MB)\n" ] }, "metadata": {}, @@ -292,11 +285,11 @@ { "data": { "text/html": [ - "
 Trainable params: 1,062,924 (4.05 MB)\n",
+       "
 Trainable params: 1,059,849 (4.04 MB)\n",
        "
\n" ], "text/plain": [ - "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m1,062,924\u001b[0m (4.05 MB)\n" + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m1,059,849\u001b[0m (4.04 MB)\n" ] }, "metadata": {}, @@ -319,11 +312,11 @@ "source": [ "# large model\n", "model_large = keras.Sequential(\n", - " [keras.layers.Input(shape=(12,), dtype=dtype),\n", + " [keras.layers.Input(shape=(9,), dtype=dtype),\n", " keras.layers.Dense(512, activation='relu', dtype=dtype),\n", " keras.layers.Dense(1024, activation='relu', dtype=dtype),\n", " keras.layers.Dense(512, activation='relu', dtype=dtype),\n", - " keras.layers.Dense(12, dtype=dtype)\n", + " keras.layers.Dense(9, dtype=dtype)\n", " ])\n", "\n", "model_large.compile(optimizer=optimizer_large, loss = loss)\n", @@ -332,17 +325,17 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
Model: \"sequential_6\"\n",
+       "
Model: \"sequential_5\"\n",
        "
\n" ], "text/plain": [ - "\u001b[1mModel: \"sequential_6\"\u001b[0m\n" + "\u001b[1mModel: \"sequential_5\"\u001b[0m\n" ] }, "metadata": {}, @@ -354,15 +347,15 @@ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
        "┃ Layer (type)                     Output Shape                  Param # ┃\n",
        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
-       "│ dense_24 (Dense)                │ (None, 128)            │         1,664 │\n",
+       "│ dense_19 (Dense)                │ (None, 128)            │         1,664 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_25 (Dense)                │ (None, 256)            │        33,024 │\n",
+       "│ dense_20 (Dense)                │ (None, 256)            │        33,024 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_26 (Dense)                │ (None, 512)            │       131,584 │\n",
+       "│ dense_21 (Dense)                │ (None, 512)            │       131,584 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_27 (Dense)                │ (None, 256)            │       131,328 │\n",
+       "│ dense_22 (Dense)                │ (None, 256)            │       131,328 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_28 (Dense)                │ (None, 12)             │         3,084 │\n",
+       "│ dense_23 (Dense)                │ (None, 12)             │         3,084 │\n",
        "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
        "
\n" ], @@ -370,15 +363,15 @@ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", - "│ dense_24 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,664\u001b[0m │\n", + "│ dense_19 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,664\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_25 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m33,024\u001b[0m │\n", + "│ dense_20 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m33,024\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_26 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m131,584\u001b[0m │\n", + "│ dense_21 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m131,584\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_27 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m131,328\u001b[0m │\n", + "│ dense_22 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m131,328\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_28 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m3,084\u001b[0m │\n", + "│ dense_23 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m3,084\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ] }, @@ -450,7 +443,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 141, "metadata": {}, "outputs": [], "source": [ @@ -474,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 142, "metadata": {}, "outputs": [], "source": [ @@ -520,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 143, "metadata": {}, "outputs": [], "source": [ @@ -554,14 +547,23 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 182, + "metadata": {}, + "outputs": [], + "source": [ + "species_columns = [\"H\", \"O\", \"Charge\", \"Ba\", \"Cl\", \"S_6_\", \"Sr\", \"Barite\", \"Celestite\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 183, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/Users/hannessigner/miniforge3/envs/ai/lib/python3.12/site-packages/sklearn/base.py:1474: ConvergenceWarning: Number of distinct clusters (1) found smaller than n_clusters (2). Possibly due to duplicate points in X.\n", + "/home/signer/bin/miniconda3/envs/training/lib/python3.11/site-packages/sklearn/base.py:1473: ConvergenceWarning: Number of distinct clusters (1) found smaller than n_clusters (2). Possibly due to duplicate points in X.\n", " return fit_method(estimator, *args, **kwargs)\n" ] }, @@ -575,7 +577,7 @@ } ], "source": [ - "X_train, X_val, X_test, y_train, y_val, y_test, scaler_X, scaler_y = preprocessing_training(df_design, df_results, func_dict_in, func_dict_out, \"over\", 'individual', 0.1)" + "X_train, X_val, X_test, y_train, y_val, y_test, scaler_X, scaler_y = preprocessing_training(df_design[species_columns], df_results[species_columns], func_dict_in, func_dict_out, \"off\", 'global', 0.1)" ] }, { @@ -587,7 +589,7 @@ }, { "cell_type": "code", - "execution_count": 164, + "execution_count": 146, "metadata": {}, "outputs": [], "source": [ @@ -601,6 +603,39 @@ " return loss" ] }, + { + "cell_type": "code", + "execution_count": 199, + "metadata": {}, + "outputs": [], + "source": [ + "def custom_loss(scaler_X, scaler_y, FuncTransform, dict_in, dict_out, columns):\n", + " def loss(results, predicted):\n", + " \n", + " predicted = pd.DataFrame(scaler_X.inverse_transform(predicted), columns = columns)\n", + " results = pd.DataFrame(scaler_y.inverse_transform(results), columns = columns)\n", + " \n", + " predicted = FuncTransform(dict_in, dict_out).inverse_transform(predicted)\n", + " results = FuncTransform(dict_in, dict_out).inverse_transform(results)\n", + " \n", + " dBa = tf.keras.backend.abs((predicted[\"Ba\"] + predicted[\"Barite\"]) - (results[\"Ba\"] + results[\"Barite\"]))\n", + " dSr = tf.keras.backend.abs((predicted[\"Sr\"] + predicted[\"Celestite\"]) - (results[\"Sr\"] + results[\"Celestite\"]))\n", + " total_loss = keras.loss.Huber(results, predicted) + 0.1 * dBa + 0.1 * dSr\n", + " \n", + " return total_loss\n", + "\n", + " return loss" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": {}, + "outputs": [], + "source": [ + "model_simple.compile(optimizer=optimizer_simple, loss=custom_loss(scaler_X, scaler_y, FuncTransform, func_dict_in, func_dict_out, species_columns))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -610,54 +645,610 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 188, + "metadata": {}, + "outputs": [], + "source": [ + "# measure time\n", + "def model_training(model):\n", + " start = time.time()\n", + " callback = keras.callbacks.EarlyStopping(monitor='loss', patience=3)\n", + " history = model.fit(X_train.iloc[:, X_train.columns != \"Class\"], \n", + " y_train.iloc[:, y_train.columns != \"Class\"], \n", + " batch_size = batch_size, \n", + " epochs = 20, \n", + " validation_data = (X_val.iloc[:, X_val.columns != \"Class\"], y_val.iloc[:, y_val.columns != \"Class\"]),\n", + " callbacks = [callback])\n", + "\n", + " end = time.time()\n", + "\n", + " print(\"Training took {} seconds\".format(end - start))" + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
HOChargeH_0_O_0_BaClS_2_S_6_SrBariteCelestite
0111.01243455.506219-7.748371e-091.541375e-130.000000e+001.916106e-024.082138e-021.440295e-206.403132e-070.0012500.0022500.999244
1111.01243455.506220-4.672647e-090.000000e+006.197818e-149.637903e-032.189133e-020.000000e+007.449873e-070.0013090.0023080.999244
2111.01243455.508129-1.325997e-091.416456e-130.000000e+005.839037e-075.887491e-042.981540e-174.781732e-040.0007720.0012940.999847
3111.01243455.508676-1.223549e-094.449984e-140.000000e+004.536952e-072.183551e-053.803886e-196.148996e-040.0006250.0010100.999995
4111.01243455.508699-1.216518e-090.000000e+004.098861e-144.496372e-078.098352e-070.000000e+006.205560e-040.0006210.0010001.000000
.......................................
2502495111.01243455.5074883.573897e-090.000000e+001.374167e-109.953042e-072.266555e-030.000000e+003.178142e-040.0014500.0010001.000014
2502496111.01243455.5075013.494199e-090.000000e+001.378928e-109.814307e-072.217997e-030.000000e+003.210423e-040.0014290.0010001.000010
2502497111.01243455.5075123.429947e-090.000000e+001.376072e-109.704342e-072.179066e-030.000000e+003.236905e-040.0014120.0010001.000006
2502498111.01243455.5075203.381818e-090.000000e+001.368903e-109.632999e-072.149820e-030.000000e+003.257170e-040.0014000.0010001.000004
2502499111.01243455.5075253.349044e-090.000000e+001.378174e-109.563975e-072.129912e-030.000000e+003.271123e-040.0013910.0010001.000001
\n", + "

2502500 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " H O Charge H_0_ O_0_ \\\n", + "0 111.012434 55.506219 -7.748371e-09 1.541375e-13 0.000000e+00 \n", + "1 111.012434 55.506220 -4.672647e-09 0.000000e+00 6.197818e-14 \n", + "2 111.012434 55.508129 -1.325997e-09 1.416456e-13 0.000000e+00 \n", + "3 111.012434 55.508676 -1.223549e-09 4.449984e-14 0.000000e+00 \n", + "4 111.012434 55.508699 -1.216518e-09 0.000000e+00 4.098861e-14 \n", + "... ... ... ... ... ... \n", + "2502495 111.012434 55.507488 3.573897e-09 0.000000e+00 1.374167e-10 \n", + "2502496 111.012434 55.507501 3.494199e-09 0.000000e+00 1.378928e-10 \n", + "2502497 111.012434 55.507512 3.429947e-09 0.000000e+00 1.376072e-10 \n", + "2502498 111.012434 55.507520 3.381818e-09 0.000000e+00 1.368903e-10 \n", + "2502499 111.012434 55.507525 3.349044e-09 0.000000e+00 1.378174e-10 \n", + "\n", + " Ba Cl S_2_ S_6_ Sr \\\n", + "0 1.916106e-02 4.082138e-02 1.440295e-20 6.403132e-07 0.001250 \n", + "1 9.637903e-03 2.189133e-02 0.000000e+00 7.449873e-07 0.001309 \n", + "2 5.839037e-07 5.887491e-04 2.981540e-17 4.781732e-04 0.000772 \n", + "3 4.536952e-07 2.183551e-05 3.803886e-19 6.148996e-04 0.000625 \n", + "4 4.496372e-07 8.098352e-07 0.000000e+00 6.205560e-04 0.000621 \n", + "... ... ... ... ... ... \n", + "2502495 9.953042e-07 2.266555e-03 0.000000e+00 3.178142e-04 0.001450 \n", + "2502496 9.814307e-07 2.217997e-03 0.000000e+00 3.210423e-04 0.001429 \n", + "2502497 9.704342e-07 2.179066e-03 0.000000e+00 3.236905e-04 0.001412 \n", + "2502498 9.632999e-07 2.149820e-03 0.000000e+00 3.257170e-04 0.001400 \n", + "2502499 9.563975e-07 2.129912e-03 0.000000e+00 3.271123e-04 0.001391 \n", + "\n", + " Barite Celestite \n", + "0 0.002250 0.999244 \n", + "1 0.002308 0.999244 \n", + "2 0.001294 0.999847 \n", + "3 0.001010 0.999995 \n", + "4 0.001000 1.000000 \n", + "... ... ... \n", + "2502495 0.001000 1.000014 \n", + "2502496 0.001000 1.000010 \n", + "2502497 0.001000 1.000006 \n", + "2502498 0.001000 1.000004 \n", + "2502499 0.001000 1.000001 \n", + "\n", + "[2502500 rows x 12 columns]" + ] + }, + "execution_count": 203, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_results" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
HOChargeH_0_O_0_BaClS_2_S_6_SrBariteCelestite
0111.01243455.508192-7.779554e-092.697041e-262.210590e-152.041069e-024.082138e-020.000000e+000.0004940.0004940.0011.000000
1111.01243455.508427-4.736083e-091.446346e-262.473481e-151.094567e-022.189133e-020.000000e+000.0005530.0005530.0011.000000
2111.01243455.508691-1.311169e-093.889826e-282.769320e-152.943745e-045.887491e-040.000000e+000.0006190.0006190.0011.000000
3111.01243455.508698-1.220023e-091.442658e-292.777193e-151.091776e-052.183551e-050.000000e+000.0006200.0006200.0011.000000
4111.01243455.508699-1.216643e-095.350528e-312.777485e-154.049176e-078.098352e-070.000000e+000.0006200.0006200.0011.000000
.......................................
2502495111.01243455.5074883.573728e-095.424062e-1451.375204e-109.953520e-072.266555e-035.509534e-1490.0003180.0014500.0011.000014
2502496111.01243455.5075013.494007e-092.011675e-1461.377139e-109.817216e-072.217997e-032.043375e-1500.0003210.0014290.0011.000010
2502497111.01243455.5075123.429764e-097.460897e-1481.377819e-109.706451e-072.179066e-037.578467e-1520.0003240.0014120.0011.000006
2502498111.01243455.5075203.381745e-092.767237e-1491.371144e-109.621074e-072.149820e-032.810844e-1530.0003260.0014000.0011.000004
2502499111.01243455.5075253.348864e-095.321610e-1511.376026e-109.564401e-072.129912e-035.405468e-1550.0003270.0013910.0011.000001
\n", + "

2502500 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " H O Charge H_0_ O_0_ \\\n", + "0 111.012434 55.508192 -7.779554e-09 2.697041e-26 2.210590e-15 \n", + "1 111.012434 55.508427 -4.736083e-09 1.446346e-26 2.473481e-15 \n", + "2 111.012434 55.508691 -1.311169e-09 3.889826e-28 2.769320e-15 \n", + "3 111.012434 55.508698 -1.220023e-09 1.442658e-29 2.777193e-15 \n", + "4 111.012434 55.508699 -1.216643e-09 5.350528e-31 2.777485e-15 \n", + "... ... ... ... ... ... \n", + "2502495 111.012434 55.507488 3.573728e-09 5.424062e-145 1.375204e-10 \n", + "2502496 111.012434 55.507501 3.494007e-09 2.011675e-146 1.377139e-10 \n", + "2502497 111.012434 55.507512 3.429764e-09 7.460897e-148 1.377819e-10 \n", + "2502498 111.012434 55.507520 3.381745e-09 2.767237e-149 1.371144e-10 \n", + "2502499 111.012434 55.507525 3.348864e-09 5.321610e-151 1.376026e-10 \n", + "\n", + " Ba Cl S_2_ S_6_ Sr \\\n", + "0 2.041069e-02 4.082138e-02 0.000000e+00 0.000494 0.000494 \n", + "1 1.094567e-02 2.189133e-02 0.000000e+00 0.000553 0.000553 \n", + "2 2.943745e-04 5.887491e-04 0.000000e+00 0.000619 0.000619 \n", + "3 1.091776e-05 2.183551e-05 0.000000e+00 0.000620 0.000620 \n", + "4 4.049176e-07 8.098352e-07 0.000000e+00 0.000620 0.000620 \n", + "... ... ... ... ... ... \n", + "2502495 9.953520e-07 2.266555e-03 5.509534e-149 0.000318 0.001450 \n", + "2502496 9.817216e-07 2.217997e-03 2.043375e-150 0.000321 0.001429 \n", + "2502497 9.706451e-07 2.179066e-03 7.578467e-152 0.000324 0.001412 \n", + "2502498 9.621074e-07 2.149820e-03 2.810844e-153 0.000326 0.001400 \n", + "2502499 9.564401e-07 2.129912e-03 5.405468e-155 0.000327 0.001391 \n", + "\n", + " Barite Celestite \n", + "0 0.001 1.000000 \n", + "1 0.001 1.000000 \n", + "2 0.001 1.000000 \n", + "3 0.001 1.000000 \n", + "4 0.001 1.000000 \n", + "... ... ... \n", + "2502495 0.001 1.000014 \n", + "2502496 0.001 1.000010 \n", + "2502497 0.001 1.000006 \n", + "2502498 0.001 1.000004 \n", + "2502499 0.001 1.000001 \n", + "\n", + "[2502500 rows x 12 columns]" + ] + }, + "execution_count": 202, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_design" + ] + }, + { + "cell_type": "code", + "execution_count": 206, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 0.324673\n", + "1 0.307932\n", + "2 -2.590695\n", + "3 -1.376848\n", + "4 0.045476\n", + " ... \n", + "2502495 -0.000021\n", + "2502496 -0.000129\n", + "2502497 -0.000094\n", + "2502498 0.000537\n", + "2502499 -0.000019\n", + "Length: 2502500, dtype: float64" + ] + }, + "execution_count": 206, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(np.log10(df_results['Ba']) + np.log10(df_results['Barite'])) - (np.log10(df_design['Ba']) + np.log10(df_design['Barite']))" + ] + }, + { + "cell_type": "code", + "execution_count": 201, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Epoch 1/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 0.0018 - val_loss: 3.6601e-05\n", - "Epoch 2/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.6899e-05 - val_loss: 3.6822e-05\n", - "Epoch 3/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.5005e-05 - val_loss: 3.5655e-05\n", - "Epoch 4/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.4032e-05 - val_loss: 3.3455e-05\n", - "Epoch 5/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.3279e-05 - val_loss: 3.3064e-05\n", - "Epoch 6/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.3023e-05 - val_loss: 3.3338e-05\n", - "Epoch 7/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2532e-05 - val_loss: 3.2765e-05\n", - "Epoch 8/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.2749e-05 - val_loss: 3.2730e-05\n", - "Epoch 9/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.2961e-05 - val_loss: 3.2593e-05\n", - "Epoch 10/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2573e-05 - val_loss: 3.2576e-05\n", - "Epoch 11/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.2442e-05 - val_loss: 3.2507e-05\n", - "Epoch 12/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2135e-05 - val_loss: 3.2548e-05\n", - "Epoch 13/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2451e-05 - val_loss: 3.2482e-05\n", - "Epoch 14/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2296e-05 - val_loss: 3.2475e-05\n", - "Epoch 15/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2081e-05 - val_loss: 3.2470e-05\n", - "Epoch 16/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2440e-05 - val_loss: 3.2471e-05\n", - "Epoch 17/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2050e-05 - val_loss: 3.2460e-05\n", - "Epoch 18/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2444e-05 - val_loss: 3.2452e-05\n", - "Epoch 19/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m15s\u001b[0m 2ms/step - loss: 3.2259e-05 - val_loss: 3.2452e-05\n", - "Epoch 20/20\n", - "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m15s\u001b[0m 2ms/step - loss: 3.2442e-05 - val_loss: 3.2448e-05\n", - "Training took 276.5459449291229 seconds\n" + "Epoch 1/20\n" + ] + }, + { + "ename": "NotImplementedError", + "evalue": "Cannot convert a symbolic tf.Tensor (sequential_7_1/dense_29_1/Add:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNotImplementedError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[201], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m model_training(model_simple)\n", + "Cell \u001b[0;32mIn[188], line 5\u001b[0m, in \u001b[0;36mmodel_training\u001b[0;34m(model)\u001b[0m\n\u001b[1;32m 3\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 4\u001b[0m callback \u001b[38;5;241m=\u001b[39m keras\u001b[38;5;241m.\u001b[39mcallbacks\u001b[38;5;241m.\u001b[39mEarlyStopping(monitor\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mloss\u001b[39m\u001b[38;5;124m'\u001b[39m, patience\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m3\u001b[39m)\n\u001b[0;32m----> 5\u001b[0m history \u001b[38;5;241m=\u001b[39m model\u001b[38;5;241m.\u001b[39mfit(X_train\u001b[38;5;241m.\u001b[39miloc[:, X_train\u001b[38;5;241m.\u001b[39mcolumns \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m], \n\u001b[1;32m 6\u001b[0m y_train\u001b[38;5;241m.\u001b[39miloc[:, y_train\u001b[38;5;241m.\u001b[39mcolumns \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m], \n\u001b[1;32m 7\u001b[0m batch_size \u001b[38;5;241m=\u001b[39m batch_size, \n\u001b[1;32m 8\u001b[0m epochs \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m20\u001b[39m, \n\u001b[1;32m 9\u001b[0m validation_data \u001b[38;5;241m=\u001b[39m (X_val\u001b[38;5;241m.\u001b[39miloc[:, X_val\u001b[38;5;241m.\u001b[39mcolumns \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m], y_val\u001b[38;5;241m.\u001b[39miloc[:, y_val\u001b[38;5;241m.\u001b[39mcolumns \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m]),\n\u001b[1;32m 10\u001b[0m callbacks \u001b[38;5;241m=\u001b[39m [callback])\n\u001b[1;32m 12\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTraining took \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(end \u001b[38;5;241m-\u001b[39m start))\n", + "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/keras/src/utils/traceback_utils.py:122\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 119\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n\u001b[1;32m 120\u001b[0m \u001b[38;5;66;03m# To get the full stack trace, call:\u001b[39;00m\n\u001b[1;32m 121\u001b[0m \u001b[38;5;66;03m# `keras.config.disable_traceback_filtering()`\u001b[39;00m\n\u001b[0;32m--> 122\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 124\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n", + "Cell \u001b[0;32mIn[199], line 4\u001b[0m, in \u001b[0;36mcustom_loss..loss\u001b[0;34m(results, predicted)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mloss\u001b[39m(results, predicted):\n\u001b[0;32m----> 4\u001b[0m predicted \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame(scaler_X\u001b[38;5;241m.\u001b[39minverse_transform(predicted), columns \u001b[38;5;241m=\u001b[39m columns)\n\u001b[1;32m 5\u001b[0m results \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame(scaler_y\u001b[38;5;241m.\u001b[39minverse_transform(results), columns \u001b[38;5;241m=\u001b[39m columns)\n\u001b[1;32m 7\u001b[0m predicted \u001b[38;5;241m=\u001b[39m FuncTransform(dict_in, dict_out)\u001b[38;5;241m.\u001b[39minverse_transform(predicted)\n", + "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/sklearn/preprocessing/_data.py:566\u001b[0m, in \u001b[0;36mMinMaxScaler.inverse_transform\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 562\u001b[0m check_is_fitted(\u001b[38;5;28mself\u001b[39m)\n\u001b[1;32m 564\u001b[0m xp, _ \u001b[38;5;241m=\u001b[39m get_namespace(X)\n\u001b[0;32m--> 566\u001b[0m X \u001b[38;5;241m=\u001b[39m check_array(\n\u001b[1;32m 567\u001b[0m X,\n\u001b[1;32m 568\u001b[0m copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcopy,\n\u001b[1;32m 569\u001b[0m dtype\u001b[38;5;241m=\u001b[39m_array_api\u001b[38;5;241m.\u001b[39msupported_float_dtypes(xp),\n\u001b[1;32m 570\u001b[0m force_writeable\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m 571\u001b[0m force_all_finite\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mallow-nan\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 572\u001b[0m )\n\u001b[1;32m 574\u001b[0m X \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmin_\n\u001b[1;32m 575\u001b[0m X \u001b[38;5;241m/\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mscale_\n", + "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/sklearn/utils/validation.py:1012\u001b[0m, in \u001b[0;36mcheck_array\u001b[0;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[0m\n\u001b[1;32m 1010\u001b[0m array \u001b[38;5;241m=\u001b[39m xp\u001b[38;5;241m.\u001b[39mastype(array, dtype, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 1011\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1012\u001b[0m array \u001b[38;5;241m=\u001b[39m _asarray_with_order(array, order\u001b[38;5;241m=\u001b[39morder, dtype\u001b[38;5;241m=\u001b[39mdtype, xp\u001b[38;5;241m=\u001b[39mxp)\n\u001b[1;32m 1013\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ComplexWarning \u001b[38;5;28;01mas\u001b[39;00m complex_warning:\n\u001b[1;32m 1014\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 1015\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mComplex data not supported\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(array)\n\u001b[1;32m 1016\u001b[0m ) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcomplex_warning\u001b[39;00m\n", + "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/sklearn/utils/_array_api.py:745\u001b[0m, in \u001b[0;36m_asarray_with_order\u001b[0;34m(array, dtype, order, copy, xp, device)\u001b[0m\n\u001b[1;32m 743\u001b[0m array \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39marray(array, order\u001b[38;5;241m=\u001b[39morder, dtype\u001b[38;5;241m=\u001b[39mdtype)\n\u001b[1;32m 744\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 745\u001b[0m array \u001b[38;5;241m=\u001b[39m numpy\u001b[38;5;241m.\u001b[39masarray(array, order\u001b[38;5;241m=\u001b[39morder, dtype\u001b[38;5;241m=\u001b[39mdtype)\n\u001b[1;32m 747\u001b[0m \u001b[38;5;66;03m# At this point array is a NumPy ndarray. We convert it to an array\u001b[39;00m\n\u001b[1;32m 748\u001b[0m \u001b[38;5;66;03m# container that is consistent with the input's namespace.\u001b[39;00m\n\u001b[1;32m 749\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m xp\u001b[38;5;241m.\u001b[39masarray(array)\n", + "\u001b[0;31mNotImplementedError\u001b[0m: Cannot convert a symbolic tf.Tensor (sequential_7_1/dense_29_1/Add:0) to a numpy array. This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported." ] } ], @@ -665,63 +1256,168 @@ "model_training(model_simple)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test Mass Balance" + ] + }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 164, + "metadata": {}, + "outputs": [], + "source": [ + "def mass_balance(model, X, scaler_X, scaler_y, func_dict_in, func_dict_out):\n", + " \n", + " # predict the chemistry\n", + " columns = X.iloc[:, X.columns != \"Class\"].columns\n", + " prediction = pd.DataFrame(model.predict(X[columns]), columns=columns)\n", + " # backtransform min/max\n", + " X = pd.DataFrame(scaler_X.inverse_transform(X.iloc[:, X.columns != \"Class\"]), columns=columns)\n", + " prediction = pd.DataFrame(scaler_y.inverse_transform(prediction), columns=columns)\n", + " \n", + " # backtransform log\n", + " X = FuncTransform(func_dict_in, func_dict_out).inverse_transform(X)\n", + " prediction = FuncTransform(func_dict_in, func_dict_out).inverse_transform(prediction)\n", + " \n", + " # calculate mass balance\n", + " dBa = np.abs((prediction[\"Ba\"] + prediction[\"Barite\"]) - (X[\"Ba\"] + X[\"Barite\"]))\n", + " dSr = np.abs((prediction[\"Sr\"] + prediction[\"Celestite\"]) - (X[\"Sr\"] + X[\"Celestite\"]))\n", + " \n", + " return dBa + dSr" + ] + }, + { + "cell_type": "code", + "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n" + "\u001b[1m7821/7821\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 328us/step\n" ] - }, + } + ], + "source": [ + "columns = X_test.columns[X_test.columns != \"Class\"]\n", + "prediction = pd.DataFrame(model_simple.predict(X_test[columns]), columns = columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m7821/7821\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 1ms/step\n" + ] + } + ], + "source": [ + "mass_balance_results = mass_balance(model_large, X_test, scaler_X, scaler_y, func_dict_in, func_dict_out)" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "metadata": {}, + "outputs": [ { "data": { - "image/png": "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bNkymzZtmvl8PrvmmmuCwogkO++886xdu3Y2Z84cW758uX3++edmZjZ06FB78cUXLSsry7Kysuyxxx6zqKiowPvmRHVUFmbee+89q127tnXs2NHmzZtnCxcutPT0dPN4PDZ37txAv/Iw06JFC7vnnnvsnXfesRdeeMHq1atnV199daBfbm6uRUZGWvfu3W3hwoX23nvv2WuvvWaDBw+uEHzx74UwA+fk5eWZJBswYMBx+916660myXbu3HnMPq1btw7MOpxIaWmpJSQkWNu2ba20tDTQXlRUZI0bN7YuXboE2soDwaRJk4K2MWLECIuMjAx8wLz//vsmycaPH3/M/W7dutXCw8PtnnvuCWovKioyv99vt9xyS6BtyJAhJsn++te/BvXt3bu3tWrVKvD4hx9+MEn28MMPV9hfee0PPfTQcUbjZyUlJbZv3z6LiYkJCl9/+9vfTJKtWLGiwnOODjPlwerosZo3b55Jsueeey7QVj4j9O233wbaDh48aPXr17dhw4Ydt9Znn3220rF56qmnTJItXbrUzMx27dplERER9sADDwT1u+WWWyw+Pt5++uknMzN7/fXXTZLNnz8/qF9OTo5JshkzZgTVHRYWZl9++eVxayx3dJgxM7vooossLS2tQt/MzEyrVauW5eTkBLX//e9/N0n21ltvBdokmc/nsx9//PG4+y8tLbWffvrJHn30UWvQoEFQIDpWHZWFmcsuu8waN25sRUVFgbaSkhJLSUmxpk2bBrZbHmZGjBgRtM1JkyaZJNuxY0fQMX366afHrR//fjgBGOcsM5MkeTyeKtnel19+qe+//16DBw9WrVr/96dTp04d3Xjjjfr444914MCBoOf86le/Cnrcrl07HTp0SPn5+ZKkt99+W5I0cuTIY+73nXfeUUlJiW6//XaVlJQElsjISKWlpVU4idfj8ahfv34V9vvtt9+e0vHeeOONFdr27dunsWPH6oILLlB4eLjCw8NVp04d7d+/X1988cUpbb/c8uXLJf18Bc+Rbr75ZsXExOjdd98Nam/fvr2aNWsWeBwZGalf/OIXJzy+5cuXKyYmRjfddFNQe/l+y/fToEED9evXT7Nnz1ZZWZkkac+ePVq0aJFuv/32wPlZixcvVt26ddWvX7+g16V9+/by+/0VXpd27drpF7/4xYkH5BQtXrxYKSkpat++fVAdPXr0kMfjqVDHNddco3r16lXYzvLly9WtWzf5fD6FhYWpdu3aeuihh7R79+7A+/VU7N+/X6tXr9ZNN90UdGVWWFiYBg8erO3bt+vLL78Mek5lfy+SAq9t+/btFRERobvuukuzZ8/WN998c8p14dxEmIFzGjZsqOjoaOXm5h6335YtWxQdHa369esfs0+zZs30ww8/aP/+/Sfc7+7duyX9fNXG0RISElRWVqY9e/YEtTdo0CDosdfrlfTzyZ+S9MMPPygsLEx+v/+Y+925c6ck6ZJLLlHt2rWDlnnz5mnXrl1B/aOjoxUZGVlhv4cOHTrhMR6psuMcOHCgpk+frt/+9rd65513tGbNGuXk5KhRo0aBYzpVu3fvVnh4uBo1ahTU7vF45Pf7A+Ne7ugxlX4+vhPtf/fu3fL7/RXCbePGjRUeHh60nzvvvFPfffedsrKyJEmvv/66iouLgwLXzp07tXfvXkVERFR4XfLy8iq8LpWNZ1XYuXOnPvvsswo1xMbGysxOqo41a9YoPT1dkvT888/ro48+Uk5OjsaPHy9Jp/Xa7tmzR2Z2zL8XSSd8bY/+ezn//PO1bNkyNW7cWCNHjtT555+v888/X9OmTTvl+nBu4WomOCcsLExXX321lixZou3btwddgVRu+/btWrdunXr16qWwsLBjbqtHjx5aunSp/vGPf2jAgAHH3W/5P7Q7duyosO77779XrVq1Kv0/3uNp1KiRSktLlZeXd8wPu4YNG0qS/v73vyspKemUtn8mjv7QLygo0OLFi/Xwww/r/vvvD7QXFxfrxx9/PO39NGjQQCUlJfrhhx+CAo2ZKS8vT5dccslpb/vo/axevVpmFnRs+fn5KikpCYyz9PP7IiEhQbNmzVKPHj00a9Yspaamqk2bNoE+DRs2VIMGDbRkyZJK9xcbGxv0uKpmCI/WsGFDRUVF6aWXXjrm+hPVMXfuXNWuXVuLFy8OCsILFy487brq1aunWrVqHfPvpbLaTsaVV16pK6+8UqWlpVq7dq3+/Oc/KyMjQ/Hx8Sf8G8a5i5kZOGncuHEyM40YMUKlpaVB60pLS3X33XfLzDRu3Ljjbuc3v/mN/H6/xowZo++++67SPgsWLJAktWrVSuedd57mzJkT+ApL+nk6ff78+ercufMpX77cq1cvSdLMmTOP2adHjx4KDw/X119/rU6dOlW6nKqj/4/3ZHg8HplZ4LnlXnjhhQqvwals/9prr5Ukvfrqq0Ht8+fP1/79+wPrz9S1116rffv2VfiA/stf/hJUh/R/X4UsXLhQH3zwgdauXas777wz6Hl9+/bV7t27VVpaWulr0qpVqyqpu9yxZp/69u2rr7/+Wg0aNKi0jpO5QaHH41F4eHhQ8D948KBeeeWVk67jaDExMUpNTdWCBQuC+peVlenVV19V06ZNz+hrt7CwMKWmpuqZZ56RJK1fv/60twX3MTMDJ11++eWaOnWqMjIydMUVV2jUqFFq1qyZtm7dqmeeeUarV6/W1KlT1aVLl+Nux+fzadGiRerbt686dOigUaNGqXPnzoqIiNDmzZv16quv6p///Kf69++vWrVqadKkSRo0aJD69u2rYcOGqbi4WH/84x+1d+9ePfnkk6d8HFdeeaUGDx6sxx9/XDt37lTfvn3l9Xr1ySefKDo6Wvfcc4+aN2+uRx99VOPHj9c333yjnj17ql69etq5c6fWrFmjmJgYPfLII6e039jYWCUlJWnRokW69tprVb9+fTVs2PC4H3xxcXG66qqr9Mc//jHQNzs7Wy+++KLq1q0b1DclJUWS9Nxzzyk2NlaRkZFKTk6u9Cui7t27q0ePHho7dqwKCwt1+eWX67PPPtPDDz+sDh06aPDgwad0bMdy++2365lnntGQIUO0ZcsWtW3bVh9++KEmTpyo3r17q1u3bkH977zzTj311FMaOHCgoqKidOuttwatHzBggF577TX17t1bo0eP1qWXXqratWtr+/btWrFiha677jrdcMMNVVK7JLVt21Zz587VvHnz1KJFC0VGRqpt27bKyMjQ/PnzddVVV+l3v/ud2rVrp7KyMm3dulVLly7V73//e6Wmph5323369NGUKVM0cOBA3XXXXdq9e7cmT55cIbger47KZGZmqnv37rr66qt13333KSIiQjNmzNDnn3+u119//ZRnq5599lktX75cffr0UbNmzXTo0KHAjNTRrx/+zYTs1GOgCqxatcpuuukmi4+Pt/DwcGvcuLH179+/wn1fTiQvL8/Gjh1rF110kUVHR5vX67ULLrjAhg0bZhs2bAjqu3DhQktNTbXIyEiLiYmxa6+91j766KOgPuVXBJVfrlyu/KqN3NzcQFtpaan96U9/spSUFIuIiDCfz2edO3e2f/zjHxX2e/XVV1tcXJx5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3XXW6gBwdoWHugAAOJHDhw8rIiLitJ/fqFGjKqwGQE3DzAyAajF06FBlZ2dr2rRp8ng88ng82rJliyRp06ZN6t27t+rUqaP4+HgNHjxYu3btCjy3a9euGjVqlO699141bNhQ3bt3lyRNmTJFbdu2VUxMjBITEzVixAjt27dPkvTee+/pjjvuUEFBQWB/EyZMkFTxa6atW7fquuuuU506dRQXF6dbbrlFO3fuDKyfMGGC2rdvr1deeUXNmzeXz+fTgAEDVFRUVL2DBuC0EGYAVItp06apc+fO+o//+A/t2LFDO3bsUGJionbs2KG0tDS1b99ea9eu1ZIlS7Rz507dcsstQc+fPXu2wsPD9dFHH+m///u/JUm1atXS008/rc8//1yzZ8/W8uXLNWbMGElSly5dNHXqVMXFxQX2d99991Woy8x0/fXX68cff1R2draysrL09ddf69Zbbw3q9/XXX2vhwoVavHixFi9erOzsbD355JPVNFoAzgRfMwGoFj6fTxEREYqOjpbf7w+0z5w5UxdffLEmTpwYaHvppZeUmJior776Sr/4xS8kSRdccIEmTZoUtM0jz79JTk7WY489prvvvlszZsxQRESEfD6fPB5P0P6OtmzZMn322WfKzc1VYmKiJOmVV17RRRddpJycHF1yySWSpLKyMr388suKjY2VJA0ePFjvvvuunnjiiTMbGABVjpkZAGfVunXrtGLFCtWpUyewtG7dWtLPsyHlOnXqVOG5K1asUPfu3XXeeecpNjZWt99+u3bv3q39+/ef9P6/+OILJSYmBoKMJLVp00Z169bVF198EWhr3rx5IMhIUpMmTZSfn39Kxwrg7GBmBsBZVVZWpn79+umpp56qsK5JkyaB/46JiQla9+2336p3794aPny4HnvsMdWvX18ffvihfvOb3+inn3466f2bmTwezwnba9euHbTe4/GorKzspPcD4OwhzACoNhERESotLQ1qu/jiizV//nw1b95c4eEn/0/Q2rVrVVJSov/6r/9SrVo/Tyr/9a9/PeH+jtamTRtt3bpV27ZtC8zObNq0SQUFBbrwwgtPuh4ANQdfMwGoNs2bN9fq1au1ZcsW7dq1S2VlZRo5cqR+/PFH3XbbbVqzZo2++eYbLV26VHfeeedxg8j555+vkpIS/fnPf9Y333yjV155Rc8++2yF/e3bt0/vvvuudu3apQMHDlTYTrdu3dSuXTsNGjRI69ev15o1a3T77bcrLS2t0q+2ANR8hBkA1ea+++5TWFiY2rRpo0aNGmnr1q1KSEjQRx99pNLSUvXo0UMpKSkaPXq0fD5fYMalMu3bt9eUKVP01FNPKSUlRa+99poyMzOD+nTp0kXDhw/XrbfeqkaNGlU4gVj6+euihQsXql69errqqqvUrVs3tWjRQvPmzavy4wdwdnjMzEJdBAAAwOliZgYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAAp/1/7MgGXoPfaWQAAAAASUVORK5CYII=", "text/plain": [ - "
" + "0.022793206793206792" ] }, + "execution_count": 176, "metadata": {}, - "output_type": "display_data" - }, + "output_type": "execute_result" + } + ], + "source": [ + "len(mass_balance_results[mass_balance_results < 1e-5]) / len(mass_balance_results)" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGsCAYAAAB968WXAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJJVJREFUeJzt3XtU1HXi//HXyGUUZabQEBA0UpMMUVfTUEszNc3KatduhppWa5ul+au8VF+rXYVqa7fditR2Oe3pwh5Tyzorm61CF6+orKSVlpom4KVwIExQeP/+cJ2aQHIA3zD6fJzD+crn8573vOet7Ty/M58BhzHGCAAAwJJmjb0AAABwdiE+AACAVcQHAACwivgAAABWER8AAMAq4gMAAFhFfAAAAKuIDwAAYBXxAQAArCI+AACAVU06Pj788ENde+21iomJkcPh0Ntvv33a73Pv3r26/fbb1bp1a4WFhalHjx7asGFDneebM2eO+vXrp7CwMJ1zzjmndJvFixfrqquuUps2beRwOJSXl1dtzPz58zVo0CC5XC45HA4dOnSo2pji4mKlpKTI7XbL7XYrJSWl2rgpU6aoV69ecjqd6tGjR7U5srOzNWrUKEVHR6tly5bq0aOHXn/99ZOu/ZNPPlFwcHCNc9Vm165dmjhxouLj49WiRQt17NhRs2fPVkVFhV/zAACaviYdH2VlZerevbteeOEFK/dXXFys/v37KyQkRMuWLdPWrVv17LPP1hoN559/vrKzs096vqKiQqNHj9Y999xzyusoKytT//79lZaWdtIxhw8f1vDhwzVr1qyTjrntttuUl5enrKwsZWVlKS8vTykpKT5jjDGaMGGCbr755hrnWLVqlZKSkrRo0SJt3rxZEyZM0NixY/Xuu+9WG+vxeDR27FhdeeWVp/hIf/T555+rqqpK8+bN05YtW/SnP/1JL7/8cq2PDwAQoEyAkGSWLFnic6y8vNw89NBDJiYmxoSFhZk+ffqYlStX1vk+pk+fbgYMGODXbTp06HBK95mRkWHcbrdfc+/cudNIMps2bTrpmJUrVxpJpri42Of41q1bjSSzZs0a77HVq1cbSebzzz+vNs/s2bNN9+7dT2ldV199tbnjjjuqHb/55pvNo48+etK5/v73v5uEhATjdDpNly5dzIsvvljr/Tz99NMmPj7+lNYEAAgcTfqVj19yxx136JNPPlFmZqY2b96s0aNHa/jw4dq+fXud5lu6dKl69+6t0aNHKzIyUj179tSCBQsaeNV2rF69Wm63W3379vUeu/TSS+V2u7Vq1ap6ze3xeBQREeFzLCMjQ1999ZVmz55d420WLFigRx55RHPmzNFnn32muXPn6rHHHtOrr77q1/0AAAJfwMbHV199pTfffFMLFy7UZZddpo4dO+rBBx/UgAEDlJGRUac5d+zYofT0dHXu3Fn//ve/NWnSJN1///36xz/+0cCrP/2KiooUGRlZ7XhkZKSKiorqPO9bb72l9evX64477vAe2759u2bMmKHXX39dwcHBNd7u97//vZ599lndeOONio+P14033qgHHnhA8+bNq3H8V199pb/+9a+aNGlSndcKAGiaan6mCAAbN26UMUYXXnihz/Hy8nK1bt1a0vGLGOPj42ud59577/VeU1JVVaXevXtr7ty5kqSePXtqy5YtSk9P19ixYyVJkyZN0muvvea9/eHDhzVixAgFBQV5j23dulXt27ev/4OsJ4fDUe2YMabG46ciOztb48eP14IFC3TxxRdLkiorK3XbbbfpiSeeqPZ3ccKBAwe0Z88eTZw4UXfddZf3+LFjx+R2u6uNLygo0PDhwzV69GjdeeeddVorAKDpCtj4qKqqUlBQkDZs2ODzxC9JrVq1kiS1a9dOn332Wa3znHvuud4/R0dHq2vXrj7nL7roIi1atMj7/ZNPPqkHH3zQ+/2gQYP01FNP+by9ERMT4/8DamBRUVHat29fteMHDhxQ27Zt/Z4vJydH1157rZ577jlviElSaWmpcnNztWnTJk2ePFnS8b8bY4yCg4P1/vvve0NlwYIFPvskqdrfXUFBga644golJydr/vz5fq8TAND0BWx89OzZU5WVldq/f78uu+yyGseEhIQoISHhlOfs37+/vvjiC59j27ZtU4cOHbzfR0ZG+rydERwcrHbt2qlTp05+PoLTKzk5WR6PR+vWrVOfPn0kSWvXrpXH41G/fv38mis7O1vXXHONnnrqKd19990+51wul/Lz832OvfTSS1qxYoXeeustxcfHq2XLlmrXrp127NihMWPGnPR+9u7dqyuuuEK9evVSRkaGmjUL2HcFAQC1aNLx8f333+vLL7/0fr9z507l5eUpIiJCF154ocaMGaOxY8fq2WefVc+ePXXw4EGtWLFC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AKwiPgAAgFXEBwAAsIr4AAAAVhEfAADAKuIDAABYRXwAAACriA8AAGAV8QEAAKwiPgAAgFXEBwAAsMqv+EhPT1dSUpJcLpdcLpeSk5O1bNky73ljjB5//HHFxMSoRYsWGjRokLZs2dLgiwYAAIHLr/iIjY1VWlqacnNzlZubq8GDB2vUqFHewHj66af13HPP6YUXXtD69esVFRWloUOHqrS09LQsHgAABB6HMcbUZ4KIiAg988wzmjBhgmJiYjR16lRNnz5dklReXq62bdvqqaee0m9/+9tTmq+kpERut1sej0cul6s+SwMAAJb48/xd52s+KisrlZmZqbKyMiUnJ2vnzp0qKirSsGHDvGOcTqcGDhyoVatWnXSe8vJylZSU+HwBAIAzl9/xkZ+fr1atWsnpdGrSpElasmSJunbtqqKiIklS27Ztfca3bdvWe64mqampcrvd3q+4uDh/lwQAAAKI3/HRpUsX5eXlac2aNbrnnns0btw4bd261Xve4XD4jDfGVDv2UzNnzpTH4/F+7dmzx98lAQCAABLs7w1CQ0PVqVMnSVLv3r21fv16Pf/8897rPIqKihQdHe0dv3///mqvhvyU0+mU0+n0dxkAACBA1fvnfBhjVF5ervj4eEVFRWn58uXecxUVFcrJyVG/fv3qezcAAOAM4dcrH7NmzdKIESMUFxen0tJSZWZmKjs7W1lZWXI4HJo6darmzp2rzp07q3Pnzpo7d67CwsJ02223na71AwCAAONXfOzbt08pKSkqLCyU2+1WUlKSsrKyNHToUEnSww8/rB9++EG/+93vVFxcrL59++r9999XeHj4aVk8AAAIPPX+OR8NjZ/zAQBA4LHycz4AAADqgvgAAABWER8AAMAq4gMAAFhFfAAAAKuIDwAAYBXxAQAArCI+AACAVcQHAACwivgAAABWER8AAMAq4gMAAFhFfAAAAKuIDwAAYBXxAQAArCI+AACAVcQHAACwivgAAABWER8AAMAq4gMAAFhFfAAAAKuIDwAAYBXxAQAArCI+AACAVcQHAACwivgAAABWER8AAMAq4gMAAFhFfAAAAKuIDwAAYBXxAQAArCI+AACAVcQHAACwivgAAABWER8AAMAq4gMAAFhFfAAAAKuIDwAAYBXxAQAArCI+AACAVcQHAACwivgAAABWER8AAMAq4gMAAFhFfAAAAKuI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Wnk8nvrve70uVw0QJz5q+7e//c1s3brVTJ061bRs2dLs2rWrsZcWMO655x7jdrtNdna2KSws9H4dPnzYOyYtLc243W6zePFik5+fb2699dYaP9oVGxtrPvjgA7Nx40YzePDgs/rjcqfip592MYZ9bijr1q0zwcHBZs6cOWb79u3m9ddfN2FhYea1117zjmGv62/cuHGmXbt23o/aLl682LRp08Y8/PDD3jHss/9KS0vNpk2bzKZNm4wk89xzz5lNmzZ5f4REQ+3p8OHDTVJSklm9erVZvXq16datGx+19ceLL75oOnToYEJDQ82vfvUr70dEcWok1fiVkZHhHVNVVWVmz55toqKijNPpNJdffrnJz8/3meeHH34wkydPNhEREaZFixbmmmuuMbt377b8aALLz+ODfW447777rklMTDROp9MkJCSY+fPn+5xnr+uvpKTETJkyxbRv3940b97cXHDBBeaRRx4x5eXl3jHss/9WrlxZ4/8mjxs3zhjTcHv67bffmjFjxpjw8HATHh5uxowZY4qLi+u9focxxtTvtRMAAIBTd8Zf8wEAAJoW4gMAAFhFfAAAAKuIDwAAYBXxAQAArCI+AACAVcQHAACwivgAAABWER8AAMAq4gMAAFhFfAAAAKuIDwAAYNX/BxJdbIcUM2/sAAAAAElFTkSuQmCC", "text/plain": [ - "" + "4 0.000006\n", + "46 0.000010\n", + "157 0.000010\n", + "160 0.000003\n", + "189 0.000009\n", + " ... \n", + "250016 0.000007\n", + "250022 0.000007\n", + "250086 0.000007\n", + "250139 0.000003\n", + "250223 0.000006\n", + "Length: 5704, dtype: float64" ] }, - "execution_count": 69, + "execution_count": 169, "metadata": {}, - "output_type": "display_data" - }, + "output_type": "execute_result" + } + ], + "source": [ + "mass_balance_results[mass_balance_results < 1e-5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Percentage of cells that pass the mass balance condition\n", + "\n", + "small_modell_20_epochs = 0.0031088911088911087\n", + "\n", + "large_modell_20_epochs = 0.022793206793206792" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "metadata": {}, + "outputs": [ { - "data": { - "image/png": "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/XrwwQdVVVUliXW60fDwsGpqanT16lXdcccdOn78uO6///70L0/W6Evd3d364IMPNDAwMGMf/z0tzJKN0HW3+jXh+Apr9pW9e/fq7Nmzev/992fsY52k++67T0NDQ/r888/1t7/9Tbt27VIkEknvZ42kaDSqffv2qaenR2vWrJnzONZqfpbsn+Ny/ZpwSMFgUJJYs3979tln9eabb+q9995TWVlZepx1+kpRUZHuvfdebdmyReFwWJs2bdJLL73EGt3g9OnTGhsb0+bNm1VQUKCCggJFIhH95je/UUFBQXo9WKv5WbIRuvFrwm/U29ur2tpao1ktbRUVFQoGgxlrNjExoUgkclutmXNOe/fu1bFjx/Tuu++qoqIiYz/rNDfnnFKpFGt0g23btml4eFhDQ0PpbcuWLdq5c6eGhoZ0zz33sFYLYXdPxM0t5GvCV6pkMunOnDnjzpw54yS5zs5Od+bMGXfhwgXnnHOHDh1yfr/fHTt2zA0PD7sf//jHbuPGjS6RSBjP/OvzzDPPOL/f706ePOkuXryY3r744ov0MayTc62tra6vr8+Njo66s2fPuueff96tWrXK9fT0OOdYo2xuvDvOOdZqIZZ0hJxz7re//a27++67XVFRkfvud7+bvs32dvXee+/N+l3uu3btcs59ebvoCy+84ILBoPN6ve7hhx92w8PDtpP+ms22PpLca6+9lj6GdXLuqaeeSv+/9a1vfctt27YtHSDnWKNs/jNCrNX88VUOAAAzS/Y1IQDAykeEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmPl/qGKdNepT4hUAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "TypeError", + "evalue": "argument of type 'int' is not iterable", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[178], line 11\u001b[0m\n\u001b[1;32m 7\u001b[0m y_results \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 8\u001b[0m y_differences \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m---> 11\u001b[0m df_design_transformed_scaled \u001b[38;5;241m=\u001b[39m scaler_X\u001b[38;5;241m.\u001b[39mtransform(FuncTransform(func_dict_in, func_dict_out)\u001b[38;5;241m.\u001b[39mfit_transform(df_design[species]))\n\u001b[1;32m 12\u001b[0m df_results_transformed_scaled \u001b[38;5;241m=\u001b[39m scaler_X\u001b[38;5;241m.\u001b[39mtransform(FuncTransform(func_dict_in, func_dict_out)\u001b[38;5;241m.\u001b[39mfit_transform(df_results[species]))\n\u001b[1;32m 14\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m0\u001b[39m,iterations):\n", + "File \u001b[0;32m~/Documents/model-training/preprocessing.py:63\u001b[0m, in \u001b[0;36mFuncTransform.fit_transform\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfit_transform\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, y\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit(X)\n\u001b[0;32m---> 63\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransform(X, y)\n", + "File \u001b[0;32m~/Documents/model-training/preprocessing.py:57\u001b[0m, in \u001b[0;36mFuncTransform.transform\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 55\u001b[0m X \u001b[38;5;241m=\u001b[39m X\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m 56\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key \u001b[38;5;129;01min\u001b[39;00m X\u001b[38;5;241m.\u001b[39mkeys(): \n\u001b[0;32m---> 57\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m key:\n\u001b[1;32m 58\u001b[0m X[key] \u001b[38;5;241m=\u001b[39m X[key]\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc_transform[key])\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m X\n", + "\u001b[0;31mTypeError\u001b[0m: argument of type 'int' is not iterable" + ] } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", - "species = \"O\"\n", + "species = \"Barite\"\n", "iterations = 1000\n", - "cell_offset = 60\n", + "cell_offset = 9\n", "y_design = []\n", "y_results = []\n", "y_differences = []\n", "\n", "\n", - "df_design_transformed_scaled = scaler_X.transform(FuncTransform(func_dict_in, func_dict_out).fit_transform(df_design))\n", - "df_results_transformed_scaled = scaler_X.transform(FuncTransform(func_dict_in, func_dict_out).fit_transform(df_results))\n", + "df_design_transformed_scaled = scaler_X.transform(FuncTransform(func_dict_in, func_dict_out).fit_transform(df_design[species]))\n", + "df_results_transformed_scaled = scaler_X.transform(FuncTransform(func_dict_in, func_dict_out).fit_transform(df_results[species]))\n", "\n", "for i in range(0,iterations):\n", " idx = i*50*50 + cell_offset -1\n", @@ -743,12 +1439,14 @@ "plt.xlabel('Iteration')\n", "plt.ylabel(species)\n", "plt.title(species+' Concentration over Iterations')\n", + "plt.legend()\n", "plt.show()\n", "\n", - "plt.plot(np.arange(0,iterations), y_results_back[species], label = \"Results\")\n", - "plt.plot(np.arange(0,iterations), prediction_back[species], label = \"Prediction\")\n", + "# plt.plot(np.arange(0,iterations), y_results_back[species], label = \"Results\")\n", + "# plt.plot(np.arange(0,iterations), prediction_back[species], label = \"Prediction\")\n", + "# plt.legend()\n", "\n", - "plt.show()\n", + "# plt.show()\n", "\n", "timestep = 1000\n", "plt.imshow(np.array(df_results[\"Barite\"][(timestep*2500):(timestep*2500+2500)]).reshape(50,50), origin='lower')" @@ -1314,65 +2012,56 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 184, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m 20/7821\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m44s\u001b[0m 6ms/step - loss: 5.1914e-06" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m7821/7821\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m29s\u001b[0m 4ms/step - loss: 1.0395e-06\n" + "\u001b[1m7821/7821\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 1ms/step - loss: 7.4076e-07\n" ] }, { "data": { "text/plain": [ - "9.875676596493577e-07" + "1.0149801710213069e-06" ] }, - "execution_count": 15, + "execution_count": 184, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# test on all test data\n", - "model_large.evaluate(X_test.iloc[:,X_test.columns != \"Class\"], y_test.iloc[:, y_test.columns != \"Class\"])" + "model_large.evaluate(X_test[species_columns], y_test[species_columns])" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 185, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m7727/7727\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m29s\u001b[0m 4ms/step - loss: 5.4493e-07\n" + "ename": "IndexError", + "evalue": ".iloc requires numeric indexers, got ['H' 'O' 'Charge' 'Ba' 'Cl' 'S_6_' 'Sr' 'Barite' 'Celestite']", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[185], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# test on non-reactive data\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m model_large\u001b[38;5;241m.\u001b[39mevaluate(X_test[X_test[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39miloc[:,species_columns], y_test[X_test[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39miloc[:,species_columns])\n", + "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/pandas/core/indexing.py:1184\u001b[0m, in \u001b[0;36m_LocationIndexer.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1182\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_is_scalar_access(key):\n\u001b[1;32m 1183\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj\u001b[38;5;241m.\u001b[39m_get_value(\u001b[38;5;241m*\u001b[39mkey, takeable\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_takeable)\n\u001b[0;32m-> 1184\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_getitem_tuple(key)\n\u001b[1;32m 1185\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1186\u001b[0m \u001b[38;5;66;03m# we by definition only have the 0th axis\u001b[39;00m\n\u001b[1;32m 1187\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxis \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;241m0\u001b[39m\n", + "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/pandas/core/indexing.py:1690\u001b[0m, in \u001b[0;36m_iLocIndexer._getitem_tuple\u001b[0;34m(self, tup)\u001b[0m\n\u001b[1;32m 1689\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_getitem_tuple\u001b[39m(\u001b[38;5;28mself\u001b[39m, tup: \u001b[38;5;28mtuple\u001b[39m):\n\u001b[0;32m-> 1690\u001b[0m tup \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_validate_tuple_indexer(tup)\n\u001b[1;32m 1691\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m suppress(IndexingError):\n\u001b[1;32m 1692\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_getitem_lowerdim(tup)\n", + "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/pandas/core/indexing.py:966\u001b[0m, in \u001b[0;36m_LocationIndexer._validate_tuple_indexer\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 964\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, k \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(key):\n\u001b[1;32m 965\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 966\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_validate_key(k, i)\n\u001b[1;32m 967\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 968\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 969\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLocation based indexing can only have \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 970\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m[\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_valid_types\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m] types\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 971\u001b[0m ) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n", + "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/pandas/core/indexing.py:1608\u001b[0m, in \u001b[0;36m_iLocIndexer._validate_key\u001b[0;34m(self, key, axis)\u001b[0m\n\u001b[1;32m 1606\u001b[0m \u001b[38;5;66;03m# check that the key has a numeric dtype\u001b[39;00m\n\u001b[1;32m 1607\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_numeric_dtype(arr\u001b[38;5;241m.\u001b[39mdtype):\n\u001b[0;32m-> 1608\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mIndexError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.iloc requires numeric indexers, got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00marr\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1610\u001b[0m \u001b[38;5;66;03m# check that the key does not exceed the maximum size of the index\u001b[39;00m\n\u001b[1;32m 1611\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(arr) \u001b[38;5;129;01mand\u001b[39;00m (arr\u001b[38;5;241m.\u001b[39mmax() \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m len_axis \u001b[38;5;129;01mor\u001b[39;00m arr\u001b[38;5;241m.\u001b[39mmin() \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m-\u001b[39mlen_axis):\n", + "\u001b[0;31mIndexError\u001b[0m: .iloc requires numeric indexers, got ['H' 'O' 'Charge' 'Ba' 'Cl' 'S_6_' 'Sr' 'Barite' 'Celestite']" ] - }, - { - "data": { - "text/plain": [ - "5.075861508885282e-07" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ "# test on non-reactive data\n", - "model_large.evaluate(X_test[X_test['Class'] == 0].iloc[:,:-1], y_test[X_test['Class'] == 0].iloc[:,:-1])" + "model_large.evaluate(X_test[X_test['Class'] == 0].iloc[:,species_columns], y_test[X_test['Class'] == 0].iloc[:,species_columns])" ] }, { @@ -1509,7 +2198,7 @@ ], "metadata": { "kernelspec": { - "display_name": "ai", + "display_name": "training", "language": "python", "name": "python3" }, @@ -1523,7 +2212,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.8" + "version": "3.11.11" } }, "nbformat": 4,