diff --git a/POET_Training.ipynb b/POET_Training.ipynb index 1558adf..79513e6 100644 --- a/POET_Training.ipynb +++ b/POET_Training.ipynb @@ -27,9 +27,26 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "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", + "To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running Keras in version 3.6.0\n" + ] + } + ], "source": [ "import keras\n", "import h5py\n", @@ -39,12 +56,16 @@ "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 *" + "from preprocessing import *\n", + "from sklearn import set_config\n", + "set_config(transform_output = \"pandas\")" ] }, { @@ -56,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -91,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -192,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -298,12 +319,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Define some functions and helper classes" + "## Define transformer functions" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -327,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -373,7 +394,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -391,265 +412,51 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 9, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
HOChargeH_0_O_0_BaClS_2_S_6_SrBariteCelestite
0111.01243455.508192-7.779554e-092.697041e-262.210590e-152.041069e-024.082138e-020.000000e+000.0004940.0004940.0011.000000
1111.01243455.508427-4.736083e-091.446346e-262.473481e-151.094567e-022.189133e-020.000000e+000.0005530.0005530.0011.000000
2111.01243455.508691-1.311169e-093.889826e-282.769320e-152.943745e-045.887491e-040.000000e+000.0006190.0006190.0011.000000
3111.01243455.508698-1.220023e-091.442658e-292.777193e-151.091776e-052.183551e-050.000000e+000.0006200.0006200.0011.000000
4111.01243455.508699-1.216643e-095.350528e-312.777485e-154.049176e-078.098352e-070.000000e+000.0006200.0006200.0011.000000
.......................................
2502495111.01243455.5074883.573728e-095.424062e-1451.375204e-109.953520e-072.266555e-035.509534e-1490.0003180.0014500.0011.000014
2502496111.01243455.5075013.494007e-092.011675e-1461.377139e-109.817216e-072.217997e-032.043375e-1500.0003210.0014290.0011.000010
2502497111.01243455.5075123.429764e-097.460897e-1481.377819e-109.706451e-072.179066e-037.578467e-1520.0003240.0014120.0011.000006
2502498111.01243455.5075203.381745e-092.767237e-1491.371144e-109.621074e-072.149820e-032.810844e-1530.0003260.0014000.0011.000004
2502499111.01243455.5075253.348864e-095.321610e-1511.376026e-109.564401e-072.129912e-035.405468e-1550.0003270.0013910.0011.000001
\n", - "

2502500 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " H O Charge H_0_ O_0_ \\\n", - "0 111.012434 55.508192 -7.779554e-09 2.697041e-26 2.210590e-15 \n", - "1 111.012434 55.508427 -4.736083e-09 1.446346e-26 2.473481e-15 \n", - "2 111.012434 55.508691 -1.311169e-09 3.889826e-28 2.769320e-15 \n", - "3 111.012434 55.508698 -1.220023e-09 1.442658e-29 2.777193e-15 \n", - "4 111.012434 55.508699 -1.216643e-09 5.350528e-31 2.777485e-15 \n", - "... ... ... ... ... ... \n", - "2502495 111.012434 55.507488 3.573728e-09 5.424062e-145 1.375204e-10 \n", - "2502496 111.012434 55.507501 3.494007e-09 2.011675e-146 1.377139e-10 \n", - "2502497 111.012434 55.507512 3.429764e-09 7.460897e-148 1.377819e-10 \n", - "2502498 111.012434 55.507520 3.381745e-09 2.767237e-149 1.371144e-10 \n", - "2502499 111.012434 55.507525 3.348864e-09 5.321610e-151 1.376026e-10 \n", - "\n", - " Ba Cl S_2_ S_6_ Sr \\\n", - "0 2.041069e-02 4.082138e-02 0.000000e+00 0.000494 0.000494 \n", - "1 1.094567e-02 2.189133e-02 0.000000e+00 0.000553 0.000553 \n", - "2 2.943745e-04 5.887491e-04 0.000000e+00 0.000619 0.000619 \n", - "3 1.091776e-05 2.183551e-05 0.000000e+00 0.000620 0.000620 \n", - "4 4.049176e-07 8.098352e-07 0.000000e+00 0.000620 0.000620 \n", - "... ... ... ... ... ... \n", - "2502495 9.953520e-07 2.266555e-03 5.509534e-149 0.000318 0.001450 \n", - "2502496 9.817216e-07 2.217997e-03 2.043375e-150 0.000321 0.001429 \n", - "2502497 9.706451e-07 2.179066e-03 7.578467e-152 0.000324 0.001412 \n", - "2502498 9.621074e-07 2.149820e-03 2.810844e-153 0.000326 0.001400 \n", - "2502499 9.564401e-07 2.129912e-03 5.405468e-155 0.000327 0.001391 \n", - "\n", - " Barite Celestite \n", - "0 0.001 1.000000 \n", - "1 0.001 1.000000 \n", - "2 0.001 1.000000 \n", - "3 0.001 1.000000 \n", - "4 0.001 1.000000 \n", - "... ... ... \n", - "2502495 0.001 1.000014 \n", - "2502496 0.001 1.000010 \n", - "2502497 0.001 1.000006 \n", - "2502498 0.001 1.000004 \n", - "2502499 0.001 1.000001 \n", - "\n", - "[2502500 rows x 12 columns]" - ] - }, - "execution_count": 100, - "metadata": {}, - "output_type": "execute_result" + "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.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'" + ] } ], "source": [ - "df_design" + "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)" ] }, { @@ -661,93 +468,30 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/Users/hannessigner/miniconda3/envs/ai/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", + "/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": [ - "# widget with slider for the index\n", - "\n", - "class_label_design = np.array([])\n", - "class_label_result = np.array([])\n", - "\n", - "\n", - "i = len(df_design) / 2500\n", - "for i in range(0,252):\n", - " field_design = np.array(df_design['Barite'][(i*2500):(i*2500+2500)]).reshape(50,50)\n", - " field_result = np.array(df_results['Barite'][(i*2500):(i*2500+2500)]).reshape(50,50)\n", - " \n", - " kmeans_design = KMeans(n_clusters=2, random_state=0).fit(field_design.reshape(-1,1))\n", - " kmeans_result = KMeans(n_clusters=2, random_state=0).fit(field_result.reshape(-1,1))\n", - " \n", - " class_label_design = np.append(class_label_design.astype(int), kmeans_design.labels_)\n", - " class_label_result = np.append(class_label_result.astype(int), kmeans_result.labels_)\n", - " \n", - "\n", - "\n", - "class_label_design = pd.DataFrame(class_label_design, columns = [\"Class\"])\n", - "class_label_result = pd.DataFrame(class_label_result, columns = [\"Class\"])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "if(\"Class\" in df_design.columns and \"Class\" in df_results.columns):\n", - " print(\"Class column already exists\")\n", - "else:\n", - " df_design = pd.concat([df_design, class_label_design], axis=1)\n", - " df_results = pd.concat([df_results, class_label_design], axis=1)" + "df_design = clustering(df_design)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Amount class 0: 0.9520126984126984\n", - "Amount class 1: 0.047987301587301585\n" - ] - } - ], - "source": [ - "counter = Counter(df_design.iloc[:,-1])\n", - "print(\"Amount class 0:\", counter[0] / (counter[0] + counter[1]) )\n", - "print(\"Amount class 1:\", counter[1] / (counter[0] + counter[1]) )\n" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, "outputs": [ { "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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QoyMhJAQQoiRkRASQggxMhJCQgghRkZCSAghxMhICAkhhBgZCSEhhBAjIyEkhBBiZCSEhBBCjIyEkBBCiJGREBJCCDEyEkJCCCFGRkJICCHEyEgICSGEGBkJISGEECOzpBD6wAc+wLnnnsv4+Djj4+NceOGF/N3f/V3/fucc11xzDZs2baJer3PJJZdwxx13LPuTFkIIcXxYUgiddtppXHvttdx6663ceuut/PzP/zwvfOEL+0Fz3XXXcf3113PDDTewa9cuNm7cyKWXXsr09PRRefJCCCFWN+Wcc0fyBdatW8cf/MEfcPnll7Np0yauvPJK3va2twGQJAkbNmzg93//93nd6163qK83NTXFxMQEl/BCAhUeyVMTQggxArnL+BJ/zeTkJOPj4wd97GHPCRVFwY033ki73ebCCy/k3nvvZc+ePVx22WX9x8RxzMUXX8wtt9xywK+TJAlTU1OzNiGEECeGJYfQ7bffztjYGHEc8/rXv57PfvaznHXWWezZsweADRs2zHr8hg0b+vctZPv27UxMTPS3zZs3L/UpCSGEWKWWHEJnnnkmt912G1//+tf57d/+bV75ylfyve99r3+/UmrW451z824bdtVVVzE5Odnfdu/evdSnJIQQYpUKlvoPoijiSU96EgAXXHABu3bt4o/+6I/680B79uzh1FNP7T9+796986qjYXEcE8fxUp+GEEKI48ARnyfknCNJEk4//XQ2btzIjh07+velacrOnTu56KKLjvTbCCGEOA4tqRJ6xzvewfOe9zw2b97M9PQ0N954I1/60pf4+7//e5RSXHnllWzbto0tW7awZcsWtm3bRqPR4OUvf/nRev5CCCFWsSWF0IMPPshv/uZv8sADDzAxMcG5557L3//933PppZcC8Na3vpVut8sb3vAG9u3bxzOe8QxuuukmWq3WUXnyQgghVrcjPk9oucl5QkIIsbodk/OEhBBCiCMlISSEEGJkJISEEEKMjISQEEKIkZEQEkIIMTISQkIIIUZGQkgIIcTISAgJIYQYGQkhIYQQIyMhJIQQYmQkhIQQQoyMhJAQQoiRkRASQggxMhJCQgghRkZCSAghxMhICAkhhBgZCSEhhBAjIyEkhBBiZCSEhBBCjIyEkBBCiJGREBJCCDEyEkJCCCFGRkJICCHEyEgICSGEGBkJISGEECMjISSEEGJkJISE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OC0YQgghVhwJISGEECOz4kMojmPe/e53z+qgE/PJfloc2U+LI/tpcWQ/HbkVPyckhBDi+LXiKyEhhBDHLwkhIYQQIyMhJIQQYmQkhIQQQozMig+hlXyZ8FG4+eabecELXsCmTZtQSvG5z31u1v3OOa655ho2bdpEvV7nkksu4Y477hjNkx2R7du387SnPY1Wq8X69et50YtexA9+8INZj5H9BB/4wAc499xzGR8fZ3x8nAsvvJC/+7u/698v+2hh27dvRynFlVde2b9N9tXhW9EhVF0m/Oqrr+bb3/42z3rWs3je857HT37yk1E/tZFpt9ucd9553HDDDQvef91113H99ddzww03sGvXLjZu3Mill17K9PT0MX6mo7Nz506uuOIKvv71r7Njxw7yPOeyyy6j3W73HyP7CU477TSuvfZabr31Vm699VZ+/ud/nhe+8IX9g6fso/l27drFhz70Ic4999xZt8u+OgJHsE7pUff0pz/dvf71r59125Of/GT39re/fUTPaGUB3Gc/+9n+59Zat3HjRnfttdf2b+v1em5iYsL9+Z//+Qie4cqwd+9eB7idO3c652Q/HczatWvdRz7yEdlHC5iennZbtmxxO3bscBdffLF785vf7JyT36cjtWIroeP5MuFHy7333suePXtm7bM4jrn44otP6H02OTkJwLp16wDZTwspioIbb7yRdrvNhRdeKPtoAVdccQXPf/7z+YVf+IVZt8u+OjJHZRXt5bDUy4QL+vtloX123333jeIpjZxzjre85S0885nPZOvWrYDsp2G33347F154Ib1ej7GxMT772c9y1lln9Q+eso+8G2+8kW9961vs2rVr3n3y+3RkVmwIVRZ7mXAxIPts4I1vfCPf+c53+MpXvjLvPtlPcOaZZ3Lbbbexf/9+Pv3pT/PKV76SnTt39u+XfQS7d+/mzW9+MzfddBO1Wu2Aj5N9dXhW7HDcUi8TLmDjxo0Ass9Kb3rTm/j85z/PF7/4RU477bT+7bKfBqIo4klPehIXXHAB27dv57zzzuOP/uiPZB8N+eY3v8nevXs5//zzCYKAIAjYuXMnf/zHf0wQBP39Ifvq8KzYEBq+TPiwHTt2cNFFF43oWa1sp59+Ohs3bpy1z9I0ZefOnSfUPnPO8cY3vpHPfOYz/OM//iOnn376rPtlPx2Yc44kSWQfDXnuc5/L7bffzm233dbfLrjgAl7xildw22238YQnPEH21ZEYXU/EoR3JZcKPV9PT0+7b3/62+/a3v+0Ad/3117tvf/vb7r777nPOOXfttde6iYkJ95nPfMbdfvvt7td//dfdqaee6qampkb8zI+d3/7t33YTExPuS1/6knvggQf6W6fT6T9G9pNzV111lbv55pvdvffe677zne+4d7zjHU5r7W666SbnnOyjgxnujnNO9tWRWNEh5Jxzf/qnf+oe97jHuSiK3FOf+tR+m+2J6otf/OKC13J/5Stf6Zzz7aLvfve73caNG10cx+7Zz362u/3220f7pI+xhfYP4D7+8Y/3HyP7ybnLL7+8/7d1yimnuOc+97n9AHJO9tHBzA0h2VeHTy7lIIQQYmRW7JyQEEKI45+EkBBCiJGREBJCCDEyEkJCCCFGRkJICCHEyEgICSGEGBkJISGEECMjISSEEGJkJISEEEKMjISQEEKIkZEQEkIIMTISQkIIIUbm/wc8h2LRzZ9kUwAAAABJRU5ErkJggg==", + "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": [ "
" ] @@ -757,70 +501,7 @@ } ], "source": [ - "i=251\n", - "\n", - "plt.imshow(np.array(df_results['Barite'][(i*2500):(i*2500+2500)]).reshape(50,50), interpolation='bicubic', origin='lower')\n", - "plt.contour(np.array(df_results['Class'][(i*2500):(i*2500+2500)]).reshape(50,50), levels=[0.1], colors='red', origin='lower')" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "df_design['Class threshold'] = df_design['Barite'] > 0.49\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.9991298042059463" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_design['Class'][df_design[\"Class threshold\"] == True].sum() / df_design['Class threshold'][df_design[\"Class threshold\"] == True].sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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oRASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQzuwqhb3zjG9x3330sLi6yuLjI/fffz1/+5V/OPh5j5LHHHuPEiRP0+30efPBBXn755Vv+pkVE5GDYVQjdddddfO1rX+OFF17ghRde4Fd+5Vf49Kc/PQuaJ598kqeeeoqnn36as2fPcvz4cR566CGGw+F78uZFRGR/MzHGeDN/wdGjR/m3//bf8lu/9VucOHGCU6dO8Xu/93sAFEXBsWPH+MM//EM+//nP7+jvW1tbY2lpiQf5NIlJb+atiYhIB+pY8R3+nNXVVRYXF9/xtTe8JuS955lnnmFjY4P777+fV155hfPnz/Pwww/PXpPnOQ888ADPP//82/49RVGwtra27SEiIofDrkPopZdeYn5+njzP+e3f/m2+/e1v8/M///OcP38egGPHjm17/bFjx2Yfu54nnniCpaWl2ePkyZO7fUsiIrJP7TqEfuZnfoYXX3yR7373u/zO7/wOn/vc5/jbv/3b2ceNMdteH2O85rmtHn30UVZXV2ePc+fO7fYtiYjIPpXs9hOyLOOnf/qnAfjYxz7G2bNn+aM/+qPZOtD58+e58847Z6+/cOHCNaOjrfI8J8/z3b4NERE5AG56n1CMkaIouPvuuzl+/DinT5+efawsS86cOcMnPvGJm/0yIiJyAO1qJPT7v//7fOpTn+LkyZMMh0OeeeYZvvOd7/BXf/VXGGM4deoUjz/+OPfccw/33HMPjz/+OIPBgM985jPv1fsXEZF9bFch9Oabb/LP/tk/44033mBpaYn77ruPv/qrv+Khhx4C4Ctf+Qrj8ZgvfOELXLlyhY9//OM8++yzLCwsvCdvXkRE9reb3id0q2mfkIjI/va+7BMSERG5WQohERHpjEJIREQ6oxASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQzCiEREemMQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6s6sQeuKJJ/jFX/xFFhYWuOOOO/iN3/gNfvSjH217TYyRxx57jBMnTtDv93nwwQd5+eWXb+mbFhGRg2FXIXTmzBkeeeQRvvvd73L69Gnquubhhx9mY2Nj9ponn3ySp556iqeffpqzZ89y/PhxHnroIYbD4S1/8yIisr+ZGGO80U++ePEid9xxB2fOnOGXf/mXiTFy4sQJTp06xe/93u8BUBQFx44d4w//8A/5/Oc//65/59raGktLSzzIp0lMeqNvTUREOlLHiu/w56yurrK4uPiOr72pNaHV1VUAjh49CsArr7zC+fPnefjhh2evyfOcBx54gOeff/66f0dRFKytrW17iIjI4XDDIRRj5Mtf/jK/9Eu/xL333gvA+fPnATh27Ni21x47dmz2sas98cQTLC0tzR4nT5680bckIiL7zA2H0Be/+EV++MMf8t//+3+/5mPGmG1/jjFe89zUo48+yurq6uxx7ty5G31LIiKyzyQ38km/+7u/y1/8xV/w3HPPcdddd82eP378ONCMiO68887Z8xcuXLhmdDSV5zl5nt/I2xARkX1uVyOhGCNf/OIX+da3vsVf//Vfc/fdd2/7+N13383x48c5ffr07LmyLDlz5gyf+MQnbs07FhGRA2NXI6FHHnmEb37zm/z5n/85CwsLs3WepaUl+v0+xhhOnTrF448/zj333MM999zD448/zmAw4DOf+cx78h8gIiL7165C6Bvf+AYADz744Lbn/+RP/oR//s//OQBf+cpXGI/HfOELX+DKlSt8/OMf59lnn2VhYeGWvGERETk4bmqf0HtB+4RERPa3922fkIiIyM1QCImISGcUQiIi0hmFkIiIdEYhJCIinVEIiYhIZxRCIiLSGYWQiIh0RiEkIiKdUQiJiEhnFEIiItIZhZCIiHRGISQiIp1RCImISGcUQiIi0hmFkIiIdEYhJCIinVEIiYhIZxRCIiLSGYWQiIh0RiEkIiKdUQiJiEhnFEIiItIZhZCIiHRGISQiIp1RCImISGcUQiIi0hmFkIiIdEYhJCIinVEIiYhIZxRCIiLSGYWQiIh0RiEkIiKdUQiJiEhnFEIiItIZhZCIiHRGISQiIp1RCImISGcUQiIi0hmFkIiIdEYhJCIinVEIiYhIZxRCIiLSGYWQiIh0RiEkIiKdUQiJiEhnFEIiItIZhZCIiHRGISQiIp1RCImISGcUQiIi0hmFkIiIdEYhJCIinVEIiYhIZxRCIiLSGYWQiIh0RiEkIiKdUQiJiEhnFEIiItIZhZCIiHRGISQiIp1RCImISGd2HULPPfccv/7rv86JEycwxvBnf/Zn2z4eY+Sxxx7jxIkT9Pt9HnzwQV5++eVb9X5FROQA2XUIbWxs8JGPfISnn376uh9/8skneeqpp3j66ac5e/Ysx48f56GHHmI4HN70mxURkYMl2e0nfOpTn+JTn/rUdT8WY+TrX/86X/3qV/nN3/xNAP70T/+UY8eO8c1vfpPPf/7zN/duRUTkQLmla0KvvPIK58+f5+GHH549l+c5DzzwAM8///yt/FIiInIA7Hok9E7Onz8PwLFjx7Y9f+zYMV599dXrfk5RFBRFMfvz2trarXxLIiKyh70n1XHGmG1/jjFe89zUE088wdLS0uxx8uTJ9+ItiYjIHnRLQ+j48ePA5oho6sKFC9eMjqYeffRRVldXZ49z587dyrckIiJ72C0Nobvvvpvjx49z+vTp2XNlWXLmzBk+8YlPXPdz8jxncXFx20NERA6HXa8Jra+v83d/93ezP7/yyiu8+OKLHD16lA996EOcOnWKxx9/nHvuuYd77rmHxx9/nMFgwGc+85lb+sZFRGT/23UIvfDCC/yjf/SPZn/+8pe/DMDnPvc5/ut//a985StfYTwe84UvfIErV67w8Y9/nGeffZaFhYVb965FRORAMDHG2PWb2GptbY2lpSUe5NMkJu367YiIyC7VseI7/Dmrq6vvusSis+NERKQzCiEREemMQkhERDpzS09MuKWsA+Nu7u+I4TrP7aklMBGR7rzNIQKYmxyfxADXuf1ez54NIZMmGHMTby9EoA2xNoxiiGA2/6xAEpFDZxo8bdAYu/3PANi3CaedfokYoXj318EeDiHbz7Emu7FPDk24xBghhCZsZr9GiKYJJIKCSEQOD2PA2CZ4jAVrmiPVrG0+Zu3mEWs3EUQ22v0fQmZuDmPz3X/iNHCg+TVECB68Bx/Ae6L3GDwxWBREInIoTAPIuSZ8nAPnMM6Cc2Db309Dafo5N/KlQgErO3vtng2huDhPdDcYQtMRTwiY2kPtoa6bX6sSKtNcXB+IHhREInKgbQkg4yykKSZJIEkwiYMkgcQRE9cEkG3vkTcYQtGn8NrOXrtnQ6j8wICQ9Hb1OSbGZjEsRkyImDpgqoAta6hqTFlB4cCVxLLCUEEMGhGJyMF1vQDKUkyWQZ4Rs7R5pI6YWmJiidMQshBvIIjqeudFZXs2hMa3ZyTpLteEYsREMAGMj9gq4oqALTxuUmPHCcZaTDvUjNPPwbcjIhGRg8dY04xupgHU6xH7ObGXE/spvpfgc0vILCE1RGeIFqLhhkZDdbXD0jj2cAiN7rDY3ma1hrlqkBJN89z01+bJLQFUg60gKSLJxJGsO5LM4ZJmUc7AbMquqZpToYKIHDDtKAjnMEmyGUCDHnGQ4+cy6vmUemCpe5Y6N4QMQgLRNkFEm0Fb77VxWlAXt/9+qi53XuK9Z0NofDxie7sLBBOAANYbTAWuhGRsSEaGLGtSPrWGBJrpOt8Of9rg0fqQiBwY26bhHCbLMFnWjIAGOfVCTrWYUi44qjlDPTDUffAZxBSCi8103A1sGQqTnd9D92wIVcdKbH8X//XRNOtBwYA3mNLiJk0AJT1DSCG4Zp7SRMBHbIxNyG/d1Dot344KIxHZh64qwzZpOwLKM+g1AeTnc6qllGLRUS4aykVDPQd1P+J7kZgFcLF5GK6dinoXYVzu+LV7NoTuuH0NN7fDQnMgREOMhtpbytpRFin1JMFvOHxuiUk7tMRBhCxETGweTMPIGGJdq3xbRPanrQE0nYJLE0yvB72cMNfHz+eUi00AFcuGYtlQLUbqhUCcq0lyT5ZXZIkncQFjInaXIeQ3Cn6yw9fu2RD62SNvks3vrDAhtJOWVXCUwTGqM9bLnNVxj2GvR5VmYB3RmGbNKDhMSDEx4mAWQJg2vVW+LSL7zdVVcNMpuDyDfrMO5BdyqsWMctFRLDUBVC5F6mVPslgyPzdhqT9hPisYJCWZ9aS2Wbaw7Pw+WGYl39/ha/dsCP3fC6/Tm9/52wvR4jGMfM66z1mpBlzM53kzm+eSnaOiBzhMME0BQ0zaRTWDMwY73SlszWb5NlonEpF94O3KsHs9yDPCLIBSiqUmgMppAB2pyZYLji5ucGywzu29dZbTEfOuYOAKHBFrdl7tBjAx9Y5fu2dD6Gey15nLd1ZrHtrDwMvomMSUoe9zOZtjMVkiczXWRC5CE0RxNvYBkrYeHnCmqZrbUr4920ek8m0R2cvaKbhZAOUZJs83q+DaKbhyyxRcudyMgLLlgtuX1rlrYYUP9lY4nq9y1G2w4Mb0TEVmpiOhnQfRRrnzm+aeDaG7kjXmk50VJsym46JlEhPWbI8FNyY1fjaXGaLhUjRUMYfpJJyBaB3RZk3VXFsPP42o2J43Z4B4VSWdiEjnpvesdg1oNgKaBtBcj3o+21aEUBxpRkDVsiddKvjA0jon5lc52b/Ch/LLHEtXuM2tM2dKeqYmbUdBu5mOW08OwD6hoy6y4Hb6H928royeKlYMbEUvVDgijkiIZla4cBmoTA7GzergmyBqdghPL4iZnj83aUdFxranK2x5T1e3ilBAicitdvVm0S2nXc8q4K6agov9vAmgpZxyIaVYshRLlnKJ2RpQujzhtqUN7pxb48ODy3wov8zJ7BK3uzWWbcHAeFID2Q1sVs12fO/ewyE0Z1Lmd9nTojKeKgbSWJMywrVp3BxXuvl3XTaRyuREkzQVcca0G7ESiJFkeuxPOzVnKteMhLzfHjTTUm7YPJUbFEYicvO2tFzY1m6h/f3stOt2HxDTEdA0gBa2BNByG0DLkXq5Jltq1oA+OL/KhweX+WB+hRPpFW53axy1ExZsoGcMqbGk7L6vW9jFGtKeDaHcJOS7CKFAxGFIiThqsIFAgU/W8O0EmyNgTSSxgbdspLA9ok1opuZsUwrf5kcCGNce8VNVzQGoPmBi2GwVMQ2laZsI7xVGInJzrg4f57a1WzDtfkem7RicbQ4jTVNiL9uyETWZBVCx3ASQP1LRWyq4bWFjtgZ0sneZk+llbk82A2jOWHKTNEVbWCy7Gw3lByGEnLG4XYSQA3w0szUgT0WwHhhDwmxqLrGBxAQSG7hgI2PToyClXSCahRDG4BKLTZPm8NPpadzTU7qnrSGmbSKqelbaTTRNQBmjIBKRnbt6o+m01DpNtrdbcK55rbNgbXP6dZYSegl+kLUB5DYD6EjAL9cMjoy5Y3GdD86t8qH+Ze7MVpsRULLGbXa8LYBS47CYXd2Hp9wuMmvPhtCNcO26jTOGXhNL0AaRSwLOBFJTbytYuACMg6GMCUSDiaZZL3KGJLO4XootPabyTWsI3458at8EU1U3oyRXzX4fqxrjthQziIjs0Gz00242JU0waQpputluoW25EF0zQoqpI2QO33PUA0exuLkGVC1F/HJNf3nCHYvrnJy/wof6V7gru8zxdHW2BrRg/WwKrhkB3VgA7daBCqEpiyWdJbHHWo9lgiOSmvqa3b/ng6GgB7GZmovO4DND2re4wmHLiK0C1k9bRERM5ZtwKmsoK8ykJNpyNncbq1qHoorIzk0PG53u98lSSJvNprGXQZYSs4SQuabtQmIIzra/GkJuqHNL3TdU84ZycXMNqLdUzALo7sElPphd4YPpZW6zGyzZYrYG1DOuHQG99+EzdeBCaDoaYksQOQLOBpyZbNt0Na2aq4LlrWgogWgTQmrwuaGaM7jCYCuwdXsyd9siwpZNmwg3rnHjZNYWN9IcjtqsE2mPkYjs0Ja9Ps0IKMMMem27hQw/2NJyITeEpH04ml9T8HlzCGk9gGox4Bc9+fKE2xY2ODG3yof6V2YBdLsbsmxLFkykZ2xThNAG0Ps1CoIDGEKwGUQWhzUWi8ca36zf2BIY4qOlyh0eSx2bZbdLNjJJckLuqAcWVzQhZDzYymBrMDW4MuIKSMeBZGRJM4tzBmsMJkZi2FJJFzQaEpF3saXSjWmlW6/p9xPmc/x8RjWXUM01LRd8D3zaBE9MmtYLIYGQgc8jfhCI857+4oSj8yPuWljh5KCZgpsG0G22YGBgYB0pbrYGBLxvAQQHNIRgy0WMgdQ4HE2XwGkQBTckYAnREtqChsQGLqc1415OPU6oK4spDaY22KoJI1cabGFIJlBvWLKsmb7LaPoY4T2mrtvCBd8cA6TRkIi8C2MNxpjmwNEkIeYpYVrptpBQLFqq+c2WCyEDn0Wig5BGYhKJWYQskPRqBoOCo3Mj7hystQF0hePpKrfZjWYEZA25sfRM8r6PfrY6sCE0tW16DsegDSJvC0rW8Wlz0a2J9F3FfDbPSq/PRpFR1o6qcgTv8LUhlo6qMtiJJRkZ0sw0pwBhMT7BVIGkrJt+7a7t1S4ishOmqXSbnnxAnhH6CfWco1xoCg2qRajmI/UgEnoBsoBJAzaJOOdJU0+e1gyyiuXemNt769yZr25Wwbm1Zg3IRHLjOg8gOAQhBJtBlJqmjUPPRBZsILTl2wC5rVhwE46mG6z0BgzrnIlPKeqEwidM6oSiSpiUKcU4pVxPmioVpiMki5skuKw5Op3CbS40oqGQiLyDaQC0ZdikCSFL8L2EamApFwzVIhTLkXrRY+Zrev2KXtY8cufJXU2e1PRcxUJSsJyOuC3d4APpkDuSNY669bYKLjRrQLz/6z/XcyhCCLaXb6dYesTZPiKXBOZswaIds5IMGOY9Rj5nFDKKkFCGhPU6Y73KWS37XMn7rCV9KjJM5XCloRpbktwSModJmlr+aO3mhjLNyYnIO5lOx7lm30/MHb5nqfuWemCoFiL1kidZKllcGHF0MGYpG7OQFvRdRWZrclszsCUDV7BgJyy7UfOwIxZsua0M+2b2Ad1KhyaEpq5Xvp2aMXOmYsGOOerWmcS0eYSUKiZMYsooZFyp5rhYLvBGsogxkSu1pZ5Y6pHB5xByQ0zbGv52l7PKEURkx6YHkTpLSCw+t/ictuItYucrFhdGfHBxjTv7q9yerbOUjBjYkp6p6NmK1NTN703FnC2YMxUDWzMwcVsZ9l5xqELo7cq3MxPpmYqFWDGxBVW0lG3RQoljElKGoc+K22DgmsZ3hU8YTXImvYSQW3zWlEvGZPN4jelPNgoiEXk3ZrZPqN2AmlhCAj5rf8jtBfr9iqODMXf2V/lw7zLH0lVuS9YZmIKercjwWBPICKQm0GsPIe21M0BdlWG/k0MVQnBtEFksKYGUgDeRQfR4PAHwESoMlbUMw4SebQJo5DOuZH3eyuaYpL2mQqWt2Y+2qZab/YOiqXqJUUf4iMh1GLN5QKltjuKJSXMawnT/T0ibqrdeVnEkH3F7ts6xdJUPpldmU22pCc3ZmW0hsANSY5ozNU0TO1vPgtsLAQSHMITg6n1EkYAhNQ4fI8EEPNMeRBFPpIqe1EwAmLiMI+kGC2lBntaYzBNdslmn3x6j0UzJtZUuPqDiBBF5W2bLeXC2WU8OSVN9G5JmL5BJA/2sKTpYSkbclqy3xQbNhtMmcCzWTA9sNrPgAbYdRLpXAggOaQjB9n1Etj2qvDnOp/l9IIABHyOV8fjgqWzJgh0zsCV9V9FLamzS1udPj85IbXukRnvuk3NEW2OcU2M8Edk0bUjXtuSenhUXE0dMN0dCzWbUiE0CmfP0XcWCnTAwBXOmZsHE2YbTrYEztfUE7L0UPlOHNoSmtv5P2b5U5/Cxaf3QlHUHRibQs82CX9+W5K7GOk+dxtlu5ZAZQuaa07fTFNIK433bLnxL3yEFkcjhtfW07Om+oCyd/Roy19xL0nYklEYSF5oybNsUIDT3Ik9qzLYTD/Zi0LyTQx9C72RrWbeLhpSAozmJO7c1abs5rEpju3vZtNUsDttPsVW2rUPrtNVDU62tIBI5lKYB5DbbMsxacvcyQi9pjg7LLT43hCwS00iaenquvfcY3xQh0Ey7vZ+nXt9qCqF34YwlxIg1BmcgNZ6erZp6/KQkSzyjLFD3YnN67cCQzLkmgOomaKZBFMsKQ9X8XkEkcvhcHUBXt+Qe5E0/oHlH1R7P43MgC+RpRS+pGLimHNua0BQhmOnaz/4LIFAI7YoFMgI9UzWbwZKCubxkvV/jB456zlFNDK5sjvEh5rMLPG0V3kzLVc0J20GbWEUOlS0nZZOmmDxrRkCD3raOqOX89Jw48IPmLLi5tihhYEtSU5MR3seGC+8dhdAOOUxb8tiE0IKdsJyOWO6NWRvkDOcTqsJiS4PxhvZQOQCS6QJk++fYtgM3eJVuixwW01Ls9qTs2RTcoEec621pye2ac+IWoFoIxPnmMNLl3pjldMS8mzBnC1ITcDT3pv1MIbRDzUkLhp7xzNmCZTfiSDri9t4664OcqkqY1IYytI3xjGk7hhswZnNEFELb3qEtUlDjO5GDb2vDuiTBZNnmFNxcj3opp1xIKZbajqjLTUM6v+TpLzSnYd+er3MkGbFox+2JCE1RwvvZgO69oBDaAdsu/LloSE1kzlQsuxEfSIYM8x7jubRpjBcMZQRI2vJLSzRgYgIxkoTQdGaNsdkw2wbPbH0IFEYiB8m0T9B0HShtDjg2eQZ5NhsBzQJouWnJPe2Imi81/YCODYYcy9f4QDpk2Y2YMxWp2V6UsF8phHYhNc3BpwNbsxxH3J4MqWIy69BqgLdMpDA9om1GRBjbDHbitOMq2Bjb6bgtolH5tshBclUZ9rRlt+n1oN8jDHr4+ekUXBNAxXI7Alqu6bUdUe9aWOFk/wp3ZqvckayxbEcMbD07iHS/UwjtULPbOJISGJhAZUtuT9Y2P24iiQkkNnDBRsa2R0EKGEwwmOAwIWvCKLajoS1nRcW6btaIgkVBJLLPbamCw5rNKbg8g36POOjhF3LKxZRi0bUhBOWRgF+uGRwZc3vbknvakG7aD2jBlgxMJG3vSpqOOwTeqQ0ECTgTmnJJ2s2twAVgHNs1omgwgTaIUkyMOJoDC2ejIWuhqrSPSGS/e7sy7CyDXk6Y6+MXcqrFlHLRUSwZyiWolpoRUH95wh2L65ycv8KH+k1L7uPpKre7tbYf0GY7hv28P2hKIbQL12sDYRm1m8YCqfGzEAI4HwxF6GFiggmmqc8mIZr2YEFjsMY0Py1NJteWbyuIRPaXnewDms+pFrPNAFo2lEvNGlBvqZgF0N2DS3wwu8IH08vcZjeajqg2bGvHsN9HQaAQ2rG3awOBDTgzaTeONcUF0zWiKlguBkMVDQSHiQYTIZpk1uoB15RtXrd8W1uIRPYdY9vv7a0B1O4D8vPNFNw0gIoj0wDyZEsFt7VTcB/qX+FD2SWOpyvc7oazQ0p7Zm+2Y7gZCqFduF4bCGs8LniwJTAEmhDyWOpoCdFwKRqqmINxRGMIDqJ1RAupYXv5tvcQ42b5tpJIZP+YlmG3h5GaLJuNgOqFnGppugbUjoCWI9WyJ12ecHSxLUIYTKfgmgC6zRYMDNsOKT0oAQQKoV27ug0EEQYWaIMoxA2qNKGKCXVoQihGw2WgMm0QWdPuXG02tJoQcT5iag+1b1o/eN90fzDazCqyL0zLsacbUpOkKcPuTafg0nYjqqFY3hwBpcsTblva4IPzq5zsby1CaEdA1pAbS88ke7Ydw81QCN2ArW0gUuOaHcttEHlb4FnDpxa/pQjbmMglE6noEWmn5gJY77Blgq0CsUwxRdn0IWqn6zQQEtk/TNtN2TiLSRwxS4n9lHouoVxwFItbAuhITbpUzALow4PLfDBvAug2t86CqVgwkdy4bQF0UMJnSiF0E7ZNz+HomciCDQQKfLK2LYSsiVgTuQhU9JpKudpgK3ClwxUJdpQ0Pz0511TLicj+Y9sGdVlKzFJ8L6Gac1RzhmrBUE3XgJYLPrC0vi2ATqaXuT2ZVsGFZg2Ig7P+cz0KoZs0DaLUOALh2vJtIo7N6TQfLG8FS13luMJRTwz1yJLkFpcluMSBdZt7iNSRVWT/MNNZjOZ8uJg7fG6pe4Z6YKjnoJ4PJIslRxc3R0Afyi83U3DJGrfZ8bYy7P3aJ2inFEK3wNYganhog8gloX2mGRWVPqGoElYmCfXIUo8MdW4ImW26KSbN5jaNhET2KWsxzhJd02U5tH2B6j7Ug0icq1mYH3Pn3Bon+1f4UH6Zk9mlbfuABtvKsA9uAIFC6Ja6/j6iyWxqroqOtbrPSr/Peq+H7yX4affE1BAT2/wDtu0pCrYdDWlhSGTvM7Y5HcGYdjTUBFFIDT6jefQCab9iqT/h9t46x/NVjqUr3O7WOGonLNjA3FVl2AedQugWuV75tqMGG6iYMLEpQ7fRHMWeFWR5xSjLiKlt2ve6NnTs/j2IUETYnMlwlmgNwRlCYogpxCySZZ6FrGA5HXPUbXCbW5+tAc0ZS26SA1eG/U4UQrfQNeXbgKdiwdSM7IQFN2beFZsdWV0kuEh0zd4htvwEpTAS2edMUzUbbdNeLCQRXCRLmq7MC665JyzYCQPTrAHlJplNwcHBKcN+JwqhW2xr+fb0rLnUeHqmbnqA2IrMeqwNYOPsH+n0H+wsiERk/2q/h+NsWr39PneRxAUyW5PbaktfIA5FEcL1HJ7/0veZM81gOsWRGUNqApnxpMaTWo/bFkAQTfMPVkQOhmljy+b3NL83EWcDqWnOmsyMxxGbewSHL4BAIfSeul6jKWsClmbPEEYnIYgceGbzsXmoQrN1w9LeD7p8fx07zP/t7yvb/oO7nqgBkIgcUgqhPUADIhE5rBRCIiLSGYWQiIh05j0Lof/wH/4Dd999N71ej49+9KP87//9v9+rLyUiIvvUexJC/+N//A9OnTrFV7/6VX7wgx/wD//hP+RTn/oUP/7xj9+LLyciIvvUexJCTz31FP/iX/wL/uW//Jf83M/9HF//+tc5efIk3/jGN96LLyciIvvULQ+hsiz53ve+x8MPP7zt+Ycffpjnn3/+Vn+5A0El2iJyWN3yY3veeustvPccO3Zs2/PHjh3j/Pnz17y+KAqKopj9eW1t7Va/JRER2aPes8IEc9URNDHGa54DeOKJJ1haWpo9Tp48+V69JRER2WNueQh94AMfwDl3zajnwoUL14yOAB599FFWV1dnj3Pnzt3qt7TnabOqiBxWt3w6LssyPvrRj3L69Gn+8T/+x7PnT58+zac//elrXp/nOXmez/4cY3NHXlu//hE3+4mPgSIGNmJg3Rs2as+krCnXS/xGQRhPCJOALwx1FajrEusLTCiIsSTEihhrNbUT2Q9iwMSIjRYTCoLPqGtLXQV8YQmTSBg33/tlVjKhZqP0rCeBnovUJpCbgDsAa8TT+/f0fv6O4nvgmWeeiWmaxv/yX/5L/Nu//dt46tSpODc3F//+7//+XT/33LlzEdBDDz300GOfP86dO/eu9/z3pJ/QP/kn/4RLly7xb/7Nv+GNN97g3nvv5X/9r//Fhz/84Xf93BMnTnDu3DkWFhYwxrC2tsbJkyc5d+4ci4uL78XbPRB0nXZG12lndJ12Rtfp+mKMDIdDTpw48a6vNTHuZLzUnbW1NZaWllhdXdX/5Heg67Qzuk47o+u0M7pON09nx4mISGcUQiIi0pk9H0J5nvMHf/AH2yro5Fq6Tjuj67Qzuk47o+t08/b8mpCIiBxce34kJCIiB5dCSEREOqMQEhGRziiERESkM3s+hNQmfLvnnnuOX//1X+fEiRMYY/izP/uzbR+PMfLYY49x4sQJ+v0+Dz74IC+//HI3b7YjTzzxBL/4i7/IwsICd9xxB7/xG7/Bj370o22v0XWCb3zjG9x3330sLi6yuLjI/fffz1/+5V/OPq5rdH1PPPEExhhOnTo1e07X6sbt6RBSm/BrbWxs8JGPfISnn376uh9/8skneeqpp3j66ac5e/Ysx48f56GHHmI4HL7P77Q7Z86c4ZFHHuG73/0up0+fpq5rHn74YTY2Nmav0XWCu+66i6997Wu88MILvPDCC/zKr/wKn/70p2c3T12ja509e5Y//uM/5r777tv2vK7VTbiJc0rfc//gH/yD+Nu//dvbnvvZn/3Z+K/+1b/q6B3tLUD89re/PftzCCEeP348fu1rX5s9N5lM4tLSUvyP//E/dvAO94YLFy5EIJ45cybGqOv0To4cORL/83/+z7pG1zEcDuM999wTT58+HR944IH4pS99Kcaof083a8+OhNQmfPdeeeUVzp8/v+2a5XnOAw88cKiv2erqKgBHjx4FdJ2ux3vPM888w8bGBvfff7+u0XU88sgj/Nqv/Rq/+qu/uu15Xaub856con0r7LZNuDC7Lte7Zq+++moXb6lzMUa+/OUv80u/9Evce++9gK7TVi+99BL3338/k8mE+fl5vv3tb/PzP//zs5unrlHjmWee4fvf/z5nz5695mP693Rz9mwITe20Tbhs0jXb9MUvfpEf/vCH/J//83+u+ZiuE/zMz/wML774IisrK/zP//k/+dznPseZM2dmH9c1gnPnzvGlL32JZ599ll6v97av07W6MXt2Om63bcIFjh8/DqBr1vrd3/1d/uIv/oK/+Zu/4a677po9r+u0Kcsyfvqnf5qPfexjPPHEE3zkIx/hj/7oj3SNtvje977HhQsX+OhHP0qSJCRJwpkzZ/h3/+7fkSTJ7HroWt2YPRtCW9uEb3X69Gk+8YlPdPSu9ra7776b48ePb7tmZVly5syZQ3XNYox88Ytf5Fvf+hZ//dd/zd13373t47pOby/GSFEUukZbfPKTn+Sll17ixRdfnD0+9rGP8dnPfpYXX3yRn/qpn9K1uhnd1US8u5tpE35QDYfD+IMf/CD+4Ac/iEB86qmn4g9+8IP46quvxhhj/NrXvhaXlpbit771rfjSSy/Ff/pP/2m8884749raWsfv/P3zO7/zO3FpaSl+5zvfiW+88cbsMRqNZq/RdYrx0Ucfjc8991x85ZVX4g9/+MP4+7//+9FaG5999tkYo67RO9laHRejrtXN2NMhFGOM//7f//v44Q9/OGZZFn/hF35hVmZ7WP3N3/zNdXu5f+5zn4sxNuWif/AHfxCPHz8e8zyPv/zLvxxfeumlbt/0++x61weIf/InfzJ7ja5TjL/1W781+966/fbb4yc/+clZAMWoa/ROrg4hXasbp1YOIiLSmT27JiQiIgefQkhERDqjEBIRkc4ohEREpDMKIRER6YxCSEREOqMQEhGRziiERESkMwohERHpjEJIREQ6oxASEZHOKIRERKQz/x8yyf41ki+eawAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "i = 251\n", - "plt.imshow(np.array(df_design['Class threshold'][(i*2500):(i*2500+2500)]).reshape(50,50), interpolation='bicubic', origin='lower')" + "plot_simulation(df_results, 100)" ] }, { @@ -832,11 +513,25 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 74, "metadata": {}, "outputs": [], "source": [ - "X_train, X_test, y_train, y_test = sk.train_test_split(df_design, df_results, test_size = 0.2)" + "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)" ] }, { @@ -846,89 +541,6 @@ "## Perform Over and Under Sampling on dataset to balance classes" ] }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def balancer(design, target, strategy, sample_fraction=0.5):\n", - " counter = Counter(design.iloc[:,-1])\n", - " print(\"Amount class 0 before:\", counter[0] / (counter[0] + counter[1]) )\n", - " print(\"Amount class 1 before:\", counter[1] / (counter[0] + counter[1]) )\n", - " \n", - " number_features = (df_design.columns != \"Class\").sum()\n", - " if(\"Class\" not in design.columns):\n", - " if(\"Class\" in target.columns):\n", - " classes = target['Class']\n", - " else:\n", - " raise(\"No class column found\")\n", - " else:\n", - " classes = design['Class']\n", - " df = pd.concat([design.loc[:,design.columns != \"Class\"], target.loc[:, design.columns != \"Class\"], classes], axis=1)\n", - " \n", - " if strategy == 'smote':\n", - " print(\"Using SMOTE strategy\")\n", - " smote = SMOTE(sampling_strategy=sample_fraction)\n", - " df_resampled, classes_resampled = smote.fit_resample(df.loc[:, df.columns != \"Class\"], df.loc[:, df.columns == \"Class\"])\n", - " \n", - " elif strategy == 'over':\n", - " print(\"Using Oversampling\")\n", - " over = RandomOverSampler()\n", - " df_resampled, classes_resampled = over.fit_resample(df.loc[:, df.columns != \"Class\"], df.loc[:, df.columns == \"Class\"])\n", - " \n", - " elif strategy == 'under':\n", - " print(\"Using Undersampling\")\n", - " under = RandomUnderSampler()\n", - " df_resampled, classes_resampled = under.fit_resample(df.loc[:, df.columns != \"Class\"], df.loc[:, df.columns == \"Class\"])\n", - "\n", - " counter = Counter(classes_resampled[\"Class\"])\n", - " print(\"Amount class 0 after:\", counter[0] / (counter[0] + counter[1]) )\n", - " print(\"Amount class 1 after:\", counter[1] / (counter[0] + counter[1]) )\n", - " \n", - " design_resampled = pd.concat([df_resampled.iloc[:,0:number_features], classes_resampled], axis=1)\n", - " target_resampled = pd.concat([df_resampled.iloc[:,number_features:], classes_resampled], axis=1)\n", - " \n", - " return design_resampled, target_resampled " - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Amount class 0 before: 0.9563730158730158\n", - "Amount class 1 before: 0.043626984126984125\n" - ] - }, - { - "ename": "IndexError", - "evalue": "Boolean index has wrong length: 11 instead of 10", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[32], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m X_train, y_train \u001b[38;5;241m=\u001b[39m \u001b[43mbalancer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mover\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[0;32mIn[31], line 14\u001b[0m, in \u001b[0;36mbalancer\u001b[0;34m(design, target, strategy, sample_fraction)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 13\u001b[0m classes \u001b[38;5;241m=\u001b[39m design[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m---> 14\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mconcat([design\u001b[38;5;241m.\u001b[39mloc[:,design\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], \u001b[43mtarget\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mloc\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdesign\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m!=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mClass\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m, classes], axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m strategy \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msmote\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 17\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUsing SMOTE strategy\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m~/miniconda3/envs/ai/lib/python3.11/site-packages/pandas/core/indexing.py:1184\u001b[0m, in \u001b[0;36m_LocationIndexer.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1182\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_is_scalar_access(key):\n\u001b[1;32m 1183\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj\u001b[38;5;241m.\u001b[39m_get_value(\u001b[38;5;241m*\u001b[39mkey, takeable\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_takeable)\n\u001b[0;32m-> 1184\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_getitem_tuple\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1185\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1186\u001b[0m \u001b[38;5;66;03m# we by definition only have the 0th axis\u001b[39;00m\n\u001b[1;32m 1187\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxis \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;241m0\u001b[39m\n", - "File \u001b[0;32m~/miniconda3/envs/ai/lib/python3.11/site-packages/pandas/core/indexing.py:1377\u001b[0m, in \u001b[0;36m_LocIndexer._getitem_tuple\u001b[0;34m(self, tup)\u001b[0m\n\u001b[1;32m 1374\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_multi_take_opportunity(tup):\n\u001b[1;32m 1375\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_multi_take(tup)\n\u001b[0;32m-> 1377\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_getitem_tuple_same_dim\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtup\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/ai/lib/python3.11/site-packages/pandas/core/indexing.py:1020\u001b[0m, in \u001b[0;36m_LocationIndexer._getitem_tuple_same_dim\u001b[0;34m(self, tup)\u001b[0m\n\u001b[1;32m 1017\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m com\u001b[38;5;241m.\u001b[39mis_null_slice(key):\n\u001b[1;32m 1018\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[0;32m-> 1020\u001b[0m retval \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mretval\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_getitem_axis\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mi\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1021\u001b[0m \u001b[38;5;66;03m# We should never have retval.ndim < self.ndim, as that should\u001b[39;00m\n\u001b[1;32m 1022\u001b[0m \u001b[38;5;66;03m# be handled by the _getitem_lowerdim call above.\u001b[39;00m\n\u001b[1;32m 1023\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m retval\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mndim\n", - "File \u001b[0;32m~/miniconda3/envs/ai/lib/python3.11/site-packages/pandas/core/indexing.py:1413\u001b[0m, in \u001b[0;36m_LocIndexer._getitem_axis\u001b[0;34m(self, key, axis)\u001b[0m\n\u001b[1;32m 1411\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_slice_axis(key, axis\u001b[38;5;241m=\u001b[39maxis)\n\u001b[1;32m 1412\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m com\u001b[38;5;241m.\u001b[39mis_bool_indexer(key):\n\u001b[0;32m-> 1413\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_getbool_axis\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1414\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m is_list_like_indexer(key):\n\u001b[1;32m 1415\u001b[0m \u001b[38;5;66;03m# an iterable multi-selection\u001b[39;00m\n\u001b[1;32m 1416\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28misinstance\u001b[39m(key, \u001b[38;5;28mtuple\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(labels, MultiIndex)):\n", - "File \u001b[0;32m~/miniconda3/envs/ai/lib/python3.11/site-packages/pandas/core/indexing.py:1209\u001b[0m, in \u001b[0;36m_LocationIndexer._getbool_axis\u001b[0;34m(self, key, axis)\u001b[0m\n\u001b[1;32m 1205\u001b[0m \u001b[38;5;129m@final\u001b[39m\n\u001b[1;32m 1206\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_getbool_axis\u001b[39m(\u001b[38;5;28mself\u001b[39m, key, axis: AxisInt):\n\u001b[1;32m 1207\u001b[0m \u001b[38;5;66;03m# caller is responsible for ensuring non-None axis\u001b[39;00m\n\u001b[1;32m 1208\u001b[0m labels \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj\u001b[38;5;241m.\u001b[39m_get_axis(axis)\n\u001b[0;32m-> 1209\u001b[0m key \u001b[38;5;241m=\u001b[39m \u001b[43mcheck_bool_indexer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1210\u001b[0m inds \u001b[38;5;241m=\u001b[39m key\u001b[38;5;241m.\u001b[39mnonzero()[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 1211\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj\u001b[38;5;241m.\u001b[39m_take_with_is_copy(inds, axis\u001b[38;5;241m=\u001b[39maxis)\n", - "File \u001b[0;32m~/miniconda3/envs/ai/lib/python3.11/site-packages/pandas/core/indexing.py:2681\u001b[0m, in \u001b[0;36mcheck_bool_indexer\u001b[0;34m(index, key)\u001b[0m\n\u001b[1;32m 2677\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_array_like(result):\n\u001b[1;32m 2678\u001b[0m \u001b[38;5;66;03m# GH 33924\u001b[39;00m\n\u001b[1;32m 2679\u001b[0m \u001b[38;5;66;03m# key may contain nan elements, check_array_indexer needs bool array\u001b[39;00m\n\u001b[1;32m 2680\u001b[0m result \u001b[38;5;241m=\u001b[39m pd_array(result, dtype\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mbool\u001b[39m)\n\u001b[0;32m-> 2681\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcheck_array_indexer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mindex\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mresult\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/ai/lib/python3.11/site-packages/pandas/core/indexers/utils.py:539\u001b[0m, in \u001b[0;36mcheck_array_indexer\u001b[0;34m(array, indexer)\u001b[0m\n\u001b[1;32m 537\u001b[0m \u001b[38;5;66;03m# GH26658\u001b[39;00m\n\u001b[1;32m 538\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(indexer) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mlen\u001b[39m(array):\n\u001b[0;32m--> 539\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mIndexError\u001b[39;00m(\n\u001b[1;32m 540\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBoolean index has wrong length: \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 541\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(indexer)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m instead of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(array)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 542\u001b[0m )\n\u001b[1;32m 543\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m is_integer_dtype(dtype):\n\u001b[1;32m 544\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "\u001b[0;31mIndexError\u001b[0m: Boolean index has wrong length: 11 instead of 10" - ] - } - ], - "source": [ - "X_train, y_train = balancer(X_train, y_train, 'over')" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -936,619 +548,6 @@ "## Define Scaling and Normalization Functions" ] }, - { - "cell_type": "code", - "execution_count": 88, - "metadata": {}, - "outputs": [], - "source": [ - "def log_scale(df_design, df_result, func_dict):\n", - " \n", - " df_design = df_design.copy()\n", - " df_result = df_result.copy()\n", - " \n", - " for key in df_design.keys():\n", - " if key != \"Class\":\n", - " df_design[key] = np.vectorize(func_dict[key])(df_design[key])\n", - " df_result[key] = np.vectorize(func_dict[key])(df_result[key])\n", - " \n", - " return df_design, df_result\n", - "\n", - "# Get minimum and maximum values for each column\n", - "def get_min_max(df_design, df_result):\n", - " \n", - " min_vals_des = df_design.min()\n", - " max_vals_des = df_design.max()\n", - " \n", - " min_vals_res = df_result.min()\n", - " max_vals_res = df_result.max()\n", - "\n", - " # minimum of input and output data to get global minimum/maximum\n", - " data_min = np.minimum(min_vals_des, min_vals_res).to_dict()\n", - " data_max = np.maximum(max_vals_des, max_vals_res).to_dict()\n", - "\n", - " return data_min, data_max\n" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [], - "source": [ - "df_design_log, df_results_log = log_scale(df_design, df_results, func_dict_in)\n", - "data_min_log, data_max_log = get_min_max(df_design_log, df_results_log)" - ] - }, - { - "cell_type": "code", - "execution_count": 102, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
HOChargeH_0_O_0_BaClS_2_S_6_SrBariteCelestite
0111.01243455.508192-7.779554e-092.697041e-262.210590e-152.041069e-024.082138e-020.000000e+000.0004940.0004940.0011.000000
1111.01243455.508427-4.736083e-091.446346e-262.473481e-151.094567e-022.189133e-020.000000e+000.0005530.0005530.0011.000000
2111.01243455.508691-1.311169e-093.889826e-282.769320e-152.943745e-045.887491e-040.000000e+000.0006190.0006190.0011.000000
3111.01243455.508698-1.220023e-091.442658e-292.777193e-151.091776e-052.183551e-050.000000e+000.0006200.0006200.0011.000000
4111.01243455.508699-1.216643e-095.350528e-312.777485e-154.049176e-078.098352e-070.000000e+000.0006200.0006200.0011.000000
.......................................
2502495111.01243455.5074883.573728e-095.424062e-1451.375204e-109.953520e-072.266555e-035.509534e-1490.0003180.0014500.0011.000014
2502496111.01243455.5075013.494007e-092.011675e-1461.377139e-109.817216e-072.217997e-032.043375e-1500.0003210.0014290.0011.000010
2502497111.01243455.5075123.429764e-097.460897e-1481.377819e-109.706451e-072.179066e-037.578467e-1520.0003240.0014120.0011.000006
2502498111.01243455.5075203.381745e-092.767237e-1491.371144e-109.621074e-072.149820e-032.810844e-1530.0003260.0014000.0011.000004
2502499111.01243455.5075253.348864e-095.321610e-1511.376026e-109.564401e-072.129912e-035.405468e-1550.0003270.0013910.0011.000001
\n", - "

2502500 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " H O Charge H_0_ O_0_ \\\n", - "0 111.012434 55.508192 -7.779554e-09 2.697041e-26 2.210590e-15 \n", - "1 111.012434 55.508427 -4.736083e-09 1.446346e-26 2.473481e-15 \n", - "2 111.012434 55.508691 -1.311169e-09 3.889826e-28 2.769320e-15 \n", - "3 111.012434 55.508698 -1.220023e-09 1.442658e-29 2.777193e-15 \n", - "4 111.012434 55.508699 -1.216643e-09 5.350528e-31 2.777485e-15 \n", - "... ... ... ... ... ... \n", - "2502495 111.012434 55.507488 3.573728e-09 5.424062e-145 1.375204e-10 \n", - "2502496 111.012434 55.507501 3.494007e-09 2.011675e-146 1.377139e-10 \n", - "2502497 111.012434 55.507512 3.429764e-09 7.460897e-148 1.377819e-10 \n", - "2502498 111.012434 55.507520 3.381745e-09 2.767237e-149 1.371144e-10 \n", - "2502499 111.012434 55.507525 3.348864e-09 5.321610e-151 1.376026e-10 \n", - "\n", - " Ba Cl S_2_ S_6_ Sr \\\n", - "0 2.041069e-02 4.082138e-02 0.000000e+00 0.000494 0.000494 \n", - "1 1.094567e-02 2.189133e-02 0.000000e+00 0.000553 0.000553 \n", - "2 2.943745e-04 5.887491e-04 0.000000e+00 0.000619 0.000619 \n", - "3 1.091776e-05 2.183551e-05 0.000000e+00 0.000620 0.000620 \n", - "4 4.049176e-07 8.098352e-07 0.000000e+00 0.000620 0.000620 \n", - "... ... ... ... ... ... \n", - "2502495 9.953520e-07 2.266555e-03 5.509534e-149 0.000318 0.001450 \n", - "2502496 9.817216e-07 2.217997e-03 2.043375e-150 0.000321 0.001429 \n", - "2502497 9.706451e-07 2.179066e-03 7.578467e-152 0.000324 0.001412 \n", - "2502498 9.621074e-07 2.149820e-03 2.810844e-153 0.000326 0.001400 \n", - "2502499 9.564401e-07 2.129912e-03 5.405468e-155 0.000327 0.001391 \n", - "\n", - " Barite Celestite \n", - "0 0.001 1.000000 \n", - "1 0.001 1.000000 \n", - "2 0.001 1.000000 \n", - "3 0.001 1.000000 \n", - "4 0.001 1.000000 \n", - "... ... ... \n", - "2502495 0.001 1.000014 \n", - "2502496 0.001 1.000010 \n", - "2502497 0.001 1.000006 \n", - "2502498 0.001 1.000004 \n", - "2502499 0.001 1.000001 \n", - "\n", - "[2502500 rows x 12 columns]" - ] - }, - "execution_count": 102, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_design" - ] - }, - { - "cell_type": "code", - "execution_count": 103, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
HOChargeH_0_O_0_BaClS_2_S_6_SrBariteCelestite
04.718614.0343868.1090452.697041e-262.210590e-152.020518e-024.001019e-020.000000e+000.0004940.0004940.0010000.693147
14.718614.0343908.3245811.446346e-262.473481e-151.088620e-022.165516e-020.000000e+000.0005520.0005520.0010000.693147
24.718614.0343948.8823413.889826e-282.769320e-152.943312e-045.885758e-040.000000e+000.0006180.0006180.0010000.693147
34.718614.0343958.9136321.442658e-292.777193e-151.091770e-052.183528e-050.000000e+000.0006200.0006200.0010000.693147
44.718614.0343958.9148375.350528e-312.777485e-154.049175e-078.098349e-070.000000e+000.0006200.0006200.0010000.693147
.......................................
25024954.718614.034373-8.4468785.424062e-1451.375204e-109.953515e-072.263990e-035.509534e-1490.0003180.0014490.0009990.693154
25024964.718614.034373-8.4566762.011675e-1461.377139e-109.817211e-072.215541e-032.043375e-1500.0003210.0014280.0009990.693152
25024974.718614.034374-8.4647367.460897e-1481.377819e-109.706446e-072.176695e-037.578467e-1520.0003240.0014110.0009990.693150
25024984.718614.034374-8.4708592.767237e-1491.371144e-109.621070e-072.147512e-032.810844e-1530.0003260.0013990.0009990.693149
25024994.718614.034374-8.4751025.321610e-1511.376026e-109.564396e-072.127647e-035.405468e-1550.0003270.0013900.0009990.693148
\n", - "

2502500 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " H O Charge H_0_ O_0_ \\\n", - "0 4.71861 4.034386 8.109045 2.697041e-26 2.210590e-15 \n", - "1 4.71861 4.034390 8.324581 1.446346e-26 2.473481e-15 \n", - "2 4.71861 4.034394 8.882341 3.889826e-28 2.769320e-15 \n", - "3 4.71861 4.034395 8.913632 1.442658e-29 2.777193e-15 \n", - "4 4.71861 4.034395 8.914837 5.350528e-31 2.777485e-15 \n", - "... ... ... ... ... ... \n", - "2502495 4.71861 4.034373 -8.446878 5.424062e-145 1.375204e-10 \n", - "2502496 4.71861 4.034373 -8.456676 2.011675e-146 1.377139e-10 \n", - "2502497 4.71861 4.034374 -8.464736 7.460897e-148 1.377819e-10 \n", - "2502498 4.71861 4.034374 -8.470859 2.767237e-149 1.371144e-10 \n", - "2502499 4.71861 4.034374 -8.475102 5.321610e-151 1.376026e-10 \n", - "\n", - " Ba Cl S_2_ S_6_ Sr \\\n", - "0 2.020518e-02 4.001019e-02 0.000000e+00 0.000494 0.000494 \n", - "1 1.088620e-02 2.165516e-02 0.000000e+00 0.000552 0.000552 \n", - "2 2.943312e-04 5.885758e-04 0.000000e+00 0.000618 0.000618 \n", - "3 1.091770e-05 2.183528e-05 0.000000e+00 0.000620 0.000620 \n", - "4 4.049175e-07 8.098349e-07 0.000000e+00 0.000620 0.000620 \n", - "... ... ... ... ... ... \n", - "2502495 9.953515e-07 2.263990e-03 5.509534e-149 0.000318 0.001449 \n", - "2502496 9.817211e-07 2.215541e-03 2.043375e-150 0.000321 0.001428 \n", - "2502497 9.706446e-07 2.176695e-03 7.578467e-152 0.000324 0.001411 \n", - "2502498 9.621070e-07 2.147512e-03 2.810844e-153 0.000326 0.001399 \n", - "2502499 9.564396e-07 2.127647e-03 5.405468e-155 0.000327 0.001390 \n", - "\n", - " Barite Celestite \n", - "0 0.001000 0.693147 \n", - "1 0.001000 0.693147 \n", - "2 0.001000 0.693147 \n", - "3 0.001000 0.693147 \n", - "4 0.001000 0.693147 \n", - "... ... ... \n", - "2502495 0.000999 0.693154 \n", - "2502496 0.000999 0.693152 \n", - "2502497 0.000999 0.693150 \n", - "2502498 0.000999 0.693149 \n", - "2502499 0.000999 0.693148 \n", - "\n", - "[2502500 rows x 12 columns]" - ] - }, - "execution_count": 103, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_design_log" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [], - "source": [ - "X_train_log, y_train_log = log_scale(X_train, y_train, func_dict_in)\n", - "X_test_log, y_test_log = log_scale(X_test, y_test, func_dict_in)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "train_min_log, train_max_log = get_min_max(X_train_log, y_train_log)\n", - "test_min_log, test_max_log = get_min_max(X_test_log, y_test_log)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def preprocess(data, func_dict, data_min, data_max):\n", - " data = data.copy()\n", - " for key in data.keys():\n", - " if key != \"Class\":\n", - " data[key] = (data[key] - data_min[key]) / (data_max[key] - data_min[key])\n", - "\n", - " return data\n", - "\n", - "def postprocess(data, func_dict, data_min, data_max):\n", - " data = data.copy()\n", - " for key in data.keys():\n", - " if key != \"Class\":\n", - " data[key] = data[key] * (data_max[key] - data_min[key]) + data_min[key]\n", - " data[key] = np.vectorize(func_dict[key])(data[key])\n", - " return data" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1556,29 +555,6 @@ "## Preprocess the data" ] }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "pp_design = preprocess(df_design_log, func_dict_in, data_min_log, data_max_log)\n", - "pp_results = preprocess(df_results_log, func_dict_in, data_min_log, data_max_log)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "X_train_preprocess = preprocess(X_train_log, func_dict_in, train_min_log, train_max_log)\n", - "y_train_preprocess = preprocess(y_train_log, func_dict_in, train_min_log, train_max_log)\n", - "\n", - "X_test_preprocess = preprocess(X_test_log, func_dict_in, test_min_log, test_max_log)\n", - "y_test_preprocess = preprocess(y_test_log, func_dict_in, test_min_log, test_max_log)" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1586,15 +562,6 @@ "## Sample the data" ] }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [], - "source": [ - "X_train, X_val, y_train, y_val = sk.train_test_split(X_train_preprocess, y_train_preprocess, test_size = 0.1)" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -1627,39 +594,60 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Epoch 1/5\n" + "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": "ValueError", - "evalue": "Attr 'Toutput_types' of 'OptionalFromValue' Op passed list of length 0 less than minimum 1.", + "ename": "KeyboardInterrupt", + "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[71], 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 \u001b[43mmodel_simple\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miloc\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miloc\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43mepochs\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalidation_data\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_val\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miloc\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m:\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_val\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miloc\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[43m)\u001b[49m\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~/miniconda3/envs/ai/lib/python3.11/site-packages/keras/src/utils/traceback_utils.py:122\u001b[0m, in \u001b[0;36mfilter_traceback..error_handler\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 119\u001b[0m filtered_tb \u001b[38;5;241m=\u001b[39m _process_traceback_frames(e\u001b[38;5;241m.\u001b[39m__traceback__)\n\u001b[1;32m 120\u001b[0m \u001b[38;5;66;03m# To get the full stack trace, call:\u001b[39;00m\n\u001b[1;32m 121\u001b[0m \u001b[38;5;66;03m# `keras.config.disable_traceback_filtering()`\u001b[39;00m\n\u001b[0;32m--> 122\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\u001b[38;5;241m.\u001b[39mwith_traceback(filtered_tb) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 124\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m filtered_tb\n", - "File \u001b[0;32m~/miniconda3/envs/ai/lib/python3.11/site-packages/keras/src/backend/tensorflow/trainer.py:131\u001b[0m, in \u001b[0;36mTensorFlowTrainer._make_function..multi_step_on_iterator\u001b[0;34m(iterator)\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[38;5;129m@tf\u001b[39m\u001b[38;5;241m.\u001b[39mautograph\u001b[38;5;241m.\u001b[39mexperimental\u001b[38;5;241m.\u001b[39mdo_not_convert\n\u001b[1;32m 129\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmulti_step_on_iterator\u001b[39m(iterator):\n\u001b[1;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msteps_per_execution \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m--> 131\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mtf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexperimental\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mOptional\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_value\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 132\u001b[0m \u001b[43m \u001b[49m\u001b[43mone_step_on_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43miterator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_next\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 133\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 135\u001b[0m \u001b[38;5;66;03m# the spec is set lazily during the tracing of `tf.while_loop`\u001b[39;00m\n\u001b[1;32m 136\u001b[0m empty_outputs \u001b[38;5;241m=\u001b[39m tf\u001b[38;5;241m.\u001b[39mexperimental\u001b[38;5;241m.\u001b[39mOptional\u001b[38;5;241m.\u001b[39mempty(\u001b[38;5;28;01mNone\u001b[39;00m)\n", - "\u001b[0;31mValueError\u001b[0m: Attr 'Toutput_types' of 'OptionalFromValue' Op passed list of length 0 less than minimum 1." + "\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": [ - "# measure time\n", + "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.iloc[:, :-1], \n", - " y_train.iloc[:, :-1], \n", + "history = model_simple.fit(X_train, \n", + " y_train, \n", " batch_size = batch_size, \n", - " epochs = 5, \n", - " validation_data = (X_val.iloc[:,:-1], y_val.iloc[:, :-1])\n", + " epochs = epochs, \n", + " validation_data = (X_val, y_val)\n", ")\n", "\n", "end = time.time()\n", @@ -1669,12 +657,72 @@ }, { "cell_type": "code", - "execution_count": 146, + "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: " + ] + } + ], + "source": [ + "# measure time\n", + "start = time.time()\n", + "\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", + "\n", + "end = time.time()\n", + "\n", + "print(\"Training took {} seconds\".format(end - start))" + ] + }, + { + "cell_type": "code", + "execution_count": 30, "metadata": {}, "outputs": [ { "data": { - "image/png": "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J4udO3cWf/zxR1EURTEtLU1MSEgwtP/hhx9ET09PMSUlRTx79qy4ceNGUaFQiJ988olUKbTI2hzfeecdMTs7W/z222/F06dPi2lpaSIAMSsrS6oUmlVTUyMWFhaKhYWFIgBx1apVYmFhoXjp0iVRFJ3/Glqbn7Ndv9/97ndi165dxa+//losKysz/NTW1hraOPM1tCU/Z7uG8+fPF//973+LxcXF4smTJ8UFCxaIMplMzM3NFUXRua+fKFqfn7NdP3MefOqwPVxDFlpObO3atWK/fv1Ed3d38dFHHzV67Pqll14Sx44da9T+66+/FkeNGiW6u7uL/fv3F9etW9fGEVvPmhxXrFghDhw4UPTw8BC7d+8uPvnkk+KePXskiNoy+kepH/x56aWXRFF0/mtobX7Odv3M5QZAfP/99w1tnPka2pKfs13DV155xfDvl549e4rjx483FCGi6NzXTxStz8/Zrp85DxZa7eEaCqJ47y4wIiIiIrIr3qNFRERE5CAstIiIiIgchIUWERERkYOw0CIiIiJyEBZaRERERA7CQouIiIjIQVhoERERETkICy0iIiIiB2GhRUTUzgiCgO3bt0sdBhHZAQstIqL7zJw5E4IgmPzExcVJHRoROSE3qQMgImpv4uLi8P777xsdUyqVEkVDRM6MM1pERA9QKpVQqVRGP927dwegW9Zbt24dJkyYgE6dOiEwMBAff/yx0fmnTp3CU089hU6dOsHHxwe//e1vcevWLaM2mzZtwrBhw6BUKuHv74/XXnvN6P2Kigr88pe/hKenJwYPHoydO3c6NmkicggWWkREVlq8eDGmTZuGoqIi/PrXv8avfvUrnDt3DgBQW1uLuLg4dO/eHUeOHMHHH3+Mffv2GRVS69atw+9//3v89re/xalTp7Bz504MGjTIaIylS5di+vTpOHnyJCZOnIgXX3wRlZWVbZonEdmBSEREBi+99JIol8vFzp07G/0sW7ZMFEVRBCAmJiYanRMeHi7+7ne/E0VRFDds2CB2795dvHXrluH9PXv2iDKZTFSr1aIoimJAQIC4cOHCJmMAIC5atMjw+tatW6IgCOJnn31mtzyJqG3wHi0iogf84he/wLp164yO9ejRw/B7RESE0XsRERE4ceIEAODcuXMYOXIkOnfubHj/iSeegFarxYULFyAIAkpLSzF+/PhmYxgxYoTh986dO8PLywvl5eW2pkREEmGhRUT0gM6dO5ss5bVEEAQAgCiKht/NtenUqZNF/SkUCpNztVqtVTERkfR4jxYRkZW++eYbk9dBQUEAgODgYJw4cQK3b982vP+f//wHMpkMDz/8MLy8vNC/f3988cUXbRozEUmDM1pERA+oq6uDWq02Oubm5gZfX18AwMcff4ywsDA8+eST+Oc//4nDhw9j48aNAIAXX3wRS5YswUsvvYT09HRcu3YNr7/+OhISEuDn5wcASE9PR2JiInr16oUJEyagpqYG//nPf/D666+3baJE5HAstIiIHrB37174+/sbHRsyZAjOnz8PQPdE4LZt25CUlASVSoV//vOfCA4OBgB4enri888/x7x58/DYY4/B09MT06ZNw6pVqwx9vfTSS7h79y7eeecd/OEPf4Cvry/i4+PbLkEiajOCKIqi1EEQETkLQRCQnZ2NZ599VupQiMgJ8B4tIiIiIgdhoUVERETkILxHi4jICrzbgoiswRktIiIiIgdhoUVERETkICy0iIiIiByEhRYRERGRg7DQIiIiInIQFlpEREREDsJCi4iIiMhBWGgREREROcj/D4wFAcu42nHDAAAAAElFTkSuQmCC", + "image/png": "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", "text/plain": [ "
" ] @@ -1695,12 +743,12 @@ }, { "cell_type": "code", - "execution_count": 147, + "execution_count": 31, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -1727,30 +775,30 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\u001b[1m15641/15641\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 233us/step - loss: 0.0324\n" + "\u001b[1m15641/15641\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 331us/step - loss: 3.0422e-06\n" ] }, { "data": { "text/plain": [ - "0.032423071563243866" + "2.9736404485447565e-06" ] }, - "execution_count": 31, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# test on all test data\n", - "model_simple.evaluate(X_test_preprocess.iloc[:,:-1], y_test_preprocess.iloc[:, :-1])" + "model_simple.evaluate(X_test_preprocess.iloc[:,X_test.columns != \"Class\"], y_test_preprocess.iloc[:, y_test.columns != \"Class\"])" ] }, { @@ -1825,11 +873,87 @@ "# Save the model\n", "model.save(\"Barite_50_Model_additional_species.keras\")" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Legacy Code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "def log_scale(df_design, df_result, func_dict):\n", + " \n", + " df_design = df_design.copy()\n", + " df_result = df_result.copy()\n", + " \n", + " for key in df_design.keys():\n", + " if key != \"Class\":\n", + " df_design[key] = np.vectorize(func_dict[key])(df_design[key])\n", + " df_result[key] = np.vectorize(func_dict[key])(df_result[key])\n", + " \n", + " return df_design, df_result\n", + "\n", + "# Get minimum and maximum values for each column\n", + "def get_min_max(df_design, df_result):\n", + " \n", + " min_vals_des = df_design.min()\n", + " max_vals_des = df_design.max()\n", + " \n", + " min_vals_res = df_result.min()\n", + " max_vals_res = df_result.max()\n", + "\n", + " # minimum of input and output data to get global minimum/maximum\n", + " data_min = np.minimum(min_vals_des, min_vals_res).to_dict()\n", + " data_max = np.maximum(max_vals_des, max_vals_res).to_dict()\n", + "\n", + " return data_min, data_max\n", + "\n", + "df_design_log, df_results_log = log_scale(df_design, df_results, func_dict_in)\n", + "data_min_log, data_max_log = get_min_max(df_design_log, df_design_log)\n", + "\n", + "train_min_log, train_max_log = get_min_max(X_train_log, y_train_log)\n", + "test_min_log, test_max_log = get_min_max(X_test_log, y_test_log)\n", + "\n", + "X_train_preprocess = preprocess(X_train_log, func_dict_in, train_min_log, train_max_log)\n", + "y_train_preprocess = preprocess(y_train_log, func_dict_in, train_min_log, train_max_log)\n", + "\n", + "X_test_preprocess = preprocess(X_test_log, func_dict_in, test_min_log, test_max_log)\n", + "y_test_preprocess = preprocess(y_test_log, func_dict_in, test_min_log, test_max_log)\n", + "\n", + "X_train_log, y_train_log = log_scale(X_train, y_train, func_dict_in)\n", + "X_test_log, y_test_log = log_scale(X_test, y_test, func_dict_in)\n", + "\n", + "\n", + "def preprocess(data, func_dict, data_min, data_max):\n", + " data = data.copy()\n", + " for key in data.keys():\n", + " if key != \"Class\":\n", + " data[key] = (data[key] - data_min[key]) / (data_max[key] - data_min[key])\n", + "\n", + " return data\n", + "\n", + "def postprocess(data, func_dict, data_min, data_max):\n", + " data = data.copy()\n", + " for key in data.keys():\n", + " if key != \"Class\":\n", + " data[key] = data[key] * (data_max[key] - data_min[key]) + data_min[key]\n", + " data[key] = np.vectorize(func_dict[key])(data[key])\n", + " return data\n", + "\n", + "X_train, X_val, y_train, y_val = sk.train_test_split(X_train_preprocess, y_train_preprocess, test_size = 0.1)\n", + "\n", + "pp_design = preprocess(df_design_log, func_dict_in, data_min_log, data_max_log)\n", + "pp_results = preprocess(df_results_log, func_dict_in, data_min_log, data_max_log)" + ] } ], "metadata": { "kernelspec": { - "display_name": "ai", + "display_name": "training", "language": "python", "name": "python3" }, diff --git a/preprocessing.py b/preprocessing.py index afc1e7a..ed4e600 100644 --- a/preprocessing.py +++ b/preprocessing.py @@ -13,6 +13,7 @@ from imblearn.under_sampling import RandomUnderSampler from imblearn.over_sampling import RandomOverSampler from collections import Counter import os +from sklearn.preprocessing import StandardScaler, MinMaxScaler # preprocessing pipeline # @@ -46,18 +47,19 @@ class FuncTransform(): self.func_transform = func_transform self.func_inverse = func_inverse - def fit(self, X): + def fit(self, X, y=None): return self - def transform(self, X): + def transform(self, X, y=None): X = X.copy() for key in X.keys(): if "Class" not in key: X[key] = X[key].apply(self.func_transform[key]) return X - def fit_transform(self, X): - return self.fit(X).transform(X) + def fit_transform(self, X, y=None): + self.fit(X) + return self.transform(X, y) def inverse_transform(self, X_log): X_log = X_log.copy() @@ -66,38 +68,112 @@ class FuncTransform(): X_log[key] = X_log[key].apply(self.func_inverse[key]) return X_log -class DataSetSampling(): - - def __init__(self, X, y, sampling_strategy): - self.X = X - self.y = y - self.sampling_strategy = sampling_strategy + +def clustering(X, n_clusters=2, random_state=42, x_length=50, y_length=50): + ''' + Function to cluster data with KMeans. + ''' + + 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['Barite'][(i*grid_length):(i*grid_length+grid_length)] + ).reshape(x_length, y_length) + kmeans = KMeans(n_clusters=n_clusters, random_state=random_state).fit( + field.reshape(-1, 1)) + + class_labels = np.append(class_labels.astype(int), kmeans.labels_) - def fit(self, X): - pass + if("Class" in X.columns and "Class" in X.columns): + print("Class column already exists") + else: + class_labels_df = pd.DataFrame(class_labels, columns=['Class']) + X_clustered = pd.concat([X, class_labels_df], axis=1) - def transform(self): - pass - - -class Scaling(): - - def __init__(self, X, scaling_strategy): - self.X = X - self.scaler = scaling_strategy + return X_clustered + + +def balancer(design, target, strategy, sample_fraction=0.5): - def fit(self, X): - pass - - def transform(self): - pass - - def fit_transform(self, X): - pass - - def inverse_transform(self, X): - pass - + number_features = (design.columns != "Class").sum() + if("Class" not in design.columns): + if("Class" in target.columns): + classes = target['Class'] + else: + raise Exception("No class column found") + else: + classes = design['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([design.loc[:,design.columns != "Class"], target.loc[:, target.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: + classes_resampled = classes + + 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) + + return design_resampled, target_resampled + + +def plot_simulation(X, timestep, component='Barite', x_length=50, y_length=50): + grid_length = x_length * y_length + max_iter = int(len(X) / grid_length) + if(timestep >= max_iter): + raise Exception("timestep is not in the simulation range") + + plt.imshow(np.array(X[component][(timestep*grid_length):(timestep*grid_length+grid_length)]).reshape(x_length,y_length), interpolation='bicubic', origin='lower') + + if("Class" in X.columns): + plt.contour(np.array(X['Class'][(timestep*grid_length):(timestep*grid_length+grid_length)]).reshape(x_length,y_length), levels=[0.1], colors='red', origin='lower') + + plt.show() + + +def preprocessing(df_design, df_targets, func_dict_in, func_dict_out, sampling, test_size): + + df_design = clustering(df_design) + + 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) + + X_train, X_test, y_train, y_test = sk.train_test_split(df_design_log, df_results_log, test_size = test_size, random_state=42) + + X_train, y_train = balancer(X_train, y_train, sampling) + + scaler_X = MinMaxScaler() + scaler_y = MinMaxScaler() + + X_train = scaler_X.fit_transform(X_train) + X_test = scaler_X.transform(X_test) + + y_train = scaler_y.fit_transform(y_train) + y_test = scaler_y.transform(y_test) + + 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