diff --git a/src/POET_Training.ipynb b/src/POET_Training.ipynb
new file mode 100644
index 0000000..5091c02
--- /dev/null
+++ b/src/POET_Training.ipynb
@@ -0,0 +1,3206 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## General Information"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This notebook is used to train a simple neural network model to predict the chemistry in the barite benchmark (50x50 grid). The training data is stored in the repository using **git large file storage** and can be downloaded after the installation of git lfs using the `git lfs pull` command.\n",
+ "\n",
+ "It is then recommended to create a Python environment using miniconda. The necessary dependencies are contained in `environment.yml` and can be installed using `conda env create -f environment.yml`.\n",
+ "\n",
+ "The data set is divided into a design and result part and consists of the iterations of a reference simulation. The design part of the data set contains the chemical concentrations at time $t$ and the result part at time $t+1$, which are to be learned by the model."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Setup Libraries"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "2025-02-18 16:48:16.636424: 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-02-18 16:48:16.655319: 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"
+ ]
+ }
+ ],
+ "source": [
+ "import keras\n",
+ "from keras.layers import Dense, Dropout, Input,BatchNormalization, LeakyReLU\n",
+ "import tensorflow as tf\n",
+ "import h5py\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import time\n",
+ "import sklearn.model_selection as sk\n",
+ "import matplotlib.pyplot as plt\n",
+ "from sklearn.cluster import KMeans\n",
+ "from sklearn.pipeline import Pipeline, make_pipeline\n",
+ "from sklearn.preprocessing import StandardScaler, MinMaxScaler\n",
+ "from imblearn.over_sampling import SMOTE\n",
+ "from imblearn.under_sampling import RandomUnderSampler\n",
+ "from imblearn.over_sampling import RandomOverSampler\n",
+ "from collections import Counter\n",
+ "import os\n",
+ "from preprocessing import *\n",
+ "from sklearn import set_config\n",
+ "from importlib import reload\n",
+ "set_config(transform_output = \"pandas\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%load_ext autoreload\n",
+ "%autoreload 2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Define parameters"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dtype = \"float32\"\n",
+ "activation = \"relu\"\n",
+ "\n",
+ "lr = 0.001\n",
+ "batch_size = 512\n",
+ "epochs = 50 # default 400 epochs\n",
+ "\n",
+ "lr_schedule = keras.optimizers.schedules.ExponentialDecay(\n",
+ " initial_learning_rate=lr,\n",
+ " decay_steps=2000,\n",
+ " decay_rate=0.9,\n",
+ " staircase=True\n",
+ ")\n",
+ "\n",
+ "optimizer_simple = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
+ "optimizer_large = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
+ "optimizer_paper = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
+ "\n",
+ "\n",
+ "loss = keras.losses.Huber()\n",
+ "\n",
+ "sample_fraction = 0.8"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Setup the model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/signer/bin/miniconda3/envs/training/lib/python3.11/site-packages/keras/src/layers/activations/leaky_relu.py:41: UserWarning: Argument `alpha` is deprecated. Use `negative_slope` instead.\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
Model: \"sequential\"\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1mModel: \"sequential\"\u001b[0m\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+ "┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+ "│ dense (Dense) │ (None, 128) │ 1,152 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu (LeakyReLU) │ (None, 128) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_1 (Dense) │ (None, 128) │ 16,512 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_1 (LeakyReLU) │ (None, 128) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_2 (Dense) │ (None, 8) │ 1,032 │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\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 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,152\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_1 (\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",
+ "│ leaky_re_lu_1 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m) │ \u001b[38;5;34m1,032\u001b[0m │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Total params: 18,696 (73.03 KB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m18,696\u001b[0m (73.03 KB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Trainable params: 18,696 (73.03 KB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m18,696\u001b[0m (73.03 KB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Non-trainable params: 0 (0.00 B)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# small model\n",
+ "model_simple = keras.Sequential(\n",
+ " [\n",
+ " keras.Input(shape=(8,), dtype=\"float32\"),\n",
+ " keras.layers.Dense(units=128, dtype=\"float32\"),\n",
+ " LeakyReLU(alpha=0.01),\n",
+ " # Dropout(0.2),\n",
+ " keras.layers.Dense(units=128, dtype=\"float32\"),\n",
+ " LeakyReLU(alpha=0.01),\n",
+ " keras.layers.Dense(units=8, dtype=\"float32\")\n",
+ " ]\n",
+ ")\n",
+ "\n",
+ "model_simple.compile(optimizer=optimizer_simple, loss = loss)\n",
+ "model_simple.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Model: \"sequential_1\"\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1mModel: \"sequential_1\"\u001b[0m\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+ "┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+ "│ dense_3 (Dense) │ (None, 512) │ 4,608 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_2 (LeakyReLU) │ (None, 512) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_4 (Dense) │ (None, 1024) │ 525,312 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_3 (LeakyReLU) │ (None, 1024) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_5 (Dense) │ (None, 512) │ 524,800 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_4 (LeakyReLU) │ (None, 512) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_6 (Dense) │ (None, 8) │ 4,104 │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\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_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m4,608\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_2 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_4 (\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",
+ "│ leaky_re_lu_3 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_5 (\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",
+ "│ leaky_re_lu_4 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_6 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m) │ \u001b[38;5;34m4,104\u001b[0m │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Total params: 1,058,824 (4.04 MB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m1,058,824\u001b[0m (4.04 MB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Trainable params: 1,058,824 (4.04 MB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m1,058,824\u001b[0m (4.04 MB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Non-trainable params: 0 (0.00 B)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# large model\n",
+ "model_large = keras.Sequential(\n",
+ " [\n",
+ " keras.layers.Input(shape=(8,), dtype=dtype),\n",
+ " keras.layers.Dense(512, dtype=dtype),\n",
+ " LeakyReLU(alpha=0.01),\n",
+ " keras.layers.Dense(1024, dtype=dtype),\n",
+ " LeakyReLU(alpha=0.01),\n",
+ " keras.layers.Dense(512, dtype=dtype),\n",
+ " LeakyReLU(alpha=0.01),\n",
+ " keras.layers.Dense(8, dtype=dtype)\n",
+ " ]\n",
+ ")\n",
+ "\n",
+ "model_large.compile(optimizer=optimizer_large, loss = loss)\n",
+ "model_large.summary()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Model: \"sequential_2\"\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1mModel: \"sequential_2\"\u001b[0m\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+ "┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+ "│ dense_7 (Dense) │ (None, 128) │ 1,152 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_5 (LeakyReLU) │ (None, 128) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_8 (Dense) │ (None, 256) │ 33,024 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_6 (LeakyReLU) │ (None, 256) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_9 (Dense) │ (None, 512) │ 131,584 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_7 (LeakyReLU) │ (None, 512) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_10 (Dense) │ (None, 256) │ 131,328 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_8 (LeakyReLU) │ (None, 256) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_11 (Dense) │ (None, 8) │ 2,056 │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\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,152\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ leaky_re_lu_5 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_8 (\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",
+ "│ leaky_re_lu_6 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_9 (\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",
+ "│ leaky_re_lu_7 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_10 (\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",
+ "│ leaky_re_lu_8 (\u001b[38;5;33mLeakyReLU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_11 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m) │ \u001b[38;5;34m2,056\u001b[0m │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Total params: 299,144 (1.14 MB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m299,144\u001b[0m (1.14 MB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Trainable params: 299,144 (1.14 MB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m299,144\u001b[0m (1.14 MB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Non-trainable params: 0 (0.00 B)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# model from paper\n",
+ "# (see https://doi.org/10.1007/s11242-022-01779-3 model for the complex chemistry)\n",
+ "model_paper = keras.Sequential(\n",
+ " [keras.layers.Input(shape=(8,), dtype=dtype),\n",
+ " keras.layers.Dense(128, dtype=dtype),\n",
+ " LeakyReLU(alpha=0.01),\n",
+ " keras.layers.Dense(256, dtype=dtype),\n",
+ " LeakyReLU(alpha=0.01),\n",
+ " keras.layers.Dense(512, dtype=dtype),\n",
+ " LeakyReLU(alpha=0.01),\n",
+ " keras.layers.Dense(256, dtype=dtype),\n",
+ " LeakyReLU(alpha=0.01),\n",
+ " keras.layers.Dense(8, dtype=dtype)\n",
+ " ])\n",
+ "\n",
+ "model_paper.compile(optimizer=optimizer_paper, loss = loss)\n",
+ "model_paper.summary()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Define transformer functions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def Safelog(val):\n",
+ " # get range of vector\n",
+ " if val > 0:\n",
+ " return np.log10(val)\n",
+ " elif val < 0:\n",
+ " return -np.log10(-val)\n",
+ " else:\n",
+ " return 0\n",
+ "\n",
+ "def Safeexp(val):\n",
+ " if val > 0:\n",
+ " return -10 ** -val\n",
+ " elif val < 0:\n",
+ " return 10 ** val\n",
+ " else:\n",
+ " return 0"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# ? Why does the charge is using another logarithm than the other species\n",
+ "\n",
+ "func_dict_in = {\n",
+ " \"H\" : np.log1p,\n",
+ " \"O\" : np.log1p,\n",
+ " \"Charge\" : Safelog,\n",
+ " \"H_0_\" : np.log1p,\n",
+ " \"O_0_\" : np.log1p,\n",
+ " \"Ba\" : np.log1p,\n",
+ " \"Cl\" : np.log1p,\n",
+ " \"S_2_\" : np.log1p,\n",
+ " \"S_6_\" : np.log1p,\n",
+ " \"Sr\" : np.log1p,\n",
+ " \"Barite\" : np.log1p,\n",
+ " \"Celestite\" : np.log1p,\n",
+ "}\n",
+ "\n",
+ "func_dict_out = {\n",
+ " \"H\" : np.expm1,\n",
+ " \"O\" : np.expm1,\n",
+ " \"Charge\" : Safeexp,\n",
+ " \"H_0_\" : np.expm1,\n",
+ " \"O_0_\" : np.expm1,\n",
+ " \"Ba\" : np.expm1,\n",
+ " \"Cl\" : np.expm1,\n",
+ " \"S_2_\" : np.expm1,\n",
+ " \"S_6_\" : np.expm1,\n",
+ " \"Sr\" : np.expm1,\n",
+ " \"Barite\" : np.expm1,\n",
+ " \"Celestite\" : np.expm1,\n",
+ "}\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Read data from `.h5` file and convert it to a `pandas.DataFrame`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# os.chdir('/mnt/beegfs/home/signer/projects/model-training')\n",
+ "# data_file = h5py.File(\"barite_50_ai_20k.h5\")\n",
+ "data_file = h5py.File(\"../datasets/barite_50_4_corner.h5\")\n",
+ "\n",
+ "design = data_file[\"design\"]\n",
+ "results = data_file[\"result\"]\n",
+ "\n",
+ "df_design = pd.DataFrame(np.array(design[\"data\"]).transpose(), columns = np.array(design[\"names\"].asstr()))\n",
+ "df_results = pd.DataFrame(np.array(results[\"data\"]).transpose(), columns = np.array(results[\"names\"].asstr()))\n",
+ "\n",
+ "data_file.close()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Preprocess Data\n",
+ "\n",
+ "The data are preprocessed in the following way:\n",
+ "\n",
+ "1. Label data points in the `design` dataset with `reactive` and `non-reactive` labels using kmeans clustering\n",
+ "2. Transform `design` and `results` data set into log-scaled data.\n",
+ "3. Split data into training and test sets.\n",
+ "4. Learn scaler on training data for `design` and `results` together (option `global`) or individual (option `individual`).\n",
+ "5. Transform training and test data.\n",
+ "6. Split training data into training and validation dataset."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "species_columns = ['H', 'O', 'Ba', 'Cl', 'S', 'Sr', 'Barite', 'Celestite']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/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"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Amount class 0 before: 0.9521309523809524\n",
+ "Amount class 1 before: 0.04786904761904762\n",
+ "Using Oversampling\n",
+ "Amount class 0 after: 0.5\n",
+ "Amount class 1 after: 0.5\n"
+ ]
+ },
+ {
+ "ename": "Exception",
+ "evalue": "No valid scaler type found",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mException\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[11], line 7\u001b[0m\n\u001b[1;32m 5\u001b[0m X_train, X_test, y_train, y_test \u001b[38;5;241m=\u001b[39m preprocess\u001b[38;5;241m.\u001b[39msplit(X, y, ratio \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.2\u001b[39m)\n\u001b[1;32m 6\u001b[0m X_train, y_train \u001b[38;5;241m=\u001b[39m preprocess\u001b[38;5;241m.\u001b[39mbalancer(X_train, y_train, strategy \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mover\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 7\u001b[0m preprocess\u001b[38;5;241m.\u001b[39mscale_fit(X_train, y_train, scaling \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mglobal\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mtype\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMinMax\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 8\u001b[0m X_train, X_test, y_train, y_test \u001b[38;5;241m=\u001b[39m preprocess\u001b[38;5;241m.\u001b[39mscale_transform(X_train, X_test, y_train, y_test)\n\u001b[1;32m 9\u001b[0m X_train, X_val, y_train, y_val \u001b[38;5;241m=\u001b[39m preprocess\u001b[38;5;241m.\u001b[39msplit(X_train, y_train, ratio \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.1\u001b[39m)\n",
+ "File \u001b[0;32m~/Documents/model-training/src/preprocessing.py:341\u001b[0m, in \u001b[0;36mpreprocessing.scale_fit\u001b[0;34m(self, X, y, scaling, type)\u001b[0m\n\u001b[1;32m 338\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mscaler_y \u001b[38;5;241m=\u001b[39m StandardScaler()\n\u001b[1;32m 340\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 341\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo valid scaler type found\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 343\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m scaling \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mindividual\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 344\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mscaler_X\u001b[38;5;241m.\u001b[39mfit(X\u001b[38;5;241m.\u001b[39miloc[:, X\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[0;31mException\u001b[0m: No valid scaler type found"
+ ]
+ }
+ ],
+ "source": [
+ "preprocess = preprocessing(func_dict_in=func_dict_in, func_dict_out=func_dict_out)\n",
+ "X, y = preprocess.cluster(df_design[species_columns], df_results[species_columns])\n",
+ "# X, y = preprocess.funcTranform(X, y)\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = preprocess.split(X, y, ratio = 0.2)\n",
+ "X_train, y_train = preprocess.balancer(X_train, y_train, strategy = \"over\")\n",
+ "preprocess.scale_fit(X_train, y_train, scaling = \"global\", type=\"MinMax\")\n",
+ "X_train, X_test, y_train, y_test = preprocess.scale_transform(X_train, X_test, y_train, y_test)\n",
+ "X_train, X_val, y_train, y_val = preprocess.split(X_train, y_train, ratio = 0.1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "timestep=250\n",
+ "plt.imshow(np.array(X[\"Barite\"][(timestep*2500):(timestep*2500+2500)]).reshape(50,50), origin='lower')\n",
+ "plt.contour(np.array(X[\"Class\"][(timestep*2500):(timestep*2500+2500)]).reshape(50,50), origin='lower', colors='red')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Custom Loss function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "column_dict = {\"Ba\": X.columns.get_loc(\"Ba\"), \"Barite\":X.columns.get_loc(\"Barite\"), \"Sr\":X.columns.get_loc(\"Sr\"), \"Celestite\":X.columns.get_loc(\"Celestite\"), \"H\":X.columns.get_loc(\"H\"), \"H\":X.columns.get_loc(\"H\"), \"O\":X.columns.get_loc(\"O\")}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def custom_loss(preprocess, column_dict, h1, h2, h3, h4, scaler_type=\"minmax\"):\n",
+ " # extract the scaling parameters\n",
+ " \n",
+ " if scaler_type == \"minmax\":\n",
+ " scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)\n",
+ " min_X = tf.convert_to_tensor(preprocess.scaler_X.min_, dtype=tf.float32)\n",
+ " scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)\n",
+ " min_y = tf.convert_to_tensor(preprocess.scaler_y.min_, dtype=tf.float32)\n",
+ " \n",
+ " elif scaler_type == \"standard\":\n",
+ " scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)\n",
+ " mean_X = tf.convert_to_tensor(preprocess.scaler_X.mean_, dtype=tf.float32)\n",
+ " scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)\n",
+ " mean_y = tf.convert_to_tensor(preprocess.scaler_y.mean_, dtype=tf.float32)\n",
+ "\n",
+ " def loss(results, predicted):\n",
+ " \n",
+ " # inverse min/max scaling\n",
+ " if scaler_type == \"minmax\":\n",
+ " predicted_inverse = predicted * scale_y + min_y\n",
+ " results_inverse = results * scale_X + min_X\n",
+ " \n",
+ " elif scaler_type == \"standard\":\n",
+ " predicted_inverse = predicted * scale_y + mean_y\n",
+ " results_inverse = results * scale_X + mean_X\n",
+ "\n",
+ " # mass balance\n",
+ " dBa = tf.keras.backend.abs(\n",
+ " (predicted_inverse[:, column_dict[\"Ba\"]] + predicted_inverse[:, column_dict[\"Barite\"]]) -\n",
+ " (results_inverse[:, column_dict[\"Ba\"]] + results_inverse[:, column_dict[\"Barite\"]])\n",
+ " )\n",
+ " dSr = tf.keras.backend.abs(\n",
+ " (predicted_inverse[:, column_dict[\"Sr\"]] + predicted_inverse[:, column_dict[\"Celestite\"]]) -\n",
+ " (results_inverse[:, column_dict[\"Sr\"]] + results_inverse[:, column_dict[\"Celestite\"]])\n",
+ " )\n",
+ " \n",
+ " # H/O ratio has to be 2\n",
+ " h2o_ratio = tf.keras.backend.abs(\n",
+ " (predicted_inverse[:, column_dict[\"H\"]] / predicted_inverse[:, column_dict[\"O\"]]) - 2\n",
+ " )\n",
+ "\n",
+ " # huber loss\n",
+ " huber_loss = tf.keras.losses.Huber()(results, predicted)\n",
+ " \n",
+ " # total loss\n",
+ " total_loss = h1 * huber_loss + h2 * dBa + h3 * dSr #+ h4 * h2o_ratio\n",
+ " # total_loss = huber_loss\n",
+ " return total_loss\n",
+ "\n",
+ " return loss\n",
+ "\n",
+ "\n",
+ "def custom_metric(preprocess, column_dict, scaler_type=\"minmax\"):\n",
+ " \n",
+ " if scaler_type == \"minmax\":\n",
+ " scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)\n",
+ " min_X = tf.convert_to_tensor(preprocess.scaler_X.min_, dtype=tf.float32)\n",
+ " scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)\n",
+ " min_y = tf.convert_to_tensor(preprocess.scaler_y.min_, dtype=tf.float32)\n",
+ "\n",
+ " elif scaler_type == \"standard\":\n",
+ " scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)\n",
+ " mean_X = tf.convert_to_tensor(preprocess.scaler_X.mean_, dtype=tf.float32)\n",
+ " scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)\n",
+ " mean_y = tf.convert_to_tensor(preprocess.scaler_y.mean_, dtype=tf.float32)\n",
+ " \n",
+ " \n",
+ " def mass_balance(results, predicted):\n",
+ " # inverse min/max scaling\n",
+ " if scaler_type == \"minmax\":\n",
+ " predicted_inverse = predicted * scale_y + min_y\n",
+ " results_inverse = results * scale_X + min_X\n",
+ " \n",
+ " elif scaler_type == \"standard\":\n",
+ " predicted_inverse = predicted * scale_y + mean_y\n",
+ " results_inverse = results * scale_X + mean_X\n",
+ "\n",
+ " # mass balance\n",
+ " dBa = tf.keras.backend.abs(\n",
+ " (predicted_inverse[:, column_dict[\"Ba\"]] + predicted_inverse[:, column_dict[\"Barite\"]]) -\n",
+ " (results_inverse[:, column_dict[\"Ba\"]] + results_inverse[:, column_dict[\"Barite\"]])\n",
+ " )\n",
+ " dSr = tf.keras.backend.abs(\n",
+ " (predicted_inverse[:, column_dict[\"Sr\"]] + predicted_inverse[:, column_dict[\"Celestite\"]]) -\n",
+ " (results_inverse[:, column_dict[\"Sr\"]] + results_inverse[:, column_dict[\"Celestite\"]])\n",
+ " )\n",
+ " \n",
+ " return tf.reduce_mean(dBa + dSr)\n",
+ " \n",
+ " return mass_balance\n",
+ "\n",
+ "\n",
+ "def huber_metric(delta=1.0):\n",
+ " def huber(results, predicted):\n",
+ " return tf.keras.losses.huber(results, predicted, delta=delta)\n",
+ " \n",
+ " return huber"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model_simple.compile(optimizer=optimizer_simple, loss=custom_loss(preprocess, column_dict, 1, 1, 1, 1, \"minmax\"))\n",
+ "\n",
+ "model_large.compile(optimizer=optimizer_large, loss=custom_loss(preprocess, column_dict, 1, 1, 1, 1, \"minmax\"), metrics=[huber_metric(1.0), custom_metric(preprocess, column_dict, scaler_type=\"minmax\")])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Train the model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "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.loc[:, X_train.columns != \"Class\"], \n",
+ " y_train.loc[:, y_train.columns != \"Class\"], \n",
+ " batch_size=batch_size, \n",
+ " epochs=100, \n",
+ " validation_data=(X_val.loc[:, X_val.columns != \"Class\"], y_val.loc[:, y_val.columns != \"Class\"]),\n",
+ " callbacks=[callback])\n",
+ " \n",
+ "\n",
+ " end = time.time()\n",
+ "\n",
+ " print(\"Training took {} seconds\".format(end - start))\n",
+ " \n",
+ " return history"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 13ms/step - huber: 0.0280 - loss: 0.5766 - mass_balance: 0.5486 - val_huber: 0.0052 - val_loss: 0.3554 - val_mass_balance: 0.3502\n",
+ "Epoch 2/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 14ms/step - huber: 0.0038 - loss: 0.1885 - mass_balance: 0.1847 - val_huber: 0.0013 - val_loss: 0.1407 - val_mass_balance: 0.1394\n",
+ "Epoch 3/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 17ms/step - huber: 9.8317e-04 - loss: 0.1252 - mass_balance: 0.1242 - val_huber: 6.6276e-04 - val_loss: 0.1825 - val_mass_balance: 0.1818\n",
+ "Epoch 4/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m47s\u001b[0m 28ms/step - huber: 5.5962e-04 - loss: 0.1058 - mass_balance: 0.1052 - val_huber: 4.2667e-04 - val_loss: 0.1063 - val_mass_balance: 0.1058\n",
+ "Epoch 5/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m34s\u001b[0m 20ms/step - huber: 4.1409e-04 - loss: 0.0987 - mass_balance: 0.0983 - val_huber: 2.7614e-04 - val_loss: 0.0551 - val_mass_balance: 0.0548\n",
+ "Epoch 6/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 13ms/step - huber: 2.9547e-04 - loss: 0.0840 - mass_balance: 0.0837 - val_huber: 2.2160e-04 - val_loss: 0.0798 - val_mass_balance: 0.0796\n",
+ "Epoch 7/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m21s\u001b[0m 13ms/step - huber: 2.2008e-04 - loss: 0.0703 - mass_balance: 0.0701 - val_huber: 1.5488e-04 - val_loss: 0.0621 - val_mass_balance: 0.0620\n",
+ "Epoch 8/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 15ms/step - huber: 1.5455e-04 - loss: 0.0563 - mass_balance: 0.0562 - val_huber: 1.4596e-04 - val_loss: 0.0520 - val_mass_balance: 0.0519\n",
+ "Epoch 9/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m34s\u001b[0m 20ms/step - huber: 1.3447e-04 - loss: 0.0548 - mass_balance: 0.0547 - val_huber: 9.0868e-05 - val_loss: 0.0258 - val_mass_balance: 0.0257\n",
+ "Epoch 10/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m29s\u001b[0m 17ms/step - huber: 1.0780e-04 - loss: 0.0512 - mass_balance: 0.0511 - val_huber: 1.0800e-04 - val_loss: 0.0882 - val_mass_balance: 0.0880\n",
+ "Epoch 11/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 13ms/step - huber: 9.2014e-05 - loss: 0.0469 - mass_balance: 0.0468 - val_huber: 6.0724e-05 - val_loss: 0.0343 - val_mass_balance: 0.0343\n",
+ "Epoch 12/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m24s\u001b[0m 14ms/step - huber: 7.2128e-05 - loss: 0.0386 - mass_balance: 0.0386 - val_huber: 5.6025e-05 - val_loss: 0.0444 - val_mass_balance: 0.0444\n",
+ "Epoch 13/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m35s\u001b[0m 21ms/step - huber: 6.2327e-05 - loss: 0.0383 - mass_balance: 0.0382 - val_huber: 4.8252e-05 - val_loss: 0.0264 - val_mass_balance: 0.0263\n",
+ "Epoch 14/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m32s\u001b[0m 19ms/step - huber: 5.0254e-05 - loss: 0.0289 - mass_balance: 0.0289 - val_huber: 4.7942e-05 - val_loss: 0.0367 - val_mass_balance: 0.0366\n",
+ "Epoch 15/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m24s\u001b[0m 14ms/step - huber: 4.9434e-05 - loss: 0.0317 - mass_balance: 0.0316 - val_huber: 3.9466e-05 - val_loss: 0.0483 - val_mass_balance: 0.0483\n",
+ "Epoch 16/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 22ms/step - huber: 4.1831e-05 - loss: 0.0292 - mass_balance: 0.0292 - val_huber: 3.3752e-05 - val_loss: 0.0254 - val_mass_balance: 0.0254\n",
+ "Epoch 17/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 22ms/step - huber: 3.5998e-05 - loss: 0.0254 - mass_balance: 0.0254 - val_huber: 3.6478e-05 - val_loss: 0.0198 - val_mass_balance: 0.0197\n",
+ "Epoch 18/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m25s\u001b[0m 15ms/step - huber: 3.1113e-05 - loss: 0.0216 - mass_balance: 0.0216 - val_huber: 2.5108e-05 - val_loss: 0.0183 - val_mass_balance: 0.0183\n",
+ "Epoch 19/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m30s\u001b[0m 18ms/step - huber: 2.6720e-05 - loss: 0.0199 - mass_balance: 0.0198 - val_huber: 2.1269e-05 - val_loss: 0.0195 - val_mass_balance: 0.0195\n",
+ "Epoch 20/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 24ms/step - huber: 2.2666e-05 - loss: 0.0166 - mass_balance: 0.0166 - val_huber: 2.1749e-05 - val_loss: 0.0166 - val_mass_balance: 0.0166\n",
+ "Epoch 21/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m35s\u001b[0m 21ms/step - huber: 1.9886e-05 - loss: 0.0147 - mass_balance: 0.0147 - val_huber: 2.0177e-05 - val_loss: 0.0258 - val_mass_balance: 0.0258\n",
+ "Epoch 22/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 14ms/step - huber: 1.7967e-05 - loss: 0.0145 - mass_balance: 0.0145 - val_huber: 1.5768e-05 - val_loss: 0.0225 - val_mass_balance: 0.0225\n",
+ "Epoch 23/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m30s\u001b[0m 18ms/step - huber: 1.6283e-05 - loss: 0.0129 - mass_balance: 0.0129 - val_huber: 1.3621e-05 - val_loss: 0.0099 - val_mass_balance: 0.0099\n",
+ "Epoch 24/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 25ms/step - huber: 1.4158e-05 - loss: 0.0120 - mass_balance: 0.0120 - val_huber: 1.2725e-05 - val_loss: 0.0219 - val_mass_balance: 0.0219\n",
+ "Epoch 25/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 23ms/step - huber: 1.3349e-05 - loss: 0.0122 - mass_balance: 0.0122 - val_huber: 1.1089e-05 - val_loss: 0.0058 - val_mass_balance: 0.0058\n",
+ "Epoch 26/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 14ms/step - huber: 1.1305e-05 - loss: 0.0094 - mass_balance: 0.0094 - val_huber: 1.0137e-05 - val_loss: 0.0094 - val_mass_balance: 0.0094\n",
+ "Epoch 27/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m30s\u001b[0m 18ms/step - huber: 1.0401e-05 - loss: 0.0087 - mass_balance: 0.0087 - val_huber: 8.7671e-06 - val_loss: 0.0097 - val_mass_balance: 0.0097\n",
+ "Epoch 28/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 25ms/step - huber: 9.2662e-06 - loss: 0.0084 - mass_balance: 0.0084 - val_huber: 7.9543e-06 - val_loss: 0.0042 - val_mass_balance: 0.0042\n",
+ "Epoch 29/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m34s\u001b[0m 20ms/step - huber: 8.7411e-06 - loss: 0.0083 - mass_balance: 0.0083 - val_huber: 7.5361e-06 - val_loss: 0.0047 - val_mass_balance: 0.0047\n",
+ "Epoch 30/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 13ms/step - huber: 8.3025e-06 - loss: 0.0069 - mass_balance: 0.0069 - val_huber: 7.4451e-06 - val_loss: 0.0094 - val_mass_balance: 0.0094\n",
+ "Epoch 31/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 17ms/step - huber: 7.6382e-06 - loss: 0.0057 - mass_balance: 0.0057 - val_huber: 6.9163e-06 - val_loss: 0.0050 - val_mass_balance: 0.0050\n",
+ "Epoch 32/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 23ms/step - huber: 7.3375e-06 - loss: 0.0056 - mass_balance: 0.0056 - val_huber: 6.7540e-06 - val_loss: 0.0046 - val_mass_balance: 0.0046\n",
+ "Epoch 33/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m33s\u001b[0m 20ms/step - huber: 7.0753e-06 - loss: 0.0051 - mass_balance: 0.0051 - val_huber: 6.2671e-06 - val_loss: 0.0072 - val_mass_balance: 0.0072\n",
+ "Epoch 34/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 14ms/step - huber: 6.7945e-06 - loss: 0.0048 - mass_balance: 0.0048 - val_huber: 6.2241e-06 - val_loss: 0.0072 - val_mass_balance: 0.0072\n",
+ "Epoch 35/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m31s\u001b[0m 19ms/step - huber: 6.5585e-06 - loss: 0.0045 - mass_balance: 0.0045 - val_huber: 6.1400e-06 - val_loss: 0.0036 - val_mass_balance: 0.0036\n",
+ "Epoch 36/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 22ms/step - huber: 6.4420e-06 - loss: 0.0038 - mass_balance: 0.0038 - val_huber: 5.8129e-06 - val_loss: 0.0028 - val_mass_balance: 0.0027\n",
+ "Epoch 37/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m31s\u001b[0m 18ms/step - huber: 6.0778e-06 - loss: 0.0034 - mass_balance: 0.0034 - val_huber: 5.7370e-06 - val_loss: 0.0020 - val_mass_balance: 0.0020\n",
+ "Epoch 38/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 13ms/step - huber: 6.0100e-06 - loss: 0.0030 - mass_balance: 0.0030 - val_huber: 5.4983e-06 - val_loss: 0.0026 - val_mass_balance: 0.0026\n",
+ "Epoch 39/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m32s\u001b[0m 19ms/step - huber: 5.8758e-06 - loss: 0.0032 - mass_balance: 0.0032 - val_huber: 5.4214e-06 - val_loss: 0.0016 - val_mass_balance: 0.0016\n",
+ "Epoch 40/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 22ms/step - huber: 5.6621e-06 - loss: 0.0026 - mass_balance: 0.0026 - val_huber: 5.2990e-06 - val_loss: 0.0034 - val_mass_balance: 0.0034\n",
+ "Epoch 41/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m34s\u001b[0m 20ms/step - huber: 5.5953e-06 - loss: 0.0026 - mass_balance: 0.0026 - val_huber: 5.1084e-06 - val_loss: 0.0017 - val_mass_balance: 0.0016\n",
+ "Epoch 42/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 14ms/step - huber: 5.4874e-06 - loss: 0.0027 - mass_balance: 0.0027 - val_huber: 5.0405e-06 - val_loss: 0.0015 - val_mass_balance: 0.0015\n",
+ "Epoch 43/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m30s\u001b[0m 18ms/step - huber: 5.3323e-06 - loss: 0.0022 - mass_balance: 0.0022 - val_huber: 4.9327e-06 - val_loss: 0.0017 - val_mass_balance: 0.0017\n",
+ "Epoch 44/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 22ms/step - huber: 5.1880e-06 - loss: 0.0022 - mass_balance: 0.0022 - val_huber: 4.8816e-06 - val_loss: 0.0023 - val_mass_balance: 0.0023\n",
+ "Epoch 45/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m34s\u001b[0m 20ms/step - huber: 5.2677e-06 - loss: 0.0019 - mass_balance: 0.0019 - val_huber: 4.8684e-06 - val_loss: 0.0030 - val_mass_balance: 0.0030\n",
+ "Epoch 46/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 13ms/step - huber: 5.0820e-06 - loss: 0.0016 - mass_balance: 0.0016 - val_huber: 4.7764e-06 - val_loss: 0.0017 - val_mass_balance: 0.0017\n",
+ "Epoch 47/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m32s\u001b[0m 19ms/step - huber: 5.1720e-06 - loss: 0.0017 - mass_balance: 0.0017 - val_huber: 4.6949e-06 - val_loss: 0.0014 - val_mass_balance: 0.0014\n",
+ "Epoch 48/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 22ms/step - huber: 4.9894e-06 - loss: 0.0015 - mass_balance: 0.0015 - val_huber: 4.6528e-06 - val_loss: 0.0013 - val_mass_balance: 0.0013\n",
+ "Epoch 49/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m30s\u001b[0m 18ms/step - huber: 5.0818e-06 - loss: 0.0014 - mass_balance: 0.0014 - val_huber: 4.6386e-06 - val_loss: 0.0013 - val_mass_balance: 0.0013\n",
+ "Epoch 50/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 13ms/step - huber: 4.9151e-06 - loss: 0.0014 - mass_balance: 0.0014 - val_huber: 4.5971e-06 - val_loss: 0.0017 - val_mass_balance: 0.0017\n",
+ "Epoch 51/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 22ms/step - huber: 5.1078e-06 - loss: 0.0013 - mass_balance: 0.0013 - val_huber: 4.5822e-06 - val_loss: 0.0012 - val_mass_balance: 0.0012\n",
+ "Epoch 52/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 22ms/step - huber: 4.8951e-06 - loss: 0.0012 - mass_balance: 0.0012 - val_huber: 4.5595e-06 - val_loss: 0.0012 - val_mass_balance: 0.0012\n",
+ "Epoch 53/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m32s\u001b[0m 19ms/step - huber: 4.7999e-06 - loss: 0.0012 - mass_balance: 0.0011 - val_huber: 4.5535e-06 - val_loss: 0.0011 - val_mass_balance: 0.0011\n",
+ "Epoch 54/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 14ms/step - huber: 5.0074e-06 - loss: 0.0010 - mass_balance: 0.0010 - val_huber: 4.5312e-06 - val_loss: 0.0011 - val_mass_balance: 0.0011\n",
+ "Epoch 55/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m36s\u001b[0m 21ms/step - huber: 4.7403e-06 - loss: 0.0011 - mass_balance: 0.0010 - val_huber: 4.5230e-06 - val_loss: 0.0011 - val_mass_balance: 0.0011\n",
+ "Epoch 56/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m36s\u001b[0m 22ms/step - huber: 4.8505e-06 - loss: 0.0010 - mass_balance: 0.0010 - val_huber: 4.4992e-06 - val_loss: 9.9706e-04 - val_mass_balance: 9.9211e-04\n",
+ "Epoch 57/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 16ms/step - huber: 4.7829e-06 - loss: 0.0010 - mass_balance: 0.0010 - val_huber: 4.4840e-06 - val_loss: 0.0011 - val_mass_balance: 0.0011\n",
+ "Epoch 58/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 13ms/step - huber: 4.6865e-06 - loss: 9.4714e-04 - mass_balance: 9.4245e-04 - val_huber: 4.4743e-06 - val_loss: 0.0010 - val_mass_balance: 0.0010\n",
+ "Epoch 59/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m36s\u001b[0m 21ms/step - huber: 4.7369e-06 - loss: 9.1854e-04 - mass_balance: 9.1381e-04 - val_huber: 4.4658e-06 - val_loss: 9.0883e-04 - val_mass_balance: 9.0412e-04\n",
+ "Epoch 60/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m36s\u001b[0m 21ms/step - huber: 4.7842e-06 - loss: 8.9714e-04 - mass_balance: 8.9235e-04 - val_huber: 4.4619e-06 - val_loss: 0.0011 - val_mass_balance: 0.0010\n",
+ "Epoch 61/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m32s\u001b[0m 19ms/step - huber: 4.7509e-06 - loss: 9.0488e-04 - mass_balance: 9.0013e-04 - val_huber: 4.4496e-06 - val_loss: 8.7976e-04 - val_mass_balance: 8.7495e-04\n",
+ "Epoch 62/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m24s\u001b[0m 14ms/step - huber: 4.7354e-06 - loss: 8.7100e-04 - mass_balance: 8.6626e-04 - val_huber: 4.4387e-06 - val_loss: 8.0406e-04 - val_mass_balance: 7.9931e-04\n",
+ "Epoch 63/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 22ms/step - huber: 4.7464e-06 - loss: 8.3838e-04 - mass_balance: 8.3364e-04 - val_huber: 4.4327e-06 - val_loss: 7.9101e-04 - val_mass_balance: 7.8626e-04\n",
+ "Epoch 64/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 23ms/step - huber: 4.6876e-06 - loss: 8.1951e-04 - mass_balance: 8.1482e-04 - val_huber: 4.4294e-06 - val_loss: 8.9929e-04 - val_mass_balance: 8.9460e-04\n",
+ "Epoch 65/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m31s\u001b[0m 18ms/step - huber: 4.6590e-06 - loss: 8.0697e-04 - mass_balance: 8.0231e-04 - val_huber: 4.4291e-06 - val_loss: 8.6386e-04 - val_mass_balance: 8.5926e-04\n",
+ "Epoch 66/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m24s\u001b[0m 14ms/step - huber: 4.7361e-06 - loss: 8.0089e-04 - mass_balance: 7.9615e-04 - val_huber: 4.4201e-06 - val_loss: 9.0955e-04 - val_mass_balance: 9.0501e-04\n",
+ "Epoch 67/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 23ms/step - huber: 4.6704e-06 - loss: 7.8888e-04 - mass_balance: 7.8421e-04 - val_huber: 4.4193e-06 - val_loss: 8.9738e-04 - val_mass_balance: 8.9274e-04\n",
+ "Epoch 68/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 23ms/step - huber: 4.6470e-06 - loss: 7.7605e-04 - mass_balance: 7.7141e-04 - val_huber: 4.4142e-06 - val_loss: 8.5801e-04 - val_mass_balance: 8.5335e-04\n",
+ "Epoch 69/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 16ms/step - huber: 4.7550e-06 - loss: 7.7262e-04 - mass_balance: 7.6787e-04 - val_huber: 4.4084e-06 - val_loss: 7.9255e-04 - val_mass_balance: 7.8781e-04\n",
+ "Epoch 70/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m29s\u001b[0m 17ms/step - huber: 4.7623e-06 - loss: 7.5767e-04 - mass_balance: 7.5291e-04 - val_huber: 4.4077e-06 - val_loss: 7.4866e-04 - val_mass_balance: 7.4407e-04\n",
+ "Epoch 71/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 23ms/step - huber: 4.7104e-06 - loss: 7.4709e-04 - mass_balance: 7.4238e-04 - val_huber: 4.4048e-06 - val_loss: 7.6893e-04 - val_mass_balance: 7.6434e-04\n",
+ "Epoch 72/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m36s\u001b[0m 22ms/step - huber: 4.7597e-06 - loss: 7.4175e-04 - mass_balance: 7.3699e-04 - val_huber: 4.4023e-06 - val_loss: 7.5106e-04 - val_mass_balance: 7.4639e-04\n",
+ "Epoch 73/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 13ms/step - huber: 4.6848e-06 - loss: 7.3518e-04 - mass_balance: 7.3050e-04 - val_huber: 4.3981e-06 - val_loss: 8.2756e-04 - val_mass_balance: 8.2306e-04\n",
+ "Epoch 74/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m32s\u001b[0m 19ms/step - huber: 4.6485e-06 - loss: 7.3155e-04 - mass_balance: 7.2690e-04 - val_huber: 4.3989e-06 - val_loss: 8.4362e-04 - val_mass_balance: 8.3890e-04\n",
+ "Epoch 75/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 22ms/step - huber: 4.7278e-06 - loss: 7.2393e-04 - mass_balance: 7.1920e-04 - val_huber: 4.3956e-06 - val_loss: 7.3810e-04 - val_mass_balance: 7.3353e-04\n",
+ "Epoch 76/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m35s\u001b[0m 21ms/step - huber: 4.7837e-06 - loss: 7.2246e-04 - mass_balance: 7.1768e-04 - val_huber: 4.3947e-06 - val_loss: 7.2104e-04 - val_mass_balance: 7.1644e-04\n",
+ "Epoch 77/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 17ms/step - huber: 4.7795e-06 - loss: 7.1239e-04 - mass_balance: 7.0761e-04 - val_huber: 4.3899e-06 - val_loss: 7.5226e-04 - val_mass_balance: 7.4761e-04\n",
+ "Epoch 78/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m35s\u001b[0m 21ms/step - huber: 4.5890e-06 - loss: 7.1344e-04 - mass_balance: 7.0885e-04 - val_huber: 4.3891e-06 - val_loss: 7.4826e-04 - val_mass_balance: 7.4358e-04\n",
+ "Epoch 79/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m31s\u001b[0m 18ms/step - huber: 4.8303e-06 - loss: 7.1237e-04 - mass_balance: 7.0754e-04 - val_huber: 4.3876e-06 - val_loss: 7.2122e-04 - val_mass_balance: 7.1660e-04\n",
+ "Epoch 80/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 14ms/step - huber: 4.7512e-06 - loss: 7.0720e-04 - mass_balance: 7.0245e-04 - val_huber: 4.3860e-06 - val_loss: 7.8552e-04 - val_mass_balance: 7.8102e-04\n",
+ "Epoch 81/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m33s\u001b[0m 19ms/step - huber: 4.9366e-06 - loss: 7.0371e-04 - mass_balance: 6.9877e-04 - val_huber: 4.3859e-06 - val_loss: 7.4151e-04 - val_mass_balance: 7.3684e-04\n",
+ "Epoch 82/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 24ms/step - huber: 4.5501e-06 - loss: 6.9870e-04 - mass_balance: 6.9415e-04 - val_huber: 4.3839e-06 - val_loss: 7.2937e-04 - val_mass_balance: 7.2469e-04\n",
+ "Epoch 83/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m33s\u001b[0m 19ms/step - huber: 4.7512e-06 - loss: 6.9658e-04 - mass_balance: 6.9183e-04 - val_huber: 4.3828e-06 - val_loss: 6.9935e-04 - val_mass_balance: 6.9476e-04\n",
+ "Epoch 84/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 14ms/step - huber: 4.9666e-06 - loss: 6.9299e-04 - mass_balance: 6.8802e-04 - val_huber: 4.3836e-06 - val_loss: 6.9820e-04 - val_mass_balance: 6.9360e-04\n",
+ "Epoch 85/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 22ms/step - huber: 4.7241e-06 - loss: 6.8971e-04 - mass_balance: 6.8498e-04 - val_huber: 4.3817e-06 - val_loss: 7.0906e-04 - val_mass_balance: 7.0448e-04\n",
+ "Epoch 86/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 24ms/step - huber: 4.6853e-06 - loss: 6.8834e-04 - mass_balance: 6.8366e-04 - val_huber: 4.3801e-06 - val_loss: 6.9305e-04 - val_mass_balance: 6.8842e-04\n",
+ "Epoch 87/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 23ms/step - huber: 4.7930e-06 - loss: 6.8417e-04 - mass_balance: 6.7938e-04 - val_huber: 4.3793e-06 - val_loss: 6.8721e-04 - val_mass_balance: 6.8261e-04\n",
+ "Epoch 88/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 16ms/step - huber: 4.6025e-06 - loss: 6.8556e-04 - mass_balance: 6.8096e-04 - val_huber: 4.3797e-06 - val_loss: 6.9921e-04 - val_mass_balance: 6.9457e-04\n",
+ "Epoch 89/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 24ms/step - huber: 4.6096e-06 - loss: 6.8345e-04 - mass_balance: 6.7884e-04 - val_huber: 4.3777e-06 - val_loss: 7.1012e-04 - val_mass_balance: 7.0556e-04\n",
+ "Epoch 90/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 23ms/step - huber: 4.7352e-06 - loss: 6.8032e-04 - mass_balance: 6.7559e-04 - val_huber: 4.3785e-06 - val_loss: 6.8198e-04 - val_mass_balance: 6.7735e-04\n",
+ "Epoch 91/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m29s\u001b[0m 17ms/step - huber: 4.9625e-06 - loss: 6.7876e-04 - mass_balance: 6.7380e-04 - val_huber: 4.3782e-06 - val_loss: 6.8370e-04 - val_mass_balance: 6.7908e-04\n",
+ "Epoch 92/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 23ms/step - huber: 4.6216e-06 - loss: 6.7679e-04 - mass_balance: 6.7217e-04 - val_huber: 4.3776e-06 - val_loss: 6.9870e-04 - val_mass_balance: 6.9412e-04\n",
+ "Epoch 93/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m32s\u001b[0m 19ms/step - huber: 4.5977e-06 - loss: 6.8038e-04 - mass_balance: 6.7579e-04 - val_huber: 4.3780e-06 - val_loss: 6.7655e-04 - val_mass_balance: 6.7195e-04\n",
+ "Epoch 94/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 17ms/step - huber: 4.7114e-06 - loss: 6.7618e-04 - mass_balance: 6.7147e-04 - val_huber: 4.3773e-06 - val_loss: 6.8676e-04 - val_mass_balance: 6.8217e-04\n",
+ "Epoch 95/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m39s\u001b[0m 23ms/step - huber: 4.8114e-06 - loss: 6.7424e-04 - mass_balance: 6.6943e-04 - val_huber: 4.3775e-06 - val_loss: 6.7735e-04 - val_mass_balance: 6.7271e-04\n",
+ "Epoch 96/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m31s\u001b[0m 18ms/step - huber: 4.6262e-06 - loss: 6.7161e-04 - mass_balance: 6.6699e-04 - val_huber: 4.3762e-06 - val_loss: 6.8181e-04 - val_mass_balance: 6.7717e-04\n",
+ "Epoch 97/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m23s\u001b[0m 14ms/step - huber: 4.6763e-06 - loss: 6.7315e-04 - mass_balance: 6.6847e-04 - val_huber: 4.3764e-06 - val_loss: 6.7627e-04 - val_mass_balance: 6.7167e-04\n",
+ "Epoch 98/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m35s\u001b[0m 20ms/step - huber: 4.4961e-06 - loss: 6.7211e-04 - mass_balance: 6.6761e-04 - val_huber: 4.3764e-06 - val_loss: 6.7528e-04 - val_mass_balance: 6.7067e-04\n",
+ "Epoch 99/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m35s\u001b[0m 21ms/step - huber: 4.6732e-06 - loss: 6.6925e-04 - mass_balance: 6.6458e-04 - val_huber: 4.3758e-06 - val_loss: 6.7478e-04 - val_mass_balance: 6.7018e-04\n",
+ "Epoch 100/100\n",
+ "\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m25s\u001b[0m 15ms/step - huber: 4.8459e-06 - loss: 6.6713e-04 - mass_balance: 6.6228e-04 - val_huber: 4.3756e-06 - val_loss: 6.7381e-04 - val_mass_balance: 6.6918e-04\n",
+ "Training took 3161.1680614948273 seconds\n"
+ ]
+ }
+ ],
+ "source": [
+ "history = model_training(model_large)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'huber': [0.016467243432998657,\n",
+ " 0.0026575098745524883,\n",
+ " 0.0008205742342397571,\n",
+ " 0.0005093477666378021,\n",
+ " 0.0003787624591495842,\n",
+ " 0.0002784435637295246,\n",
+ " 0.00020736613078042865,\n",
+ " 0.00014805630780756474,\n",
+ " 0.0001245995081262663,\n",
+ " 0.0001012101347441785,\n",
+ " 8.732335845706984e-05,\n",
+ " 7.07938161212951e-05,\n",
+ " 6.000046414555982e-05,\n",
+ " 4.9258629587711766e-05,\n",
+ " 4.5853365008952096e-05,\n",
+ " 3.878949792124331e-05,\n",
+ " 3.496679710224271e-05,\n",
+ " 3.024175384780392e-05,\n",
+ " 2.5801549782045186e-05,\n",
+ " 2.228489756816998e-05,\n",
+ " 1.9326878827996552e-05,\n",
+ " 1.720393993309699e-05,\n",
+ " 1.545708619232755e-05,\n",
+ " 1.3873431271349546e-05,\n",
+ " 1.2577706002048217e-05,\n",
+ " 1.1043644917663187e-05,\n",
+ " 1.0004349860537332e-05,\n",
+ " 9.15171312954044e-06,\n",
+ " 8.605407856521197e-06,\n",
+ " 8.079078725131694e-06,\n",
+ " 7.523737622250337e-06,\n",
+ " 7.217747679533204e-06,\n",
+ " 6.9549328145512845e-06,\n",
+ " 6.68665734337992e-06,\n",
+ " 6.558057521033334e-06,\n",
+ " 6.348819169943454e-06,\n",
+ " 6.18170042798738e-06,\n",
+ " 5.973774477752158e-06,\n",
+ " 5.812943072669441e-06,\n",
+ " 5.673456598742632e-06,\n",
+ " 5.545334715861827e-06,\n",
+ " 5.442475867312169e-06,\n",
+ " 5.3044891501485836e-06,\n",
+ " 5.23393055118504e-06,\n",
+ " 5.18664319315576e-06,\n",
+ " 5.130440968059702e-06,\n",
+ " 5.0675025704549626e-06,\n",
+ " 5.022430286771851e-06,\n",
+ " 4.986327894584974e-06,\n",
+ " 4.958836598234484e-06,\n",
+ " 4.92672143082018e-06,\n",
+ " 4.920212177239591e-06,\n",
+ " 4.895785878034076e-06,\n",
+ " 4.880493179371115e-06,\n",
+ " 4.865618393523619e-06,\n",
+ " 4.846592673857231e-06,\n",
+ " 4.830980287806597e-06,\n",
+ " 4.8156484808714595e-06,\n",
+ " 4.8047577365650795e-06,\n",
+ " 4.800085662282072e-06,\n",
+ " 4.7918410928105e-06,\n",
+ " 4.782257747137919e-06,\n",
+ " 4.775091383635299e-06,\n",
+ " 4.770627583638998e-06,\n",
+ " 4.764243385579903e-06,\n",
+ " 4.759195689985063e-06,\n",
+ " 4.757103852170985e-06,\n",
+ " 4.750551852339413e-06,\n",
+ " 4.747769253299339e-06,\n",
+ " 4.743907993542962e-06,\n",
+ " 4.7424591684830375e-06,\n",
+ " 4.740706572192721e-06,\n",
+ " 4.737036761071067e-06,\n",
+ " 4.734663889394142e-06,\n",
+ " 4.732184152089758e-06,\n",
+ " 4.729894044430694e-06,\n",
+ " 4.728701242129318e-06,\n",
+ " 4.726135557575617e-06,\n",
+ " 4.7255007302737795e-06,\n",
+ " 4.723358870251104e-06,\n",
+ " 4.722523044620175e-06,\n",
+ " 4.721841378341196e-06,\n",
+ " 4.720112428913126e-06,\n",
+ " 4.719278877018951e-06,\n",
+ " 4.718392574432073e-06,\n",
+ " 4.7173257371468935e-06,\n",
+ " 4.716040621133288e-06,\n",
+ " 4.71549265057547e-06,\n",
+ " 4.71482553621172e-06,\n",
+ " 4.71395878776093e-06,\n",
+ " 4.714067017630441e-06,\n",
+ " 4.71353814646136e-06,\n",
+ " 4.712836471298942e-06,\n",
+ " 4.7125276978476904e-06,\n",
+ " 4.712316240329528e-06,\n",
+ " 4.712058398581576e-06,\n",
+ " 4.711535893875407e-06,\n",
+ " 4.711482688435353e-06,\n",
+ " 4.711087512987433e-06,\n",
+ " 4.711544988822425e-06],\n",
+ " 'loss': [0.30648601055145264,\n",
+ " 0.17231327295303345,\n",
+ " 0.12539470195770264,\n",
+ " 0.10020893812179565,\n",
+ " 0.09178448468446732,\n",
+ " 0.08137709647417068,\n",
+ " 0.07206308841705322,\n",
+ " 0.057256944477558136,\n",
+ " 0.05294961482286453,\n",
+ " 0.04877038672566414,\n",
+ " 0.04524555802345276,\n",
+ " 0.040079012513160706,\n",
+ " 0.03670475631952286,\n",
+ " 0.03016498312354088,\n",
+ " 0.029404371976852417,\n",
+ " 0.02616339921951294,\n",
+ " 0.02604585886001587,\n",
+ " 0.02159888669848442,\n",
+ " 0.01955566182732582,\n",
+ " 0.017443886026740074,\n",
+ " 0.015240314416587353,\n",
+ " 0.013656704686582088,\n",
+ " 0.012432842515408993,\n",
+ " 0.011758713982999325,\n",
+ " 0.011179047636687756,\n",
+ " 0.009406129829585552,\n",
+ " 0.008792762644588947,\n",
+ " 0.00785292312502861,\n",
+ " 0.00764220766723156,\n",
+ " 0.0069798934273421764,\n",
+ " 0.005929442122578621,\n",
+ " 0.00583580182865262,\n",
+ " 0.005070519633591175,\n",
+ " 0.004584070760756731,\n",
+ " 0.004380729515105486,\n",
+ " 0.0039043554570525885,\n",
+ " 0.0036823840346187353,\n",
+ " 0.003121868474408984,\n",
+ " 0.0029378121253103018,\n",
+ " 0.0027718590572476387,\n",
+ " 0.002403492806479335,\n",
+ " 0.002596942475065589,\n",
+ " 0.002093954710289836,\n",
+ " 0.002055332064628601,\n",
+ " 0.0019100041827186942,\n",
+ " 0.001678098109550774,\n",
+ " 0.0015641257632523775,\n",
+ " 0.0015202162321656942,\n",
+ " 0.001371403457596898,\n",
+ " 0.001403785077854991,\n",
+ " 0.0012853954685851932,\n",
+ " 0.0012285530101507902,\n",
+ " 0.0011501156259328127,\n",
+ " 0.0010609555756673217,\n",
+ " 0.001058138906955719,\n",
+ " 0.0009922973113134503,\n",
+ " 0.0010090821888297796,\n",
+ " 0.0009523544576950371,\n",
+ " 0.0009076613350771368,\n",
+ " 0.0008950438932515681,\n",
+ " 0.0008835873450152576,\n",
+ " 0.0008577112457714975,\n",
+ " 0.0008402072708122432,\n",
+ " 0.0008168538333848119,\n",
+ " 0.000813478312920779,\n",
+ " 0.0007976202177815139,\n",
+ " 0.0007844835636205971,\n",
+ " 0.0007707226905040443,\n",
+ " 0.000765060365665704,\n",
+ " 0.0007560566300526261,\n",
+ " 0.0007469917181879282,\n",
+ " 0.0007387903751805425,\n",
+ " 0.0007344671757891774,\n",
+ " 0.0007288424530997872,\n",
+ " 0.0007215943187475204,\n",
+ " 0.0007187195005826652,\n",
+ " 0.0007133104954846203,\n",
+ " 0.0007089162245392799,\n",
+ " 0.0007070220308378339,\n",
+ " 0.0007033782312646508,\n",
+ " 0.0007000636542215943,\n",
+ " 0.0006962578627280891,\n",
+ " 0.0006947630899958313,\n",
+ " 0.0006916335551068187,\n",
+ " 0.0006891160737723112,\n",
+ " 0.0006869803764857352,\n",
+ " 0.0006848273333162069,\n",
+ " 0.0006834670784883201,\n",
+ " 0.0006819777772761881,\n",
+ " 0.0006801678682677448,\n",
+ " 0.0006790790939703584,\n",
+ " 0.0006776662194170058,\n",
+ " 0.0006763586425222456,\n",
+ " 0.0006750965840183198,\n",
+ " 0.0006742294644936919,\n",
+ " 0.0006733413320034742,\n",
+ " 0.000672198599204421,\n",
+ " 0.0006714383489452302,\n",
+ " 0.0006705404375679791,\n",
+ " 0.000669809291139245],\n",
+ " 'mass_balance': [0.28992345929145813,\n",
+ " 0.1696203649044037,\n",
+ " 0.1245775818824768,\n",
+ " 0.09968571364879608,\n",
+ " 0.09139259904623032,\n",
+ " 0.08108312636613846,\n",
+ " 0.07183856517076492,\n",
+ " 0.05711941421031952,\n",
+ " 0.052825648337602615,\n",
+ " 0.048665404319763184,\n",
+ " 0.04515230283141136,\n",
+ " 0.04000015929341316,\n",
+ " 0.03663957118988037,\n",
+ " 0.030117226764559746,\n",
+ " 0.029365424066781998,\n",
+ " 0.026129310950636864,\n",
+ " 0.02601895108819008,\n",
+ " 0.021564332768321037,\n",
+ " 0.01952822133898735,\n",
+ " 0.017421750351786613,\n",
+ " 0.015222830697894096,\n",
+ " 0.013639131560921669,\n",
+ " 0.012420604936778545,\n",
+ " 0.011748346500098705,\n",
+ " 0.011165905743837357,\n",
+ " 0.009393330663442612,\n",
+ " 0.00878295861184597,\n",
+ " 0.007845276035368443,\n",
+ " 0.007633090019226074,\n",
+ " 0.006970338989049196,\n",
+ " 0.0059210676699876785,\n",
+ " 0.005827996879816055,\n",
+ " 0.005064042750746012,\n",
+ " 0.00457689817994833,\n",
+ " 0.004373996052891016,\n",
+ " 0.0038968229200690985,\n",
+ " 0.0036758396308869123,\n",
+ " 0.003116681706160307,\n",
+ " 0.002932669362053275,\n",
+ " 0.00276594003662467,\n",
+ " 0.002398006385192275,\n",
+ " 0.0025909102987498045,\n",
+ " 0.0020891136955469847,\n",
+ " 0.002050071721896529,\n",
+ " 0.0019051755079999566,\n",
+ " 0.0016737208934500813,\n",
+ " 0.0015591479605063796,\n",
+ " 0.0015149891842156649,\n",
+ " 0.0013664665166288614,\n",
+ " 0.001398497261106968,\n",
+ " 0.0012803340796381235,\n",
+ " 0.0012235511094331741,\n",
+ " 0.0011449819430708885,\n",
+ " 0.0010562300449237227,\n",
+ " 0.0010532340966165066,\n",
+ " 0.0009873538510873914,\n",
+ " 0.0010040433844551444,\n",
+ " 0.0009474873077124357,\n",
+ " 0.0009026402258314192,\n",
+ " 0.0008902117260731757,\n",
+ " 0.0008786250837147236,\n",
+ " 0.0008528471225872636,\n",
+ " 0.0008353753364644945,\n",
+ " 0.0008118956466205418,\n",
+ " 0.0008086940506473184,\n",
+ " 0.000793011044152081,\n",
+ " 0.0007796218851581216,\n",
+ " 0.0007659022230654955,\n",
+ " 0.0007601975230500102,\n",
+ " 0.0007513085147365928,\n",
+ " 0.0007420866750180721,\n",
+ " 0.0007340752054005861,\n",
+ " 0.0007296513067558408,\n",
+ " 0.0007241083076223731,\n",
+ " 0.0007167430012486875,\n",
+ " 0.0007139622466638684,\n",
+ " 0.000708507839590311,\n",
+ " 0.0007042676443234086,\n",
+ " 0.0007021916680969298,\n",
+ " 0.0006986657972447574,\n",
+ " 0.0006952557014301419,\n",
+ " 0.0006915002595633268,\n",
+ " 0.0006899730069562793,\n",
+ " 0.0006869392236694694,\n",
+ " 0.0006842977018095553,\n",
+ " 0.0006822088616900146,\n",
+ " 0.0006800602423027158,\n",
+ " 0.0006787151214666665,\n",
+ " 0.0006773100467398763,\n",
+ " 0.0006753901834599674,\n",
+ " 0.0006744506536051631,\n",
+ " 0.0006728798034600914,\n",
+ " 0.000671558256726712,\n",
+ " 0.0006704204715788364,\n",
+ " 0.0006694469484500587,\n",
+ " 0.000668513064738363,\n",
+ " 0.0006674117757938802,\n",
+ " 0.0006666934350505471,\n",
+ " 0.0006657900521531701,\n",
+ " 0.0006664929678663611],\n",
+ " 'val_huber': [0.005201284773647785,\n",
+ " 0.0012923928443342447,\n",
+ " 0.0006627636030316353,\n",
+ " 0.00042667306843213737,\n",
+ " 0.00027613641577772796,\n",
+ " 0.0002216041466454044,\n",
+ " 0.00015488243661820889,\n",
+ " 0.00014596043911296874,\n",
+ " 9.086774662137032e-05,\n",
+ " 0.00010800284508150071,\n",
+ " 6.072385804145597e-05,\n",
+ " 5.602455712505616e-05,\n",
+ " 4.8251691623590887e-05,\n",
+ " 4.7942019591573626e-05,\n",
+ " 3.946639844798483e-05,\n",
+ " 3.375155574758537e-05,\n",
+ " 3.647833364084363e-05,\n",
+ " 2.510796366550494e-05,\n",
+ " 2.126926301571075e-05,\n",
+ " 2.1749185179942288e-05,\n",
+ " 2.0177141777821817e-05,\n",
+ " 1.5768278899486177e-05,\n",
+ " 1.3621114703710191e-05,\n",
+ " 1.2724695807264652e-05,\n",
+ " 1.1089017789345235e-05,\n",
+ " 1.0136632226931397e-05,\n",
+ " 8.767069630266633e-06,\n",
+ " 7.954341526783537e-06,\n",
+ " 7.5360685514169745e-06,\n",
+ " 7.445102255587699e-06,\n",
+ " 6.916348866070621e-06,\n",
+ " 6.754000423825346e-06,\n",
+ " 6.267141998250736e-06,\n",
+ " 6.224123353604227e-06,\n",
+ " 6.1399505284498446e-06,\n",
+ " 5.812878498545615e-06,\n",
+ " 5.73702027395484e-06,\n",
+ " 5.498338396137115e-06,\n",
+ " 5.421410605777055e-06,\n",
+ " 5.299044914863771e-06,\n",
+ " 5.108431196276797e-06,\n",
+ " 5.040476480644429e-06,\n",
+ " 4.9326554290018976e-06,\n",
+ " 4.881565018877154e-06,\n",
+ " 4.868429186899448e-06,\n",
+ " 4.776351488544606e-06,\n",
+ " 4.694877134170383e-06,\n",
+ " 4.6527843551302794e-06,\n",
+ " 4.6385612222366035e-06,\n",
+ " 4.597116003424162e-06,\n",
+ " 4.5821902858733665e-06,\n",
+ " 4.559493390843272e-06,\n",
+ " 4.553502549242694e-06,\n",
+ " 4.531224476522766e-06,\n",
+ " 4.522975359577686e-06,\n",
+ " 4.499182068684604e-06,\n",
+ " 4.484040800889488e-06,\n",
+ " 4.474295565159991e-06,\n",
+ " 4.4657635953626595e-06,\n",
+ " 4.46186004410265e-06,\n",
+ " 4.449606876733014e-06,\n",
+ " 4.4387397792888805e-06,\n",
+ " 4.432703462953214e-06,\n",
+ " 4.42938244304969e-06,\n",
+ " 4.429067757882876e-06,\n",
+ " 4.420137429406168e-06,\n",
+ " 4.419258402776904e-06,\n",
+ " 4.414219802129082e-06,\n",
+ " 4.4083758439228404e-06,\n",
+ " 4.4077228267269675e-06,\n",
+ " 4.404752871778328e-06,\n",
+ " 4.402321337693138e-06,\n",
+ " 4.398110377223929e-06,\n",
+ " 4.3989152800349984e-06,\n",
+ " 4.395626092446037e-06,\n",
+ " 4.394668849272421e-06,\n",
+ " 4.389917194203008e-06,\n",
+ " 4.389116384118097e-06,\n",
+ " 4.387592525745276e-06,\n",
+ " 4.385979536891682e-06,\n",
+ " 4.385893134895014e-06,\n",
+ " 4.383934083307395e-06,\n",
+ " 4.382837232697057e-06,\n",
+ " 4.383563464216422e-06,\n",
+ " 4.381744929560227e-06,\n",
+ " 4.380144673632458e-06,\n",
+ " 4.379347501526354e-06,\n",
+ " 4.379693109513028e-06,\n",
+ " 4.377741788630374e-06,\n",
+ " 4.37848348155967e-06,\n",
+ " 4.378244284453103e-06,\n",
+ " 4.37762719229795e-06,\n",
+ " 4.3779509724117815e-06,\n",
+ " 4.377348432171857e-06,\n",
+ " 4.377521236165194e-06,\n",
+ " 4.376238848635694e-06,\n",
+ " 4.376393917482346e-06,\n",
+ " 4.376391643745592e-06,\n",
+ " 4.375826847535791e-06,\n",
+ " 4.375569005787838e-06],\n",
+ " 'val_loss': [0.3554118573665619,\n",
+ " 0.14072169363498688,\n",
+ " 0.18250100314617157,\n",
+ " 0.10625234246253967,\n",
+ " 0.0550912544131279,\n",
+ " 0.07982474565505981,\n",
+ " 0.06212713196873665,\n",
+ " 0.052029162645339966,\n",
+ " 0.025773700326681137,\n",
+ " 0.08815066516399384,\n",
+ " 0.034315552562475204,\n",
+ " 0.04443306848406792,\n",
+ " 0.026383033022284508,\n",
+ " 0.036652978509664536,\n",
+ " 0.048315778374671936,\n",
+ " 0.02544834092259407,\n",
+ " 0.019760675728321075,\n",
+ " 0.018324358388781548,\n",
+ " 0.019503841176629066,\n",
+ " 0.016593070700764656,\n",
+ " 0.025827599689364433,\n",
+ " 0.02246992290019989,\n",
+ " 0.009874003008008003,\n",
+ " 0.02192152850329876,\n",
+ " 0.005770025309175253,\n",
+ " 0.009400702081620693,\n",
+ " 0.009708519093692303,\n",
+ " 0.004203513730317354,\n",
+ " 0.00473543256521225,\n",
+ " 0.009447645395994186,\n",
+ " 0.005036721937358379,\n",
+ " 0.004580398090183735,\n",
+ " 0.00723404623568058,\n",
+ " 0.007191700395196676,\n",
+ " 0.0035864152014255524,\n",
+ " 0.0027530172374099493,\n",
+ " 0.001993797719478607,\n",
+ " 0.002578657353296876,\n",
+ " 0.0016335397958755493,\n",
+ " 0.0034430362284183502,\n",
+ " 0.0016514776507392526,\n",
+ " 0.00154941959772259,\n",
+ " 0.001672835205681622,\n",
+ " 0.0022707339376211166,\n",
+ " 0.003024233039468527,\n",
+ " 0.0017011138843372464,\n",
+ " 0.00135646085254848,\n",
+ " 0.0013078938936814666,\n",
+ " 0.0013143954565748572,\n",
+ " 0.00168643519282341,\n",
+ " 0.0012276587076485157,\n",
+ " 0.0012025146279484034,\n",
+ " 0.0011409894796088338,\n",
+ " 0.0011019987286999822,\n",
+ " 0.0010852228151634336,\n",
+ " 0.0009970556711778045,\n",
+ " 0.001057568471878767,\n",
+ " 0.0010358155705034733,\n",
+ " 0.0009088307269848883,\n",
+ " 0.0010502993827685714,\n",
+ " 0.0008797580958344042,\n",
+ " 0.0008040553657338023,\n",
+ " 0.0007910137064754963,\n",
+ " 0.000899291830137372,\n",
+ " 0.0008638582658022642,\n",
+ " 0.0009095508721657097,\n",
+ " 0.0008973782532848418,\n",
+ " 0.0008580106659792364,\n",
+ " 0.0007925477693788707,\n",
+ " 0.0007486609974876046,\n",
+ " 0.0007689266931265593,\n",
+ " 0.0007510561845265329,\n",
+ " 0.000827563984785229,\n",
+ " 0.0008436156203970313,\n",
+ " 0.0007380963070318103,\n",
+ " 0.0007210447802208364,\n",
+ " 0.000752260850276798,\n",
+ " 0.0007482616929337382,\n",
+ " 0.000721216609235853,\n",
+ " 0.0007855220464989543,\n",
+ " 0.0007415070431306958,\n",
+ " 0.0007293731905519962,\n",
+ " 0.0006993496208451688,\n",
+ " 0.0006982010090723634,\n",
+ " 0.0007090615690685809,\n",
+ " 0.0006930531817488372,\n",
+ " 0.0006872066296637058,\n",
+ " 0.0006992127164267004,\n",
+ " 0.0007101157680153847,\n",
+ " 0.0006819805130362511,\n",
+ " 0.0006836954271420836,\n",
+ " 0.0006987039814703166,\n",
+ " 0.0006765545695088804,\n",
+ " 0.0006867556949146092,\n",
+ " 0.0006773460190743208,\n",
+ " 0.0006818092078901827,\n",
+ " 0.0006762673147022724,\n",
+ " 0.0006752805784344673,\n",
+ " 0.0006747819716110826,\n",
+ " 0.0006738057709299028],\n",
+ " 'val_mass_balance': [0.35021522641181946,\n",
+ " 0.1394379734992981,\n",
+ " 0.18183398246765137,\n",
+ " 0.10583663731813431,\n",
+ " 0.05481866002082825,\n",
+ " 0.07961198687553406,\n",
+ " 0.06197033077478409,\n",
+ " 0.051894836127758026,\n",
+ " 0.025688081979751587,\n",
+ " 0.08804472535848618,\n",
+ " 0.03425372764468193,\n",
+ " 0.04437873885035515,\n",
+ " 0.026329094544053078,\n",
+ " 0.03660159558057785,\n",
+ " 0.048272017389535904,\n",
+ " 0.025413667783141136,\n",
+ " 0.019724544137716293,\n",
+ " 0.018299173563718796,\n",
+ " 0.0194828100502491,\n",
+ " 0.016570812091231346,\n",
+ " 0.025805149227380753,\n",
+ " 0.022451717406511307,\n",
+ " 0.009862499311566353,\n",
+ " 0.021908782422542572,\n",
+ " 0.005759319290518761,\n",
+ " 0.009390369057655334,\n",
+ " 0.00970003753900528,\n",
+ " 0.004195359069854021,\n",
+ " 0.004727505147457123,\n",
+ " 0.009439199231564999,\n",
+ " 0.00502851651981473,\n",
+ " 0.0045739514753222466,\n",
+ " 0.007227415218949318,\n",
+ " 0.00718472758308053,\n",
+ " 0.003580695716664195,\n",
+ " 0.0027465075254440308,\n",
+ " 0.0019877778831869364,\n",
+ " 0.00257281051017344,\n",
+ " 0.0016277511604130268,\n",
+ " 0.0034374732058495283,\n",
+ " 0.0016461930936202407,\n",
+ " 0.0015438479604199529,\n",
+ " 0.0016676313243806362,\n",
+ " 0.002265515737235546,\n",
+ " 0.003019126830622554,\n",
+ " 0.0016960910288617015,\n",
+ " 0.0013514243764802814,\n",
+ " 0.0013028718531131744,\n",
+ " 0.001309368759393692,\n",
+ " 0.0016814287519082427,\n",
+ " 0.001222927705384791,\n",
+ " 0.0011976248351857066,\n",
+ " 0.001136238221079111,\n",
+ " 0.0010970447910949588,\n",
+ " 0.0010802543256431818,\n",
+ " 0.000992113258689642,\n",
+ " 0.001052781823091209,\n",
+ " 0.0010309231001883745,\n",
+ " 0.0009041248122230172,\n",
+ " 0.0010457386961206794,\n",
+ " 0.0008749476983211935,\n",
+ " 0.0007993136532604694,\n",
+ " 0.0007862630300223827,\n",
+ " 0.0008946022135205567,\n",
+ " 0.0008592592785134912,\n",
+ " 0.000905013526789844,\n",
+ " 0.0008927428280003369,\n",
+ " 0.0008533502114005387,\n",
+ " 0.0007878062315285206,\n",
+ " 0.0007440654444508255,\n",
+ " 0.0007643401622772217,\n",
+ " 0.0007463873480446637,\n",
+ " 0.0008230630191974342,\n",
+ " 0.0008388996939174831,\n",
+ " 0.0007335346890613437,\n",
+ " 0.0007164428243413568,\n",
+ " 0.000747605343349278,\n",
+ " 0.0007435783045366406,\n",
+ " 0.000716604117769748,\n",
+ " 0.000781018054112792,\n",
+ " 0.0007368420483544469,\n",
+ " 0.0007246945751830935,\n",
+ " 0.0006947608781047165,\n",
+ " 0.0006936006830073893,\n",
+ " 0.0007044760859571397,\n",
+ " 0.0006884249160066247,\n",
+ " 0.0006826136959716678,\n",
+ " 0.0006945744971744716,\n",
+ " 0.0007055643363855779,\n",
+ " 0.0006773463101126254,\n",
+ " 0.000679083401337266,\n",
+ " 0.000694122223649174,\n",
+ " 0.0006719458033330739,\n",
+ " 0.0006821651477366686,\n",
+ " 0.0006727080326527357,\n",
+ " 0.0006771697080694139,\n",
+ " 0.0006716735661029816,\n",
+ " 0.0006706715212203562,\n",
+ " 0.000670175941195339,\n",
+ " 0.0006691797752864659]}"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "history.history"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Test Mass Balance"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def mass_balance(model, X, preprocess):\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 or standard scaler\n",
+ " X = pd.DataFrame(preprocess.scaler_X.inverse_transform(X.iloc[:, X.columns != \"Class\"]), columns=columns)\n",
+ " prediction = pd.DataFrame(preprocess.scaler_y.inverse_transform(prediction), columns=columns)\n",
+ " \n",
+ " # calculate mass balance\n",
+ " dBa = np.abs((prediction[\"Ba\"] + prediction[\"Barite\"]) - (X[\"Ba\"] + X[\"Barite\"]))\n",
+ " print(dBa.min())\n",
+ " dSr = np.abs((prediction[\"Sr\"] + prediction[\"Celestite\"]) - (X[\"Sr\"] + X[\"Celestite\"]))\n",
+ " print(dSr.min())\n",
+ " return dBa, dSr, prediction"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model_large.save(\"../results/models/model_large_minmax.keras\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m26993/26993\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 958us/step\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " H | \n",
+ " O | \n",
+ " Ba | \n",
+ " Cl | \n",
+ " S | \n",
+ " Sr | \n",
+ " Barite | \n",
+ " Celestite | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 111.012436 | \n",
+ " 55.506577 | \n",
+ " 2.545392e-05 | \n",
+ " 0.056169 | \n",
+ " 9.056123e-05 | \n",
+ " 0.028152 | \n",
+ " 0.000378 | \n",
+ " 1.000338 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 111.012436 | \n",
+ " 55.506767 | \n",
+ " -2.754421e-06 | \n",
+ " 0.013520 | \n",
+ " 1.372749e-04 | \n",
+ " 0.006905 | \n",
+ " 0.001824 | \n",
+ " 1.001608 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 111.012436 | \n",
+ " 55.506561 | \n",
+ " 4.052742e-05 | \n",
+ " 0.066249 | \n",
+ " 8.696535e-05 | \n",
+ " 0.033175 | \n",
+ " -0.000851 | \n",
+ " 1.002237 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 111.012436 | \n",
+ " 55.506218 | \n",
+ " 4.709655e-02 | \n",
+ " 0.153739 | \n",
+ " 1.902060e-07 | \n",
+ " 0.029717 | \n",
+ " 1.007493 | \n",
+ " 0.000263 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 111.012436 | \n",
+ " 55.507805 | \n",
+ " 4.156423e-06 | \n",
+ " 0.001301 | \n",
+ " 3.962677e-04 | \n",
+ " 0.001057 | \n",
+ " 0.000573 | \n",
+ " 1.001946 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 863768 | \n",
+ " 111.012436 | \n",
+ " 55.506592 | \n",
+ " -3.092120e-08 | \n",
+ " 0.048117 | \n",
+ " 9.312747e-05 | \n",
+ " 0.024139 | \n",
+ " 0.002836 | \n",
+ " 0.999394 | \n",
+ "
\n",
+ " \n",
+ " | 863769 | \n",
+ " 111.012436 | \n",
+ " 55.506775 | \n",
+ " -2.154928e-06 | \n",
+ " 0.013042 | \n",
+ " 1.396511e-04 | \n",
+ " 0.006667 | \n",
+ " 0.001727 | \n",
+ " 1.002290 | \n",
+ "
\n",
+ " \n",
+ " | 863770 | \n",
+ " 111.012436 | \n",
+ " 55.506489 | \n",
+ " 3.149816e-05 | \n",
+ " 0.108516 | \n",
+ " 6.810994e-05 | \n",
+ " 0.054227 | \n",
+ " 0.108361 | \n",
+ " 0.891181 | \n",
+ "
\n",
+ " \n",
+ " | 863771 | \n",
+ " 111.012436 | \n",
+ " 55.506218 | \n",
+ " 3.613450e-02 | \n",
+ " 0.141631 | \n",
+ " -7.596697e-08 | \n",
+ " 0.034772 | \n",
+ " 0.996522 | \n",
+ " 0.000232 | \n",
+ "
\n",
+ " \n",
+ " | 863772 | \n",
+ " 111.012436 | \n",
+ " 55.506214 | \n",
+ " 4.155123e-02 | \n",
+ " 0.150297 | \n",
+ " -7.713574e-07 | \n",
+ " 0.033498 | \n",
+ " 1.020295 | \n",
+ " -0.003992 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
863773 rows × 8 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " H O Ba Cl S Sr \\\n",
+ "0 111.012436 55.506577 2.545392e-05 0.056169 9.056123e-05 0.028152 \n",
+ "1 111.012436 55.506767 -2.754421e-06 0.013520 1.372749e-04 0.006905 \n",
+ "2 111.012436 55.506561 4.052742e-05 0.066249 8.696535e-05 0.033175 \n",
+ "3 111.012436 55.506218 4.709655e-02 0.153739 1.902060e-07 0.029717 \n",
+ "4 111.012436 55.507805 4.156423e-06 0.001301 3.962677e-04 0.001057 \n",
+ "... ... ... ... ... ... ... \n",
+ "863768 111.012436 55.506592 -3.092120e-08 0.048117 9.312747e-05 0.024139 \n",
+ "863769 111.012436 55.506775 -2.154928e-06 0.013042 1.396511e-04 0.006667 \n",
+ "863770 111.012436 55.506489 3.149816e-05 0.108516 6.810994e-05 0.054227 \n",
+ "863771 111.012436 55.506218 3.613450e-02 0.141631 -7.596697e-08 0.034772 \n",
+ "863772 111.012436 55.506214 4.155123e-02 0.150297 -7.713574e-07 0.033498 \n",
+ "\n",
+ " Barite Celestite \n",
+ "0 0.000378 1.000338 \n",
+ "1 0.001824 1.001608 \n",
+ "2 -0.000851 1.002237 \n",
+ "3 1.007493 0.000263 \n",
+ "4 0.000573 1.001946 \n",
+ "... ... ... \n",
+ "863768 0.002836 0.999394 \n",
+ "863769 0.001727 1.002290 \n",
+ "863770 0.108361 0.891181 \n",
+ "863771 0.996522 0.000232 \n",
+ "863772 1.020295 -0.003992 \n",
+ "\n",
+ "[863773 rows x 8 columns]"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.DataFrame(preprocess.scaler_X.inverse_transform(model_large.predict(X_train[species_columns])), columns=species_columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " H | \n",
+ " O | \n",
+ " Ba | \n",
+ " Cl | \n",
+ " S | \n",
+ " Sr | \n",
+ " Barite | \n",
+ " Celestite | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 111.012434 | \n",
+ " 55.506578 | \n",
+ " 1.977602e-05 | \n",
+ " 0.056160 | \n",
+ " 9.022655e-05 | \n",
+ " 0.028151 | \n",
+ " 0.001000 | \n",
+ " 1.000490 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 111.012434 | \n",
+ " 55.506767 | \n",
+ " 4.662127e-06 | \n",
+ " 0.013550 | \n",
+ " 1.374302e-04 | \n",
+ " 0.006908 | \n",
+ " 0.001000 | \n",
+ " 1.000091 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 111.012434 | \n",
+ " 55.506565 | \n",
+ " 2.349696e-05 | \n",
+ " 0.066235 | \n",
+ " 8.705933e-05 | \n",
+ " 0.033181 | \n",
+ " 0.001001 | \n",
+ " 1.000613 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 111.012434 | \n",
+ " 55.506217 | \n",
+ " 4.713082e-02 | \n",
+ " 0.153692 | \n",
+ " 1.289482e-07 | \n",
+ " 0.029715 | \n",
+ " 1.003514 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 111.012434 | \n",
+ " 55.507809 | \n",
+ " 7.424997e-07 | \n",
+ " 0.001338 | \n",
+ " 3.981606e-04 | \n",
+ " 0.001067 | \n",
+ " 0.001000 | \n",
+ " 1.000093 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 863768 | \n",
+ " 111.012434 | \n",
+ " 55.506591 | \n",
+ " 1.684073e-05 | \n",
+ " 0.048120 | \n",
+ " 9.347094e-05 | \n",
+ " 0.024137 | \n",
+ " 0.001001 | \n",
+ " 1.000615 | \n",
+ "
\n",
+ " \n",
+ " | 863769 | \n",
+ " 111.012434 | \n",
+ " 55.506776 | \n",
+ " 4.502549e-06 | \n",
+ " 0.013076 | \n",
+ " 1.397029e-04 | \n",
+ " 0.006673 | \n",
+ " 0.001000 | \n",
+ " 1.000591 | \n",
+ "
\n",
+ " \n",
+ " | 863770 | \n",
+ " 111.012434 | \n",
+ " 55.506474 | \n",
+ " 2.738630e-04 | \n",
+ " 0.108422 | \n",
+ " 6.420915e-05 | \n",
+ " 0.054001 | \n",
+ " 0.104655 | \n",
+ " 0.892149 | \n",
+ "
\n",
+ " \n",
+ " | 863771 | \n",
+ " 111.012434 | \n",
+ " 55.506217 | \n",
+ " 3.604271e-02 | \n",
+ " 0.141633 | \n",
+ " 1.533977e-07 | \n",
+ " 0.034774 | \n",
+ " 1.006758 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 863772 | \n",
+ " 111.012434 | \n",
+ " 55.506217 | \n",
+ " 4.167711e-02 | \n",
+ " 0.150324 | \n",
+ " 1.392182e-07 | \n",
+ " 0.033485 | \n",
+ " 1.006763 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
863773 rows × 8 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " H O Ba Cl S Sr \\\n",
+ "0 111.012434 55.506578 1.977602e-05 0.056160 9.022655e-05 0.028151 \n",
+ "1 111.012434 55.506767 4.662127e-06 0.013550 1.374302e-04 0.006908 \n",
+ "2 111.012434 55.506565 2.349696e-05 0.066235 8.705933e-05 0.033181 \n",
+ "3 111.012434 55.506217 4.713082e-02 0.153692 1.289482e-07 0.029715 \n",
+ "4 111.012434 55.507809 7.424997e-07 0.001338 3.981606e-04 0.001067 \n",
+ "... ... ... ... ... ... ... \n",
+ "863768 111.012434 55.506591 1.684073e-05 0.048120 9.347094e-05 0.024137 \n",
+ "863769 111.012434 55.506776 4.502549e-06 0.013076 1.397029e-04 0.006673 \n",
+ "863770 111.012434 55.506474 2.738630e-04 0.108422 6.420915e-05 0.054001 \n",
+ "863771 111.012434 55.506217 3.604271e-02 0.141633 1.533977e-07 0.034774 \n",
+ "863772 111.012434 55.506217 4.167711e-02 0.150324 1.392182e-07 0.033485 \n",
+ "\n",
+ " Barite Celestite \n",
+ "0 0.001000 1.000490 \n",
+ "1 0.001000 1.000091 \n",
+ "2 0.001001 1.000613 \n",
+ "3 1.003514 0.000000 \n",
+ "4 0.001000 1.000093 \n",
+ "... ... ... \n",
+ "863768 0.001001 1.000615 \n",
+ "863769 0.001000 1.000591 \n",
+ "863770 0.104655 0.892149 \n",
+ "863771 1.006758 0.000000 \n",
+ "863772 1.006763 0.000000 \n",
+ "\n",
+ "[863773 rows x 8 columns]"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.DataFrame(preprocess.scaler_X.inverse_transform(X_train[species_columns]), columns=species_columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 953us/step\n",
+ "9.191400065101246e-09\n",
+ "3.33847283151556e-09\n"
+ ]
+ }
+ ],
+ "source": [
+ "dBa, dSr, prediction = mass_balance(model_large, X_test, preprocess)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mass_balance_results = dBa + dSr"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.0"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(mass_balance_results[mass_balance_results < 1e-5]) / len(mass_balance_results)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Series([], dtype: float64)"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mass_balance_results[mass_balance_results < 1e-5]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Optimizing with Optuna"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import optuna\n",
+ "\n",
+ "def create_model(model, preprocess, h1, h2, h3, h4):\n",
+ " \n",
+ " model.compile(optimizer=optimizer_simple, loss=custom_loss(preprocess, column_dict, h1, h2, h3, h4))\n",
+ " \n",
+ " return model\n",
+ "\n",
+ "\n",
+ "def objective(trial, preprocess, X_train, y_train, X_val, y_val, X_test, y_test):\n",
+ " h1 = trial.suggest_float(\"h1\", 0.1, 100)\n",
+ " h2 = trial.suggest_float(\"h2\", 0.1, 100)\n",
+ " h3 = trial.suggest_float(\"h3\", 0.1, 100)\n",
+ " h4 = trial.suggest_float(\"h4\", 0.1, 100)\n",
+ " \n",
+ " model = create_model(model_simple, preprocess, h1, h2, h3, h4)\n",
+ " \n",
+ " callback = keras.callbacks.EarlyStopping(monitor='loss', patience=3)\n",
+ " history = model.fit(X_train.loc[:, X_train.columns != \"Class\"], \n",
+ " y_train.loc[:, y_train.columns != \"Class\"], \n",
+ " batch_size=batch_size, \n",
+ " epochs=50, \n",
+ " validation_data=(X_val.loc[:, X_val.columns != \"Class\"], y_val.loc[:, y_val.columns != \"Class\"]),\n",
+ " callbacks=[callback])\n",
+ " \n",
+ " mass_balance_results = mass_balance(model, X_test, preprocess)\n",
+ " \n",
+ " loss = len(mass_balance_results[mass_balance_results < 1e-5]) / len(mass_balance_results)\n",
+ "\n",
+ " return loss"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[I 2025-02-17 00:06:24,572] A new study created in memory with name: no-name-585ded5e-6499-4f70-9577-49339316366a\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12377019392.0000 - val_loss: 43404600.0000\n",
+ "Epoch 2/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 36439708.0000 - val_loss: 19609912.0000\n",
+ "Epoch 3/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 15841922.0000 - val_loss: 7256873.5000\n",
+ "Epoch 4/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 5500834.0000 - val_loss: 1881962.5000\n",
+ "Epoch 5/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1413300.5000 - val_loss: 617048.8125\n",
+ "Epoch 6/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 496590.9375 - val_loss: 194345.2812\n",
+ "Epoch 7/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 139668.2969 - val_loss: 31873.9043\n",
+ "Epoch 8/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 21170.1543 - val_loss: 4920.2520\n",
+ "Epoch 9/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 4156.0869 - val_loss: 3427.2729\n",
+ "Epoch 10/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3414.1331 - val_loss: 3416.1082\n",
+ "Epoch 11/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3416.9729 - val_loss: 3429.7239\n",
+ "Epoch 12/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3412.4482 - val_loss: 3435.3306\n",
+ "Epoch 13/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3425.5073 - val_loss: 3403.7925\n",
+ "Epoch 14/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3425.9592 - val_loss: 3423.5193\n",
+ "\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 296us/step\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[I 2025-02-17 00:06:49,285] Trial 0 finished with value: 0.0 and parameters: {'h1': 72.40785703177082, 'h2': 25.825548427085515, 'h3': 61.927211067692724, 'h4': 19.232336897801325}. Best is trial 0 with value: 0.0.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2791.0564 - val_loss: 2618.3965\n",
+ "Epoch 2/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2622.5496 - val_loss: 2616.2480\n",
+ "Epoch 3/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2620.7339 - val_loss: 2631.9077\n",
+ "Epoch 4/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2650.9636 - val_loss: 2814.0315\n",
+ "Epoch 5/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2722.9919 - val_loss: 2598.4248\n",
+ "Epoch 6/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2778.1111 - val_loss: 2559.9062\n",
+ "\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 291us/step\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[I 2025-02-17 00:07:00,296] Trial 1 finished with value: 0.0 and parameters: {'h1': 55.156241799815355, 'h2': 78.4033434954878, 'h3': 95.18824024469184, 'h4': 14.82240562501995}. Best is trial 0 with value: 0.0.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 7852.1719 - val_loss: 2412.7383\n",
+ "Epoch 2/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2426.0986 - val_loss: 2597.7363\n",
+ "Epoch 3/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2473.9902 - val_loss: 2277.7488\n",
+ "Epoch 4/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2471.1829 - val_loss: 2443.7427\n",
+ "Epoch 5/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2402.8818 - val_loss: 2218.1780\n",
+ "Epoch 6/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2367.2834 - val_loss: 2218.3396\n",
+ "Epoch 7/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2340.9314 - val_loss: 2119.3755\n",
+ "Epoch 8/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2219.4814 - val_loss: 2298.2070\n",
+ "Epoch 9/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2155.6299 - val_loss: 2612.8733\n",
+ "Epoch 10/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2100.1267 - val_loss: 2046.4711\n",
+ "Epoch 11/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2001.3557 - val_loss: 2211.9299\n",
+ "Epoch 12/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1971.5155 - val_loss: 1997.1703\n",
+ "Epoch 13/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1947.2655 - val_loss: 1892.0009\n",
+ "Epoch 14/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1915.1980 - val_loss: 1860.9949\n",
+ "Epoch 15/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1882.3663 - val_loss: 1861.6248\n",
+ "Epoch 16/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1869.7008 - val_loss: 1896.9276\n",
+ "Epoch 17/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1883.5923 - val_loss: 1915.4973\n",
+ "Epoch 18/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1871.5115 - val_loss: 1837.4102\n",
+ "Epoch 19/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1877.5151 - val_loss: 1879.3440\n",
+ "Epoch 20/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1862.3589 - val_loss: 1957.3567\n",
+ "Epoch 21/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1845.3960 - val_loss: 1814.5060\n",
+ "Epoch 22/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1835.3391 - val_loss: 1809.6317\n",
+ "Epoch 23/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1838.9376 - val_loss: 1833.8245\n",
+ "Epoch 24/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1831.4557 - val_loss: 1886.3599\n",
+ "Epoch 25/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1833.6478 - val_loss: 1800.0344\n",
+ "Epoch 26/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1833.5480 - val_loss: 1797.0282\n",
+ "Epoch 27/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1819.1056 - val_loss: 1794.1648\n",
+ "Epoch 28/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1812.3524 - val_loss: 1881.1871\n",
+ "Epoch 29/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1805.2583 - val_loss: 1802.8263\n",
+ "Epoch 30/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1808.2974 - val_loss: 1777.7633\n",
+ "Epoch 31/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1792.2367 - val_loss: 1791.2937\n",
+ "Epoch 32/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1789.2295 - val_loss: 1778.8715\n",
+ "Epoch 33/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1772.3083 - val_loss: 1778.3553\n",
+ "Epoch 34/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1781.2627 - val_loss: 1760.8132\n",
+ "Epoch 35/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1783.0363 - val_loss: 1763.7234\n",
+ "Epoch 36/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1765.7679 - val_loss: 1752.7267\n",
+ "Epoch 37/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1761.1954 - val_loss: 1762.8220\n",
+ "Epoch 38/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1762.9722 - val_loss: 1747.1544\n",
+ "Epoch 39/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1753.7981 - val_loss: 1763.1051\n",
+ "Epoch 40/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1752.4087 - val_loss: 1739.5280\n",
+ "Epoch 41/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1748.3682 - val_loss: 1728.5411\n",
+ "Epoch 42/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1739.5088 - val_loss: 1729.1458\n",
+ "Epoch 43/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1736.5480 - val_loss: 1724.7151\n",
+ "Epoch 44/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1740.2578 - val_loss: 1734.8917\n",
+ "Epoch 45/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1730.3800 - val_loss: 1736.1029\n",
+ "Epoch 46/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1714.5963 - val_loss: 1715.0453\n",
+ "Epoch 47/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1717.4546 - val_loss: 1771.3018\n",
+ "Epoch 48/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1712.6161 - val_loss: 1711.4847\n",
+ "Epoch 49/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1702.8785 - val_loss: 1712.8119\n",
+ "Epoch 50/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1711.1716 - val_loss: 1700.8627\n",
+ "\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 296us/step\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[I 2025-02-17 00:08:19,362] Trial 2 finished with value: 0.0 and parameters: {'h1': 32.18807766864932, 'h2': 32.38115474529778, 'h3': 82.71542742505292, 'h4': 21.39993663591346}. Best is trial 0 with value: 0.0.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1814.5203 - val_loss: 1661.1248\n",
+ "Epoch 2/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1621.0743 - val_loss: 1503.6709\n",
+ "Epoch 3/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1466.0696 - val_loss: 1357.3704\n",
+ "Epoch 4/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1319.6273 - val_loss: 1204.6761\n",
+ "Epoch 5/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1164.8816 - val_loss: 1049.8190\n",
+ "Epoch 6/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1012.0715 - val_loss: 900.6155\n",
+ "Epoch 7/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 866.8824 - val_loss: 782.1039\n",
+ "Epoch 8/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 765.9833 - val_loss: 752.7275\n",
+ "Epoch 9/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 752.8401 - val_loss: 751.8625\n",
+ "Epoch 10/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 752.4477 - val_loss: 755.2651\n",
+ "Epoch 11/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 752.4553 - val_loss: 750.9076\n",
+ "Epoch 12/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 752.6575 - val_loss: 751.2373\n",
+ "Epoch 13/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 751.5120 - val_loss: 750.2513\n",
+ "Epoch 14/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 750.1327 - val_loss: 749.1887\n",
+ "Epoch 15/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 750.2402 - val_loss: 748.8613\n",
+ "Epoch 16/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 751.2623 - val_loss: 748.6445\n",
+ "Epoch 17/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 750.6178 - val_loss: 748.5185\n",
+ "Epoch 18/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 749.1051 - val_loss: 748.1081\n",
+ "Epoch 19/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 749.3755 - val_loss: 747.6932\n",
+ "Epoch 20/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 748.1135 - val_loss: 747.2830\n",
+ "Epoch 21/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.3423 - val_loss: 747.2092\n",
+ "Epoch 22/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.1829 - val_loss: 747.7263\n",
+ "Epoch 23/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.6171 - val_loss: 746.8931\n",
+ "Epoch 24/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 746.1934 - val_loss: 746.4072\n",
+ "Epoch 25/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.4377 - val_loss: 746.0536\n",
+ "Epoch 26/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.3806 - val_loss: 745.7092\n",
+ "Epoch 27/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 746.1663 - val_loss: 745.9564\n",
+ "Epoch 28/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 746.9430 - val_loss: 745.2064\n",
+ "Epoch 29/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.6080 - val_loss: 745.0362\n",
+ "Epoch 30/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 745.1031 - val_loss: 745.5790\n",
+ "Epoch 31/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.9517 - val_loss: 746.2484\n",
+ "Epoch 32/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 745.3198 - val_loss: 744.7700\n",
+ "Epoch 33/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 746.6561 - val_loss: 744.3752\n",
+ "Epoch 34/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.4594 - val_loss: 744.5372\n",
+ "Epoch 35/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 745.4088 - val_loss: 744.5147\n",
+ "Epoch 36/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 745.0701 - val_loss: 743.8632\n",
+ "Epoch 37/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.1857 - val_loss: 744.3721\n",
+ "Epoch 38/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.1999 - val_loss: 743.6331\n",
+ "Epoch 39/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.2258 - val_loss: 743.9576\n",
+ "Epoch 40/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.8534 - val_loss: 743.3392\n",
+ "Epoch 41/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.1964 - val_loss: 743.3118\n",
+ "Epoch 42/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.2463 - val_loss: 744.1565\n",
+ "Epoch 43/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.7304 - val_loss: 742.9604\n",
+ "Epoch 44/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 742.8326 - val_loss: 743.0219\n",
+ "Epoch 45/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.7935 - val_loss: 742.7424\n",
+ "Epoch 46/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 742.9843 - val_loss: 742.6505\n",
+ "Epoch 47/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 741.9490 - val_loss: 742.4158\n",
+ "Epoch 48/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 741.9554 - val_loss: 742.6078\n",
+ "Epoch 49/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.1502 - val_loss: 742.2740\n",
+ "Epoch 50/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.5102 - val_loss: 742.0992\n",
+ "\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 290us/step\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[I 2025-02-17 00:09:41,637] Trial 3 finished with value: 0.0 and parameters: {'h1': 51.147323536824445, 'h2': 56.78563118722674, 'h3': 31.302312703064025, 'h4': 0.2323539329544047}. Best is trial 0 with value: 0.0.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 27736.6758 - val_loss: 25335.9141\n",
+ "Epoch 2/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 24856.6797 - val_loss: 23624.0430\n",
+ "Epoch 3/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 23591.7324 - val_loss: 22455.3379\n",
+ "Epoch 4/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 22087.6445 - val_loss: 21249.2285\n",
+ "Epoch 5/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 21055.1582 - val_loss: 20346.3613\n",
+ "Epoch 6/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 20397.3496 - val_loss: 19634.5000\n",
+ "Epoch 7/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 19168.5645 - val_loss: 18746.1426\n",
+ "Epoch 8/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 18433.6738 - val_loss: 18086.1094\n",
+ "Epoch 9/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 17888.7070 - val_loss: 17506.1172\n",
+ "Epoch 10/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 17398.0664 - val_loss: 16952.9180\n",
+ "Epoch 11/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 16835.0117 - val_loss: 16448.4297\n",
+ "Epoch 12/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 16369.1172 - val_loss: 15983.9541\n",
+ "Epoch 13/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 15914.9648 - val_loss: 15574.0117\n",
+ "Epoch 14/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 15417.1514 - val_loss: 15182.9922\n",
+ "Epoch 15/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14972.8398 - val_loss: 14841.6963\n",
+ "Epoch 16/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14821.4219 - val_loss: 14586.0078\n",
+ "Epoch 17/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14475.7656 - val_loss: 14208.0049\n",
+ "Epoch 18/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14218.5225 - val_loss: 13965.6191\n",
+ "Epoch 19/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14080.0352 - val_loss: 13686.0967\n",
+ "Epoch 20/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 13640.7412 - val_loss: 13432.9609\n",
+ "Epoch 21/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 13297.7139 - val_loss: 13222.0645\n",
+ "Epoch 22/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 13205.2559 - val_loss: 13020.1660\n",
+ "Epoch 23/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 13046.4668 - val_loss: 12839.4688\n",
+ "Epoch 24/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12915.7373 - val_loss: 12695.6348\n",
+ "Epoch 25/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12565.1816 - val_loss: 12489.5596\n",
+ "Epoch 26/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12385.2871 - val_loss: 12334.8535\n",
+ "Epoch 27/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12441.1230 - val_loss: 12193.6494\n",
+ "Epoch 28/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12110.5723 - val_loss: 12051.1250\n",
+ "Epoch 29/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12140.8193 - val_loss: 11922.8623\n",
+ "Epoch 30/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11870.8330 - val_loss: 11813.3994\n",
+ "Epoch 31/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11781.4502 - val_loss: 11694.6562\n",
+ "Epoch 32/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11774.9316 - val_loss: 11599.8086\n",
+ "Epoch 33/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11517.6182 - val_loss: 11493.0459\n",
+ "Epoch 34/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11443.8252 - val_loss: 11402.4766\n",
+ "Epoch 35/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11502.7910 - val_loss: 11311.7754\n",
+ "Epoch 36/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11410.6387 - val_loss: 11226.0420\n",
+ "Epoch 37/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11144.2510 - val_loss: 11152.2734\n",
+ "Epoch 38/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10994.5703 - val_loss: 11074.9717\n",
+ "Epoch 39/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11061.8809 - val_loss: 11009.4912\n",
+ "Epoch 40/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10965.7441 - val_loss: 10939.0264\n",
+ "Epoch 41/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11017.5010 - val_loss: 10882.1914\n",
+ "Epoch 42/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10908.1650 - val_loss: 10822.1357\n",
+ "Epoch 43/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10795.5361 - val_loss: 10765.4912\n",
+ "Epoch 44/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10588.0283 - val_loss: 10712.4141\n",
+ "Epoch 45/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10675.9863 - val_loss: 10659.5850\n",
+ "Epoch 46/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10741.0137 - val_loss: 10615.9727\n",
+ "Epoch 47/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10552.5371 - val_loss: 10568.0938\n",
+ "Epoch 48/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10671.9209 - val_loss: 10526.0469\n",
+ "Epoch 49/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10479.7158 - val_loss: 10484.8340\n",
+ "Epoch 50/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10387.6152 - val_loss: 10451.1416\n",
+ "\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 313us/step\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[I 2025-02-17 00:11:09,995] Trial 4 finished with value: 0.0 and parameters: {'h1': 61.30953008699103, 'h2': 93.9200835460014, 'h3': 57.8376987539652, 'h4': 82.3346527788174}. Best is trial 0 with value: 0.0.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8271.6963 - val_loss: 8311.1768\n",
+ "Epoch 2/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8371.5420 - val_loss: 8275.3896\n",
+ "Epoch 3/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8377.3896 - val_loss: 8246.3291\n",
+ "Epoch 4/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8375.9121 - val_loss: 8216.7363\n",
+ "Epoch 5/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8269.5869 - val_loss: 8189.8159\n",
+ "Epoch 6/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8172.8184 - val_loss: 8167.1416\n",
+ "Epoch 7/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8084.1265 - val_loss: 8137.8125\n",
+ "Epoch 8/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8089.8613 - val_loss: 8119.4287\n",
+ "Epoch 9/50\n",
+ "\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8135.9199 - val_loss: 8094.7837\n",
+ "Epoch 10/50\n",
+ "\u001b[1m610/886\u001b[0m \u001b[32m━━━━━━━━━━━━━\u001b[0m\u001b[37m━━━━━━━\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 8253.8984"
+ ]
+ }
+ ],
+ "source": [
+ "study = optuna.create_study(direction=\"maximize\")\n",
+ "study.optimize(lambda trial: objective(trial, preprocess, X_train, y_train, X_val, y_val, X_test, y_test), n_trials=100)"
+ ]
+ },
+ {
+ "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": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHFCAYAAAAaD0bAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAcyJJREFUeJzt3Xd4FNX+x/H3ZtMTEgKkQggBlCI9CNIUFQIICJYrojQ7WIHrVRERxJ+iWC56FVAEsSJeRa4FFVRAhEgHKRGUFkpCSCAV0nbn98eShSUBkpBkAvm8nmeeZM+cmfnO2Q375cyZMxbDMAxEREREqhE3swMQERERqWxKgERERKTaUQIkIiIi1Y4SIBEREal2lACJiIhItaMESERERKodJUAiIiJS7SgBEhERkWpHCZCIiIhUO0qApFhz587FYrG4LMHBwXTv3p1vv/22Qo7ZoEEDRowY4Xx96NAhJk2axKZNmyrkeBkZGbzwwgu0b9+egIAAvLy8aNCgAXfffTcbNmyokGOa7cUXX2ThwoUVsu9zvV+TJk3CYrFUyHEvFYVtlJKS4iz79NNPmTZtmnlBlSAOi8XCpEmTKjWekhoxYgQNGjQwO4yz6t69O927d3cpK2l7ZmZm8uijj1K3bl28vLy4/PLLmTp1KjabrWKCvQS5mx2AVG3vv/8+TZs2xTAMkpKSeOutt+jfvz9ff/01/fv3L9djffXVVwQEBDhfHzp0iOeee44GDRrQpk2bcj3Wrl27iI2NJTk5mZEjR/Lcc8/h7+/P3r17+fzzz4mJiSEtLY3AwMByPa7ZXnzxRW699VYGDhxY7vs+1/t177330rt373I/5qXu008/ZevWrYwePbrKxhEXF0e9evUqP6gSmDBhAo899pjZYZS7goICevbsyc6dO3n++ee5/PLL+eGHH3jqqac4cOAAb775ptkhXhSUAMk5tWjRgvbt2ztf9+7dm6CgIObNm1duCdCJEyfw8fGhbdu25bK/87HZbNx0002kpKQQFxdHixYtnOuuueYahg8fzvfff4+Hh0elxFNVnThxAm9v73LpualXr16V/ZKsTMePH8fX19fsMJx/c+XhqquuKpf9VIRGjRqZHUKF+OKLL1i9ejVffvklN998MwA9e/YkKyuLt99+m4ceeogmTZqYHGXVp0tgUire3t54enoWSQ6ee+45OnbsSK1atQgICKBdu3bMnj2bM5+126BBA/r168eCBQto27Yt3t7ePPfcc851hZfAli1bxpVXXgnAXXfd5bwMd3rX8Lp167jxxhupVasW3t7etG3bls8///y857Bw4UK2bNnCuHHjXJKf0/Xp08fli+q3337j+uuvp0aNGvj6+tK5c2e+++47l20KLxsuXbqUUaNGUadOHWrXrs3NN9/MoUOHihzj008/pVOnTvj7++Pv70+bNm2YPXu2S52ffvqJ66+/noCAAHx9fenSpQs///yzS53CSyfbtm1j8ODBBAYGEhoayt133016erqznsViITs7mw8++MDZnoXd74WxL168mLvvvpvg4GB8fX3Jzc3l77//5q677uKyyy7D19eXunXr0r9/f7Zs2eLc9/ner+IugdntdqZOnUrTpk3x8vIiJCSEYcOGceDAAZd63bt3p0WLFqxdu5Zu3brh6+tLw4YNeemll7Db7cW+f6fLyclh3LhxREdH4+npSd26dXnooYdIS0tz1hk4cCBRUVHF7q9jx460a9fO+dowDKZPn06bNm3w8fEhKCiIW2+9ld27dxcb96+//krnzp3x9fXl7rvvPm+8p2//3XffsW/fPpdL0YXy8vL4v//7P2f7BQcHc9ddd3HkyBGX/Zzrb+7tt9/m6quvJiQkBD8/P1q2bMnUqVPJz88vcRzFXbLZunUrAwYMICgoCG9vb9q0acMHH3zgUmfZsmVYLBbmzZvH+PHjiYiIICAggB49erBjxw6Xuhs3bqRfv36EhITg5eVFREQEffv2LfJZOVNxl8AsFgsPP/wwH330Ec2aNcPX15fWrVuX+NJ+Wloa//znP2nYsKHzc3vDDTfw559/OuuU9L0pq5UrV2KxWOjTp49Leb9+/bDb7Xz11VflcpxLnXqA5JxsNhsFBQUYhsHhw4d55ZVXyM7O5o477nCpt3fvXh544AHq168PwO+//84jjzzCwYMHefbZZ13qbtiwgfj4eJ555hmio6Px8/Mrctx27drx/vvvc9ddd/HMM8/Qt29fAGcvwtKlS+nduzcdO3Zk5syZBAYG8tlnnzFo0CCOHz/uMpboTIsXLwYo8WWg5cuX07NnT1q1asXs2bPx8vJi+vTp9O/fn3nz5jFo0CCX+vfeey99+/bl008/Zf/+/fzrX/9iyJAh/PLLL846zz77LM8//zw333wz//znPwkMDGTr1q3s27fPWefjjz9m2LBhDBgwgA8++AAPDw/eeecdevXqxY8//sj111/vctxbbrmFQYMGcc899zgTPIA5c+YAjksV1113Hddeey0TJkwAcLnkCHD33XfTt29fPvroI7Kzs/Hw8ODQoUPUrl2bl156ieDgYI4ePcoHH3xAx44d2bhxI02aNDnv+1WcUaNG8e677/Lwww/Tr18/9u7dy4QJE1i2bBkbNmygTp06zrpJSUnceeed/POf/2TixIl89dVXjBs3joiICIYNG3bWYxiGwcCBA/n5558ZN24c3bp1448//mDixInExcURFxeHl5cXd999NwMGDOCXX36hR48ezu3//PNP1qxZ43JJ4YEHHmDu3Lk8+uijvPzyyxw9epTJkyfTuXNnNm/eTGhoqLNuYmIiQ4YM4YknnuDFF1/Eza3k/+ecPn06999/P7t27SryhWa32xkwYAArVqzgiSeeoHPnzuzbt4+JEyfSvXt31q1b59LDc7a/uV27dnHHHXc4k8PNmzfzwgsv8Oeffzo/N+eKozg7duygc+fOhISE8Oabb1K7dm0+/vhjRowYweHDh3niiSdc6j/99NN06dKF9957j4yMDJ588kn69+9PfHw8VquV7OxsevbsSXR0NG+//TahoaEkJSWxdOlSMjMzS9yep/vuu+9Yu3YtkydPxt/fn6lTp3LTTTexY8cOGjZseNbtMjMz6dq1K3v37uXJJ5+kY8eOZGVl8euvv5KYmEjTpk1L/d6URV5eHm5ubkX+I+rl5QXAH3/8cUH7rzYMkWK8//77BlBk8fLyMqZPn37ObW02m5Gfn29MnjzZqF27tmG3253roqKiDKvVauzYsaPIdlFRUcbw4cOdr9euXWsAxvvvv1+kbtOmTY22bdsa+fn5LuX9+vUzwsPDDZvNdtb4evfubQBGTk7OOc+j0FVXXWWEhIQYmZmZzrKCggKjRYsWRr169ZznV9hmDz74oMv2U6dONQAjMTHRMAzD2L17t2G1Wo0777zzrMfMzs42atWqZfTv39+l3GazGa1btzY6dOjgLJs4caIBGFOnTnWp++CDDxre3t4u7e/n5+fSxoUKYx82bNh5WsNx7nl5ecZll11mjBkzxll+rverMMZC8fHxxbbV6tWrDcB4+umnnWXXXHONARirV692qdu8eXOjV69e54z1hx9+KLZt5s+fbwDGu+++axiGYeTn5xuhoaHGHXfc4VLviSeeMDw9PY2UlBTDMAwjLi7OAIzXXnvNpd7+/fsNHx8f44knnigS988//3zOGAsVttGRI0ecZX379jWioqKK1J03b54BGF9++aVLeeF7cPrf6Ln+5k5X+Hf74YcfGlar1Th69Oh54zAMwwCMiRMnOl/ffvvthpeXl5GQkOBSr0+fPoavr6+RlpZmGIZhLF261ACMG264waXe559/bgBGXFycYRiGsW7dOgMwFi5ceM74izN8+PAicQNGaGiokZGR4SxLSkoy3NzcjClTppxzf5MnTzYAY8mSJWetU5r35pprrjGuueaaIvGd3p7FmTZtmgEYK1ascCmfMGGCARixsbHn3F4cdAlMzunDDz9k7dq1rF27lu+//57hw4fz0EMP8dZbb7nUK/yfc2BgIFarFQ8PD5599llSU1NJTk52qduqVSsuv/zyMsf0999/8+eff3LnnXcCjgGBhcsNN9xAYmJikS70ssrOzmb16tXceuut+Pv7O8utVitDhw7lwIEDRY514403urxu1aoVgLN3Z8mSJdhsNh566KGzHnfVqlUcPXqU4cOHu5yf3W6nd+/erF27luzs7PMeNycnp0j7n8stt9xSpKygoIAXX3yR5s2b4+npibu7O56envz111/Ex8eXeN+nW7p0KUCRnroOHTrQrFmzIpf5wsLC6NChg0tZq1atXHrMilPY63bmcf7xj3/g5+fnPI67uztDhgxhwYIFzsuGNpuNjz76iAEDBlC7dm0Avv32WywWC0OGDHF5X8LCwmjdujXLli1zOU5QUBDXXXfduRujDL799ltq1qxJ//79XeJo06YNYWFhReI429/cxo0bufHGG6ldu7bz73bYsGHYbDZ27txZpth++eUXrr/+eiIjI13KR4wYwfHjx4mLi3MpP9/fS+PGjQkKCuLJJ59k5syZbN++vUxxne7aa6+lRo0aztehoaGEhISc9/P0/fffc/nll7v0Ep6ptO9NWdx5553UqlWL+++/n9WrV5OWlsa8efOcPZWl6WmsztRKck7NmjWjffv2tG/fnt69e/POO+8QGxvLE0884RxDsWbNGmJjYwGYNWsWK1euZO3atYwfPx5wDLg8XXh4+AXFdPjwYQAef/xxPDw8XJYHH3wQwOVW4jMVXqbbs2fPeY917NgxDMMoNuaIiAgAUlNTXcoLvywLFXZLF7ZD4TiAc10eKjzHW2+9tcg5vvzyyxiGwdGjR0t13JIo7jzHjh3LhAkTGDhwIN988w2rV69m7dq1tG7dulT7Pl1hm52tXc/XpuA4v/MdPzU1FXd3d4KDg13KLRYLYWFhLse5++67ycnJ4bPPPgPgxx9/JDExkbvuustZ5/DhwxiGQWhoaJH35ffffy/yubvQz/rZHD58mLS0NOd4vNOXpKSkEsWRkJBAt27dOHjwIG+88QYrVqxg7dq1vP3220DpPjenS01NLde/l8DAQJYvX06bNm14+umnueKKK4iIiGDixIkuY5VKo6yfpyNHjpx3MH9p35uyqFOnDj/88APgGIQeFBTEI488wuuvvw5A3bp1L/gY1YHGAEmptWrVih9//JGdO3fSoUMHPvvsMzw8PPj222/x9vZ21jvbfDMXeldR4diQcePGOe+AONO57oDo1asX7777LgsXLuSpp54657GCgoJwc3MjMTGxyLrCgc2nj1UpicIv4wMHDhT5X3Khwn3+5z//OetdNqePNSkvxb03hWORXnzxRZfylJQUatasWabjFH4BJSYmFvlCOXToUKnb9FzHKSgo4MiRIy5JkHFyWofCgdsAzZs3p0OHDrz//vs88MADvP/++0RERDiTe3C8LxaLhRUrVji/qE93ZllFzX1UOMC+8EvwTKf3bpwtjoULF5Kdnc2CBQuIiopyll/ovFu1a9cu178XgJYtW/LZZ59hGAZ//PEHc+fOZfLkyfj4+Jz3b7g8BQcHn3fgdWnfm7K68sor2b59O3v37iU7O5vLLruM9evXA3D11VeXyzEudeoBklIr/Aey8AvFYrHg7u6O1Wp11jlx4gQfffTRBR3nbD0YTZo04bLLLmPz5s3O3qkzl3P9IzNgwABatmzJlClT2Lp1a7F1fvzxR44fP46fnx8dO3ZkwYIFLnHY7XY+/vhj6tWrV+rLebGxsVitVmbMmHHWOl26dKFmzZps3779rOfo6elZquNCyf6XeyaLxVLki/27777j4MGDRfYNJes5KLws9PHHH7uUr127lvj4+CIDvMuqcD9nHufLL78kOzu7yHHuuusuVq9ezW+//cY333zD8OHDXT7X/fr1wzAMDh48WOx70rJly3KJu9DZ3q9+/fqRmpqKzWYrNo6S3AJdmBSd/t4ahsGsWbNKHEdxrr/+en755Zcidz5++OGH+Pr6XtBt8xaLhdatW/Pvf/+bmjVrVvqEpX369GHnzp0uNzScqTzem9Jo0KABV1xxBR4eHrz22mtERETwj3/8o1yPcalSD5Cc09atWykoKAAcXdcLFixgyZIl3HTTTURHRwPQt29fXn/9de644w7uv/9+UlNTefXVV4v9H3JpNGrUCB8fHz755BOaNWuGv78/ERERRERE8M4779CnTx969erFiBEjqFu3LkePHiU+Pp4NGzbw3//+96z7tVqtfPXVV8TGxtKpUydGjRrFtddei5+fH/v27eOLL77gm2++4dixYwBMmTKFnj17cu211/L444/j6enJ9OnT2bp1K/PmzSv1//IbNGjA008/zfPPP8+JEyect65v376dlJQU56SM//nPfxg+fDhHjx7l1ltvJSQkhCNHjrB582aOHDlyzgTqbFq2bMmyZcv45ptvCA8Pp0aNGuf9B7lfv37MnTuXpk2b0qpVK9avX88rr7xSpOfmXO/XmZo0acL999/Pf/7zH9zc3OjTp4/zLrDIyEjGjBlT6nMrTs+ePenVqxdPPvkkGRkZdOnSxXkXWNu2bRk6dKhL/cGDBzN27FgGDx5Mbm5ukbFDXbp04f777+euu+5i3bp1XH311fj5+ZGYmMhvv/1Gy5YtGTVqVLnEDo73a8GCBcyYMYOYmBjc3Nxo3749t99+O5988gk33HADjz32GB06dMDDw4MDBw6wdOlSBgwYwE033XTetvH09GTw4ME88cQT5OTkMGPGDOfnviRxFGfixIl8++23XHvttTz77LPUqlWLTz75hO+++46pU6eWenLRb7/9lunTpzNw4EAaNmyIYRgsWLCAtLQ0evbsWap9XajRo0czf/58BgwYwFNPPUWHDh04ceIEy5cvp1+/flx77bXl8t6UxPjx42nZsiXh4eEkJCQwZ84cVq9ezXfffVduczxd8swbfy1VWXF3gQUGBhpt2rQxXn/99SJ3UM2ZM8do0qSJ4eXlZTRs2NCYMmWKMXv2bAMw9uzZ46wXFRVl9O3bt9hjnnkXmGE47qho2rSp4eHhUeTuiM2bNxu33XabERISYnh4eBhhYWHGddddZ8ycObNE55iWlmY8//zzRrt27Qx/f3/Dw8PDqF+/vjFkyBBj5cqVLnVXrFhhXHfddYafn5/h4+NjXHXVVcY3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f/P555/z5ZdfOi9B9e3bl6SkJBYtWsT69etp164d119/PUePHgXg888/Z+LEibzwwgusW7eO8PBwpk+ffs5jjhs3jpdffpkJEyawfft2Pv30U0JDQwFYs2YNAD/99BOJiYksWLCg2H088cQTfPnll3zwwQds2LCBxo0b06tXL2dchcaPH89rr73GunXrcHd35+677y5zW4mIyAU4ngpAupvjKe0hAd5mRmPuJbDXX3+de+65h3vvvReAadOm8eOPPzJjxgymTJlSpH6DBg144403AJgzZ85Z92uz2bjzzjt57rnnWLFiBWlpaRUSv1P+cXgxomKPcTZPHwJPvzJtumbNGj799FOuv/56APLy8vjoo48IDnbMz/DLL7+wZcsWkpOT8fJyZOqvvvoqCxcu5IsvvuD+++9n2rRp3H333c738P/+7//46aefivQCFcrMzOSNN97grbfeYvjw4QA0atSIrl27AjiPXbt2bcLCwordR+Elu7lz59KnTx8AZs2axZIlS5g9ezb/+te/nHVfeOEFrrnmGgCeeuop+vbtS05ODt7e5v7hiYhUOyd7gFKNkwlQdR0EnZeXx/r164mNjXUpj42NZdWqVRe078mTJxMcHMw999xTovq5ublkZGS4LJeqb7/9Fn9/f7y9venUqRNXX301//nPfwCIiopyJiAA69evJysri9q1a+Pv7+9c9uzZw65duwCIj4+nU6dOLsc48/Xp4uPjyc3NdSZdZbFr1y7y8/Pp0qWLs8zDw4MOHToQHx/vUrdVq1bO38PDwwFITk4u87FFRKSMTvYAHbE5/tMeUqOa9gClpKRgs9mclz4KhYaGkpSUVOb9rly5ktmzZxe5i+hcpkyZwnPPPVfmY+Lh6+iJMYOHb6mqX3vttcyYMQMPDw8iIiJcBjr7+bn2JNntdsLDw1m2bFmR/dSsWbMs0eLj41Om7U5nnLzsZ7FYipSfWXb6+RWus9vtFxyDiIiU0nFHD9ARWw0AgqtrD1ChknyJlVRmZiZDhgxh1qxZ1KlTp8TbjRs3jvT0dOeyf//+0h3YYnFchjJjKWVb+fn50bhxY6Kios57l1e7du1ISkrC3d2dxo0buyyF7dusWTN+//13l+3OfH26yy67DB8fH37++edi13t6egKOy5hn07hxYzw9Pfntt9+cZfn5+axbt45mzZqd85xERMQk2Y4e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PT2dgICAMu1DRESk1E6kkfvqFXjZsnjO+wkmPPE0bm5KgEqqNN/fpvUA5eXlsX79emJjY13KY2NjWbVqVbHbxMXFFanfq1cv1q1bR35+PgBff/01nTp14qGHHiI0NJQWLVrw4osvYrPZzhpLbm4uGRkZLouIiEhly105Ha+TvT8tegxV8lOBTEuAUlJSsNlshIaGupSHhoaSlJRU7DZJSUnF1i8oKCAlJQWA3bt388UXX2Cz2Vi0aBHPPPMMr732Gi+88MJZY5kyZQqBgYHOJTIy8gLPTkREpJROpEHc2wB85jOYAW3rmRvPJc70QdBnXts0DOOc1zuLq396ud1uJyQkhHfffZeYmBhuv/12xo8f73KZ7Uzjxo0jPT3duezfv7+spyMiIlImuSvfxsuWxU57XVr1Goa7HnpaoUr9NPjyUqdOHaxWa5HenuTk5CK9PIXCwsKKre/u7k7t2rUBCA8Px8PDA6vV6qzTrFkzkpKSyMvLw9Oz6HNUvLy8nE+4FxERqXQn0jB+d/xHfZ7vHTzTRlciKppp6aWnpycxMTEsWbLEpXzJkiV07ty52G06depUpP7ixYtp3769c8Bzly5d+Pvvv7Hb7c46O3fuJDw8vNjkR0RExGw5K6fjXZDJTntd2vQajlVjfyqcqf1rY8eO5b333mPOnDnEx8czZswYEhISGDlyJOC4NDVs2KkJoEaOHMm+ffsYO3Ys8fHxzJkzh9mzZ/P4448764waNYrU1FQee+wxdu7cyXfffceLL77IQw89VOnnJyIicl4n0uD36QDM97uTfq019qcymHYJDGDQoEGkpqYyefJkEhMTadGiBYsWLSIqKgqAxMRElzmBoqOjWbRoEWPGjOHtt98mIiKCN998k1tuucVZJzIyksWLFzNmzBhatWpF3bp1eeyxx3jyyScr/fxERETO5/Ten9bq/ak0ps4DVFVpHiAREakUOenkvHIF3rZM/s/nX4z713glQBfgopgHSEREpLrL+W063raTY396q/enMikBEhERMUPqLtxWvQHAF353cENLjf2pTEqAREREKpstn4L/3oOn/QRxtua07XOXZn2uZEqAREREKtvyl3FP2ki64cvbQY/Tq0WE2RFVO0qAREREKtO+OIwVrwHwdP69DIntot4fEygBEhERqSw56bDgfiyGnS9sV7MnNJZeVxT/9AOpWEqA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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsoAAAHFCAYAAADrKN8IAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAwo9JREFUeJzsnXeYU+XWxddJn94bbWboA9JBmggIgjSRC4INUGyIioh+XhEF5aqIImIFG2BF9IqIypUigigD0hXpdSjTe097vz+S96TPpCczs3/Pw6OTnJy8aScr66y9t8AYYyAIgiAIgiAIwgJJoBdAEARBEARBEMEICWWCIAiCIAiCsAMJZYIgCIIgCIKwAwllgiAIgiAIgrADCWWCIAiCIAiCsAMJZYIgCIIgCIKwAwllgiAIgiAIgrADCWWCIAiCIAiCsAMJZYIgCIIgCIKwg0tCec2aNRAEweJfQkIChgwZgh9//NEnC0xLS8Pdd98t/n316lU8//zzOHz4sE/uDwAKCgqgVCohCAL2799vd5shQ4bgmmuu8dka7HHhwgUIgoA1a9a4dfuXX34ZGzZs8OqaAMNzwd8PEokEERERaNu2LW699Vb897//hV6vt7mN9esKAIcOHcLgwYMRFRUFQRCwfPlyAMAvv/yC3r17IywsDIIg+OQxNCbuvvtuhIeHe3WfX375pfh6EL7D+nOxY8cOCIKAHTt2uLSf3bt34/nnn0dJSYnNdUOGDMGQIUM8WmdjwNnnwVfHzWDE3febv7D3vRssr4+jdQT7c2rvuziYEAQBzz//vPi3K8/nqVOnMHHiRMTExCA0NBR9+/bFxo0bXV6DW47y6tWrkZmZid27d+ODDz6AVCrFuHHj8MMPP7izuzr57rvv8Nxzz4l/X716FS+88IJPhfJnn30GtVoNAPj44499dj/+xpcHlNatW4vviQ0bNuDpp59GdXU1br31VgwZMgSlpaUW21u/rgAwY8YMZGdn46uvvkJmZiZuu+02MMYwefJkyOVybNy4EZmZmRg8eLBPHgPhGBLKgaFnz57IzMxEz549Xbrd7t278cILL9gVyu+99x7ee+89L62w8RMsQoywT7C8Po7W4e5n2F/Y+y5uDFy4cAH9+/fHyZMnsXLlSnzzzTdISEjALbfcgm+//dalfcncWcA111yD3r17i3/fdNNNiImJwdq1azFu3Dh3dmlDdXU1QkJC0KNHD6/szxVWrVqFxMREpKamYu3atVi2bBlCQkL8vo6GREhICPr162dx2X333YfVq1djxowZeOCBB7Bu3TrxOnuv69GjR3H//fdj1KhR4mVXrlxBUVERJkyYgGHDhnllrRqNBoIgQCZz6+1PEDZUVVUhNDTU6/uNjIy0+Vx5SqdOnby6P8JEdXU1VCoVBEEI9FIID9DpdNBqtVAqlR7vyxefYW8SCI3lD1555RVUVVVh8+bNaN68OQCDVu3SpQsef/xxTJgwARKJc16xVzLKKpUKCoUCcrnc4vIXXngBffv2RWxsLCIjI9GzZ098/PHHYIxZbJeWloaxY8di/fr16NGjB1QqFV544QXxOn5aYMeOHejTpw8A4J577hFP95vb8vv378fNN9+M2NhYqFQq9OjRA19//bXTj2Xv3r04evQopk6divvvvx+lpaV1/vrYtWsX+vXrh5CQEDRv3hzPPfccdDqdxTYrVqxAt27dEB4ejoiICHTs2BHPPPOMxTZHjx7F+PHjERMTA5VKhe7du+OTTz6pd71333030tLSbC5//vnnLQ7WgiCgsrISn3zyifi8mZ92zMnJwYMPPogWLVpAoVAgPT0dL7zwArRabb1rqIt77rkHo0ePxjfffIOLFy+Kl5u/rjzSo9VqsWLFCovXtUWLFgCAf//73xAEweKxnj59GnfccQcSExOhVCqRkZGBd9991+L++Wmazz77DE888QSaN28OpVKJM2fOAAC2bduGYcOGITIyEqGhoRg4cCB++eUXu8/lP//8g9tvvx1RUVFISkrCjBkzbJxyvV6Pt99+G927d0dISAiio6PRr18/m9M969atQ//+/REWFobw8HCMHDkShw4dstjm3LlzuO2229CsWTMolUokJSVh2LBhTp9N+eeffzBs2DCEhYUhISEBjzzyCKqqqiy2YYzhvffeE9cbExODSZMm4dy5c+I2Q4YMwU8//YSLFy9axK4AoE+fPhgzZozFPrt06QJBELBv3z7xsvXr10MQBPz999/iZc68fgBQVlaGJ598Eunp6VAoFGjevDnmzJmDyspKi+0EQcAjjzyCzz77DBkZGQgNDUW3bt2cioXx98nnn3+OuXPnIjk5GSEhIRg8eLDN68KjLX///TdGjBiBiIgI8UecWq3Giy++iI4dO0KpVCIhIQH33HMP8vPzLfah0Wjw1FNPITk5GaGhobjuuuvw559/OlyX9WnGvXv3Yty4cYiLi4NKpUKbNm0wZ84cAIb36//93/8BANLT08XXi+/DXuSgqKgIs2bNQvPmzaFQKNC6dWvMnz8ftbW1bj3H+fn5eOCBB9CyZUvxeRg4cCC2bdtW5+tw5swZ3HPPPWjXrh1CQ0PRvHlzjBs3zuJ9Y/68rF27FvPnz0ezZs0QGRmJ4cOH4+TJkxbbMsbw6quvIjU1FSqVCj179sT//ve/Otdh/ngdHTf5cWvLli2YMWMGEhISEBoaitraWqePy3x99X0G7bFhwwYIgmBzvAIgHkf/+usvAIbvxdtuuw1paWkICQlBWloabr/9dotjsiMcRVTsPUZn3//bt2/HkCFDEBcXh5CQELRq1QoTJ060OT7Vhze+13ik8dVXX8WLL76I9PR0KJVK/Prrr6ipqcETTzyB7t27IyoqCrGxsejfvz++//57p9fh6DO8ceNG9O/fH6GhoYiIiMCNN96IzMxMi21c+e755ptv0LdvX0RFRSE0NBStW7fGjBkz6n0OHcW9nPlsOeLEiRO4/fbbkZSUBKVSiVatWmHatGkWxxNfaQ7OH3/8gW7duokiGQCkUilGjRqFS5cu2T3eOsItS43/2mKMITc3F6+99hoqKytxxx13WGx34cIFPPjgg2jVqhUAYM+ePXj00Udx5coVLFiwwGLbgwcP4vjx43j22WeRnp6OsLAwm/vt2bMnVq9ejXvuuQfPPvus+AXNxdSvv/6Km266CX379sXKlSsRFRWFr776ClOmTEFVVZVTORwetZgxYwZatmyJOXPm4OOPP8Zdd91ls21OTg5uu+02PP3001i0aBF++uknvPjiiyguLsY777wDAPjqq68wa9YsPProo1i6dCkkEgnOnDmDY8eOifs5efIkBgwYgMTERLz11luIi4vD559/jrvvvhu5ubl46qmn6l13fWRmZuKGG27A0KFDxdMskZGR4uO49tprIZFIsGDBArRp0waZmZl48cUXceHCBaxevdqj+7755puxadMm7Nq1C6mpqTbXjxkzBpmZmejfvz8mTZqEJ554AoDhde3WrRv+9a9/4dFHH8Udd9wh/sI/duwYBgwYgFatWuH1119HcnIyNm/ejNmzZ6OgoAALFy60uI958+ahf//+WLlyJSQSCRITE/H5559j2rRpGD9+PD755BPI5XK8//77GDlyJDZv3mzjYE+cOBFTpkzBvffei7///hvz5s0DYDgDwbn77rvx+eef495778WiRYugUChw8OBBXLhwQdzm5ZdfxrPPPiu+j9VqNV577TUMGjQIf/75p+j4jR49GjqdDq+++ipatWqFgoIC7N692+7pdGs0Gg1Gjx6NBx98EE8//TR2796NF198ERcvXrSISD344INYs2YNZs+ejSVLlqCoqAiLFi3CgAEDcOTIESQlJeG9997DAw88gLNnz+K7776zuJ/hw4fjnXfegUajgVwuR25uLo4ePYqQkBBs3bpV/GG7bds2JCUloUuXLi69flVVVRg8eDAuX76MZ555Bl27dsU///yDBQsW4O+//8a2bdsshMdPP/2Effv2YdGiRQgPD8err76KCRMm4OTJk2jdunW9z9szzzyDnj174qOPPkJpaSmef/55DBkyBIcOHbK4vVqtxs033yw+v1qtFnq9HuPHj8euXbvw1FNPYcCAAbh48SIWLlyIIUOGYP/+/eKZqfvvvx+ffvopnnzySdx44404evQo/vWvf6G8vLzeNW7evBnjxo1DRkYGli1bhlatWuHChQvYsmULAMOZnKKiIrz99ttYv349UlJSADh2kmtqajB06FCcPXsWL7zwArp27Ypdu3Zh8eLFOHz4MH766SeL7Z15jqdOnYqDBw/ipZdeQvv27VFSUoKDBw+isLCwzsd29epVxMXF4ZVXXkFCQgKKiorwySefoG/fvjh06BA6dOhg83oNHDgQH330EcrKyvDvf/8b48aNw/HjxyGVSgEYDJsXXngB9957LyZNmoRLly7h/vvvh06ns9mfNXUdNzkzZszAmDFj8Nlnn6GystLGMKoPZz6D9hg7diwSExOxevVqm2PVmjVr0LNnT3Tt2hWA4bu4Q4cOuO222xAbG4vs7GysWLECffr0wbFjxxAfH+/Smu3h7Pv/woULGDNmDAYNGoRVq1YhOjoaV65cwc8//wy1Wu3SmRlvfq+99dZbaN++PZYuXYrIyEi0a9cOtbW1KCoqwpNPPonmzZtDrVZj27Zt+Ne//oXVq1dj2rRp9a7DHl9++SXuvPNOjBgxAmvXrkVtbS1effVVDBkyBL/88guuu+46i+3r++7JzMzElClTMGXKFDz//PNQqVS4ePEitm/f7vRzaY0zny17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/voLjzzyCG699Va0a9cOCoUC27dvx19//WXhCjlCoVDg9ddfR0VFBfr06SN2vRg1apRYUT1w4EA88MADuOeee7B//35cf/31CAsLQ3Z2Nn7//Xd06dIFDz30EADDe2f9+vVYsWIFevXqBYlEIvZS79WrF2JiYrBlyxYLJ2v48OHiaS4eu+A4+/rNmTMH3377La6//no8/vjj6Nq1K/R6PbKysrBlyxY88cQTTn8pO0NeXh4mTJggtoZcuHAhVCqVWGVeF7fddhu++OILjB49Go899hiuvfZayOVyXL58Gb/++ivGjx+PCRMmICMjA3fddReWL18OuVyO4cOH4+jRo2K1fX28++67GDduHPr164fHH38crVq1QlZWFjZv3owvvvgCAMTuIm+++SamT58OuVyODh06WLh6nGnTpuHdd9/F9OnTceHCBXTp0gW///47Xn75ZYwePdrmtauP0tJSDB06FHfccQc6duyIiIgI7Nu3Dz///LPDs32csWPHYs2aNejYsSO6du2KAwcO4LXXXnM7ahITE4Mnn3wSL774Iu677z7ceuutuHTpEp5//nmnoxeOjpt14exx2ZXPoCOio6MxYcIErFmzBiUlJXjyySct8peRkZG4/vrr8dprryE+Ph5paWnYuXMnPv74Y6dc+qlTp+L999/HXXfdhfvvvx+FhYV49dVXbd6rzr7/V65cie3bt2PMmDFo1aoVampqxDNGrr7XAN9+r/G2tbNmzRI7pvznP/9BSkoKTp8+7dQ6rJFIJHj11Vdx5513YuzYsXjwwQdRW1uL1157DSUlJXjllVdcfg4WLFiAy5cvY9iwYWjRogVKSkrw5ptvQi6X+31A17Jly3Ddddehb9++ePrpp9G2bVvk5uZi48aNeP/99xEREeGV16Y+8vLy8Prrr2PgwIGIiIjAiRMn8Oqrr0IikdhtQ1onTpf9MftdL6Kiolj37t3ZsmXLWE1NjcX2q1atYh06dGBKpZK1bt2aLV68mH388cc21dipqalszJgxdu/TXneEtWvXso4dOzK5XG5TEXnkyBE2efJklpiYyORyOUtOTmY33HADW7lypcPHtWHDhno7DPz8888W1cm8+nbHjh2sd+/eTKlUspSUFPbMM89YdN345JNP2NChQ1lSUhJTKBSsWbNmbPLkyeyvv/6y2P/ff//Nxo0bx6KiophCoWDd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Udi8eTPS09Oh0Th/Sz18+DAMBgNee+01qFSmD/c++eQTh6/XWVZWFsrLy3Hx4kVlVvnUqVOoqanBkCFDnD4fIiKyxdILIiInpaen45tvvsH58+dRXV0No9GIp556Cjdu3MC8efNw8OBBnDt3Dl988QUee+yxbpPczMxMGAwG/PnPf8a5c+ewYcMGrF271ub16uvrsWvXLlRXV6OxsdHm+9x7770YPnw4fv7zn+Po0aM4ePAgHnnkEUycONFuuQcRETmPiTIRkZOWLl0KtVqNrKwsxMbGory8HElJSdi3bx/a29tx3333ITs7G88++yz0er0yU2zPyJEjsWrVKrz66qvIzs7GRx99hFdeecUqJi8vD4WFhcjPz0dsbKzNYkDAVEKxbds2REZGYsKECbj33nsxcOBAbNq0yev/fiKi/kYSQghfnwQRERERUV/DGWUiIiIiIjuYKBMRERER2cFEmYiIiIjIDibKRERERER2MFEmIiIiIrKDiTIRERERkR1MlImIiIiI7GCiTERERERkBxNlIiIiIiI7mCgTEREREdnBRJmIiIiIyA4mykREREREdvwflbuvcPivGgUAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "species = \"Barite\"\n",
+ "iterations = 250\n",
+ "cell_offset = 9\n",
+ "y_design = []\n",
+ "y_results = []\n",
+ "y_differences = []\n",
+ "\n",
+ "df_design_transformed_scaled = preprocess.scaler_X.transform(df_design[species_columns])\n",
+ "df_results_transformed_scaled = preprocess.scaler_y.transform(df_results[species_columns])\n",
+ "\n",
+ "for i in range(0,iterations):\n",
+ " idx = i*50*50 + cell_offset-1\n",
+ " y_design.append(df_design_transformed_scaled.iloc[idx, :])\n",
+ " y_results.append(df_results_transformed_scaled.iloc[idx,:])\n",
+ " \n",
+ "y_design = pd.DataFrame(y_design)\n",
+ "y_results = pd.DataFrame(y_results)\n",
+ "\n",
+ "prediction = model_large.predict(y_design.iloc[:, y_design.columns != \"Class\"])\n",
+ "prediction = pd.DataFrame(prediction, columns = y_results.columns)\n",
+ "\n",
+ "# y_results_back, prediction = preprocess.funcInverse(y_results, prediction)\n",
+ "\n",
+ "y_results_back = pd.DataFrame(preprocess.scaler_y.inverse_transform(y_results), columns = species_columns)\n",
+ "prediction_back = pd.DataFrame(preprocess.scaler_X.inverse_transform(prediction), columns = species_columns)\n",
+ "\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.legend()\n",
+ "plt.xlabel('Iteration')\n",
+ "plt.ylabel(species)\n",
+ "plt.title(species+' Concentration over Iterations in cell ' + str(cell_offset))\n",
+ "plt.legend()\n",
+ "plt.show()\n",
+ "\n",
+ "\n",
+ "mass_balance = np.abs((prediction_back[\"Ba\"] + prediction_back[\"Barite\"]) - (y_results_back[\"Ba\"] + y_results_back[\"Barite\"])) \\\n",
+ " + np.abs((prediction_back[\"Sr\"] + prediction_back[\"Celestite\"]) - (y_results_back[\"Sr\"] + y_results_back[\"Celestite\"]))\n",
+ "plt.plot(np.arange(0,iterations), mass_balance, label = \"Results\")\n",
+ "plt.xlabel('Iteration')\n",
+ "plt.ylabel(species)\n",
+ "plt.title(species+' Absolute Differences between predictions and true values Iterations in cell ' + str(cell_offset))\n",
+ "plt.axhline(y=1e-5, color='r', linestyle='--', label='Threshold 1e-5')\n",
+ "plt.legend()\n",
+ "\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " H | \n",
+ " O | \n",
+ " Charge | \n",
+ " Ba | \n",
+ " Cl | \n",
+ " S_6_ | \n",
+ " Sr | \n",
+ " Barite | \n",
+ " Celestite | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 111.012434 | \n",
+ " 55.510420 | \n",
+ " -5.285676e-07 | \n",
+ " 4.536952e-07 | \n",
+ " 0.000022 | \n",
+ " 1.050707e-03 | \n",
+ " 0.000625 | \n",
+ " 0.001010 | \n",
+ " 1.717461 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 111.012434 | \n",
+ " 55.507697 | \n",
+ " -5.292985e-07 | \n",
+ " 1.091671e-06 | \n",
+ " 0.002399 | \n",
+ " 3.700427e-04 | \n",
+ " 0.001488 | \n",
+ " 0.001738 | \n",
+ " 1.716139 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 111.012434 | \n",
+ " 55.506335 | \n",
+ " -5.311407e-07 | \n",
+ " 6.816584e-05 | \n",
+ " 0.008922 | \n",
+ " 2.946349e-05 | \n",
+ " 0.004445 | \n",
+ " 0.004898 | \n",
+ " 1.708478 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 111.012434 | \n",
+ " 55.506229 | \n",
+ " -5.326179e-07 | \n",
+ " 1.435037e-03 | \n",
+ " 0.017414 | \n",
+ " 3.035681e-06 | \n",
+ " 0.007281 | \n",
+ " 0.008778 | \n",
+ " 1.698481 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 111.012434 | \n",
+ " 55.506224 | \n",
+ " -5.354202e-07 | \n",
+ " 3.264876e-03 | \n",
+ " 0.026235 | \n",
+ " 1.872898e-06 | \n",
+ " 0.009764 | \n",
+ " 0.012641 | \n",
+ " 1.688408 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 995 | \n",
+ " 111.012434 | \n",
+ " 55.506217 | \n",
+ " -5.369526e-07 | \n",
+ " 6.381593e-02 | \n",
+ " 0.223770 | \n",
+ " 1.220403e-07 | \n",
+ " 0.032096 | \n",
+ " 1.714723 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 996 | \n",
+ " 111.012434 | \n",
+ " 55.506217 | \n",
+ " -5.370535e-07 | \n",
+ " 6.386712e-02 | \n",
+ " 0.223789 | \n",
+ " 1.220029e-07 | \n",
+ " 0.032055 | \n",
+ " 1.714723 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 997 | \n",
+ " 111.012434 | \n",
+ " 55.506217 | \n",
+ " -5.371457e-07 | \n",
+ " 6.391481e-02 | \n",
+ " 0.223807 | \n",
+ " 1.219644e-07 | \n",
+ " 0.032017 | \n",
+ " 1.714723 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 998 | \n",
+ " 111.012434 | \n",
+ " 55.506217 | \n",
+ " -5.372196e-07 | \n",
+ " 6.395922e-02 | \n",
+ " 0.223826 | \n",
+ " 1.219672e-07 | \n",
+ " 0.031982 | \n",
+ " 1.714723 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 999 | \n",
+ " 111.012434 | \n",
+ " 55.506217 | \n",
+ " -5.372770e-07 | \n",
+ " 6.400057e-02 | \n",
+ " 0.223844 | \n",
+ " 1.220142e-07 | \n",
+ " 0.031950 | \n",
+ " 1.714723 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
1000 rows × 9 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " H O Charge Ba Cl \\\n",
+ "0 111.012434 55.510420 -5.285676e-07 4.536952e-07 0.000022 \n",
+ "1 111.012434 55.507697 -5.292985e-07 1.091671e-06 0.002399 \n",
+ "2 111.012434 55.506335 -5.311407e-07 6.816584e-05 0.008922 \n",
+ "3 111.012434 55.506229 -5.326179e-07 1.435037e-03 0.017414 \n",
+ "4 111.012434 55.506224 -5.354202e-07 3.264876e-03 0.026235 \n",
+ ".. ... ... ... ... ... \n",
+ "995 111.012434 55.506217 -5.369526e-07 6.381593e-02 0.223770 \n",
+ "996 111.012434 55.506217 -5.370535e-07 6.386712e-02 0.223789 \n",
+ "997 111.012434 55.506217 -5.371457e-07 6.391481e-02 0.223807 \n",
+ "998 111.012434 55.506217 -5.372196e-07 6.395922e-02 0.223826 \n",
+ "999 111.012434 55.506217 -5.372770e-07 6.400057e-02 0.223844 \n",
+ "\n",
+ " S_6_ Sr Barite Celestite \n",
+ "0 1.050707e-03 0.000625 0.001010 1.717461 \n",
+ "1 3.700427e-04 0.001488 0.001738 1.716139 \n",
+ "2 2.946349e-05 0.004445 0.004898 1.708478 \n",
+ "3 3.035681e-06 0.007281 0.008778 1.698481 \n",
+ "4 1.872898e-06 0.009764 0.012641 1.688408 \n",
+ ".. ... ... ... ... \n",
+ "995 1.220403e-07 0.032096 1.714723 0.000000 \n",
+ "996 1.220029e-07 0.032055 1.714723 0.000000 \n",
+ "997 1.219644e-07 0.032017 1.714723 0.000000 \n",
+ "998 1.219672e-07 0.031982 1.714723 0.000000 \n",
+ "999 1.220142e-07 0.031950 1.714723 0.000000 \n",
+ "\n",
+ "[1000 rows x 9 columns]"
+ ]
+ },
+ "execution_count": 99,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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16+fU5t3797dbNlgPq+S9NFHHzn1taioSJJ05513trhfMJzXU6dOacCAAVqwYIHL93/729/qhRde0IIFC/TRRx8pOTlZw4cPdzx/05Xi4mJlZ2crJydHu3btUk5OjsaPH69t27b5qxtuaamv1dXV2rFjh2bOnKkdO3Zo9erV+uKLL3Tbbbe1Wm+XLl2cznNZWZliYmL80QWPtHZuJWnkyJFO7S4sLGyxzmA8t5KanJ9XXnlFJpNJY8eObbHejnpu/cZAh3PdddcZkyZNctrWp08fY+rUqS7LP/XUU0afPn2ctj388MPG4MGD/dZGfzl8+LAhydi0aVOzZd59911DknHs2LH2a5gPzJo1yxgwYIDb5UPpvBqGYTz++ONG7969DZvN5vL9YD2vkow1a9Y4XttsNiM5OdmYN2+eY1tNTY0RHx9vLFmypNl6xo8fb4wcOdJp24gRI4y77rrL52321vl9deXDDz80JBlff/11s2VeffVVIz4+3reN8wNX/b3//vuNMWPGeFRPqJzbMWPGGDfffHOLZYLl3PoSI1IdTF1dnbZv366srCyn7VlZWdq6davLfYqLi5uUHzFihD7++GNZrVa/tdUfKisrJUkXXnhhq2WvvvpqpaSk6JZbbtG7777r76b5xP79+5Wamqq0tDTddddd+vLLL5stG0rnta6uTn/5y1/04IMPtvoA72A8r+cqLS1VeXm507mzWCwaNmxYs/+GpebPd0v7dESVlZUymUxKSEhosdzJkyfVq1cvXXzxxfrxj3+skpKS9mmgD7z33nvq3r27rrjiCk2cOFGHDx9usXwonNv/+7//0zvvvKOHHnqo1bLBfG69QZDqYCoqKtTQ0KCkpCSn7UlJSSovL3e5T3l5ucvy9fX1qqio8Ftbfc0wDOXl5emGG25Q//79my2XkpKipUuXatWqVVq9erWuvPJK3XLLLfrXv/7Vjq313KBBg/T6669r/fr1eumll1ReXq4hQ4boyJEjLsuHynmVpLVr1+r48eN64IEHmi0TrOf1fPZ/p578G7bv5+k+HU1NTY2mTp2qe+65p8UH2vbp00fLli3TunXrtHz5csXExOj666/X/v3727G13hk1apTeeOMN/fOf/9Tvf/97ffTRR7r55ptVW1vb7D6hcG5fe+01xcXF6Y477mixXDCfW29FBboBcO38v9oNw2jxL3lX5V1t78geffRRffLJJ9qyZUuL5a688kpdeeWVjteZmZk6ePCgnn/+ed14443+bqbXRo0a5fj+qquuUmZmpnr37q3XXntNeXl5LvcJhfMqSQUFBRo1apRSU1ObLROs57U5nv4b9nafjsJqtequu+6SzWbTokWLWiw7ePBgpwna119/va655hr96U9/0osvvujvprZJdna24/v+/ftr4MCB6tWrl955550WQ0Ywn1tJeuWVV/TTn/601blOwXxuvcWIVAfTrVs3RUZGNvlL5fDhw03+orFLTk52WT4qKkpdu3b1W1t96Ze//KXWrVund999VxdffLHH+w8ePDjo/uLp3LmzrrrqqmbbHQrnVZK+/vprbdy4URMmTPB432A8r/Y7MT35N2zfz9N9Ogqr1arx48ertLRURUVFLY5GuRIREaFrr7026M611DiS2qtXrxbbHsznVpI2b96sffv2efVvOJjPrbsIUh1MdHS0MjIyHHc42RUVFWnIkCEu98nMzGxSfsOGDRo4cKDMZrPf2uoLhmHo0Ucf1erVq/XPf/5TaWlpXtVTUlKilJQUH7fOv2pra7V3795m2x3M5/Vcr776qrp3764f/ehHHu8bjOc1LS1NycnJTueurq5OmzZtavbfsNT8+W5pn47AHqL279+vjRs3ehXyDcPQzp07g+5cS9KRI0d08ODBFtserOfWrqCgQBkZGRowYIDH+wbzuXVboGa5o3krVqwwzGazUVBQYOzZs8eYPHmy0blzZ+Orr74yDMMwpk6dauTk5DjKf/nll0ZsbKwxZcoUY8+ePUZBQYFhNpuNt956K1BdcNsjjzxixMfHG++9955RVlbm+KqurnaUOb+/f/jDH4w1a9YYX3zxhfHpp58aU6dONSQZq1atCkQX3PbEE08Y7733nvHll18aH3zwgfHjH//YiIuLC8nzatfQ0GD07NnTePrpp5u8F8zn9cSJE0ZJSYlRUlJiSDJeeOEFo6SkxHGn2rx584z4+Hhj9erVxu7du427777bSElJMaqqqhx15OTkON2J+/777xuRkZHGvHnzjL179xrz5s0zoqKijA8++KDd+3eulvpqtVqN2267zbj44ouNnTt3Ov0brq2tddRxfl9nz55t/OMf/zD+/e9/GyUlJcbPfvYzIyoqyti2bVsguuikpf6eOHHCeOKJJ4ytW7capaWlxrvvvmtkZmYa3/ve90Lu3NpVVlYasbGxxuLFi13WEUzn1l8IUh3UwoULjV69ehnR0dHGNddc47QcwP33328MGzbMqfx7771nXH311UZ0dLRxySWXNPtD39FIcvn16quvOsqc39/58+cbvXv3NmJiYozExETjhhtuMN555532b7yHsrOzjZSUFMNsNhupqanGHXfcYXz22WeO90PpvNqtX7/ekGTs27evyXvBfF7tSzWc/3X//fcbhtG4BMKsWbOM5ORkw2KxGDfeeKOxe/dupzqGDRvmKG/35ptvGldeeaVhNpuNPn36dIgQ2VJfS0tLm/03/O677zrqOL+vkydPNnr27GlER0cbF110kZGVlWVs3bq1/TvnQkv9ra6uNrKysoyLLrrIMJvNRs+ePY3777/fOHDggFMdoXBu7f785z8bnTp1Mo4fP+6yjmA6t/5iMowzs1cBAADgEeZIAQAAeIkgBQAA4CWCFAAAgJcIUgAAAF4iSAEAAHiJIAUAAOAlghQAAICXCFIAAABeIkgBQDsymUxau3ZtoJsBwEcIUgDCxgMPPCCTydTka+TIkYFuGoAgFRXoBgBAexo5cqReffVVp20WiyVArQEQ7BiRAhBWLBaLkpOTnb4SExMlNV52W7x4sUaNGqVOnTopLS1Nb775ptP+u3fv1s0336xOnTqpa9eu+vnPf66TJ086lXnllVfUr18/WSwWpaSk6NFHH3V6v6KiQj/5yU8UGxuryy+/XOvWrfNvpwH4DUEKAM4xc+ZMjR07Vrt27dK9996ru+++W3v37pUkVVdXa+TIkUpMTNRHH32kN998Uxs3bnQKSosXL9YvfvEL/fznP9fu3bu1bt06XXbZZU7HmDNnjsaPH69PPvlEo0eP1k9/+lMdPXq0XfsJwEcMAAgT999/vxEZGWl07tzZ6evZZ581DMMwJBmTJk1y2mfQoEHGI488YhiGYSxdutRITEw0Tp486Xj/nXfeMSIiIozy8nLDMAwjNTXVmD59erNtkGTMmDHD8frkyZOGyWQy/v73v/usnwDaD3OkAISVH/7wh1q8eLHTtgsvvNDxfWZmptN7mZmZ2rlzpyRp7969GjBggDp37ux4//rrr5fNZtO+fftkMpl06NAh3XLLLS224fvf/77j+86dOysuLk6HDx/2tksAAoggBSCsdO7cucmlttaYTCZJkmEYju9dlenUqZNb9ZnN5ib72mw2j9oEoGNgjhQAnOODDz5o8rpPnz6SpPT0dO3cuVOnTp1yvP/+++8rIiJCV1xxheLi4nTJJZfo//2//9eubQYQOIxIAQgrtbW1Ki8vd9oWFRWlbt26SZLefPNNDRw4UDfccIPeeOMNffjhhyooKJAk/fSnP9WsWbN0//33a/bs2fruu+/0y1/+Ujk5OUpKSpIkzZ49W5MmTVL37t01atQonThxQu+//75++ctftm9HAbQLghSAsPKPf/xDKSkpTtuuvPJKff7555Ia76hbsWKFcnNzlZycrDfeeEPp6emSpNjYWK1fv16PP/64rr32WsXGxmrs2LF64YUXHHXdf//9qqmp0R/+8Af96le/Urdu3TRu3Lj26yCAdmUyDMMIdCMAoCMwmUxas2aNbr/99kA3BUCQYI4UAACAlwhSAAAAXmKOFACcwUwHAJ5iRAoAAMBLBCkAAAAvEaQAAAC8RJACAADwEkEKAADASwQpAAAALxGkAAAAvESQAgAA8NL/D3qRss4b1+VXAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.plot(history.history[\"loss\"], \"o-\", label = \"Training Loss\")\n",
+ "plt.xlabel(\"Epoch\")\n",
+ "# plt.yscale('log')\n",
+ "plt.ylabel(\"Loss (Huber)\")\n",
+ "plt.grid('on')\n",
+ "\n",
+ "plt.savefig(\"loss_all.png\", dpi=300)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.plot(history.history[\"loss\"][1:], \"o-\", label = \"Training Loss\")\n",
+ "plt.xlabel(\"Epoch\")\n",
+ "# plt.yscale('log')\n",
+ "plt.ylabel(\"Loss (Huber)\")\n",
+ "plt.grid('on')\n",
+ "plt.savefig(\"loss_1_to_end.png\", dpi=300)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Test the model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 1ms/step - huber: 1.1512e-06 - loss: 6.1960e-04 - mass_balance: 6.1845e-04\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[0.0006179715855978429, 1.3147706567906425e-06, 0.0006166595267131925]"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# test on all test data\n",
+ "model_large.evaluate(X_test.loc[:, X_test.columns != \"Class\"], y_test.loc[:, y_test.columns != \"Class\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m3747/3747\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 1ms/step - huber: 7.8163e-07 - loss: 6.1089e-04 - mass_balance: 6.1011e-04\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[0.0006081282044760883, 9.70141854850226e-07, 0.0006071386160328984]"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# test on non-reactive data\n",
+ "model_large.evaluate(X_test[X_test['Class'] == 0].iloc[:,X_test.columns != \"Class\"], y_test[X_test['Class'] == 0].iloc[:, y_test.columns != \"Class\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1m192/192\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step - huber: 8.3419e-06 - loss: 7.8972e-04 - mass_balance: 7.8142e-04\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[0.0008110244525596499, 8.072383934631944e-06, 0.0008072017808444798]"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# test on reactive data\n",
+ "model_large.evaluate(X_test[X_test['Class'] == 1].iloc[:,:-1], y_test[X_test['Class'] == 1].iloc[:, :-1])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Save the model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Save the model\n",
+ "model.save(\"Barite_50_Model_additional_species.keras\")"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "training",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.11"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/src/convert_data.jl b/src/convert_data.jl
new file mode 100644
index 0000000..3cd3cc9
--- /dev/null
+++ b/src/convert_data.jl
@@ -0,0 +1,60 @@
+using HDF5
+using RData
+
+using DataFrames
+
+# Load Training Data
+# train_data = load("Barite_50_Data.rds")
+
+# training_h5_name = "Barite_50_Data.h5"
+# h5open(training_h5_name, "w") do fid
+# for key in keys(train_data)
+# group = create_group(fid, key)
+# group["names"] = names(train_data[key])
+# group["data", compress=3] = Matrix(train_data[key])
+# # group = create_group(fid, key)
+# # grou["names"] = coln
+# end
+# end
+
+# List all .rds files starting with "iter" in a given directory
+rds_files = filter(x -> startswith(x, "iter"), readdir("barite_out/"))
+
+# remove "iter_0.rds" from the list
+rds_files = rds_files[2:end]
+
+big_df_in = DataFrame()
+big_df_out = DataFrame()
+
+for rds_file in rds_files
+ # Load the RDS file
+ data = load("barite_out/$rds_file")
+ # Convert the data to a DataFrame
+ df_T = DataFrame(data["T"])
+ df_C = DataFrame(data["C"])
+ # Append the DataFrame to the big DataFrame
+ append!(big_df_in, df_T)
+ append!(big_df_out, df_C)
+end
+
+# remove ID, Barite_p1, Celestite_p1 columns
+big_df_in = big_df_in[:, Not([:ID, :Barite_p1, :Celestite_p1])]
+big_df_out = big_df_out[:, Not([:ID, :Barite_p1, :Celestite_p1])]
+
+inference_h5_name = "Barite_50_Data_inference.h5"
+h5open(inference_h5_name, "w") do fid
+ fid["names"] = names(big_df_in)
+ fid["data", compress=9] = Matrix(big_df_in)
+end
+
+training_h5_name = "Barite_50_Data_training.h5"
+h5open(training_h5_name, "w") do fid
+ group_in = create_group(fid, "design")
+ group_out = create_group(fid, "result")
+
+ group_in["names"] = names(big_df_in)
+ group_in["data", compress=9] = Matrix(big_df_in)
+
+ group_out["names"] = names(big_df_out)
+ group_out["data", compress=9] = Matrix(big_df_out)
+end
\ No newline at end of file
diff --git a/src/optuna_runs.py b/src/optuna_runs.py
new file mode 100644
index 0000000..ee5901e
--- /dev/null
+++ b/src/optuna_runs.py
@@ -0,0 +1,138 @@
+import keras
+from keras.layers import Dense, Dropout, Input,BatchNormalization
+import tensorflow as tf
+import h5py
+import numpy as np
+import pandas as pd
+import time
+import sklearn.model_selection as sk
+import matplotlib.pyplot as plt
+from sklearn.cluster import KMeans
+from sklearn.pipeline import Pipeline, make_pipeline
+from sklearn.preprocessing import StandardScaler, MinMaxScaler
+from imblearn.over_sampling import SMOTE
+from imblearn.under_sampling import RandomUnderSampler
+from imblearn.over_sampling import RandomOverSampler
+from collections import Counter
+import os
+from preprocessing import *
+from sklearn import set_config
+from importlib import reload
+set_config(transform_output = "pandas")
+import optuna
+import pickle
+
+def objective(trial, X, y, species_columns):
+
+ model_type = trial.suggest_categorical("model", ["small", "large", "paper"])
+ scaler_type = trial.suggest_categorical("scaler", ["standard", "minmax"])
+ sampling_type = trial.suggest_categorical("sampling", ["over", "off"])
+ loss_variant = trial.suggest_categorical("loss", ["huber", "huber_mass_balance"])
+ delta = trial.suggest_float("delta", 0.5, 5.0)
+
+ preprocess = preprocessing()
+ X, y = preprocess.cluster(df_design[species_columns], df_results[species_columns])
+ X_train, X_test, y_train, y_test = preprocess.split(X, y, ratio = 0.2)
+ X_train, y_train = preprocess.balancer(X_train, y_train, strategy = sampling_type)
+ preprocess.scale_fit(X_train, y_train, scaling = "global", type=scaler_type)
+ X_train, X_test, y_train, y_test = preprocess.scale_transform(X_train, X_test, y_train, y_test)
+ X_train, X_val, y_train, y_val = preprocess.split(X_train, y_train, ratio = 0.1)
+
+ column_dict = {"Ba": X.columns.get_loc("Ba"), "Barite": X.columns.get_loc("Barite"), "Sr": X.columns.get_loc(
+ "Sr"), "Celestite": X.columns.get_loc("Celestite"), "H": X.columns.get_loc("H"), "H": X.columns.get_loc("H"), "O": X.columns.get_loc("O")}
+
+ h1 = trial.suggest_float("h1", 0.1, 1.0)
+ h2 = trial.suggest_float("h2", 0.1, 1.0)
+ h3 = trial.suggest_float("h3", 0.1, 1.0)
+
+ model = model_definition(model_type)
+
+ lr_schedule = keras.optimizers.schedules.ExponentialDecay(
+ initial_learning_rate=0.001,
+ decay_steps=2000,
+ decay_rate=0.9,
+ staircase=True
+ )
+ optimizer = keras.optimizers.Adam(learning_rate=lr_schedule)
+
+ model.compile(optimizer=optimizer, loss=custom_loss(preprocess, column_dict, h1, h2, h3, scaler_type, loss_variant, delta),
+ metrics=[huber_metric(preprocess, scaler_type, delta), mass_balance_metric(preprocess, column_dict, scaler_type)])
+
+ callback = keras.callbacks.EarlyStopping(monitor='loss', patience=3)
+ history = model.fit(X_train.loc[:, X_train.columns != "Class"],
+ y_train.loc[:, y_train.columns != "Class"],
+ batch_size=512,
+ epochs=100,
+ validation_data=(X_val.loc[:, X_val.columns != "Class"], y_val.loc[:, y_val.columns != "Class"]),
+ callbacks=[callback])
+
+ prediction_huber_overall = model.evaluate(
+ X_test.loc[:, X_test.columns != "Class"], y_test.loc[:, y_test.columns != "Class"])[1]
+ prediction_huber_non_reactive = model.evaluate(
+ X_test[X_test['Class'] == 0].iloc[:, X_test.columns != "Class"], y_test[X_test['Class'] == 0].iloc[:, y_test.columns != "Class"])[1]
+ prediction_huber_reactive = model.evaluate(
+ X_test[X_test['Class'] == 1].iloc[:, X_test.columns != "Class"], y_test[X_test['Class'] == 1].iloc[:, y_test.columns != "Class"])[1]
+ prediction_mass_balance_overall = model.evaluate(
+ X_test.loc[:, X_test.columns != "Class"], y_test.loc[:, y_test.columns != "Class"])[2]
+ prediction_mass_balance_non_reactive = model.evaluate(
+ X_test[X_test['Class'] == 0].iloc[:, X_test.columns != "Class"], y_test[X_test['Class'] == 0].iloc[:, y_test.columns != "Class"])[2]
+ prediction_mass_balance_reactive = model.evaluate(
+ X_test[X_test['Class'] == 1].iloc[:, X_test.columns != "Class"], y_test[X_test['Class'] == 1].iloc[:, y_test.columns != "Class"])[2]
+
+ mass_balance_results = mass_balance_evaluation(model, X_test, preprocess)
+ mass_balance_ratio = len(mass_balance_results[mass_balance_results < 1e-5]) / len(mass_balance_results)
+
+ results_save_path = os.path.join("./results/", "results.csv")
+ results_df = pd.DataFrame({
+ "trial": [trial.number],
+ "prediction_huber_overall": [prediction_huber_overall],
+ "prediction_huber_non_reactive": [prediction_huber_non_reactive],
+ "prediction_huber_reactive": [prediction_huber_reactive],
+ "prediction_mass_balance_overall": [prediction_mass_balance_overall],
+ "prediction_mass_balance_non_reactive": [prediction_mass_balance_non_reactive],
+ "prediction_mass_balance_reactive": [prediction_mass_balance_reactive]
+ })
+
+ if not os.path.isfile(results_save_path):
+ results_df.to_csv(results_save_path, index=False)
+ else:
+ results_df.to_csv(results_save_path, mode='a', header=False, index=False)
+
+
+ model_save_path_trial = os.path.join("./results/models/", f"model_trial_{trial.number}.keras")
+ history_save_path_trial = os.path.join("./results/history/", f"history_trial_{trial.number}.pkl")
+
+ model.save(model_save_path_trial)
+ with open(history_save_path_trial, 'wb') as f:
+ pickle.dump(history.history, f)
+
+ return prediction_huber_overall, mass_balance_ratio
+
+if __name__ == "__main__":
+
+
+ print(os.path.abspath("./datasets/barite_50_4_corner.h5"))
+ data_file = h5py.File("./datasets/barite_50_4_corner.h5")
+ design = data_file["design"]
+ results = data_file["result"]
+
+ df_design = pd.DataFrame(np.array(design["data"]).transpose(), columns = np.array(design["names"].asstr()))
+ df_results = pd.DataFrame(np.array(results["data"]).transpose(), columns = np.array(results["names"].asstr()))
+
+ data_file.close()
+
+ species_columns = ['H', 'O', 'Ba', 'Cl', 'S', 'Sr', 'Barite', 'Celestite']
+
+ study = optuna.create_study(storage="sqlite:///model_large_optimization.db", study_name="model_optimization", directions=["minimize", "maximize"])
+ study.optimize(lambda trial: objective(trial, df_design, df_results, species_columns), n_trials=1000)
+
+ print("Number of finished trials: ", len(study.trials))
+
+ print("Best trial:")
+ trial = study.best_trial
+
+ print(" Value: ", trial.value)
+
+ print(" Params: ")
+ for key, value in trial.params.items():
+ print(" {}: {}".format(key, value))
\ No newline at end of file
diff --git a/src/preprocessing.py b/src/preprocessing.py
new file mode 100644
index 0000000..29a4ac5
--- /dev/null
+++ b/src/preprocessing.py
@@ -0,0 +1,384 @@
+import keras
+from keras.layers import Dense, Dropout, Input,BatchNormalization, LeakyReLU
+import tensorflow as tf
+import h5py
+import numpy as np
+import pandas as pd
+import time
+import sklearn.model_selection as sk
+import matplotlib.pyplot as plt
+from sklearn.cluster import KMeans
+from sklearn.pipeline import Pipeline, make_pipeline
+from sklearn.preprocessing import StandardScaler, MinMaxScaler
+from imblearn.over_sampling import SMOTE
+from imblearn.under_sampling import RandomUnderSampler
+from imblearn.over_sampling import RandomOverSampler
+from collections import Counter
+import os
+from preprocessing import *
+from sklearn import set_config
+from importlib import reload
+set_config(transform_output = "pandas")
+
+# preprocessing pipeline
+#
+
+def Safelog(val):
+ # get range of vector
+ if val > 0:
+ return np.log10(val)
+ elif val < 0:
+ return -np.log10(-val)
+ else:
+ return 0
+
+def Safeexp(val):
+ if val > 0:
+ return -10 ** -val
+ elif val < 0:
+ return 10 ** val
+ else:
+ return 0
+
+
+def model_definition(architecture):
+ dtype = "float32"
+
+ if architecture == "small":
+ model = keras.Sequential(
+ [
+ keras.Input(shape=(8,), dtype="float32"),
+ keras.layers.Dense(units=128, dtype="float32"),
+ LeakyReLU(negative_slope=0.01),
+ # Dropout(0.2),
+ keras.layers.Dense(units=128, dtype="float32"),
+ LeakyReLU(negative_slope=0.01),
+ keras.layers.Dense(units=8, dtype="float32")
+ ]
+ )
+
+
+ elif architecture == "large":
+ model = keras.Sequential(
+ [
+ keras.layers.Input(shape=(8,), dtype=dtype),
+ keras.layers.Dense(512, dtype=dtype),
+ LeakyReLU(negative_slope=0.01),
+ keras.layers.Dense(1024, dtype=dtype),
+ LeakyReLU(negative_slope=0.01),
+ keras.layers.Dense(512, dtype=dtype),
+ LeakyReLU(negative_slope=0.01),
+ keras.layers.Dense(8, dtype=dtype)
+ ]
+ )
+
+ elif architecture == "paper":
+ model = keras.Sequential(
+ [keras.layers.Input(shape=(8,), dtype=dtype),
+ keras.layers.Dense(128, dtype=dtype),
+ LeakyReLU(negative_slope=0.01),
+ keras.layers.Dense(256, dtype=dtype),
+ LeakyReLU(negative_slope=0.01),
+ keras.layers.Dense(512, dtype=dtype),
+ LeakyReLU(negative_slope=0.01),
+ keras.layers.Dense(256, dtype=dtype),
+ LeakyReLU(negative_slope=0.01),
+ keras.layers.Dense(8, dtype=dtype)
+ ])
+
+ return model
+
+
+def custom_loss(preprocess, column_dict, h1, h2, h3, scaler_type="minmax", loss_variant="huber", delta=1.0):
+ # extract the scaling parameters
+
+ if scaler_type == "minmax":
+ scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)
+ min_X = tf.convert_to_tensor(preprocess.scaler_X.min_, dtype=tf.float32)
+ scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)
+ min_y = tf.convert_to_tensor(preprocess.scaler_y.min_, dtype=tf.float32)
+
+ elif scaler_type == "standard":
+ scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)
+ mean_X = tf.convert_to_tensor(preprocess.scaler_X.mean_, dtype=tf.float32)
+ scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)
+ mean_y = tf.convert_to_tensor(preprocess.scaler_y.mean_, dtype=tf.float32)
+
+ def loss(results, predicted):
+
+ # inverse min/max scaling
+ if scaler_type == "minmax":
+ predicted_inverse = predicted * scale_y + min_y
+ results_inverse = results * scale_X + min_X
+
+ elif scaler_type == "standard":
+ predicted_inverse = predicted * scale_y + mean_y
+ results_inverse = results * scale_X + mean_X
+
+ # mass balance
+ dBa = tf.keras.backend.abs(
+ (predicted_inverse[:, column_dict["Ba"]] + predicted_inverse[:, column_dict["Barite"]]) -
+ (results_inverse[:, column_dict["Ba"]] + results_inverse[:, column_dict["Barite"]])
+ )
+ dSr = tf.keras.backend.abs(
+ (predicted_inverse[:, column_dict["Sr"]] + predicted_inverse[:, column_dict["Celestite"]]) -
+ (results_inverse[:, column_dict["Sr"]] + results_inverse[:, column_dict["Celestite"]])
+ )
+
+ # H/O ratio has to be 2
+ # h2o_ratio = tf.keras.backend.abs(
+ # (predicted_inverse[:, column_dict["H"]] / predicted_inverse[:, column_dict["O"]]) - 2
+ # )
+
+ # huber loss
+ huber_loss = tf.keras.losses.Huber(delta)(results, predicted)
+
+ # total loss
+ if loss_variant == "huber":
+ total_loss = huber_loss
+ elif loss_variant == "huber_mass_balance":
+ total_loss = h1 * huber_loss + h2 * dBa + h3 * dSr
+
+ return total_loss
+
+ return loss
+
+def mass_balance_metric(preprocess, column_dict, scaler_type="minmax"):
+
+ if scaler_type == "minmax":
+ scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)
+ min_X = tf.convert_to_tensor(preprocess.scaler_X.min_, dtype=tf.float32)
+ scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)
+ min_y = tf.convert_to_tensor(preprocess.scaler_y.min_, dtype=tf.float32)
+
+ elif scaler_type == "standard":
+ scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)
+ mean_X = tf.convert_to_tensor(preprocess.scaler_X.mean_, dtype=tf.float32)
+ scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)
+ mean_y = tf.convert_to_tensor(preprocess.scaler_y.mean_, dtype=tf.float32)
+
+
+ def mass_balance(results, predicted):
+ # inverse min/max scaling
+ if scaler_type == "minmax":
+ predicted_inverse = predicted * scale_y + min_y
+ results_inverse = results * scale_X + min_X
+
+ elif scaler_type == "standard":
+ predicted_inverse = predicted * scale_y + mean_y
+ results_inverse = results * scale_X + mean_X
+
+ # mass balance
+ dBa = tf.keras.backend.abs(
+ (predicted_inverse[:, column_dict["Ba"]] + predicted_inverse[:, column_dict["Barite"]]) -
+ (results_inverse[:, column_dict["Ba"]] + results_inverse[:, column_dict["Barite"]])
+ )
+ dSr = tf.keras.backend.abs(
+ (predicted_inverse[:, column_dict["Sr"]] + predicted_inverse[:, column_dict["Celestite"]]) -
+ (results_inverse[:, column_dict["Sr"]] + results_inverse[:, column_dict["Celestite"]])
+ )
+
+ return tf.reduce_mean(dBa + dSr)
+
+ return mass_balance
+
+
+def huber_metric(preprocess, scaler_type="minmax", delta=1.0):
+
+ if scaler_type == "minmax":
+ scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)
+ min_X = tf.convert_to_tensor(preprocess.scaler_X.min_, dtype=tf.float32)
+ scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)
+ min_y = tf.convert_to_tensor(preprocess.scaler_y.min_, dtype=tf.float32)
+
+ elif scaler_type == "standard":
+ scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)
+ mean_X = tf.convert_to_tensor(preprocess.scaler_X.mean_, dtype=tf.float32)
+ scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)
+ mean_y = tf.convert_to_tensor(preprocess.scaler_y.mean_, dtype=tf.float32)
+
+
+ def huber(results, predicted):
+
+ if scaler_type == "minmax":
+ predicted_inverse = predicted * scale_y + min_y
+ results_inverse = results * scale_X + min_X
+
+ elif scaler_type == "standard":
+ predicted_inverse = predicted * scale_y + mean_y
+ results_inverse = results * scale_X + mean_X
+
+ huber_loss = tf.keras.losses.Huber(delta)(results, predicted)
+
+ return huber_loss
+
+ return huber
+
+def mass_balance_evaluation(model, X, preprocess):
+
+ # predict the chemistry
+ columns = X.iloc[:, X.columns != "Class"].columns
+ prediction = pd.DataFrame(model.predict(X[columns]), columns=columns)
+
+ # backtransform min/max or standard scaler
+ X = pd.DataFrame(preprocess.scaler_X.inverse_transform(X.iloc[:, X.columns != "Class"]), columns=columns)
+ prediction = pd.DataFrame(preprocess.scaler_y.inverse_transform(prediction), columns=columns)
+
+ # calculate mass balance
+ dBa = np.abs((prediction["Ba"] + prediction["Barite"]) - (X["Ba"] + X["Barite"]))
+ print(dBa.min())
+ dSr = np.abs((prediction["Sr"] + prediction["Celestite"]) - (X["Sr"] + X["Celestite"]))
+ print(dSr.min())
+ return dBa+dSr
+
+
+class preprocessing:
+
+ def __init__(self, func_dict_in=None, func_dict_out=None, random_state=42):
+ self.random_state = random_state
+ self.scaler_X = None
+ self.scaler_y = None
+ self.func_dict_in = None
+ self.func_dict_in = func_dict_in if func_dict_in is not None else None
+ self.func_dict_out = func_dict_out if func_dict_out is not None else None
+ self.state = {"cluster": False, "log": False, "balance": False, "scale": False}
+
+ def funcTranform(self, X, y):
+ for key in X.keys():
+ if "Class" not in key:
+ X[key] = X[key].apply(self.func_dict_in[key])
+ y[key] = y[key].apply(self.func_dict_in[key])
+ self.state["log"] = True
+
+ return X, y
+
+ def funcInverse(self, X, y):
+
+ for key in X.keys():
+ if "Class" not in key:
+ X[key] = X[key].apply(self.func_dict_out[key])
+ y[key] = y[key].apply(self.func_dict_out[key])
+ self.state["log"] = False
+ return X, y
+
+ def cluster(self, X, y, species='Barite', n_clusters=2, x_length=50, y_length=50):
+
+ class_labels = np.array([])
+ grid_length = x_length * y_length
+ iterations = int(len(X) / grid_length)
+
+ for i in range(0, iterations):
+ field = np.array(X[species][(i*grid_length):(i*grid_length+grid_length)]
+ ).reshape(x_length, y_length)
+ kmeans = KMeans(n_clusters=n_clusters, random_state=self.random_state).fit(field.reshape(-1, 1))
+ class_labels = np.append(class_labels.astype(int), kmeans.labels_)
+
+ if ("Class" in X.columns and "Class" in y.columns):
+ print("Class column already exists")
+ else:
+ class_labels_df = pd.DataFrame(class_labels, columns=['Class'])
+ X = pd.concat([X, class_labels_df], axis=1)
+ y = pd.concat([y, class_labels_df], axis=1)
+ self.state["cluster"] = True
+
+ return X, y
+
+
+ def balancer(self, X, y, strategy, sample_fraction=0.5):
+
+ number_features = (X.columns != "Class").sum()
+ if("Class" not in X.columns):
+ if("Class" in y.columns):
+ classes = y['Class']
+ else:
+ raise Exception("No class column found")
+ else:
+ classes = X['Class']
+ counter = classes.value_counts()
+ print("Amount class 0 before:", counter[0] / (counter[0] + counter[1]) )
+ print("Amount class 1 before:", counter[1] / (counter[0] + counter[1]) )
+ df = pd.concat([X.loc[:,X.columns != "Class"], y.loc[:, y.columns != "Class"], classes], axis=1)
+
+ if strategy == 'smote':
+ print("Using SMOTE strategy")
+ smote = SMOTE(sampling_strategy=sample_fraction)
+ df_resampled, classes_resampled = smote.fit_resample(df.loc[:, df.columns != "Class"], df.loc[:, df. columns == "Class"])
+
+ elif strategy == 'over':
+ print("Using Oversampling")
+ over = RandomOverSampler()
+ df_resampled, classes_resampled = over.fit_resample(df.loc[:, df.columns != "Class"], df.loc[:, df. columns == "Class"])
+
+ elif strategy == 'under':
+ print("Using Undersampling")
+ under = RandomUnderSampler()
+ df_resampled, classes_resampled = under.fit_resample(df.loc[:, df.columns != "Class"], df.loc[:, df. columns == "Class"])
+
+ else:
+ return X, y
+
+ counter = classes_resampled["Class"].value_counts()
+ print("Amount class 0 after:", counter[0] / (counter[0] + counter[1]) )
+ print("Amount class 1 after:", counter[1] / (counter[0] + counter[1]) )
+
+ design_resampled = pd.concat([df_resampled.iloc[:,0:number_features], classes_resampled], axis=1)
+ target_resampled = pd.concat([df_resampled.iloc[:,number_features:], classes_resampled], axis=1)
+
+ self.state['balance'] = True
+ return design_resampled, target_resampled
+
+
+ def scale_fit(self, X, y, scaling, type='Standard'):
+
+ if type == 'minmax':
+ self.scaler_X = MinMaxScaler()
+ self.scaler_y = MinMaxScaler()
+ elif type == 'standard':
+ self.scaler_X = StandardScaler()
+ self.scaler_y = StandardScaler()
+
+ else:
+ raise Exception("No valid scaler type found")
+
+ if scaling == 'individual':
+ self.scaler_X.fit(X.iloc[:, X.columns != "Class"])
+ self.scaler_y.fit(y.iloc[:, y.columns != "Class"])
+
+ elif scaling == 'global':
+ self.scaler_X.fit(pd.concat([X.iloc[:, X.columns != "Class"], y.iloc[:, y.columns != "Class"]], axis=0))
+ self.scaler_y = self.scaler_X
+
+ self.state['scale'] = True
+
+ def scale_transform(self, X_train, X_test, y_train, y_test):
+ X_train = pd.concat([self.scaler_X.transform(X_train.loc[:, X_train.columns != "Class"]), X_train.loc[:, "Class"]], axis=1)
+
+ X_test = pd.concat([self.scaler_X.transform(X_test.loc[:, X_test.columns != "Class"]), X_test.loc[:, "Class"]], axis=1)
+
+ y_train = pd.concat([self.scaler_y.transform(y_train.loc[:, y_train.columns != "Class"]), y_train.loc[:, "Class"]], axis=1)
+
+ y_test = pd.concat([self.scaler_y.transform(y_test.loc[:, y_test.columns != "Class"]), y_test.loc[:, "Class"]], axis=1)
+
+ return X_train, X_test, y_train, y_test
+
+ def scale_inverse(self, X):
+
+ if("Class" in X.columns):
+ X = pd.concat([self.scaler_X.inverse_transform(X.loc[:, X.columns != "Class"]), X.loc[:, "Class"]], axis=1)
+ else:
+ X = self.scaler_X.inverse_transform(X)
+
+ return X
+
+ def split(self, X, y, ratio=0.8):
+ X_train, y_train, X_test, y_test = sk.train_test_split(X, y, test_size = ratio, random_state=self.random_state)
+
+ return X_train, y_train, X_test, y_test
+
+
+
+
+
+
+
+
\ No newline at end of file