diff --git a/POET_Training.ipynb b/POET_Training.ipynb index 79513e6..20450db 100644 --- a/POET_Training.ipynb +++ b/POET_Training.ipynb @@ -34,8 +34,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "2025-01-22 15:50:06.981475: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", - "2025-01-22 15:50:07.001765: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "2025-01-23 14:37:53.766781: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", + "2025-01-23 14:37:53.786741: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", "To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" ] }, @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -98,7 +98,7 @@ "optimizer_simple = keras.optimizers.Adam(learning_rate=lr_schedule)\n", "optimizer_large = keras.optimizers.Adam(learning_rate=lr_schedule)\n", "\n", - "loss = keras.losses.Huber()\n", + "loss = keras.losses.MeanSquaredError()\n", "\n", "sample_fraction = 0.8" ] @@ -112,17 +112,17 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
Model: \"sequential\"\n",
+       "
Model: \"sequential_2\"\n",
        "
\n" ], "text/plain": [ - "\u001b[1mModel: \"sequential\"\u001b[0m\n" + "\u001b[1mModel: \"sequential_2\"\u001b[0m\n" ] }, "metadata": {}, @@ -134,11 +134,11 @@ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
        "┃ Layer (type)                     Output Shape                  Param # ┃\n",
        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
-       "│ dense (Dense)                   │ (None, 128)            │         1,664 │\n",
+       "│ dense_7 (Dense)                 │ (None, 128)            │         1,664 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_1 (Dense)                 │ (None, 128)            │        16,512 │\n",
+       "│ dense_8 (Dense)                 │ (None, 128)            │        16,512 │\n",
        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
-       "│ dense_2 (Dense)                 │ (None, 12)             │         1,548 │\n",
+       "│ dense_9 (Dense)                 │ (None, 12)             │         1,548 │\n",
        "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
        "
\n" ], @@ -146,11 +146,11 @@ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", - "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,664\u001b[0m │\n", + "│ dense_7 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,664\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\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", + "│ dense_8 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m16,512\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", - "│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m1,548\u001b[0m │\n", + "│ dense_9 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m1,548\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ] }, @@ -198,6 +198,7 @@ } ], "source": [ + "# small model\n", "model_simple = keras.Sequential(\n", " [\n", " keras.Input(shape = (12,), dtype = \"float32\"),\n", @@ -303,6 +304,7 @@ } ], "source": [ + "# large model\n", "model_large = keras.Sequential(\n", " [keras.layers.Input(shape=(12,), dtype=dtype),\n", " keras.layers.Dense(512, activation='relu', dtype=dtype),\n", @@ -315,6 +317,15 @@ "model_large.summary()\n" ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# model from paper" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -324,7 +335,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -348,7 +359,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -394,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 59, "metadata": {}, "outputs": [], "source": [ @@ -410,6 +421,22 @@ "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": 9, @@ -428,138 +455,15 @@ "output_type": "stream", "text": [ "Amount class 0 before: 0.9879169719169719\n", - "Amount class 1 before: 0.012083028083028084\n" - ] - }, - { - "ename": "KeyError", - "evalue": "'Class'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/pandas/core/indexes/base.py:3805\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3804\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 3805\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine\u001b[38;5;241m.\u001b[39mget_loc(casted_key)\n\u001b[1;32m 3806\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n", - "File \u001b[0;32mindex.pyx:167\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32mindex.pyx:175\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32mpandas/_libs/index_class_helper.pxi:70\u001b[0m, in \u001b[0;36mpandas._libs.index.Int64Engine._check_type\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 'Class'", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m X_train, X_val, X_test, y_train, y_val, y_test \u001b[38;5;241m=\u001b[39m preprocessing(df_design, df_results, func_dict_in, func_dict_out, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;241m0.1\u001b[39m)\n", - "File \u001b[0;32m~/Documents/model-training/preprocessing.py:164\u001b[0m, in \u001b[0;36mpreprocessing\u001b[0;34m(df_design, df_targets, func_dict_in, func_dict_out, sampling, test_size)\u001b[0m\n\u001b[1;32m 160\u001b[0m df_results_log \u001b[38;5;241m=\u001b[39m FuncTransform(func_dict_in, func_dict_out)\u001b[38;5;241m.\u001b[39mfit_transform(df_targets)\n\u001b[1;32m 162\u001b[0m X_train, X_test, y_train, y_test \u001b[38;5;241m=\u001b[39m sk\u001b[38;5;241m.\u001b[39mtrain_test_split(df_design_log, df_results_log, test_size \u001b[38;5;241m=\u001b[39m test_size, random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m)\n\u001b[0;32m--> 164\u001b[0m X_train, y_train \u001b[38;5;241m=\u001b[39m balancer(X_train, y_train, sampling)\n\u001b[1;32m 166\u001b[0m scaler_X \u001b[38;5;241m=\u001b[39m MinMaxScaler()\n\u001b[1;32m 167\u001b[0m scaler_y \u001b[38;5;241m=\u001b[39m MinMaxScaler()\n", - "File \u001b[0;32m~/Documents/model-training/preprocessing.py:131\u001b[0m, in \u001b[0;36mbalancer\u001b[0;34m(design, target, strategy, sample_fraction)\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 129\u001b[0m classes_resampled \u001b[38;5;241m=\u001b[39m classes\n\u001b[0;32m--> 131\u001b[0m counter \u001b[38;5;241m=\u001b[39m classes_resampled[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mvalue_counts()\n\u001b[1;32m 132\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAmount class 0 after:\u001b[39m\u001b[38;5;124m\"\u001b[39m, counter[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m/\u001b[39m (counter[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m+\u001b[39m counter[\u001b[38;5;241m1\u001b[39m]) )\n\u001b[1;32m 133\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAmount class 1 after:\u001b[39m\u001b[38;5;124m\"\u001b[39m, counter[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m/\u001b[39m (counter[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m+\u001b[39m counter[\u001b[38;5;241m1\u001b[39m]) )\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/pandas/core/series.py:1121\u001b[0m, in \u001b[0;36mSeries.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1118\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_values[key]\n\u001b[1;32m 1120\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m key_is_scalar:\n\u001b[0;32m-> 1121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_value(key)\n\u001b[1;32m 1123\u001b[0m \u001b[38;5;66;03m# Convert generator to list before going through hashable part\u001b[39;00m\n\u001b[1;32m 1124\u001b[0m \u001b[38;5;66;03m# (We will iterate through the generator there to check for slices)\u001b[39;00m\n\u001b[1;32m 1125\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_iterator(key):\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/pandas/core/series.py:1237\u001b[0m, in \u001b[0;36mSeries._get_value\u001b[0;34m(self, label, takeable)\u001b[0m\n\u001b[1;32m 1234\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_values[label]\n\u001b[1;32m 1236\u001b[0m \u001b[38;5;66;03m# Similar to Index.get_value, but we do not fall back to positional\u001b[39;00m\n\u001b[0;32m-> 1237\u001b[0m loc \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mget_loc(label)\n\u001b[1;32m 1239\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_integer(loc):\n\u001b[1;32m 1240\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_values[loc]\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/pandas/core/indexes/base.py:3812\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3807\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(casted_key, \u001b[38;5;28mslice\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m (\n\u001b[1;32m 3808\u001b[0m \u001b[38;5;28misinstance\u001b[39m(casted_key, abc\u001b[38;5;241m.\u001b[39mIterable)\n\u001b[1;32m 3809\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28many\u001b[39m(\u001b[38;5;28misinstance\u001b[39m(x, \u001b[38;5;28mslice\u001b[39m) \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m casted_key)\n\u001b[1;32m 3810\u001b[0m ):\n\u001b[1;32m 3811\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m InvalidIndexError(key)\n\u001b[0;32m-> 3812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 3813\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 3814\u001b[0m \u001b[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[1;32m 3815\u001b[0m \u001b[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[1;32m 3816\u001b[0m \u001b[38;5;66;03m# the TypeError.\u001b[39;00m\n\u001b[1;32m 3817\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_indexing_error(key)\n", - "\u001b[0;31mKeyError\u001b[0m: 'Class'" + "Amount class 1 before: 0.012083028083028084\n", + "Using Oversampling\n", + "Amount class 0 after: 0.5\n", + "Amount class 1 after: 0.5\n" ] } ], "source": [ - "X_train, X_val, X_test, y_train, y_val, y_test = preprocessing(df_design, df_results, func_dict_in, func_dict_out, \"off\", 0.1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Classify each cell with kmeans" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "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" - ] - } - ], - "source": [ - "df_design = clustering(df_design)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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TCyyRs5oIjqTDsHN9DsCAGa24BH66le/qiAIpk09g4OD06YjSdq7d6+GhoaqS39//4Juz8WH5MbPC0087mRNIqtEgUn/HdpYoUlkjJOxlTu2GsmZND7OaCI8XBUHAHO24IfjMpmM1q5dq56eHn3ve9+rru/p6dG2bdumPT+bzSqbzVY/d5U3/hw+P79780x+t+1ETokSxS79WHaJSnLKO6cLiTTqEo3GsQpJSaVSScVCSfGFvNxYTsmFQC7vVC5ahSUpLiUql2OZuCiXFGWSguRKcq4o54qSi9PfwSRySTz+S83rdwGAxaSskqSJv+eX5a6Bw4cPuyiK3O9//3v38ccfu46ODrdkyRL3z3/+84pf29/f75Tee4GFhYWFZREv/f39V/ybf03eRfv73/++/ve//+nnP/+5PvvsM61evVp//etfdeONN17xa1tbW9Xf36+GhgYZYzQ8PKy2tjb19/ersbHxWmzudYH9dHXYT1eH/XR12E8zc85pZGREra2tV3yuca62jxUNDw+rqalJQ0ND/Jd8Geynq8N+ujrsp6vDfpo/zqYDALwhQgAAb2o+QtlsVs8+++yUK+gwHfvp6rCfrg776eqwn+av5s8JAQCuXzU/CQEArl9ECADgDRECAHhDhAAA3tR8hHzeJrwWHT16VPfff79aW1tljNHrr78+5XHnnPbt26fW1lbV1dVp8+bNOn36tJ+N9aSrq0u33367GhoadMMNN+iBBx7QJ598MuU57Cfp0KFDWrNmjRobG9XY2KgNGzborbfeqj7OPppZV1eXjDHq6OiormNfzV1NR8jXbcJr2ejoqG677TZ1d3fP+PiBAwd08OBBdXd3q6+vTy0tLdqyZYtGRka+4C31p7e3V7t27dL777+vnp4elctlbd26VaOjo9XnsJ+klStXav/+/Tp+/LiOHz+uu+66S9u2bav+8WQfTdfX16cXX3xRa9asmbKefTUP83if0mvu29/+tnv00UenrPvGN77hfvrTn3raotoiyb322mvVz5MkcS0tLW7//v3Vdfl83jU1Nbnf/OY3HrawNgwODjpJrre31znHfrqcZcuWud/97nfsoxmMjIy49vZ219PT4zZt2uSeeOIJ5xz/e5qvmp2Eauk24YvFmTNnNDAwMGWfZbNZbdq06Uu9z4aGhiRJy5cvl8R+mkkcxzp8+LBGR0e1YcMG9tEMdu3apfvuu0/33HPPlPXsq/m5Ju+ivRBme5twqLpfZtpnZ8+e9bFJ3jnn9OSTT+qOO+7Q6tWrJbGfJjt16pQ2bNigfD6vpUuX6rXXXtOtt95a/ePJPkodPnxYH374ofr6+qY9xv+e5qdmIzTuam8Tjgnsswm7d+/WRx99pL///e/THmM/SbfccotOnjypzz//XH/5y1+0Y8cO9fb2Vh9nH0n9/f164okndOTIEeVyuUs+j301NzV7OG62twmH1NLSIknss4rHH39cb775pt59912tXLmyup79NCGTyejmm2/WunXr1NXVpdtuu00vvPAC+2iSDz74QIODg1q7dq3CMFQYhurt7dUvf/lLhWFY3R/sq7mp2QhNvk34ZD09Pdq4caOnraptq1atUktLy5R9ViwW1dvb+6XaZ8457d69W6+++qreeecdrVq1asrj7KdLc86pUCiwjya5++67derUKZ08ebK6rFu3Tg899JBOnjypm266iX01H/6uibiy+dwm/Ho1MjLiTpw44U6cOOEkuYMHD7oTJ064s2fPOuec279/v2tqanKvvvqqO3XqlPvBD37gVqxY4YaHhz1v+Rfnsccec01NTe69995zn332WXW5cOFC9TnsJ+f27t3rjh496s6cOeM++ugj9/TTTztrrTty5Ihzjn10OZOvjnOOfTUfNR0h55z71a9+5W688UaXyWTct771repltl9W77777oz3ct+xY4dzLr1c9Nlnn3UtLS0um826O++80506dcrvRn/BZto/ktxLL71UfQ77ybmHH364+v+tr33ta+7uu++uBsg59tHlXBwh9tXccSsHAIA3NXtOCABw/SNCAABviBAAwBsiBADwhggBALwhQgAAb4gQAMAbIgQA8IYIAQC8IUIAAG+IEADAGyIEAPDm/wObChfBM84L5AAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_simulation(df_results, 100)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Split into Training and Testing datsets" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [], - "source": [ - "df_design_log = FuncTransform(func_dict_in, func_dict_out).fit_transform(df_design)\n", - "df_results_log = FuncTransform(func_dict_in, func_dict_out).fit_transform(df_results)\n", - "\n", - "X_train, X_test, y_train, y_test = sk.train_test_split(df_design_log, df_results_log, test_size = 0.1, random_state=42)\n", - "\n", - "X_train, y_train = balancer(X_train, y_train, 'over')\n", - "\n", - "scaler_X = MinMaxScaler()\n", - "scaler_y = MinMaxScaler()\n", - "\n", - "X_train = scaler_X.fit_transform(X_train)\n", - "X_test = scaler_X.transform(X_test)\n", - "\n", - "y_train = scaler_y.fit_transform(y_train)\n", - "y_test = scaler_y.transform(y_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Perform Over and Under Sampling on dataset to balance classes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Define Scaling and Normalization Functions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Preprocess the data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sample the data" + "X_train, X_val, X_test, y_train, y_val, y_test, scaler_X, scaler_y = preprocessing_training(df_design, df_results, func_dict_in, func_dict_out, \"over\", 'individual', 0.1)" ] }, { @@ -594,121 +498,67 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Epoch 1/50\n", - "\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 0.0014 - val_loss: 1.6198e-06\n", - "Epoch 2/50\n", - "\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 1.8272e-06 - val_loss: 1.0907e-06\n", - "Epoch 3/50\n", - "\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 1.7458e-06 - val_loss: 8.1786e-07\n", - "Epoch 4/50\n", - "\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 1.5743e-06 - val_loss: 7.5118e-07\n", - "Epoch 5/50\n", - "\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 1.3131e-06 - val_loss: 6.6803e-07\n", - "Epoch 6/50\n", - "\u001b[1m2479/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━\u001b[0m\u001b[37m━━━━━━\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1.1443e-06" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[76], line 7\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;66;03m# measure time\u001b[39;00m\n\u001b[1;32m 5\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m----> 7\u001b[0m history \u001b[38;5;241m=\u001b[39m model_simple\u001b[38;5;241m.\u001b[39mfit(X_train, \n\u001b[1;32m 8\u001b[0m y_train, \n\u001b[1;32m 9\u001b[0m batch_size \u001b[38;5;241m=\u001b[39m batch_size, \n\u001b[1;32m 10\u001b[0m epochs \u001b[38;5;241m=\u001b[39m epochs, \n\u001b[1;32m 11\u001b[0m validation_data \u001b[38;5;241m=\u001b[39m (X_val, y_val)\n\u001b[1;32m 12\u001b[0m )\n\u001b[1;32m 14\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTraining took \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(end \u001b[38;5;241m-\u001b[39m start))\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/keras/src/utils/traceback_utils.py:117\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 115\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 116\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 117\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fn(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 118\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 119\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/keras/src/backend/tensorflow/trainer.py:320\u001b[0m, in \u001b[0;36mTensorFlowTrainer.fit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq)\u001b[0m\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m step, iterator \u001b[38;5;129;01min\u001b[39;00m epoch_iterator\u001b[38;5;241m.\u001b[39menumerate_epoch():\n\u001b[1;32m 319\u001b[0m callbacks\u001b[38;5;241m.\u001b[39mon_train_batch_begin(step)\n\u001b[0;32m--> 320\u001b[0m logs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtrain_function(iterator)\n\u001b[1;32m 321\u001b[0m callbacks\u001b[38;5;241m.\u001b[39mon_train_batch_end(step, logs)\n\u001b[1;32m 322\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstop_training:\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/util/traceback_utils.py:150\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 148\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 149\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 150\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fn(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 151\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 152\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:833\u001b[0m, in \u001b[0;36mFunction.__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 830\u001b[0m compiler \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mxla\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jit_compile \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnonXla\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 832\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m OptionalXlaContext(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jit_compile):\n\u001b[0;32m--> 833\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[1;32m 835\u001b[0m new_tracing_count \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexperimental_get_tracing_count()\n\u001b[1;32m 836\u001b[0m without_tracing \u001b[38;5;241m=\u001b[39m (tracing_count \u001b[38;5;241m==\u001b[39m new_tracing_count)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:878\u001b[0m, in \u001b[0;36mFunction._call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 875\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lock\u001b[38;5;241m.\u001b[39mrelease()\n\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# In this case we have not created variables on the first call. So we can\u001b[39;00m\n\u001b[1;32m 877\u001b[0m \u001b[38;5;66;03m# run the first trace but we should fail if variables are created.\u001b[39;00m\n\u001b[0;32m--> 878\u001b[0m results \u001b[38;5;241m=\u001b[39m tracing_compilation\u001b[38;5;241m.\u001b[39mcall_function(\n\u001b[1;32m 879\u001b[0m args, kwds, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_variable_creation_config\n\u001b[1;32m 880\u001b[0m )\n\u001b[1;32m 881\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_created_variables:\n\u001b[1;32m 882\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCreating variables on a non-first call to a function\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 883\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m decorated with tf.function.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/polymorphic_function/tracing_compilation.py:137\u001b[0m, in \u001b[0;36mcall_function\u001b[0;34m(args, kwargs, tracing_options)\u001b[0m\n\u001b[1;32m 132\u001b[0m function \u001b[38;5;241m=\u001b[39m trace_function(\n\u001b[1;32m 133\u001b[0m args\u001b[38;5;241m=\u001b[39margs, kwargs\u001b[38;5;241m=\u001b[39mkwargs, tracing_options\u001b[38;5;241m=\u001b[39mtracing_options\n\u001b[1;32m 134\u001b[0m )\n\u001b[1;32m 136\u001b[0m \u001b[38;5;66;03m# Bind it ourselves to skip unnecessary canonicalization of default call.\u001b[39;00m\n\u001b[0;32m--> 137\u001b[0m bound_args \u001b[38;5;241m=\u001b[39m function\u001b[38;5;241m.\u001b[39mfunction_type\u001b[38;5;241m.\u001b[39mbind(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 138\u001b[0m flat_inputs \u001b[38;5;241m=\u001b[39m function\u001b[38;5;241m.\u001b[39mfunction_type\u001b[38;5;241m.\u001b[39munpack_inputs(bound_args)\n\u001b[1;32m 139\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m function\u001b[38;5;241m.\u001b[39m_call_flat( \u001b[38;5;66;03m# pylint: disable=protected-access\u001b[39;00m\n\u001b[1;32m 140\u001b[0m flat_inputs, captured_inputs\u001b[38;5;241m=\u001b[39mfunction\u001b[38;5;241m.\u001b[39mcaptured_inputs\n\u001b[1;32m 141\u001b[0m )\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/inspect.py:3195\u001b[0m, in \u001b[0;36mSignature.bind\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 3190\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mbind\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m/\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 3191\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Get a BoundArguments object, that maps the passed `args`\u001b[39;00m\n\u001b[1;32m 3192\u001b[0m \u001b[38;5;124;03m and `kwargs` to the function's signature. Raises `TypeError`\u001b[39;00m\n\u001b[1;32m 3193\u001b[0m \u001b[38;5;124;03m if the passed arguments can not be bound.\u001b[39;00m\n\u001b[1;32m 3194\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 3195\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bind(args, kwargs)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/inspect.py:3133\u001b[0m, in \u001b[0;36mSignature._bind\u001b[0;34m(self, args, kwargs, partial)\u001b[0m\n\u001b[1;32m 3130\u001b[0m arguments[param\u001b[38;5;241m.\u001b[39mname] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(values)\n\u001b[1;32m 3131\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[0;32m-> 3133\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m param\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01min\u001b[39;00m kwargs \u001b[38;5;129;01mand\u001b[39;00m param\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m!=\u001b[39m _POSITIONAL_ONLY:\n\u001b[1;32m 3134\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 3135\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmultiple values for argument \u001b[39m\u001b[38;5;132;01m{arg!r}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mformat(\n\u001b[1;32m 3136\u001b[0m arg\u001b[38;5;241m=\u001b[39mparam\u001b[38;5;241m.\u001b[39mname)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 3138\u001b[0m arguments[param\u001b[38;5;241m.\u001b[39mname] \u001b[38;5;241m=\u001b[39m arg_val\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/inspect.py:2722\u001b[0m, in \u001b[0;36mParameter.name\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 2719\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_default \u001b[38;5;241m=\u001b[39m state[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_default\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 2720\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_annotation \u001b[38;5;241m=\u001b[39m state[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_annotation\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m-> 2722\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[1;32m 2723\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mname\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 2724\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_name\n\u001b[1;32m 2726\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[1;32m 2727\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdefault\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "X_train, X_test, y_train, y_test = sk.train_test_split(pp_design, pp_results, test_size = 0.2)\n", - "X_train, X_val, y_train, y_val = sk.train_test_split(X_train, y_train, test_size = 0.1)\n", - "\n", - " # measure time\n", - "start = time.time()\n", - "\n", - "history = model_simple.fit(X_train, \n", - " y_train, \n", - " batch_size = batch_size, \n", - " epochs = epochs, \n", - " validation_data = (X_val, y_val)\n", - ")\n", - "\n", - "end = time.time()\n", - "\n", - "print(\"Training took {} seconds\".format(end - start))" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/50\n", - "\u001b[1m3960/3960\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 0.0018 - val_loss: 1.5623e-06\n", - "Epoch 2/50\n", - "\u001b[1m3960/3960\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 1.4825e-06 - val_loss: 2.3533e-06\n", - "Epoch 3/50\n", - "\u001b[1m3960/3960\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 1.5046e-06 - val_loss: 1.4752e-06\n", - "Epoch 4/50\n", - "\u001b[1m3960/3960\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 1.2676e-06 - val_loss: 1.5767e-06\n", - "Epoch 5/50\n", - "\u001b[1m2568/3960\u001b[0m \u001b[32m━━━━━━━━━━━━\u001b[0m\u001b[37m━━━━━━━━\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1.4503e-06" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[51], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# measure time\u001b[39;00m\n\u001b[1;32m 2\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m----> 4\u001b[0m history \u001b[38;5;241m=\u001b[39m model_simple\u001b[38;5;241m.\u001b[39mfit(X_train\u001b[38;5;241m.\u001b[39miloc[:, X_train\u001b[38;5;241m.\u001b[39mcolumns \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m], \n\u001b[1;32m 5\u001b[0m y_train\u001b[38;5;241m.\u001b[39miloc[:, y_train\u001b[38;5;241m.\u001b[39mcolumns \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m], \n\u001b[1;32m 6\u001b[0m batch_size \u001b[38;5;241m=\u001b[39m batch_size, \n\u001b[1;32m 7\u001b[0m epochs \u001b[38;5;241m=\u001b[39m epochs, \n\u001b[1;32m 8\u001b[0m validation_data \u001b[38;5;241m=\u001b[39m (X_val\u001b[38;5;241m.\u001b[39miloc[:,X_val\u001b[38;5;241m.\u001b[39mcolumns \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m], y_val\u001b[38;5;241m.\u001b[39miloc[:, y_val\u001b[38;5;241m.\u001b[39mcolumns \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m])\n\u001b[1;32m 9\u001b[0m )\n\u001b[1;32m 11\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTraining took \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(end \u001b[38;5;241m-\u001b[39m start))\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/keras/src/utils/traceback_utils.py:117\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 115\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 116\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 117\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fn(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 118\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 119\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/keras/src/backend/tensorflow/trainer.py:320\u001b[0m, in \u001b[0;36mTensorFlowTrainer.fit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq)\u001b[0m\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m step, iterator \u001b[38;5;129;01min\u001b[39;00m epoch_iterator\u001b[38;5;241m.\u001b[39menumerate_epoch():\n\u001b[1;32m 319\u001b[0m callbacks\u001b[38;5;241m.\u001b[39mon_train_batch_begin(step)\n\u001b[0;32m--> 320\u001b[0m logs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtrain_function(iterator)\n\u001b[1;32m 321\u001b[0m callbacks\u001b[38;5;241m.\u001b[39mon_train_batch_end(step, logs)\n\u001b[1;32m 322\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstop_training:\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/util/traceback_utils.py:150\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 148\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 149\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 150\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fn(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 151\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 152\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:833\u001b[0m, in \u001b[0;36mFunction.__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 830\u001b[0m compiler \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mxla\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jit_compile \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnonXla\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 832\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m OptionalXlaContext(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jit_compile):\n\u001b[0;32m--> 833\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[1;32m 835\u001b[0m new_tracing_count \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexperimental_get_tracing_count()\n\u001b[1;32m 836\u001b[0m without_tracing \u001b[38;5;241m=\u001b[39m (tracing_count \u001b[38;5;241m==\u001b[39m new_tracing_count)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:878\u001b[0m, in \u001b[0;36mFunction._call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 875\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lock\u001b[38;5;241m.\u001b[39mrelease()\n\u001b[1;32m 876\u001b[0m \u001b[38;5;66;03m# In this case we have not created variables on the first call. So we can\u001b[39;00m\n\u001b[1;32m 877\u001b[0m \u001b[38;5;66;03m# run the first trace but we should fail if variables are created.\u001b[39;00m\n\u001b[0;32m--> 878\u001b[0m results \u001b[38;5;241m=\u001b[39m tracing_compilation\u001b[38;5;241m.\u001b[39mcall_function(\n\u001b[1;32m 879\u001b[0m args, kwds, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_variable_creation_config\n\u001b[1;32m 880\u001b[0m )\n\u001b[1;32m 881\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_created_variables:\n\u001b[1;32m 882\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCreating variables on a non-first call to a function\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 883\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m decorated with tf.function.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/polymorphic_function/tracing_compilation.py:139\u001b[0m, in \u001b[0;36mcall_function\u001b[0;34m(args, kwargs, tracing_options)\u001b[0m\n\u001b[1;32m 137\u001b[0m bound_args \u001b[38;5;241m=\u001b[39m function\u001b[38;5;241m.\u001b[39mfunction_type\u001b[38;5;241m.\u001b[39mbind(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 138\u001b[0m flat_inputs \u001b[38;5;241m=\u001b[39m function\u001b[38;5;241m.\u001b[39mfunction_type\u001b[38;5;241m.\u001b[39munpack_inputs(bound_args)\n\u001b[0;32m--> 139\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m function\u001b[38;5;241m.\u001b[39m_call_flat( \u001b[38;5;66;03m# pylint: disable=protected-access\u001b[39;00m\n\u001b[1;32m 140\u001b[0m flat_inputs, captured_inputs\u001b[38;5;241m=\u001b[39mfunction\u001b[38;5;241m.\u001b[39mcaptured_inputs\n\u001b[1;32m 141\u001b[0m )\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/polymorphic_function/concrete_function.py:1322\u001b[0m, in \u001b[0;36mConcreteFunction._call_flat\u001b[0;34m(self, tensor_inputs, captured_inputs)\u001b[0m\n\u001b[1;32m 1318\u001b[0m possible_gradient_type \u001b[38;5;241m=\u001b[39m gradients_util\u001b[38;5;241m.\u001b[39mPossibleTapeGradientTypes(args)\n\u001b[1;32m 1319\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (possible_gradient_type \u001b[38;5;241m==\u001b[39m gradients_util\u001b[38;5;241m.\u001b[39mPOSSIBLE_GRADIENT_TYPES_NONE\n\u001b[1;32m 1320\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m executing_eagerly):\n\u001b[1;32m 1321\u001b[0m \u001b[38;5;66;03m# No tape is watching; skip to running the function.\u001b[39;00m\n\u001b[0;32m-> 1322\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inference_function\u001b[38;5;241m.\u001b[39mcall_preflattened(args)\n\u001b[1;32m 1323\u001b[0m forward_backward \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_select_forward_and_backward_functions(\n\u001b[1;32m 1324\u001b[0m args,\n\u001b[1;32m 1325\u001b[0m possible_gradient_type,\n\u001b[1;32m 1326\u001b[0m executing_eagerly)\n\u001b[1;32m 1327\u001b[0m forward_function, args_with_tangents \u001b[38;5;241m=\u001b[39m forward_backward\u001b[38;5;241m.\u001b[39mforward()\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/polymorphic_function/atomic_function.py:216\u001b[0m, in \u001b[0;36mAtomicFunction.call_preflattened\u001b[0;34m(self, args)\u001b[0m\n\u001b[1;32m 214\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcall_preflattened\u001b[39m(\u001b[38;5;28mself\u001b[39m, args: Sequence[core\u001b[38;5;241m.\u001b[39mTensor]) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Any:\n\u001b[1;32m 215\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Calls with flattened tensor inputs and returns the structured output.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 216\u001b[0m flat_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcall_flat(\u001b[38;5;241m*\u001b[39margs)\n\u001b[1;32m 217\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunction_type\u001b[38;5;241m.\u001b[39mpack_output(flat_outputs)\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/polymorphic_function/atomic_function.py:251\u001b[0m, in \u001b[0;36mAtomicFunction.call_flat\u001b[0;34m(self, *args)\u001b[0m\n\u001b[1;32m 249\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m record\u001b[38;5;241m.\u001b[39mstop_recording():\n\u001b[1;32m 250\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bound_context\u001b[38;5;241m.\u001b[39mexecuting_eagerly():\n\u001b[0;32m--> 251\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bound_context\u001b[38;5;241m.\u001b[39mcall_function(\n\u001b[1;32m 252\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname,\n\u001b[1;32m 253\u001b[0m \u001b[38;5;28mlist\u001b[39m(args),\n\u001b[1;32m 254\u001b[0m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunction_type\u001b[38;5;241m.\u001b[39mflat_outputs),\n\u001b[1;32m 255\u001b[0m )\n\u001b[1;32m 256\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 257\u001b[0m outputs \u001b[38;5;241m=\u001b[39m make_call_op_in_graph(\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 259\u001b[0m \u001b[38;5;28mlist\u001b[39m(args),\n\u001b[1;32m 260\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bound_context\u001b[38;5;241m.\u001b[39mfunction_call_options\u001b[38;5;241m.\u001b[39mas_attrs(),\n\u001b[1;32m 261\u001b[0m )\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/context.py:1552\u001b[0m, in \u001b[0;36mContext.call_function\u001b[0;34m(self, name, tensor_inputs, num_outputs)\u001b[0m\n\u001b[1;32m 1550\u001b[0m cancellation_context \u001b[38;5;241m=\u001b[39m cancellation\u001b[38;5;241m.\u001b[39mcontext()\n\u001b[1;32m 1551\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m cancellation_context \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1552\u001b[0m outputs \u001b[38;5;241m=\u001b[39m execute\u001b[38;5;241m.\u001b[39mexecute(\n\u001b[1;32m 1553\u001b[0m name\u001b[38;5;241m.\u001b[39mdecode(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mutf-8\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 1554\u001b[0m num_outputs\u001b[38;5;241m=\u001b[39mnum_outputs,\n\u001b[1;32m 1555\u001b[0m inputs\u001b[38;5;241m=\u001b[39mtensor_inputs,\n\u001b[1;32m 1556\u001b[0m attrs\u001b[38;5;241m=\u001b[39mattrs,\n\u001b[1;32m 1557\u001b[0m ctx\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 1558\u001b[0m )\n\u001b[1;32m 1559\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1560\u001b[0m outputs \u001b[38;5;241m=\u001b[39m execute\u001b[38;5;241m.\u001b[39mexecute_with_cancellation(\n\u001b[1;32m 1561\u001b[0m name\u001b[38;5;241m.\u001b[39mdecode(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mutf-8\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 1562\u001b[0m num_outputs\u001b[38;5;241m=\u001b[39mnum_outputs,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1566\u001b[0m cancellation_manager\u001b[38;5;241m=\u001b[39mcancellation_context,\n\u001b[1;32m 1567\u001b[0m )\n", - "File \u001b[0;32m~/bin/miniconda3/envs/training/lib/python3.11/site-packages/tensorflow/python/eager/execute.py:53\u001b[0m, in \u001b[0;36mquick_execute\u001b[0;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 52\u001b[0m ctx\u001b[38;5;241m.\u001b[39mensure_initialized()\n\u001b[0;32m---> 53\u001b[0m tensors \u001b[38;5;241m=\u001b[39m pywrap_tfe\u001b[38;5;241m.\u001b[39mTFE_Py_Execute(ctx\u001b[38;5;241m.\u001b[39m_handle, device_name, op_name,\n\u001b[1;32m 54\u001b[0m inputs, attrs, num_outputs)\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m core\u001b[38;5;241m.\u001b[39m_NotOkStatusException \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 56\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "Epoch 1/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 0.0018 - val_loss: 3.6601e-05\n", + "Epoch 2/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.6899e-05 - val_loss: 3.6822e-05\n", + "Epoch 3/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.5005e-05 - val_loss: 3.5655e-05\n", + "Epoch 4/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.4032e-05 - val_loss: 3.3455e-05\n", + "Epoch 5/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.3279e-05 - val_loss: 3.3064e-05\n", + "Epoch 6/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.3023e-05 - val_loss: 3.3338e-05\n", + "Epoch 7/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2532e-05 - val_loss: 3.2765e-05\n", + "Epoch 8/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.2749e-05 - val_loss: 3.2730e-05\n", + "Epoch 9/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.2961e-05 - val_loss: 3.2593e-05\n", + "Epoch 10/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2573e-05 - val_loss: 3.2576e-05\n", + "Epoch 11/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m13s\u001b[0m 2ms/step - loss: 3.2442e-05 - val_loss: 3.2507e-05\n", + "Epoch 12/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2135e-05 - val_loss: 3.2548e-05\n", + "Epoch 13/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2451e-05 - val_loss: 3.2482e-05\n", + "Epoch 14/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2296e-05 - val_loss: 3.2475e-05\n", + "Epoch 15/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2081e-05 - val_loss: 3.2470e-05\n", + "Epoch 16/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2440e-05 - val_loss: 3.2471e-05\n", + "Epoch 17/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2050e-05 - val_loss: 3.2460e-05\n", + "Epoch 18/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 2ms/step - loss: 3.2444e-05 - val_loss: 3.2452e-05\n", + "Epoch 19/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m15s\u001b[0m 2ms/step - loss: 3.2259e-05 - val_loss: 3.2452e-05\n", + "Epoch 20/20\n", + "\u001b[1m7823/7823\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m15s\u001b[0m 2ms/step - loss: 3.2442e-05 - val_loss: 3.2448e-05\n", + "Training took 276.5459449291229 seconds\n" ] } ], "source": [ "# measure time\n", "start = time.time()\n", - "\n", + "callback = keras.callbacks.EarlyStopping(monitor='loss', patience=3)\n", "history = model_simple.fit(X_train.iloc[:, X_train.columns != \"Class\"], \n", " y_train.iloc[:, y_train.columns != \"Class\"], \n", " batch_size = batch_size, \n", - " epochs = epochs, \n", - " validation_data = (X_val.iloc[:,X_val.columns != \"Class\"], y_val.iloc[:, y_val.columns != \"Class\"])\n", - ")\n", + " epochs = 20, \n", + " validation_data = (X_val.iloc[:, X_val.columns != \"Class\"], y_val.iloc[:, y_val.columns != \"Class\"]),\n", + " callbacks = [callback])\n", "\n", "end = time.time()\n", "\n", @@ -717,12 +567,91 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m32/32\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n" + ] + }, + { + "data": { + "image/png": "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bNkymzZtmvl8PrvmmmuCwogkO++886xdu3Y2Z84cW758uX3++edmZjZ06FB78cUXLSsry7Kysuyxxx6zqKiowPvmRHVUFmbee+89q127tnXs2NHmzZtnCxcutPT0dPN4PDZ37txAv/Iw06JFC7vnnnvsnXfesRdeeMHq1atnV199daBfbm6uRUZGWvfu3W3hwoX23nvv2WuvvWaDBw+uEHzx74UwA+fk5eWZJBswYMBx+916660myXbu3HnMPq1btw7MOpxIaWmpJSQkWNu2ba20tDTQXlRUZI0bN7YuXboE2soDwaRJk4K2MWLECIuMjAx8wLz//vsmycaPH3/M/W7dutXCw8PtnnvuCWovKioyv99vt9xyS6BtyJAhJsn++te/BvXt3bu3tWrVKvD4hx9+MEn28MMPV9hfee0PPfTQcUbjZyUlJbZv3z6LiYkJCl9/+9vfTJKtWLGiwnOODjPlwerosZo3b55Jsueeey7QVj4j9O233wbaDh48aPXr17dhw4Ydt9Znn3220rF56qmnTJItXbrUzMx27dplERER9sADDwT1u+WWWyw+Pt5++uknMzN7/fXXTZLNnz8/qF9OTo5JshkzZgTVHRYWZl9++eVxayx3dJgxM7vooossLS2tQt/MzEyrVauW5eTkBLX//e9/N0n21ltvBdokmc/nsx9//PG4+y8tLbWffvrJHn30UWvQoEFQIDpWHZWFmcsuu8waN25sRUVFgbaSkhJLSUmxpk2bBrZbHmZGjBgRtM1JkyaZJNuxY0fQMX366afHrR//fjgBGOcsM5MkeTyeKtnel19+qe+//16DBw9WrVr/96dTp04d3Xjjjfr444914MCBoOf86le/Cnrcrl07HTp0SPn5+ZKkt99+W5I0cuTIY+73nXfeUUlJiW6//XaVlJQElsjISKWlpVU4idfj8ahfv34V9vvtt9+e0vHeeOONFdr27dunsWPH6oILLlB4eLjCw8NVp04d7d+/X1988cUpbb/c8uXLJf18Bc+Rbr75ZsXExOjdd98Nam/fvr2aNWsWeBwZGalf/OIXJzy+5cuXKyYmRjfddFNQe/l+y/fToEED9evXT7Nnz1ZZWZkkac+ePVq0aJFuv/32wPlZixcvVt26ddWvX7+g16V9+/by+/0VXpd27drpF7/4xYkH5BQtXrxYKSkpat++fVAdPXr0kMfjqVDHNddco3r16lXYzvLly9WtWzf5fD6FhYWpdu3aeuihh7R79+7A+/VU7N+/X6tXr9ZNN90UdGVWWFiYBg8erO3bt+vLL78Mek5lfy+SAq9t+/btFRERobvuukuzZ8/WN998c8p14dxEmIFzGjZsqOjoaOXm5h6335YtWxQdHa369esfs0+zZs30ww8/aP/+/Sfc7+7duyX9fNXG0RISElRWVqY9e/YEtTdo0CDosdfrlfTzyZ+S9MMPPygsLEx+v/+Y+925c6ck6ZJLLlHt2rWDlnnz5mnXrl1B/aOjoxUZGVlhv4cOHTrhMR6psuMcOHCgpk+frt/+9rd65513tGbNGuXk5KhRo0aBYzpVu3fvVnh4uBo1ahTU7vF45Pf7A+Ne7ugxlX4+vhPtf/fu3fL7/RXCbePGjRUeHh60nzvvvFPfffedsrKyJEmvv/66iouLgwLXzp07tXfvXkVERFR4XfLy8iq8LpWNZ1XYuXOnPvvsswo1xMbGysxOqo41a9YoPT1dkvT888/ro48+Uk5OjsaPHy9Jp/Xa7tmzR2Z2zL8XSSd8bY/+ezn//PO1bNkyNW7cWCNHjtT555+v888/X9OmTTvl+nBu4WomOCcsLExXX321lixZou3btwddgVRu+/btWrdunXr16qWwsLBjbqtHjx5aunSp/vGPf2jAgAHH3W/5P7Q7duyosO77779XrVq1Kv0/3uNp1KiRSktLlZeXd8wPu4YNG0qS/v73vyspKemUtn8mjv7QLygo0OLFi/Xwww/r/vvvD7QXFxfrxx9/PO39NGjQQCUlJfrhhx+CAo2ZKS8vT5dccslpb/vo/axevVpmFnRs+fn5KikpCYyz9PP7IiEhQbNmzVKPHj00a9Yspaamqk2bNoE+DRs2VIMGDbRkyZJK9xcbGxv0uKpmCI/WsGFDRUVF6aWXXjrm+hPVMXfuXNWuXVuLFy8OCsILFy487brq1aunWrVqHfPvpbLaTsaVV16pK6+8UqWlpVq7dq3+/Oc/KyMjQ/Hx8Sf8G8a5i5kZOGncuHEyM40YMUKlpaVB60pLS3X33XfLzDRu3Ljjbuc3v/mN/H6/xowZo++++67SPgsWLJAktWrVSuedd57mzJkT+ApL+nk6ff78+ercufMpX77cq1cvSdLMmTOP2adHjx4KDw/X119/rU6dOlW6nKqj/4/3ZHg8HplZ4LnlXnjhhQqvwals/9prr5Ukvfrqq0Ht8+fP1/79+wPrz9S1116rffv2VfiA/stf/hJUh/R/X4UsXLhQH3zwgdauXas777wz6Hl9+/bV7t27VVpaWulr0qpVqyqpu9yxZp/69u2rr7/+Wg0aNKi0jpO5QaHH41F4eHhQ8D948KBeeeWVk67jaDExMUpNTdWCBQuC+peVlenVV19V06ZNz+hrt7CwMKWmpuqZZ56RJK1fv/60twX3MTMDJ11++eWaOnWqMjIydMUVV2jUqFFq1qyZtm7dqmeeeUarV6/W1KlT1aVLl+Nux+fzadGiRerbt686dOigUaNGqXPnzoqIiNDmzZv16quv6p///Kf69++vWrVqadKkSRo0aJD69u2rYcOGqbi4WH/84x+1d+9ePfnkk6d8HFdeeaUGDx6sxx9/XDt37lTfvn3l9Xr1ySefKDo6Wvfcc4+aN2+uRx99VOPHj9c333yjnj17ql69etq5c6fWrFmjmJgYPfLII6e039jYWCUlJWnRokW69tprVb9+fTVs2PC4H3xxcXG66qqr9Mc//jHQNzs7Wy+++KLq1q0b1DclJUWS9Nxzzyk2NlaRkZFKTk6u9Cui7t27q0ePHho7dqwKCwt1+eWX67PPPtPDDz+sDh06aPDgwad0bMdy++2365lnntGQIUO0ZcsWtW3bVh9++KEmTpyo3r17q1u3bkH977zzTj311FMaOHCgoqKidOuttwatHzBggF577TX17t1bo0eP1qWXXqratWtr+/btWrFiha677jrdcMMNVVK7JLVt21Zz587VvHnz1KJFC0VGRqpt27bKyMjQ/PnzddVVV+l3v/ud2rVrp7KyMm3dulVLly7V73//e6Wmph5323369NGUKVM0cOBA3XXXXdq9e7cmT55cIbger47KZGZmqnv37rr66qt13333KSIiQjNmzNDnn3+u119//ZRnq5599lktX75cffr0UbNmzXTo0KHAjNTRrx/+zYTs1GOgCqxatcpuuukmi4+Pt/DwcGvcuLH179+/wn1fTiQvL8/Gjh1rF110kUVHR5vX67ULLrjAhg0bZhs2bAjqu3DhQktNTbXIyEiLiYmxa6+91j766KOgPuVXBJVfrlyu/KqN3NzcQFtpaan96U9/spSUFIuIiDCfz2edO3e2f/zjHxX2e/XVV1tcXJx5vV5LSkqym266yZYtWxboU9lVMEfWc6Rly5ZZhw4dzOv1VnqfmaNrNzPbvn273XjjjYF7kfTs2dM+//xzS0pKCjy/3NSpUy05OdnCwsJO6j4zY8eOtaSkJKtdu7Y1adLE7r777mPeZ+ZoaWlplV5hc7Tdu3fb8OHDrUmTJhYeHm5JSUk2bty4oMu/j9SlSxeTZIMGDap0/U8//WSTJ08O3COoTp061rp1axs2bJht3rz5hHUfS2Wv45YtWyw9Pd1iY2Mr3Gdm37599oc//CFwvxufz2dt27a13/3ud5aXlxfop///PjOVeemll6xVq1bm9XqtRYsWlpmZaS+++GKF9+ux6jjRfWZiYmIsKirKLrvssgrv7fK/i6OvyFqxYkXQVXGrVq2yG264wZKSkszr9VqDBg0sLS0tcLk8/n15zI6YLwcAAHAM58wAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADjtnL9pXllZmb7//nvFxsZW2+3EAQBA1TIzFRUVKSEhIejHfStzzoeZ77//XomJiaEuAwAAnIZt27ZV+ht8Rzrnw0z5j71t27ZNcXFxIa4GAACcjMLCQiUmJlb40dbKnPNhpvyrpbi4OMIMAACOOZlTRDgBGAAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnnfM/NFldCvfu1v6CXaEuA2fI4yHPnxNO4ofoULOdzI8JouaKqlNXcXUbhGz/hJnTtHHRFHXOnR7qMgAACLlVCUPU+a6nQ7Z/wsxp8oSF65DVDnUZOAfx/6eoLh5ZqEvAuapWWEh37zGzc/rdXVhYKJ/Pp4KCAsXFxYW6HAAAcBJO5fObEwYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHBaSMPMhAkT5PF4gha/3x9Yb2aaMGGCEhISFBUVpa5du2rjxo0hrBgAANQ0IZ+Zueiii7Rjx47AsmHDhsC6SZMmacqUKZo+fbpycnLk9/vVvXt3FRUVhbBiAABQk4Q8zISHh8vv9weWRo0aSfp5Vmbq1KkaP368+vfvr5SUFM2ePVsHDhzQnDlzQlw1AACoKUIeZjZv3qyEhAQlJydrwIAB+uabbyRJubm5ysvLU3p6eqCv1+tVWlqaVq5cecztFRcXq7CwMGgBAADnrpCGmdTUVP3lL3/RO++8o+eff155eXnq0qWLdu/erby8PElSfHx80HPi4+MD6yqTmZkpn88XWBITE6v1GAAAQGiFNMz06tVLN954o9q2batu3brpf/7nfyRJs2fPDvTxeDxBzzGzCm1HGjdunAoKCgLLtm3bqqd4AABQI4T8a6YjxcTEqG3bttq8eXPgqqajZ2Hy8/MrzNYcyev1Ki4uLmgBAADnrhoVZoqLi/XFF1+oSZMmSk5Olt/vV1ZWVmD94cOHlZ2drS5duoSwSgAAUJOEh3Ln9913n/r166dmzZopPz9fjz/+uAoLCzVkyBB5PB5lZGRo4sSJatmypVq2bKmJEycqOjpaAwcODGXZAACgBglpmNm+fbtuu+027dq1S40aNdJll12mjz/+WElJSZKkMWPG6ODBgxoxYoT27Nmj1NRULV26VLGxsaEsGwAA1CAeM7NQF1GdCgsL5fP5VFBQwPkzAAA44lQ+v2vUOTMAAACnijADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOqzFhJjMzUx6PRxkZGYE2M9OECROUkJCgqKgode3aVRs3bgxdkQAAoMapEWEmJydHzz33nNq1axfUPmnSJE2ZMkXTp09XTk6O/H6/unfvrqKiohBVCgAAapqQh5l9+/Zp0KBBev7551WvXr1Au5lp6tSpGj9+vPr376+UlBTNnj1bBw4c0Jw5c0JYMQAAqElCHmZGjhypPn36qFu3bkHtubm5ysvLU3p6eqDN6/UqLS1NK1euPNtlAgCAGio8lDufO3eu1q9fr5ycnArr8vLyJEnx8fFB7fHx8fr222+Puc3i4mIVFxcHHhcWFlZRtQAAoCYK2czMtm3bNHr0aL366quKjIw8Zj+PxxP02MwqtB0pMzNTPp8vsCQmJlZZzQAAoOYJWZhZt26d8vPz1bFjR4WHhys8PFzZ2dl6+umnFR4eHpiRKZ+hKZefn19htuZI48aNU0FBQWDZtm1btR4HAAAIrZB9zXTttddqw4YNQW133HGHWrdurbFjx6pFixby+/3KyspShw4dJEmHDx9Wdna2nnrqqWNu1+v1yuv1VmvtAACg5ghZmImNjVVKSkpQW0xMjBo0aBBoz8jI0MSJE9WyZUu1bNlSEydOVHR0tAYOHBiKkgEAQA0U0hOAT2TMmDE6ePCgRowYoT179ig1NVVLly5VbGxsqEsDAAA1hMfMLNRFVKfCwkL5fD4VFBQoLi4u1OUAAICTcCqf3yG/zwwAAMCZIMwAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBpIQ0zM2fOVLt27RQXF6e4uDh17txZb7/9dmC9mWnChAlKSEhQVFSUunbtqo0bN4awYgAAUNOENMw0bdpUTz75pNauXau1a9fqmmuu0XXXXRcILJMmTdKUKVM0ffp05eTkyO/3q3v37ioqKgpl2QAAoAbxmJmFuogj1a9fX3/84x915513KiEhQRkZGRo7dqwkqbi4WPHx8Xrqqac0bNiwk9peYWGhfD6fCgoKFBcXV52lAwCAKnIqn9815pyZ0tJSzZ07V/v371fnzp2Vm5urvLw8paenB/p4vV6lpaVp5cqVx9xOcXGxCgsLgxYAAHDuCnmY2bBhg+rUqSOv16vhw4frjTfeUJs2bZSXlydJio+PD+ofHx8fWFeZzMxM+Xy+wJKYmFit9QMAgNAKeZhp1aqVPv30U3388ce6++67NWTIEG3atCmw3uPxBPU3swptRxo3bpwKCgoCy7Zt26qtdgAAEHrhoS4gIiJCF1xwgSSpU6dOysnJ0bRp0wLnyeTl5alJkyaB/vn5+RVma47k9Xrl9Xqrt2gAAFBjhHxm5mhmpuLiYiUnJ8vv9ysrKyuw7vDhw8rOzlaXLl1CWCEAAKhJQjoz88ADD6hXr15KTExUUVGR5s6dq/fee09LliyRx+NRRkaGJk6cqJYtW6ply5aaOHGioqOjNXDgwFCWDQAAapAzCjO7du2Sx+NRgwYNTuv5O3fu1ODBg7Vjxw75fD61a9dOS5YsUffu3SVJY8aM0cGDBzVixAjt2bNHqampWrp0qWJjY8+kbAAAcA455fvM7N27V+PHj9e8efO0Z88eSVK9evU0YMAAPf7446pbt2511HnauM8MAADuOZXP71Oamfnxxx/VuXNnfffddxo0aJAuvPBCmZm++OILvfzyy3r33Xe1cuVK1atX74wOAAAA4GSdUph59NFHFRERoa+//rrCFUWPPvqo0tPT9eijj+pPf/pTlRYJAABwLKd0NdPChQs1efLkSi+N9vv9mjRpkt54440qKw4AAOBETinM7NixQxdddNEx16ekpBz37rwAAABV7ZTCTMOGDbVly5Zjrs/NzT3tK5sAAABOxymFmZ49e2r8+PE6fPhwhXXFxcV68MEH1bNnzyorDgAA4ERO6dLs7du3q1OnTvJ6vRo5cqRat24tSdq0aZNmzJih4uJirV27tkb9uCOXZgMA4J5quzS7adOmWrVqlUaMGKFx48apPAd5PB51795d06dPr1FBBgAAnPtO+Q7AycnJevvtt7Vnzx5t3rxZknTBBReofv36VV4cAADAiZz2zxnUq1dPl156aVXWAgAAcMpq3K9mAwAAnArCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBphBkAAOC0kIaZzMxMXXLJJYqNjVXjxo11/fXX68svvwzqY2aaMGGCEhISFBUVpa5du2rjxo0hqhgAANQ0IQ0z2dnZGjlypD7++GNlZWWppKRE6enp2r9/f6DPpEmTNGXKFE2fPl05OTny+/3q3r27ioqKQlg5AACoKTxmZqEuotwPP/ygxo0bKzs7W1dddZXMTAkJCcrIyNDYsWMlScXFxYqPj9dTTz2lYcOGnXCbhYWF8vl8KigoUFxcXHUfAgAAqAKn8vldo86ZKSgokCTVr19fkpSbm6u8vDylp6cH+ni9XqWlpWnlypWVbqO4uFiFhYVBCwAAOHfVmDBjZrr33nt1xRVXKCUlRZKUl5cnSYqPjw/qGx8fH1h3tMzMTPl8vsCSmJhYvYUDAICQqjFhZtSoUfrss8/0+uuvV1jn8XiCHptZhbZy48aNU0FBQWDZtm1btdQLAABqhvBQFyBJ99xzj9588029//77atq0aaDd7/dL+nmGpkmTJoH2/Pz8CrM15bxer7xeb/UWDAAAaoyQzsyYmUaNGqUFCxZo+fLlSk5ODlqfnJwsv9+vrKysQNvhw4eVnZ2tLl26nO1yAQBADRTSmZmRI0dqzpw5WrRokWJjYwPnwfh8PkVFRcnj8SgjI0MTJ05Uy5Yt1bJlS02cOFHR0dEaOHBgKEsHAAA1REjDzMyZMyVJXbt2DWqfNWuWhg4dKkkaM2aMDh48qBEjRmjPnj1KTU3V0qVLFRsbe5arBQAANVGNus9MdeA+MwAAuMfZ+8wAAACcKsIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4LaRh5v3331e/fv2UkJAgj8ejhQsXBq03M02YMEEJCQmKiopS165dtXHjxtAUCwAAaqSQhpn9+/frl7/8paZPn17p+kmTJmnKlCmaPn26cnJy5Pf71b17dxUVFZ3lSgEAQE0VHsqd9+rVS7169ap0nZlp6tSpGj9+vPr37y9Jmj17tuLj4zVnzhwNGzbsbJYKAABqqBp7zkxubq7y8vKUnp4eaPN6vUpLS9PKlStDWBkAAKhJQjozczx5eXmSpPj4+KD2+Ph4ffvtt8d8XnFxsYqLiwOPCwsLq6dAAABQI9TYmZlyHo8n6LGZVWg7UmZmpnw+X2BJTEys7hIBAEAI1dgw4/f7Jf3fDE25/Pz8CrM1Rxo3bpwKCgoCy7Zt26q1TgAAEFo1NswkJyfL7/crKysr0Hb48GFlZ2erS5cux3ye1+tVXFxc0AIAAM5dIT1nZt++ffrXv/4VeJybm6tPP/1U9evXV7NmzZSRkaGJEyeqZcuWatmypSZOnKjo6GgNHDgwhFUDAICaJKRhZu3atbr66qsDj++9915J0pAhQ/Tyyy9rzJgxOnjwoEaMGKE9e/YoNTVVS5cuVWxsbKhKBgAANYzHzCzURVSnwsJC+Xw+FRQU8JUTAACOOJXP7xp7zgwAAMDJIMwAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTADAACcRpgBAABOI8wAAACnEWYAAIDTCDMAAMBphBkAAOA0wgwAAHAaYQYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAApxFmAACA0wgzAADAaeGhLsBVZqaDJQdDXQYAACEXFR4lj8cTsv0TZk7TwZKDSp2TGuoyAAAIudUDVyu6dnTI9s/XTAAAwGnMzJymqPAorR64OtRlAAAQclHhUSHdP2HmNHk8npBOqQEAgJ/xNRMAAHAaYQYAADiNMAMAAJzmRJiZMWOGkpOTFRkZqY4dO+qDDz4IdUkAAKCGqPFhZt68ecrIyND48eP1ySef6Morr1SvXr20devWUJcGAABqAI+ZWaiLOJ7U1FRdfPHFmjlzZqDtwgsv1PXXX6/MzMwTPr+wsFA+n08FBQWKi4urzlIBAEAVOZXP7xo9M3P48GGtW7dO6enpQe3p6elauXJlpc8pLi5WYWFh0AIAAM5dNTrM7Nq1S6WlpYqPjw9qj4+PV15eXqXPyczMlM/nCyyJiYlno1QAABAiNTrMlDv6x6vM7Jg/aDVu3DgVFBQElm3btp2NEgEAQIjU6DsAN2zYUGFhYRVmYfLz8yvM1pTzer3yer1nozwAAFAD1OiZmYiICHXs2FFZWVlB7VlZWerSpUuIqgIAADVJjZ6ZkaR7771XgwcPVqdOndS5c2c999xz2rp1q4YPHx7q0gAAQA1Q48PMrbfeqt27d+vRRx/Vjh07lJKSorfeektJSUmhLg0AANQANf4+M2eqoKBAdevW1bZt27jPDAAAjigsLFRiYqL27t0rn8933L41fmbmTBUVFUkSl2gDAOCgoqKiE4aZc35mpqysTN9//71iY2OPeTn36SpPjcz6VC/G+exgnM8OxvnsYazPjuoaZzNTUVGREhISVKvW8a9XOudnZmrVqqWmTZtW6z7i4uL4QzkLGOezg3E+Oxjns4exPjuqY5xPNCNTrkZfmg0AAHAihBkAAOA0wswZ8Hq9evjhh7njcDVjnM8OxvnsYJzPHsb67KgJ43zOnwAMAADObczMAAAApxFmAACA0wgzAADAaYQZAADgNMLMaZoxY4aSk5MVGRmpjh076oMPPgh1SU7JzMzUJZdcotjYWDVu3FjXX3+9vvzyy6A+ZqYJEyYoISFBUVFR6tq1qzZu3BjUp7i4WPfcc48aNmyomJgY/epXv9L27dvP5qE4IzMzUx6PRxkZGYE2xrjqfPfdd/r1r3+tBg0aKDo6Wu3bt9e6desC6xnrM1dSUqI//OEPSk5OVlRUlFq0aKFHH31UZWVlgT6M8+l5//331a9fPyUkJMjj8WjhwoVB66tqXPfs2aPBgwfL5/PJ5/Np8ODB2rt375kfgOGUzZ0712rXrm3PP/+8bdq0yUaPHm0xMTH27bffhro0Z/To0cNmzZpln3/+uX366afWp08fa9asme3bty/Q58knn7TY2FibP3++bdiwwW699VZr0qSJFRYWBvoMHz7czjvvPMvKyrL169fb1Vdfbb/85S+tpKQkFIdVY61Zs8aaN29u7dq1s9GjRwfaGeOq8eOPP1pSUpINHTrUVq9ebbm5ubZs2TL717/+FejDWJ+5xx9/3Bo0aGCLFy+23Nxc+9vf/mZ16tSxqVOnBvowzqfnrbfesvHjx9v8+fNNkr3xxhtB66tqXHv27GkpKSm2cuVKW7lypaWkpFjfvn3PuH7CzGm49NJLbfjw4UFtrVu3tvvvvz9EFbkvPz/fJFl2draZmZWVlZnf77cnn3wy0OfQoUPm8/ns2WefNTOzvXv3Wu3atW3u3LmBPt99953VqlXLlixZcnYPoAYrKiqyli1bWlZWlqWlpQXCDGNcdcaOHWtXXHHFMdcz1lWjT58+dueddwa19e/f337961+bGeNcVY4OM1U1rps2bTJJ9vHHHwf6rFq1yiTZ//7v/55RzXzNdIoOHz6sdevWKT09Pag9PT1dK1euDFFV7isoKJAk1a9fX5KUm5urvLy8oHH2er1KS0sLjPO6dev0008/BfVJSEhQSkoKr8URRo4cqT59+qhbt25B7Yxx1XnzzTfVqVMn3XzzzWrcuLE6dOig559/PrCesa4aV1xxhd5991199dVXkqR//vOf+vDDD9W7d29JjHN1qapxXbVqlXw+n1JTUwN9LrvsMvl8vjMe+3P+hyar2q5du1RaWqr4+Pig9vj4eOXl5YWoKreZme69915dccUVSklJkaTAWFY2zt9++22gT0REhOrVq1ehD6/Fz+bOnav169crJyenwjrGuOp88803mjlzpu6991498MADWrNmjf7zP/9TXq9Xt99+O2NdRcaOHauCggK1bt1aYWFhKi0t1RNPPKHbbrtNEu/p6lJV45qXl6fGjRtX2H7jxo3PeOwJM6fJ4/EEPTazCm04OaNGjdJnn32mDz/8sMK60xlnXoufbdu2TaNHj9bSpUsVGRl5zH6M8ZkrKytTp06dNHHiRElShw4dtHHjRs2cOVO33357oB9jfWbmzZunV199VXPmzNFFF12kTz/9VBkZGUpISNCQIUMC/Rjn6lEV41pZ/6oYe75mOkUNGzZUWFhYhRSZn59fIbXixO655x69+eabWrFihZo2bRpo9/v9knTccfb7/Tp8+LD27NlzzD7/ztatW6f8/Hx17NhR4eHhCg8PV3Z2tp5++mmFh4cHxogxPnNNmjRRmzZtgtouvPBCbd26VRLv56ry//7f/9P999+vAQMGqG3btho8eLB+97vfKTMzUxLjXF2qalz9fr927txZYfs//PDDGY89YeYURUREqGPHjsrKygpqz8rKUpcuXUJUlXvMTKNGjdKCBQu0fPlyJScnB61PTk6W3+8PGufDhw8rOzs7MM4dO3ZU7dq1g/rs2LFDn3/+Oa+FpGuvvVYbNmzQp59+Glg6deqkQYMG6dNPP1WLFi0Y4ypy+eWXV7i1wFdffaWkpCRJvJ+ryoEDB1SrVvDHVlhYWODSbMa5elTVuHbu3FkFBQVas2ZNoM/q1atVUFBw5mN/RqcP/5sqvzT7xRdftE2bNllGRobFxMTYli1bQl2aM+6++27z+Xz23nvv2Y4dOwLLgQMHAn2efPJJ8/l8tmDBAtuwYYPddtttlV4K2LRpU1u2bJmtX7/errnmmn/7SyyP58irmcwY46qyZs0aCw8PtyeeeMI2b95sr732mkVHR9urr74a6MNYn7khQ4bYeeedF7g0e8GCBdawYUMbM2ZMoA/jfHqKiorsk08+sU8++cQk2ZQpU+yTTz4J3HKkqsa1Z8+e1q5dO1u1apWtWrXK2rZty6XZofTMM89YUlKSRURE2MUXXxy4pBgnR1Kly6xZswJ9ysrK7OGHHza/329er9euuuoq27BhQ9B2Dh48aKNGjbL69etbVFSU9e3b17Zu3XqWj8YdR4cZxrjq/OMf/7CUlBTzer3WunVre+6554LWM9ZnrrCw0EaPHm3NmjWzyMhIa9GihY0fP96Ki4sDfRjn07NixYpK/00eMmSImVXduO7evdsGDRpksbGxFhsba4MGDbI9e/accf0eM7Mzm9sBAAAIHc6ZAQAATiPMAAAApxFmAACA0wgzAADAaYQZAADgNMIMAABwGmEGAAA4jTAD4JzXvHlzTZ06NdRlAKgmhBkAVWro0KG6/vrrJUldu3ZVRkbGWdv3yy+/rLp161Zoz8nJ0V133XXW6gBwdoWHugAAOJHDhw8rIiLitJ/fqFGjKqwGQE3DzAyAajF06FBlZ2dr2rRp8ng88ng82rJliyRp06ZN6t27t+rUqaP4+HgNHjxYu3btCjy3a9euGjVqlO699141bNhQ3bt3lyRNmTJFbdu2VUxMjBITEzVixAjt27dPkvTee+/pjjvuUEFBQWB/EyZMkFTxa6atW7fquuuuU506dRQXF6dbbrlFO3fuDKyfMGGC2rdvr1deeUXNmzeXz+fTgAEDVFRUVL2DBuC0EGYAVItp06apc+fO+o//+A/t2LFDO3bsUGJionbs2KG0tDS1b99ea9eu1ZIlS7Rz507dcsstQc+fPXu2wsPD9dFHH+m///u/JUm1atXS008/rc8//1yzZ8/W8uXLNWbMGElSly5dNHXqVMXFxQX2d99991Woy8x0/fXX68cff1R2draysrL09ddf69Zbbw3q9/XXX2vhwoVavHixFi9erOzsbD355JPVNFoAzgRfMwGoFj6fTxEREYqOjpbf7w+0z5w5UxdffLEmTpwYaHvppZeUmJior776Sr/4xS8kSRdccIEmTZoUtM0jz79JTk7WY489prvvvlszZsxQRESEfD6fPB5P0P6OtmzZMn322WfKzc1VYmKiJOmVV17RRRddpJycHF1yySWSpLKyMr388suKjY2VJA0ePFjvvvuunnjiiTMbGABVjpkZAGfVunXrtGLFCtWpUyewtG7dWtLPsyHlOnXqVOG5K1asUPfu3XXeeecpNjZWt99+u3bv3q39+/ef9P6/+OILJSYmBoKMJLVp00Z169bVF198EWhr3rx5IMhIUpMmTZSfn39Kxwrg7GBmBsBZVVZWpn79+umpp56qsK5JkyaB/46JiQla9+2336p3794aPny4HnvsMdWvX18ffvihfvOb3+inn3466f2bmTwezwnba9euHbTe4/GorKzspPcD4OwhzACoNhERESotLQ1qu/jiizV//nw1b95c4eEn/0/Q2rVrVVJSov/6r/9SrVo/Tyr/9a9/PeH+jtamTRtt3bpV27ZtC8zObNq0SQUFBbrwwgtPuh4ANQdfMwGoNs2bN9fq1au1ZcsW7dq1S2VlZRo5cqR+/PFH3XbbbVqzZo2++eYbLV26VHfeeedxg8j555+vkpIS/fnPf9Y333yjV155Rc8++2yF/e3bt0/vvvuudu3apQMHDlTYTrdu3dSuXTsNGjRI69ev15o1a3T77bcrLS2t0q+2ANR8hBkA1ea+++5TWFiY2rRpo0aNGmnr1q1KSEjQRx99pNLSUvXo0UMpKSkaPXq0fD5fYMalMu3bt9eUKVP01FNPKSUlRa+99poyMzOD+nTp0kXDhw/XrbfeqkaNGlU4gVj6+euihQsXql69errqqqvUrVs3tWjRQvPmzavy4wdwdnjMzEJdBAAAwOliZgYAADiNMAMAAJxGmAEAAE4jzAAAAKcRZgAAgNMIMwAAwGmEGQAA4DTCDAAAcBphBgAAOI0wAwAAnEaYAQAATiPMAAAAp/1/7MgGXoPfaWQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAGdCAYAAAC7EMwUAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAFzZJREFUeJzt3X9s0/edx/HXlyaY0NpW2YaNlbSXqlnXCgWp0KGwrslKEylXVXT8sxtoYuom0RIqfPxBl6JT2U6KKdNFdJeVrdvUVuqx7E6D0j/aKpFanFWIU/gRkQsndJUyZl3xsvaYbQI4kHzujw4XN4nB+dG3E54P6ftHvp/v1/700zZPfeOvbc855wQAgIEF1hMAANy6iBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBTZj2BzxsbG9NHH30kv98vz/OspwMAKJJzTplMRpFIRAsWFL7WKbkIffTRR6qqqrKeBgBgmhKJhCorKwseU3IR8vv9kqSH9fcqU7nxbAAAxbqqK/pAb+d+nxdSchG69ie4MpWrzCNCADDn/O0TSW/mJRVuTAAAmCFCAAAzRAgAYIYIAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmphWhWCwmz/MUjUZz+5xz2rVrlyKRiCoqKtTQ0KCBgYHpzhMAMA9NOUK9vb165ZVXVFtbm7d/z549am9vV0dHh3p7exUOh9XY2KhMJjPtyQIA5pcpRejChQvauHGjfvWrX+nOO+/M7XfOae/evdq5c6fWr1+v5cuX6/XXX9fFixe1f//+GZs0AGB+mFKEWlpa9Pjjj+uxxx7L2z84OKhkMqmmpqbcPp/Pp/r6eh05cmTCx8pms0qn03kbAODWUFbsCZ2dnTpx4oR6e3vHjSWTSUlSKBTK2x8KhXT27NkJHy8Wi+nHP/5xsdMAAMwDRV0JJRIJbdu2TW+88YYWLVo06XGe5+X97Jwbt++a1tZWpVKp3JZIJIqZEgBgDivqSuj48eMaGhrSypUrc/tGR0fV09Ojjo4OnTlzRtKnV0TLli3LHTM0NDTu6ugan88nn883lbkDAOa4oq6E1q5dq/7+fvX19eW2VatWaePGjerr69M999yjcDis7u7u3DkjIyOKx+Nas2bNjE8eADC3FXUl5Pf7tXz58rx9t99+u770pS/l9kejUbW1tammpkY1NTVqa2vT4sWLtWHDhpmbNQBgXij6xoQb2bFjhy5duqQtW7bo/PnzWr16tbq6uuT3+2f6qQAAc5znnHPWk7heOp1WMBhUg9apzCu3ng4AoEhX3RUd1iGlUikFAoGCx/LZcQAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMBMURHat2+famtrFQgEFAgEVFdXp3feeSc37pzTrl27FIlEVFFRoYaGBg0MDMz4pAEA80NREaqsrNTu3bt17NgxHTt2TI8++qjWrVuXC82ePXvU3t6ujo4O9fb2KhwOq7GxUZlMZlYmDwCY2zznnJvOAyxZskQ//elP9dRTTykSiSgajeq5556TJGWzWYVCIb344ovavHnzTT1eOp1WMBhUg9apzCufztQAAAauuis6rENKpVIKBAIFj53ya0Kjo6Pq7OzU8PCw6urqNDg4qGQyqaamptwxPp9P9fX1OnLkyKSPk81mlU6n8zYAwK2h6Aj19/frjjvukM/n09NPP62DBw/qgQceUDKZlCSFQqG840OhUG5sIrFYTMFgMLdVVVUVOyUAwBxVdITuu+8+9fX16ejRo3rmmWe0adMmnT59OjfueV7e8c65cfuu19raqlQqldsSiUSxUwIAzFFlxZ6wcOFC3XvvvZKkVatWqbe3Vy+99FLudaBkMqlly5bljh8aGhp3dXQ9n88nn89X7DQAAPPAtN8n5JxTNptVdXW1wuGwuru7c2MjIyOKx+Nas2bNdJ8GADAPFXUl9Pzzz6u5uVlVVVXKZDLq7OzU4cOH9e6778rzPEWjUbW1tammpkY1NTVqa2vT4sWLtWHDhtmaPwBgDisqQn/+85/1ve99T+fOnVMwGFRtba3effddNTY2SpJ27NihS5cuacuWLTp//rxWr16trq4u+f3+WZk8AGBum/b7hGYa7xMCgLntC3mfEAAA00WEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMFBWhWCymhx56SH6/X0uXLtWTTz6pM2fO5B3jnNOuXbsUiURUUVGhhoYGDQwMzOikAQDzQ1ERisfjamlp0dGjR9Xd3a2rV6+qqalJw8PDuWP27Nmj9vZ2dXR0qLe3V+FwWI2NjcpkMjM+eQDA3OY559xUT/7LX/6ipUuXKh6P65FHHpFzTpFIRNFoVM8995wkKZvNKhQK6cUXX9TmzZtv+JjpdFrBYFANWqcyr3yqUwMAGLnqruiwDimVSikQCBQ8dlqvCaVSKUnSkiVLJEmDg4NKJpNqamrKHePz+VRfX68jR45M+BjZbFbpdDpvAwDcGqYcIeectm/frocffljLly+XJCWTSUlSKBTKOzYUCuXGPi8WiykYDOa2qqqqqU4JADDHTDlCW7du1alTp/Tb3/523JjneXk/O+fG7bumtbVVqVQqtyUSialOCQAwx5RN5aRnn31Wb731lnp6elRZWZnbHw6HJX16RbRs2bLc/qGhoXFXR9f4fD75fL6pTAMAMMcVdSXknNPWrVt14MABvffee6qurs4br66uVjgcVnd3d27fyMiI4vG41qxZMzMzBgDMG0VdCbW0tGj//v06dOiQ/H5/7nWeYDCoiooKeZ6naDSqtrY21dTUqKamRm1tbVq8eLE2bNgwK/8AAIC5q6gI7du3T5LU0NCQt//VV1/V97//fUnSjh07dOnSJW3ZskXnz5/X6tWr1dXVJb/fPyMTBgDMH9N6n9Bs4H1CADC3fWHvEwIAYDqIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwUHaGenh498cQTikQi8jxPb775Zt64c067du1SJBJRRUWFGhoaNDAwMFPzBQDMI0VHaHh4WCtWrFBHR8eE43v27FF7e7s6OjrU29urcDisxsZGZTKZaU8WADC/lBV7QnNzs5qbmyccc85p79692rlzp9avXy9Jev311xUKhbR//35t3rx5erMFAMwrM/qa0ODgoJLJpJqamnL7fD6f6uvrdeTIkZl8KgDAPFD0lVAhyWRSkhQKhfL2h0IhnT17dsJzstmsstls7ud0Oj2TUwIAlLBZuTvO87y8n51z4/ZdE4vFFAwGc1tVVdVsTAkAUIJmNELhcFjSZ1dE1wwNDY27OrqmtbVVqVQqtyUSiZmcEgCghM1ohKqrqxUOh9Xd3Z3bNzIyong8rjVr1kx4js/nUyAQyNsAALeGol8TunDhgj788MPcz4ODg+rr69OSJUt01113KRqNqq2tTTU1NaqpqVFbW5sWL16sDRs2FPdEnvfp9nnOFTtlAECJKjpCx44d07e+9a3cz9u3b5ckbdq0Sa+99pp27NihS5cuacuWLTp//rxWr16trq4u+f3+mZs1AGBe8JwrrUuLdDqtYDCoBu9JlXnl4w8orekCAD7nqruiwzqkVCp1w5dY+Ow4AIAZIgQAMEOEAABmiBAAwMyMfmzPjHrwfqls0bjdZefOFzxt7JP/m3zs0qXCz8lNDwDwheJKCABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCnZ9wn9+/79CvjHN/LfMssKnvfP766fdKzmjQsFz/X+68NJx8YuXy54LgCgeFwJAQDMECEAgBkiBAAwQ4QAAGaIEADADBECAJjxnCut7y9Ip9MKBoP6+MzfTXiL9pimPt0rbrTg+Oq90UnHql47M+nY6MefTHVKADDvXHVXdFiHlEqlFAgECh7LlRAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBTsl/lMCY34XuCFsib8mOWe7cVHD/xj/866dj9y1omHftqrPDz8j4iAJgYV0IAADNECABghggBAMwQIQCAGSIEADBDhAAAZkr2Fu1y7zaVe+MbeaOvYxjT2KRjPq+84LmFHvu//+Hnk449eO7Zgo9b2XFi0rGxy5cLngsA8xlXQgAAM0QIAGCGCAEAzBAhAIAZIgQAMEOEAABmSvYW7StuVFdc8Z+iXV7gNuyLYyMFz128YGHB+UzmP6N7Cz7u+sNPTT54fKDguZpgDQBgvuBKCABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCnZ9wlNZkyF3zczVuD9PIXeByRJWXdl0rEy3TbpWLk3+Zgk/c/GOyYd++rpioLnjl28WHAcAOYyroQAAGaIEADADBECAJghQgAAM0QIAGCGCAEAzMy5W7SnY9SNFRxfMEtN/qfmA5OO/ce/PFTwXG7RBjCfcSUEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYGbWIvTyyy+rurpaixYt0sqVK/WHP/xhtp4KADBHzcr7hH73u98pGo3q5Zdf1je+8Q398pe/VHNzs06fPq277rprNp7yptzoayAKfSXDlQJfEbFAXsHH3eg/N+lY57IlBc/V/340+Zgr/M8DAKVuVq6E2tvb9YMf/EA//OEPdf/992vv3r2qqqrSvn37ZuPpAABz1IxHaGRkRMePH1dTU1Pe/qamJh05cmSmnw4AMIfN+J/jPv74Y42OjioUCuXtD4VCSiaT447PZrPKZrO5n9Pp9ExPCQBQombtxgTPy3+dxDk3bp8kxWIxBYPB3FZVVTVbUwIAlJgZj9CXv/xl3XbbbeOueoaGhsZdHUlSa2urUqlUbkskEjM9JQBAiZrxP8ctXLhQK1euVHd3t7797W/n9nd3d2vdunXjjvf5fPL5fLmf3d/u+MpcKPyJ17OhfIIrtWuuFPgE7hvdHVforryro5cLnuvclUKDBc8FAAtX9envLXczv6PcLOjs7HTl5eXuN7/5jTt9+rSLRqPu9ttvd3/84x9veG4ikXCS2NjY2Njm+JZIJG74O39W3if0ne98R5988ol+8pOf6Ny5c1q+fLnefvtt3X333Tc8NxKJKJFIyO/3y/M8pdNpVVVVKZFIKBAIzMZ05wXW6eawTjeHdbo5rNPEnHPKZDKKRCI3PNZzrrT/ppNOpxUMBpVKpfiXXADrdHNYp5vDOt0c1mn6+Ow4AIAZIgQAMFPyEfL5fHrhhRfy7qDDeKzTzWGdbg7rdHNYp+kr+deEAADzV8lfCQEA5i8iBAAwQ4QAAGaIEADATMlHiK8Jz9fT06MnnnhCkUhEnufpzTffzBt3zmnXrl2KRCKqqKhQQ0ODBgYGbCZrJBaL6aGHHpLf79fSpUv15JNP6syZM3nHsE7Svn37VFtbq0AgoEAgoLq6Or3zzju5cdZoYrFYTJ7nKRqN5vaxVlNX0hG69jXhO3fu1MmTJ/XNb35Tzc3N+tOf/mQ9NTPDw8NasWKFOjo6Jhzfs2eP2tvb1dHRod7eXoXDYTU2NiqTyXzBM7UTj8fV0tKio0ePqru7W1evXlVTU5OGh4dzx7BOUmVlpXbv3q1jx47p2LFjevTRR7Vu3brcL0/WaLze3l698sorqq2tzdvPWk3DND6ndNZ9/etfd08//XTevq997WvuRz/6kdGMSoskd/DgwdzPY2NjLhwOu927d+f2Xb582QWDQfeLX/zCYIalYWhoyEly8XjcOcc6FXLnnXe6X//616zRBDKZjKupqXHd3d2uvr7ebdu2zTnHf0/TVbJXQnxNePEGBweVTCbz1szn86m+vv6WXrNUKiVJWrJkiSTWaSKjo6Pq7OzU8PCw6urqWKMJtLS06PHHH9djjz2Wt5+1mp5Z+RTtmVDs14RDuXWZaM3Onj1rMSVzzjlt375dDz/8sJYvXy6Jdbpef3+/6urqdPnyZd1xxx06ePCgHnjggdwvT9boU52dnTpx4oR6e3vHjfHf0/SUbISuudmvCcdnWLPPbN26VadOndIHH3wwbox1ku677z719fXpr3/9q37/+99r06ZNisfjuXHWSEokEtq2bZu6urq0aNGiSY9jraamZP8cV+zXhEMKh8OSxJr9zbPPPqu33npL77//viorK3P7WafPLFy4UPfee69WrVqlWCymFStW6KWXXmKNrnP8+HENDQ1p5cqVKisrU1lZmeLxuH72s5+prKwstx6s1dSUbISu/5rw63V3d2vNmjVGsypt1dXVCofDeWs2MjKieDx+S62Zc05bt27VgQMH9N5776m6ujpvnHWanHNO2WyWNbrO2rVr1d/fr76+vty2atUqbdy4UX19fbrnnntYq+mwuyfixqbzNeHzVSaTcSdPnnQnT550klx7e7s7efKkO3v2rHPOud27d7tgMOgOHDjg+vv73Xe/+123bNkyl06njWf+xXnmmWdcMBh0hw8fdufOncttFy9ezB3DOjnX2trqenp63ODgoDt16pR7/vnn3YIFC1xXV5dzjjUq5Pq745xjraajpCPknHM///nP3d133+0WLlzoHnzwwdxttreq999/f8Lvct+0aZNz7tPbRV944QUXDoedz+dzjzzyiOvv77ed9BdsovWR5F599dXcMayTc0899VTu/62vfOUrbu3atbkAOccaFfL5CLFWU8dXOQAAzJTsa0IAgPmPCAEAzBAhAIAZIgQAMEOEAABmiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADDz/94uwpOWVe9JAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "species = \"O\"\n", + "iterations = 1000\n", + "cell_offset = 60\n", + "y_design = []\n", + "y_results = []\n", + "for i in range(0,iterations):\n", + " idx = i*50*50 + cell_offset -1\n", + " y_design.append(df_design.iloc[idx, :])\n", + " y_results.append(df_results.iloc[idx,:])\n", + " \n", + "y_design = pd.DataFrame(y_design)\n", + "y_results = pd.DataFrame(y_results)\n", + "plt.plot(np.arange(0,iterations), y_design[species], label = \"Design\")\n", + "plt.plot(np.arange(0,iterations), y_results[species], label = \"Results\")\n", + "\n", + "y = FuncTransform(func_dict_in, func_dict_out).fit_transform(y_design)\n", + "y = scaler_X.transform(y)\n", + "prediction = model_large.predict(y.iloc[:, y.columns != \"Class\"])\n", + "prediction = pd.DataFrame(prediction, columns = y.columns[y.columns != \"Class\"])\n", + "prediction_back = pd.DataFrame(scaler_X.inverse_transform(prediction), columns=prediction.columns)\n", + "prediction_back = FuncTransform(func_dict_out, func_dict_in).inverse_transform(prediction_back.iloc[:, prediction_back.columns != \"Class\"])\n", + "\n", + "plt.plot(np.arange(0,iterations), prediction_back[species], label = \"Prediction\")\n", + "plt.xlabel('Iteration')\n", + "plt.ylabel(species)\n", + "plt.title(species+' Concentration over Iterations')\n", + "plt.show()\n", + "\n", + "timestep = 1000\n", + "plt.imshow(np.array(df_results[\"Barite\"][(timestep*2500):(timestep*2500+2500)]).reshape(50,50), origin='lower')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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p07VRx99pKlTp+qyyy7T+++/b1Uz/NJWW6uqqrRhwwbdfffd2rBhg15++WV9/vnnOv/889stNzMzs8l13rt3r1JSUqxoQkDau7aSNHbs2Cb1fuWVV9osMxavraRm1+fJJ5+UYRi6+OKL2yw3Wq+tZcwEdcopp5jXX399k2P9+vUzb7/99hbP/81vfmP269evybGf/exn5vDhwy2roxX2799vSjJXr17d6jkrV640JZkHDhwIX8VCYObMmebgwYP9Pj9erqnXL37xC/Poo482PR5Pi6/H6nWVZC5evNj33OPxmHl5eeb999/vO1ZTU2NmZWWZjz76aKvlXHbZZebYsWObHDvnnHPMSZMmhbzOwTqyrS1Zt26dKcnctWtXq+fMnz/fzMrKCm3lLNBSe6dNm2ZecMEFAZUTL9f2ggsuMM8888w2z4mVaxtKCdmjUltbqw8//FBjxoxpcnzMmDFas2ZNi+957733mp1/zjnn6IMPPpDb7basrqFWVlYmScrNzW333CFDhig/P19nnXWWVq5caXXVQmLbtm0qKChQnz59NGnSJO3YsaPVc+PlmkoNP9PPPPOMfvzjH7e771UsXtfD7dy5U/v27Wty7ZxOp04//fRWf3+l1q93W++JRmVlZTIMQ9nZ2W2ed/DgQfXu3Vs9e/bUeeedp40bN4angiGwatUqdevWTX379tV1112n/fv3t3l+PFzbb7/9VsuWLdO1117b7rmxfG2DkZBBpbi4WPX19erevXuT4927d9e+fftafM++fftaPL+urk7FxcWW1TWUTNPUjBkzNHLkSA0cOLDV8/Lz8/X444/rpZde0ssvv6zjjjtOZ511lt56660w1jZww4YN09NPP63XXntNTzzxhPbt26cf/ehH+v7771s8Px6uqdeSJUtUWlqqq6++utVzYvW6Hsn7OxrI76/3fYG+J9rU1NTo9ttv1+TJk9vcB6Zfv3566qmntHTpUj333HNKSUnRiBEjtG3btjDWNjjjxo3Ts88+qzfffFN//vOftX79ep155plyuVytviceru2CBQuUkZGhiy66qM3zYvnaBiumNyXsqCP/52maZpv/G23p/JaOR6sbb7xRH3/8sd555502zzvuuON03HHH+Z4XFRVp9+7d+n//7//ptNNOs7qaQRs3bpzv60GDBqmoqEhHH320FixYoBkzZrT4nli/pl7z5s3TuHHjVFBQ0Oo5sXpdWxPo72+w74kWbrdbkyZNksfj0SOPPNLmucOHD28yAXXEiBE68cQT9de//lUPPfSQ1VXtkMsvv9z39cCBAzV06FD17t1by5Yta/Mf8Vi+tpL05JNPasqUKe3ONYnlaxushOxR6dKli+x2e7O0vX///map3CsvL6/F85OSktS5c2fL6hoqN910k5YuXaqVK1cGteP08OHDYy6xp6ena9CgQa3WO9avqdeuXbv0xhtv6Cc/+UnA743F6+q9kyuQ31/v+wJ9T7Rwu9267LLLtHPnTq1YsSLgXXVtNptOPvnkmLvWUkNPYO/evduseyxfW0l6++23tXXr1qB+h2P52vorIYNKcnKyTjrpJN9dEl4rVqzQj370oxbfU1RU1Oz8119/XUOHDpXD4bCsrh1lmqZuvPFGvfzyy3rzzTfVp0+foMrZuHGj8vPzQ1w7a7lcLm3ZsqXVesfqNT3S/Pnz1a1bN5177rkBvzcWr2ufPn2Ul5fX5NrV1tZq9erVrf7+Sq1f77beEw28IWXbtm164403ggrRpmlq06ZNMXetJen777/X7t2726x7rF5br3nz5umkk07S4MGDA35vLF9bv0VqFm+kLVq0yHQ4HOa8efPMzz77zLzlllvM9PR088svvzRN0zRvv/12c+rUqb7zd+zYYaalpZm//OUvzc8++8ycN2+e6XA4zH/84x+RaoJfbrjhBjMrK8tctWqVuXfvXt+jqqrKd86Rbf3LX/5iLl682Pz888/NTz75xLz99ttNSeZLL70UiSb47Ve/+pW5atUqc8eOHebatWvN8847z8zIyIi7a3q4+vp6s1evXuZtt93W7LVYvq4VFRXmxo0bzY0bN5qSzAceeMDcuHGj706X+++/38zKyjJffvllc/PmzeYVV1xh5ufnm+Xl5b4ypk6d2uQuvnfffde02+3m/fffb27ZssW8//77zaSkJHPt2rVhb9/h2mqr2+02zz//fLNnz57mpk2bmvwOu1wuXxlHtnXWrFnm8uXLze3bt5sbN240r7nmGjMpKcl8//33I9HEJtpqb0VFhfmrX/3KXLNmjblz505z5cqVZlFRkdmjR4+4u7ZeZWVlZlpamjl37twWy4ila2uVhA0qpmmaf/vb38zevXubycnJ5oknntjklt1p06aZp59+epPzV61aZQ4ZMsRMTk42jzrqqFZ/sKKJpBYf8+fP951zZFvnzJljHn300WZKSoqZk5Njjhw50ly2bFn4Kx+gyy+/3MzPzzcdDodZUFBgXnTRReann37qez1erunhXnvtNVOSuXXr1mavxfJ19d5KfeRj2rRppmk23KI8c+ZMMy8vz3Q6neZpp51mbt68uUkZp59+uu98rxdffNE87rjjTIfDYfbr1y8qQlpbbd25c2erv8MrV670lXFkW2+55RazV69eZnJystm1a1dzzJgx5po1a8LfuBa01d6qqipzzJgxZteuXU2Hw2H26tXLnDZtmvnVV181KSMerq3XY489ZqamppqlpaUtlhFL19Yq7J4MAACiVkLOUQEAALGBoAIAAKIWQQUAAEQtggoAAIhaBBUAABC1CCoAACBqEVQAAEDUIqgAAICoRVABEFcMw9CSJUsiXQ0AIUJQARAyV199tQzDaPYYO3ZspKsGIEYlRboCAOLL2LFjNX/+/CbHnE5nhGoDINbRowIgpJxOp/Ly8po8cnJyJDUMy8ydO1fjxo1Tamqq+vTpoxdffLHJ+zdv3qwzzzxTqamp6ty5s37605/q4MGDTc558sknNWDAADmdTuXn5+vGG29s8npxcbEuvPBCpaWl6dhjj9XSpUutbTQAyxBUAITV3XffrYsvvlgfffSRrrzySl1xxRXasmWLJKmqqkpjx45VTk6O1q9frxdffFFvvPFGkyAyd+5cTZ8+XT/96U+1efNmLV26VMccc0yTz5g9e7Yuu+wyffzxxxo/frymTJmikpKSsLYTQIhEevtmAPFj2rRppt1uN9PT05s8fve735mmaZqSzOuvv77Je4YNG2becMMNpmma5uOPP27m5OSYBw8e9L2+bNky02azmfv27TNN0zQLCgrMO++8s9U6SDLvuusu3/ODBw+ahmGYr776asjaCSB8mKMCIKTOOOMMzZ07t8mx3Nxc39dFRUVNXisqKtKmTZskSVu2bNHgwYOVnp7ue33EiBHyeDzaunWrDMPQnj17dNZZZ7VZh+OPP973dXp6ujIyMrR///5gmwQggggqAEIqPT292VBMewzDkCSZpun7uqVzUlNT/SrP4XA0e6/H4wmoTgCiA3NUAITV2rVrmz3v16+fJKl///7atGmTKisrfa+/++67stls6tu3rzIyMnTUUUfpP//5T1jrDCBy6FEBEFIul0v79u1rciwpKUldunSRJL344osaOnSoRo4cqWeffVbr1q3TvHnzJElTpkzRzJkzNW3aNM2aNUvfffedbrrpJk2dOlXdu3eXJM2aNUvXX3+9unXrpnHjxqmiokLvvvuubrrppvA2FEBYEFQAhNTy5cuVn5/f5Nhxxx2n//73v5Ia7shZtGiRfv7znysvL0/PPvus+vfvL0lKS0vTa6+9pl/84hc6+eSTlZaWposvvlgPPPCAr6xp06appqZGf/nLX3TrrbeqS5cuuuSSS8LXQABhZZimaUa6EgASg2EYWrx4sSZOnBjpqgCIEcxRAQAAUYugAgAAohZzVACEDSPNAAJFjwoAAIhaBBUAABC1CCoAACBqEVQAAEDUIqgAAICoRVABAABRi6ACAACiFkEFAABELYIKAACIWv8ffjVm25L6Qy0AAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -743,12 +672,12 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -775,86 +704,93 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m15641/15641\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 331us/step - loss: 3.0422e-06\n" + "\u001b[1m 20/7821\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m44s\u001b[0m 6ms/step - loss: 5.1914e-06" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m7821/7821\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m29s\u001b[0m 4ms/step - loss: 1.0395e-06\n" ] }, { "data": { "text/plain": [ - "2.9736404485447565e-06" + "9.875676596493577e-07" ] }, - "execution_count": 34, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# test on all test data\n", - "model_simple.evaluate(X_test_preprocess.iloc[:,X_test.columns != \"Class\"], y_test_preprocess.iloc[:, y_test.columns != \"Class\"])" + "model_large.evaluate(X_test.iloc[:,X_test.columns != \"Class\"], y_test.iloc[:, y_test.columns != \"Class\"])" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m15451/15451\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 234us/step - loss: 0.0313\n" + "\u001b[1m7727/7727\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m29s\u001b[0m 4ms/step - loss: 5.4493e-07\n" ] }, { "data": { "text/plain": [ - "0.031290605664253235" + "5.075861508885282e-07" ] }, - "execution_count": 32, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# test on non-reactive data\n", - "model_simple.evaluate(X_test_preprocess[X_test_preprocess['Class'] == 0].iloc[:,:-1], y_test_preprocess[X_test_preprocess['Class'] == 0].iloc[:,:-1])" + "model_large.evaluate(X_test[X_test['Class'] == 0].iloc[:,:-1], y_test[X_test['Class'] == 0].iloc[:,:-1])" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m190/190\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 295us/step - loss: 0.1246\n" + "\u001b[1m94/94\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4ms/step - loss: 4.0710e-05\n" ] }, { "data": { "text/plain": [ - "0.12462512403726578" + "4.047931361128576e-05" ] }, - "execution_count": 33, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# test on reactive data\n", - "model_simple.evaluate(X_test_preprocess[X_test_preprocess['Class'] == 1].iloc[:,:-1], y_test_preprocess[X_test_preprocess['Class'] == 1].iloc[:, :-1])" + "model_large.evaluate(X_test[X_test['Class'] == 1].iloc[:,:-1], y_test[X_test['Class'] == 1].iloc[:, :-1])" ] }, { diff --git a/preprocessing.py b/preprocessing.py index ed4e600..2de066a 100644 --- a/preprocessing.py +++ b/preprocessing.py @@ -14,6 +14,7 @@ from imblearn.over_sampling import RandomOverSampler from collections import Counter import os from sklearn.preprocessing import StandardScaler, MinMaxScaler +from sklearn.base import clone # preprocessing pipeline # @@ -86,7 +87,7 @@ def clustering(X, n_clusters=2, random_state=42, x_length=50, y_length=50): class_labels = np.append(class_labels.astype(int), kmeans.labels_) - if("Class" in X.columns and "Class" in X.columns): + if("Class" in X.columns): print("Class column already exists") else: class_labels_df = pd.DataFrame(class_labels, columns=['Class']) @@ -126,7 +127,7 @@ def balancer(design, target, strategy, sample_fraction=0.5): df_resampled, classes_resampled = under.fit_resample(df.loc[:, df.columns != "Class"], df.loc[:, df.columns == "Class"]) else: - classes_resampled = classes + return design, target counter = classes_resampled["Class"].value_counts() print("Amount class 0 after:", counter[0] / (counter[0] + counter[1]) ) @@ -152,9 +153,10 @@ def plot_simulation(X, timestep, component='Barite', x_length=50, y_length=50): plt.show() -def preprocessing(df_design, df_targets, func_dict_in, func_dict_out, sampling, test_size): +def preprocessing_training(df_design, df_targets, func_dict_in, func_dict_out, sampling, scaling, test_size): df_design = clustering(df_design) + df_targets = pd.concat([df_targets, df_design['Class']], axis=1) df_design_log = FuncTransform(func_dict_in, func_dict_out).fit_transform(df_design) df_results_log = FuncTransform(func_dict_in, func_dict_out).fit_transform(df_targets) @@ -166,14 +168,72 @@ def preprocessing(df_design, df_targets, func_dict_in, func_dict_out, sampling, scaler_X = MinMaxScaler() scaler_y = MinMaxScaler() - X_train = scaler_X.fit_transform(X_train) - X_test = scaler_X.transform(X_test) + if scaling == 'individual': + scaler_X.fit(X_train.iloc[:, X_train.columns != "Class"]) + scaler_y.fit(y_train.iloc[:, y_train.columns != "Class"]) + + elif scaling == 'global': + scaler_X.fit(pd.concat([X_train.iloc[:, X_train.columns != "Class"], y_train.iloc[:, y_train.columns != "Class"]], axis=0)) + scaler_y = clone(scaler_X) + + X_train = pd.concat([scaler_X.transform(X_train.loc[:, X_train.columns != "Class"]), X_train.loc[:, "Class"]], axis=1) + X_test = pd.concat([scaler_X.transform(X_test.loc[:, X_test.columns != "Class"]), X_test.loc[:, "Class"]], axis=1) - y_train = scaler_y.fit_transform(y_train) - y_test = scaler_y.transform(y_test) + y_train = pd.concat([scaler_y.transform(y_train.loc[:, y_train.columns != "Class"]), y_train.loc[:, "Class"]], axis=1) + y_test = pd.concat([scaler_y.transform(y_test.loc[:, y_test.columns != "Class"]), y_test.loc[:, "Class"]], axis=1) X_train, X_val, y_train, y_val = sk.train_test_split(X_train, y_train, test_size = 0.1) - return X_train, X_val, X_test, y_train, y_val, y_test + return X_train, X_val, X_test, y_train, y_val, y_test, scaler_X, scaler_y + +class preprocessing: + + def __init__(self, df_design, df_targets, random_state=42): + self.X = df_design + self.y = df_targets + self.random_state = random_state + self.state = {"cluster": False, "log": False, "balance": False, "scale": False} + + def funcTranform(self, func_dict_in): + for key in self.X.keys(): + if "Class" not in key: + self.X[key] = self.X[key].apply(func_dict_in[key]) + self.y[key] = self.y[key].apply(func_dict_in[key]) + self.state["log"] = True + + def funcInverse(self, func_dict_out): + + if(self.state["log"] == False): + raise Exception("Data has to be transformed first") + for key in self.X.keys(): + if "Class" not in key: + self.X[key] = self.X[key].apply(func_dict_out[key]) + self.y[key] = self.y[key].apply(func_dict_out[key]) + + def cluster(self, species='Barite', n_clusters=2, x_length=50, y_length=50): + + if(self.state["log"] == False): + raise Exception("Data has to be transformed first") + class_labels = np.array([]) + grid_length = x_length * y_length + iterations = int(len(self.X) / grid_length) + + for i in range(0, iterations): + field = np.array(self.X['Barite'][(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 self.X.columns and "Class" in self.y.columns): + print("Class column already exists") + else: + class_labels_df = pd.DataFrame(class_labels, columns=['Class']) + self.X = pd.concat([self.X, class_labels_df], axis=1) + self.y = pd.concat([self.y, class_labels_df], axis=1) + self.state["cluster"] = True + + + \ No newline at end of file