diff --git a/competitions/identify-age-related-conditions/train_models/AI_model.ipynb b/competitions/identify-age-related-conditions/train_models/AI_model.ipynb deleted file mode 100644 index 37c343d..0000000 --- a/competitions/identify-age-related-conditions/train_models/AI_model.ipynb +++ /dev/null @@ -1,1470 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 12, - "id": "a93a850b", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:25:49.669819Z", - "iopub.status.busy": "2023-06-05T15:25:49.669457Z", - "iopub.status.idle": "2023-06-05T15:25:59.366649Z", - "shell.execute_reply": "2023-06-05T15:25:59.365520Z" - }, - "papermill": { - "duration": 9.708823, - "end_time": "2023-06-05T15:25:59.369367", - "exception": false, - "start_time": "2023-06-05T15:25:49.660544", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.model_selection import train_test_split, ParameterGrid\n", - "from keras.callbacks import TensorBoard, EarlyStopping, LearningRateScheduler\n", - "import numpy as np\n", - "from keras.models import Model\n", - "from keras.layers import Activation, Dense, LSTM, Input\n", - "from keras.optimizers import Adam, RMSprop\n", - "import tensorflow as tf\n", - "import matplotlib.pyplot as plt\n", - "from os import path" - ] - }, - { - "cell_type": "markdown", - "id": "87462bba", - "metadata": { - "papermill": { - "duration": 0.005894, - "end_time": "2023-06-05T15:25:59.381875", - "exception": false, - "start_time": "2023-06-05T15:25:59.375981", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "Load Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "c55807f6", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:25:59.396342Z", - "iopub.status.busy": "2023-06-05T15:25:59.395525Z", - "iopub.status.idle": "2023-06-05T15:25:59.402735Z", - "shell.execute_reply": "2023-06-05T15:25:59.401729Z" - }, - "papermill": { - "duration": 0.01688, - "end_time": "2023-06-05T15:25:59.405006", - "exception": false, - "start_time": "2023-06-05T15:25:59.388126", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "def load_dataset() -> tuple([pd.DataFrame, pd.DataFrame, pd.DataFrame]):\n", - " train = pd.read_csv(\"C:\\\\Projects\\\\kaggle\\\\competitions\\\\identify-age-related-conditions\\\\data\\\\train.csv\")\n", - " greeks = pd.read_csv(\"C:\\\\Projects\\\\kaggle\\\\competitions\\\\identify-age-related-conditions\\\\data\\\\greeks.csv\")\n", - " test = pd.read_csv(\"C:\\\\Projects\\\\kaggle\\\\competitions\\\\identify-age-related-conditions\\\\data\\\\test.csv\")\n", - " train.head()\n", - " return (train, greeks, test)" - ] - }, - { - "cell_type": "markdown", - "id": "b92d395f", - "metadata": { - "papermill": { - "duration": 0.006176, - "end_time": "2023-06-05T15:25:59.417311", - "exception": false, - "start_time": "2023-06-05T15:25:59.411135", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "Preprocess the training data" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "5568b3c0", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:25:59.431633Z", - "iopub.status.busy": "2023-06-05T15:25:59.431205Z", - "iopub.status.idle": "2023-06-05T15:25:59.441160Z", - "shell.execute_reply": "2023-06-05T15:25:59.440006Z" - }, - "papermill": { - "duration": 0.0198, - "end_time": "2023-06-05T15:25:59.443276", - "exception": false, - "start_time": "2023-06-05T15:25:59.423476", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "def preprocess_data(df: pd.DataFrame) -> tuple([np.ndarray, np.ndarray]):\n", - " y = df[\"Class\"]\n", - " x = df.loc[:, df.columns != \"Class\"]\n", - " \n", - " #fill NaN values with zeroes\n", - " x = x.fillna(0) \n", - " \n", - " #EJ needs to be categorical\n", - " x.EJ.replace(['A', 'B'], [0, 1], inplace=True)\n", - " x.EJ\n", - " \n", - " #scale the inputs around 0\n", - " scaler = StandardScaler()\n", - " norm_columns = []\n", - " for i in range(1, 57):\n", - " if(i == x.columns.get_loc(\"EJ\")):continue\n", - " norm_columns.append(i)\n", - " x.iloc[:, norm_columns] = scaler.fit_transform(x.iloc[:, norm_columns].to_numpy())\n", - " \n", - " #convert the dataframes to numpy-arrays\n", - " x = x.iloc[:, 1:-1].to_numpy()\n", - " y = y.to_numpy()\n", - " print(f\"x shape: {x.shape} \\ny shape: {y.shape}\")\n", - " \n", - " return (x,y)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "31092ba2", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:25:59.459178Z", - "iopub.status.busy": "2023-06-05T15:25:59.458756Z", - "iopub.status.idle": "2023-06-05T15:25:59.467043Z", - "shell.execute_reply": "2023-06-05T15:25:59.465891Z" - }, - "papermill": { - "duration": 0.02006, - "end_time": "2023-06-05T15:25:59.469566", - "exception": false, - "start_time": "2023-06-05T15:25:59.449506", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "def preprocess_test_data(x: pd.DataFrame) -> tuple([np.ndarray, np.ndarray]):\n", - " #fill NaN values with zeroes\n", - " x = x.fillna(0) \n", - " \n", - " #EJ needs to be categorical\n", - " x.EJ.replace(['A', 'B'], [0, 1], inplace=True)\n", - " x.EJ\n", - " \n", - " #scale the inputs around 0\n", - " scaler = StandardScaler()\n", - " norm_columns = []\n", - " for i in range(1, 57):\n", - " if(i == x.columns.get_loc(\"EJ\")):continue\n", - " norm_columns.append(i)\n", - " x.iloc[:, norm_columns] = scaler.fit_transform(x.iloc[:, norm_columns].to_numpy())\n", - " id = x.iloc[:, 0]\n", - " \n", - " #convert the dataframes to numpy-arrays\n", - " x = x.iloc[:, 1:-1].to_numpy()\n", - " return x, id" - ] - }, - { - "cell_type": "markdown", - "id": "ceafa051", - "metadata": { - "papermill": { - "duration": 0.005985, - "end_time": "2023-06-05T15:25:59.481893", - "exception": false, - "start_time": "2023-06-05T15:25:59.475908", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "Build the AI-model" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "6d48d007", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:25:59.496462Z", - "iopub.status.busy": "2023-06-05T15:25:59.496089Z", - "iopub.status.idle": "2023-06-05T15:25:59.919813Z", - "shell.execute_reply": "2023-06-05T15:25:59.918540Z" - }, - "papermill": { - "duration": 0.434504, - "end_time": "2023-06-05T15:25:59.922713", - "exception": false, - "start_time": "2023-06-05T15:25:59.488209", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "def build_model(input_shape:int, output_shape:int, units1: int, units2: int, units3: int, activation1: str, \n", - " activation2: str, activation3: str, optimizer: tf.keras.optimizers.Optimizer, learning_rate: float) -> Model:\n", - " input = Input(shape=input_shape)\n", - " x = Dense(units=units1, activation=activation1)(input)\n", - " x = Dense(units=units2, activation=activation2)(x)\n", - " x = Dense(units=units3, activation=activation3)(x)\n", - " output = Dense(units=output_shape, activation=\"sigmoid\")(x)\n", - " model = Model(inputs=[input], outputs=[output])\n", - " \n", - " model.compile(loss=\"binary_crossentropy\",\n", - " optimizer=optimizer(learning_rate=learning_rate),\n", - " metrics=[\"accuracy\"])\n", - " \n", - " return model" - ] - }, - { - "cell_type": "markdown", - "id": "89084abc", - "metadata": { - "papermill": { - "duration": 0.005769, - "end_time": "2023-06-05T15:25:59.934888", - "exception": false, - "start_time": "2023-06-05T15:25:59.929119", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "Fit the model" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "3d7a020a", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:25:59.948925Z", - "iopub.status.busy": "2023-06-05T15:25:59.948549Z", - "iopub.status.idle": "2023-06-05T15:25:59.955893Z", - "shell.execute_reply": "2023-06-05T15:25:59.955011Z" - }, - "papermill": { - "duration": 0.016863, - "end_time": "2023-06-05T15:25:59.957983", - "exception": false, - "start_time": "2023-06-05T15:25:59.941120", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "es_callback = EarlyStopping(\n", - " monitor=\"val_accuracy\",\n", - " patience=5,\n", - " verbose=1,\n", - " restore_best_weights=True,\n", - " min_delta=0.005\n", - " )\n", - " \n", - "def fit_model(model: Model, x: np.ndarray, y: np.ndarray, epochs: int, split: float) -> Model:\n", - " #split train and validation\n", - " x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=split, random_state=42)\n", - " #fit the model\n", - " history = model.fit(x_train, y_train, epochs=epochs, validation_data=(x_val,y_val), callbacks=[es_callback])\n", - " return history " - ] - }, - { - "cell_type": "markdown", - "id": "e9aedd24", - "metadata": { - "papermill": { - "duration": 0.005936, - "end_time": "2023-06-05T15:25:59.970802", - "exception": false, - "start_time": "2023-06-05T15:25:59.964866", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "Plot accuracy and loss function of model" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "43775a9c", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:25:59.984758Z", - "iopub.status.busy": "2023-06-05T15:25:59.984354Z", - "iopub.status.idle": "2023-06-05T15:25:59.992500Z", - "shell.execute_reply": "2023-06-05T15:25:59.991363Z" - }, - "papermill": { - "duration": 0.017928, - "end_time": "2023-06-05T15:25:59.994848", - "exception": false, - "start_time": "2023-06-05T15:25:59.976920", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "def plot_acc(history:Model):\n", - " # summarize history for accuracy\n", - " plt.plot(history.history['accuracy'])\n", - " plt.plot(history.history['val_accuracy'])\n", - " plt.title('model accuracy')\n", - " plt.ylabel('accuracy')\n", - " plt.xlabel('epoch')\n", - " plt.legend(['Train', 'Validation'], loc='upper left')\n", - " plt.show()\n", - " \n", - " # summarize history for loss\n", - " plt.plot(history.history['loss'])\n", - " plt.plot(history.history['val_loss'])\n", - " plt.title('model loss')\n", - " plt.ylabel('loss')\n", - " plt.xlabel('epoch')\n", - " plt.legend(['Train', 'Validation'], loc='upper left')\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "74c4c366", - "metadata": { - "papermill": { - "duration": 0.005861, - "end_time": "2023-06-05T15:26:00.007025", - "exception": false, - "start_time": "2023-06-05T15:26:00.001164", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "Run Methods" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "f41fe70f", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:26:00.021584Z", - "iopub.status.busy": "2023-06-05T15:26:00.021163Z", - "iopub.status.idle": "2023-06-05T15:26:00.122935Z", - "shell.execute_reply": "2023-06-05T15:26:00.121784Z" - }, - "papermill": { - "duration": 0.112029, - "end_time": "2023-06-05T15:26:00.125333", - "exception": false, - "start_time": "2023-06-05T15:26:00.013304", - "status": "completed" - }, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "x shape: (617, 55) \n", - "y shape: (617,)\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 11ms/step - loss: 0.6501 - accuracy: 0.7951 - val_loss: 0.6142 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5911 - accuracy: 0.8276 - val_loss: 0.5696 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5413 - accuracy: 0.8276 - val_loss: 0.5313 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4967 - accuracy: 0.8276 - val_loss: 0.4982 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4596 - accuracy: 0.8276 - val_loss: 0.4733 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.2765 - accuracy: 0.9375Restoring model weights from the end of the best epoch: 1.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4326 - accuracy: 0.8276 - val_loss: 0.4559 - val_accuracy: 0.8145\n", - "Epoch 6: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.7135 - accuracy: 0.4888 - val_loss: 0.6406 - val_accuracy: 0.7258\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5860 - accuracy: 0.8174 - val_loss: 0.5733 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5041 - accuracy: 0.8296 - val_loss: 0.5418 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4476 - accuracy: 0.8276 - val_loss: 0.5281 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4107 - accuracy: 0.8276 - val_loss: 0.5224 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3818 - accuracy: 0.8296 - val_loss: 0.5140 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.2691 - accuracy: 0.9062Restoring model weights from the end of the best epoch: 2.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3580 - accuracy: 0.8296 - val_loss: 0.5005 - val_accuracy: 0.8145\n", - "Epoch 7: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6358 - accuracy: 0.7181 - val_loss: 0.5744 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5352 - accuracy: 0.8276 - val_loss: 0.5159 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4739 - accuracy: 0.8276 - val_loss: 0.4797 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4252 - accuracy: 0.8276 - val_loss: 0.4509 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3884 - accuracy: 0.8276 - val_loss: 0.4254 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.3218 - accuracy: 0.8438Restoring model weights from the end of the best epoch: 1.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3576 - accuracy: 0.8337 - val_loss: 0.4033 - val_accuracy: 0.8145\n", - "Epoch 6: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6378 - accuracy: 0.7627 - val_loss: 0.5983 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5313 - accuracy: 0.8276 - val_loss: 0.5472 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4569 - accuracy: 0.8276 - val_loss: 0.5188 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4030 - accuracy: 0.8276 - val_loss: 0.5039 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3598 - accuracy: 0.8438 - val_loss: 0.4897 - val_accuracy: 0.8387\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3290 - accuracy: 0.8621 - val_loss: 0.4811 - val_accuracy: 0.8548\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3036 - accuracy: 0.8702 - val_loss: 0.4768 - val_accuracy: 0.8548\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2811 - accuracy: 0.8864 - val_loss: 0.4818 - val_accuracy: 0.8548\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2623 - accuracy: 0.8945 - val_loss: 0.4771 - val_accuracy: 0.8387\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2458 - accuracy: 0.8986 - val_loss: 0.4726 - val_accuracy: 0.8387\n", - "Epoch 11/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.0875 - accuracy: 0.9688Restoring model weights from the end of the best epoch: 6.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2309 - accuracy: 0.9067 - val_loss: 0.4677 - val_accuracy: 0.8387\n", - "Epoch 11: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6549 - accuracy: 0.7099 - val_loss: 0.6109 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5800 - accuracy: 0.8276 - val_loss: 0.5472 - val_accuracy: 0.8065\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5163 - accuracy: 0.8276 - val_loss: 0.4945 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4539 - accuracy: 0.8276 - val_loss: 0.4573 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4060 - accuracy: 0.8316 - val_loss: 0.4258 - val_accuracy: 0.8226\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3672 - accuracy: 0.8357 - val_loss: 0.4031 - val_accuracy: 0.8306\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3361 - accuracy: 0.8479 - val_loss: 0.3873 - val_accuracy: 0.8226\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3109 - accuracy: 0.8600 - val_loss: 0.3739 - val_accuracy: 0.8226\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2896 - accuracy: 0.8742 - val_loss: 0.3618 - val_accuracy: 0.8306\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2705 - accuracy: 0.8925 - val_loss: 0.3531 - val_accuracy: 0.8387\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2520 - accuracy: 0.8986 - val_loss: 0.3424 - val_accuracy: 0.8548\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2366 - accuracy: 0.9067 - val_loss: 0.3327 - val_accuracy: 0.8468\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2219 - accuracy: 0.9108 - val_loss: 0.3247 - val_accuracy: 0.8629\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2096 - accuracy: 0.9209 - val_loss: 0.3175 - val_accuracy: 0.8548\n", - "Epoch 15/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1959 - accuracy: 0.9290 - val_loss: 0.3086 - val_accuracy: 0.8548\n", - "Epoch 16/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1854 - accuracy: 0.9391 - val_loss: 0.3038 - val_accuracy: 0.8629\n", - "Epoch 17/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1740 - accuracy: 0.9391 - val_loss: 0.2944 - val_accuracy: 0.8629\n", - "Epoch 18/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1643 - accuracy: 0.9473 - val_loss: 0.2897 - val_accuracy: 0.8710\n", - "Epoch 19/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1562 - accuracy: 0.9554 - val_loss: 0.2846 - val_accuracy: 0.8548\n", - "Epoch 20/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1499 - accuracy: 0.9554 - val_loss: 0.2784 - val_accuracy: 0.8548\n", - "Epoch 21/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1402 - accuracy: 0.9594 - val_loss: 0.2750 - val_accuracy: 0.8629\n", - "Epoch 22/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1352 - accuracy: 0.9615 - val_loss: 0.2713 - val_accuracy: 0.8710\n", - "Epoch 23/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.2188 - accuracy: 0.9688Restoring model weights from the end of the best epoch: 18.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1274 - accuracy: 0.9635 - val_loss: 0.2701 - val_accuracy: 0.8710\n", - "Epoch 23: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6077 - accuracy: 0.7951 - val_loss: 0.5544 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4985 - accuracy: 0.8276 - val_loss: 0.4873 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4288 - accuracy: 0.8276 - val_loss: 0.4542 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3904 - accuracy: 0.8276 - val_loss: 0.4298 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3579 - accuracy: 0.8296 - val_loss: 0.4047 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.3363 - accuracy: 0.8125Restoring model weights from the end of the best epoch: 1.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3291 - accuracy: 0.8316 - val_loss: 0.3807 - val_accuracy: 0.8065\n", - "Epoch 6: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6675 - accuracy: 0.6795 - val_loss: 0.5936 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5639 - accuracy: 0.8276 - val_loss: 0.5303 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4916 - accuracy: 0.8276 - val_loss: 0.4867 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4298 - accuracy: 0.8276 - val_loss: 0.4580 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3780 - accuracy: 0.8438 - val_loss: 0.4300 - val_accuracy: 0.8226\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3307 - accuracy: 0.8641 - val_loss: 0.4006 - val_accuracy: 0.8226\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2933 - accuracy: 0.8905 - val_loss: 0.3744 - val_accuracy: 0.8387\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2641 - accuracy: 0.9047 - val_loss: 0.3587 - val_accuracy: 0.8629\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2381 - accuracy: 0.9087 - val_loss: 0.3443 - val_accuracy: 0.8790\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2144 - accuracy: 0.9189 - val_loss: 0.3342 - val_accuracy: 0.8871\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1971 - accuracy: 0.9249 - val_loss: 0.3215 - val_accuracy: 0.9113\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1760 - accuracy: 0.9391 - val_loss: 0.3223 - val_accuracy: 0.9032\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1617 - accuracy: 0.9432 - val_loss: 0.3141 - val_accuracy: 0.9032\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1482 - accuracy: 0.9391 - val_loss: 0.3035 - val_accuracy: 0.9032\n", - "Epoch 15/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1363 - accuracy: 0.9412 - val_loss: 0.3058 - val_accuracy: 0.9032\n", - "Epoch 16/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.1791 - accuracy: 0.8750Restoring model weights from the end of the best epoch: 11.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1246 - accuracy: 0.9513 - val_loss: 0.3004 - val_accuracy: 0.8952\n", - "Epoch 16: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6414 - accuracy: 0.7586 - val_loss: 0.5743 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5449 - accuracy: 0.8276 - val_loss: 0.5106 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4669 - accuracy: 0.8276 - val_loss: 0.4599 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4012 - accuracy: 0.8337 - val_loss: 0.4169 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3483 - accuracy: 0.8519 - val_loss: 0.3874 - val_accuracy: 0.8548\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3098 - accuracy: 0.8560 - val_loss: 0.3730 - val_accuracy: 0.8710\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2761 - accuracy: 0.8722 - val_loss: 0.3576 - val_accuracy: 0.8629\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2471 - accuracy: 0.8925 - val_loss: 0.3441 - val_accuracy: 0.8468\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 4ms/step - loss: 0.2217 - accuracy: 0.9128 - val_loss: 0.3298 - val_accuracy: 0.8468\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1987 - accuracy: 0.9270 - val_loss: 0.3239 - val_accuracy: 0.8468\n", - "Epoch 11/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.2789 - accuracy: 0.9062Restoring model weights from the end of the best epoch: 6.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1786 - accuracy: 0.9371 - val_loss: 0.3165 - val_accuracy: 0.8468\n", - "Epoch 11: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6411 - accuracy: 0.7383 - val_loss: 0.5765 - val_accuracy: 0.8065\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5707 - accuracy: 0.8215 - val_loss: 0.5237 - val_accuracy: 0.8226\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5162 - accuracy: 0.8357 - val_loss: 0.4782 - val_accuracy: 0.8387\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4666 - accuracy: 0.8377 - val_loss: 0.4388 - val_accuracy: 0.8306\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4250 - accuracy: 0.8458 - val_loss: 0.4068 - val_accuracy: 0.8387\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3893 - accuracy: 0.8560 - val_loss: 0.3792 - val_accuracy: 0.8468\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3582 - accuracy: 0.8661 - val_loss: 0.3585 - val_accuracy: 0.8387\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3318 - accuracy: 0.8742 - val_loss: 0.3429 - val_accuracy: 0.8387\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3093 - accuracy: 0.8803 - val_loss: 0.3306 - val_accuracy: 0.8548\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2897 - accuracy: 0.8864 - val_loss: 0.3218 - val_accuracy: 0.8468\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2717 - accuracy: 0.8925 - val_loss: 0.3168 - val_accuracy: 0.8548\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2561 - accuracy: 0.9006 - val_loss: 0.3118 - val_accuracy: 0.8468\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2432 - accuracy: 0.9026 - val_loss: 0.3093 - val_accuracy: 0.8629\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2312 - accuracy: 0.9006 - val_loss: 0.3082 - val_accuracy: 0.8629\n", - "Epoch 15/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2208 - accuracy: 0.9067 - val_loss: 0.3065 - val_accuracy: 0.8710\n", - "Epoch 16/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2103 - accuracy: 0.9108 - val_loss: 0.3058 - val_accuracy: 0.8548\n", - "Epoch 17/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2002 - accuracy: 0.9148 - val_loss: 0.3077 - val_accuracy: 0.8548\n", - "Epoch 18/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1909 - accuracy: 0.9209 - val_loss: 0.3088 - val_accuracy: 0.8548\n", - "Epoch 19/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1821 - accuracy: 0.9270 - val_loss: 0.3075 - val_accuracy: 0.8548\n", - "Epoch 20/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.1353 - accuracy: 0.9688Restoring model weights from the end of the best epoch: 15.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1743 - accuracy: 0.9249 - val_loss: 0.3100 - val_accuracy: 0.8548\n", - "Epoch 20: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 11ms/step - loss: 0.6461 - accuracy: 0.7383 - val_loss: 0.5774 - val_accuracy: 0.8226\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5693 - accuracy: 0.8337 - val_loss: 0.5295 - val_accuracy: 0.8226\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5164 - accuracy: 0.8316 - val_loss: 0.4923 - val_accuracy: 0.8226\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4667 - accuracy: 0.8377 - val_loss: 0.4655 - val_accuracy: 0.8226\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4237 - accuracy: 0.8418 - val_loss: 0.4469 - val_accuracy: 0.8306\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3881 - accuracy: 0.8641 - val_loss: 0.4310 - val_accuracy: 0.8306\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3578 - accuracy: 0.8722 - val_loss: 0.4193 - val_accuracy: 0.8387\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3357 - accuracy: 0.8722 - val_loss: 0.4107 - val_accuracy: 0.8387\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3144 - accuracy: 0.8803 - val_loss: 0.4050 - val_accuracy: 0.8468\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2967 - accuracy: 0.8824 - val_loss: 0.4003 - val_accuracy: 0.8548\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2818 - accuracy: 0.8864 - val_loss: 0.3971 - val_accuracy: 0.8468\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2688 - accuracy: 0.8986 - val_loss: 0.3960 - val_accuracy: 0.8468\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2549 - accuracy: 0.9006 - val_loss: 0.3968 - val_accuracy: 0.8468\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2452 - accuracy: 0.9006 - val_loss: 0.3962 - val_accuracy: 0.8387\n", - "Epoch 15/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.2313 - accuracy: 0.8750Restoring model weights from the end of the best epoch: 10.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2340 - accuracy: 0.9006 - val_loss: 0.3941 - val_accuracy: 0.8548\n", - "Epoch 15: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 11ms/step - loss: 0.5686 - accuracy: 0.8276 - val_loss: 0.5566 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5110 - accuracy: 0.8276 - val_loss: 0.5301 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4711 - accuracy: 0.8276 - val_loss: 0.5072 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4366 - accuracy: 0.8276 - val_loss: 0.4858 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4044 - accuracy: 0.8357 - val_loss: 0.4667 - val_accuracy: 0.8387\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3756 - accuracy: 0.8560 - val_loss: 0.4510 - val_accuracy: 0.8387\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3506 - accuracy: 0.8682 - val_loss: 0.4372 - val_accuracy: 0.8548\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3313 - accuracy: 0.8763 - val_loss: 0.4277 - val_accuracy: 0.8468\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3110 - accuracy: 0.8844 - val_loss: 0.4178 - val_accuracy: 0.8468\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2925 - accuracy: 0.8884 - val_loss: 0.4172 - val_accuracy: 0.8468\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2790 - accuracy: 0.8925 - val_loss: 0.4092 - val_accuracy: 0.8548\n", - "Epoch 12/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.2276 - accuracy: 0.8750Restoring model weights from the end of the best epoch: 7.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2635 - accuracy: 0.9026 - val_loss: 0.4097 - val_accuracy: 0.8548\n", - "Epoch 12: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6039 - accuracy: 0.7688 - val_loss: 0.5518 - val_accuracy: 0.8226\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4790 - accuracy: 0.8276 - val_loss: 0.4976 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4208 - accuracy: 0.8296 - val_loss: 0.4688 - val_accuracy: 0.8226\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3847 - accuracy: 0.8316 - val_loss: 0.4471 - val_accuracy: 0.8226\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3527 - accuracy: 0.8377 - val_loss: 0.4243 - val_accuracy: 0.8387\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3249 - accuracy: 0.8519 - val_loss: 0.4056 - val_accuracy: 0.8468\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3031 - accuracy: 0.8803 - val_loss: 0.3924 - val_accuracy: 0.8629\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2848 - accuracy: 0.8824 - val_loss: 0.3796 - val_accuracy: 0.8548\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2711 - accuracy: 0.8884 - val_loss: 0.3666 - val_accuracy: 0.8548\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2573 - accuracy: 0.9067 - val_loss: 0.3595 - val_accuracy: 0.8548\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2461 - accuracy: 0.9047 - val_loss: 0.3426 - val_accuracy: 0.8548\n", - "Epoch 12/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.2242 - accuracy: 0.9062Restoring model weights from the end of the best epoch: 7.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2340 - accuracy: 0.9168 - val_loss: 0.3375 - val_accuracy: 0.8548\n", - "Epoch 12: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6337 - accuracy: 0.7870 - val_loss: 0.5700 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5528 - accuracy: 0.8276 - val_loss: 0.5184 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4930 - accuracy: 0.8296 - val_loss: 0.4701 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4366 - accuracy: 0.8418 - val_loss: 0.4265 - val_accuracy: 0.8306\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3842 - accuracy: 0.8519 - val_loss: 0.3882 - val_accuracy: 0.8548\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3374 - accuracy: 0.8682 - val_loss: 0.3586 - val_accuracy: 0.8548\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2995 - accuracy: 0.8824 - val_loss: 0.3396 - val_accuracy: 0.8710\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2691 - accuracy: 0.8905 - val_loss: 0.3267 - val_accuracy: 0.8710\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2441 - accuracy: 0.9006 - val_loss: 0.3204 - val_accuracy: 0.8710\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2250 - accuracy: 0.9067 - val_loss: 0.3162 - val_accuracy: 0.8710\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2073 - accuracy: 0.9128 - val_loss: 0.3141 - val_accuracy: 0.8629\n", - "Epoch 12/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.1920 - accuracy: 0.9062Restoring model weights from the end of the best epoch: 7.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1921 - accuracy: 0.9270 - val_loss: 0.3090 - val_accuracy: 0.8710\n", - "Epoch 12: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6350 - accuracy: 0.7546 - val_loss: 0.5691 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5269 - accuracy: 0.8316 - val_loss: 0.4862 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4462 - accuracy: 0.8377 - val_loss: 0.4272 - val_accuracy: 0.8387\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3839 - accuracy: 0.8519 - val_loss: 0.3836 - val_accuracy: 0.8629\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3343 - accuracy: 0.8864 - val_loss: 0.3501 - val_accuracy: 0.8468\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2953 - accuracy: 0.8925 - val_loss: 0.3311 - val_accuracy: 0.8468\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2662 - accuracy: 0.9006 - val_loss: 0.3130 - val_accuracy: 0.8790\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2414 - accuracy: 0.9108 - val_loss: 0.3017 - val_accuracy: 0.8871\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2197 - accuracy: 0.9168 - val_loss: 0.2962 - val_accuracy: 0.8871\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2021 - accuracy: 0.9229 - val_loss: 0.2925 - val_accuracy: 0.8952\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1878 - accuracy: 0.9249 - val_loss: 0.2923 - val_accuracy: 0.8952\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1759 - accuracy: 0.9331 - val_loss: 0.2871 - val_accuracy: 0.8952\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1640 - accuracy: 0.9371 - val_loss: 0.2864 - val_accuracy: 0.8952\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1537 - accuracy: 0.9432 - val_loss: 0.2804 - val_accuracy: 0.8871\n", - "Epoch 15/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.0902 - accuracy: 0.9688Restoring model weights from the end of the best epoch: 10.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1432 - accuracy: 0.9513 - val_loss: 0.2796 - val_accuracy: 0.8871\n", - "Epoch 15: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 11ms/step - loss: 0.7420 - accuracy: 0.4239 - val_loss: 0.6658 - val_accuracy: 0.6613\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5808 - accuracy: 0.8337 - val_loss: 0.5597 - val_accuracy: 0.8226\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4845 - accuracy: 0.8398 - val_loss: 0.5044 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4183 - accuracy: 0.8357 - val_loss: 0.4768 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3751 - accuracy: 0.8438 - val_loss: 0.4593 - val_accuracy: 0.8306\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3382 - accuracy: 0.8621 - val_loss: 0.4443 - val_accuracy: 0.8468\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3078 - accuracy: 0.8661 - val_loss: 0.4317 - val_accuracy: 0.8629\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2827 - accuracy: 0.8925 - val_loss: 0.4248 - val_accuracy: 0.8629\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2617 - accuracy: 0.9047 - val_loss: 0.4192 - val_accuracy: 0.8548\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2419 - accuracy: 0.9108 - val_loss: 0.4136 - val_accuracy: 0.8629\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2266 - accuracy: 0.9168 - val_loss: 0.4096 - val_accuracy: 0.8629\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2120 - accuracy: 0.9229 - val_loss: 0.4084 - val_accuracy: 0.8790\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1979 - accuracy: 0.9189 - val_loss: 0.4050 - val_accuracy: 0.8790\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1862 - accuracy: 0.9249 - val_loss: 0.4008 - val_accuracy: 0.8790\n", - "Epoch 15/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1727 - accuracy: 0.9310 - val_loss: 0.3944 - val_accuracy: 0.8790\n", - "Epoch 16/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1646 - accuracy: 0.9290 - val_loss: 0.3948 - val_accuracy: 0.8790\n", - "Epoch 17/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.0898 - accuracy: 0.9688Restoring model weights from the end of the best epoch: 12.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1536 - accuracy: 0.9331 - val_loss: 0.3891 - val_accuracy: 0.8710\n", - "Epoch 17: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 11ms/step - loss: 0.6065 - accuracy: 0.7748 - val_loss: 0.5529 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5224 - accuracy: 0.8276 - val_loss: 0.5069 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4635 - accuracy: 0.8276 - val_loss: 0.4707 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4135 - accuracy: 0.8276 - val_loss: 0.4321 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3698 - accuracy: 0.8418 - val_loss: 0.4005 - val_accuracy: 0.8387\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3294 - accuracy: 0.8580 - val_loss: 0.3650 - val_accuracy: 0.8387\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2962 - accuracy: 0.8884 - val_loss: 0.3406 - val_accuracy: 0.8629\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2661 - accuracy: 0.9006 - val_loss: 0.3247 - val_accuracy: 0.8710\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2432 - accuracy: 0.9168 - val_loss: 0.3163 - val_accuracy: 0.8710\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2253 - accuracy: 0.9209 - val_loss: 0.2886 - val_accuracy: 0.8790\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2055 - accuracy: 0.9290 - val_loss: 0.2811 - val_accuracy: 0.8871\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1915 - accuracy: 0.9351 - val_loss: 0.2798 - val_accuracy: 0.8790\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1781 - accuracy: 0.9371 - val_loss: 0.2713 - val_accuracy: 0.8790\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1644 - accuracy: 0.9473 - val_loss: 0.2648 - val_accuracy: 0.8710\n", - "Epoch 15/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1524 - accuracy: 0.9493 - val_loss: 0.2594 - val_accuracy: 0.8710\n", - "Epoch 16/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.0846 - accuracy: 0.9375Restoring model weights from the end of the best epoch: 11.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1413 - accuracy: 0.9493 - val_loss: 0.2592 - val_accuracy: 0.8871\n", - "Epoch 16: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.7249 - accuracy: 0.2617 - val_loss: 0.6950 - val_accuracy: 0.4677\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6827 - accuracy: 0.5639 - val_loss: 0.6599 - val_accuracy: 0.7339\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6532 - accuracy: 0.7992 - val_loss: 0.6308 - val_accuracy: 0.8306\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6253 - accuracy: 0.8418 - val_loss: 0.6079 - val_accuracy: 0.8226\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6020 - accuracy: 0.8316 - val_loss: 0.5854 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5773 - accuracy: 0.8276 - val_loss: 0.5642 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5534 - accuracy: 0.8276 - val_loss: 0.5439 - val_accuracy: 0.8145\n", - "Epoch 8/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.6443 - accuracy: 0.7812Restoring model weights from the end of the best epoch: 3.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5291 - accuracy: 0.8276 - val_loss: 0.5263 - val_accuracy: 0.8145\n", - "Epoch 8: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 11ms/step - loss: 0.6342 - accuracy: 0.8235 - val_loss: 0.6247 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6021 - accuracy: 0.8276 - val_loss: 0.6029 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5727 - accuracy: 0.8276 - val_loss: 0.5820 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5451 - accuracy: 0.8276 - val_loss: 0.5630 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5173 - accuracy: 0.8276 - val_loss: 0.5447 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.4964 - accuracy: 0.8438Restoring model weights from the end of the best epoch: 1.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4908 - accuracy: 0.8276 - val_loss: 0.5279 - val_accuracy: 0.8145\n", - "Epoch 6: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6996 - accuracy: 0.4341 - val_loss: 0.6669 - val_accuracy: 0.6935\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6479 - accuracy: 0.7647 - val_loss: 0.6182 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6006 - accuracy: 0.8235 - val_loss: 0.5719 - val_accuracy: 0.8306\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5539 - accuracy: 0.8316 - val_loss: 0.5320 - val_accuracy: 0.8226\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5104 - accuracy: 0.8316 - val_loss: 0.4989 - val_accuracy: 0.8226\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4729 - accuracy: 0.8316 - val_loss: 0.4733 - val_accuracy: 0.8226\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 4ms/step - loss: 0.4412 - accuracy: 0.8357 - val_loss: 0.4552 - val_accuracy: 0.8306\n", - "Epoch 8/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.5031 - accuracy: 0.7188Restoring model weights from the end of the best epoch: 3.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4163 - accuracy: 0.8377 - val_loss: 0.4412 - val_accuracy: 0.8306\n", - "Epoch 8: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6883 - accuracy: 0.5862 - val_loss: 0.6483 - val_accuracy: 0.8065\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6316 - accuracy: 0.8256 - val_loss: 0.6011 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5910 - accuracy: 0.8276 - val_loss: 0.5680 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5598 - accuracy: 0.8276 - val_loss: 0.5413 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5309 - accuracy: 0.8276 - val_loss: 0.5213 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5050 - accuracy: 0.8276 - val_loss: 0.5050 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.5400 - accuracy: 0.8125Restoring model weights from the end of the best epoch: 2.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4819 - accuracy: 0.8276 - val_loss: 0.4910 - val_accuracy: 0.8145\n", - "Epoch 7: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6746 - accuracy: 0.6937 - val_loss: 0.6327 - val_accuracy: 0.7984\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6252 - accuracy: 0.8215 - val_loss: 0.5985 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5857 - accuracy: 0.8276 - val_loss: 0.5669 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5484 - accuracy: 0.8276 - val_loss: 0.5400 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5159 - accuracy: 0.8276 - val_loss: 0.5162 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4887 - accuracy: 0.8276 - val_loss: 0.4958 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.3708 - accuracy: 0.8750Restoring model weights from the end of the best epoch: 2.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4630 - accuracy: 0.8276 - val_loss: 0.4805 - val_accuracy: 0.8145\n", - "Epoch 7: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6507 - accuracy: 0.7262 - val_loss: 0.6096 - val_accuracy: 0.7742\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5956 - accuracy: 0.8195 - val_loss: 0.5682 - val_accuracy: 0.8065\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5520 - accuracy: 0.8276 - val_loss: 0.5342 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5159 - accuracy: 0.8276 - val_loss: 0.5066 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4818 - accuracy: 0.8276 - val_loss: 0.4865 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4554 - accuracy: 0.8276 - val_loss: 0.4706 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4308 - accuracy: 0.8276 - val_loss: 0.4587 - val_accuracy: 0.8145\n", - "Epoch 8/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.4261 - accuracy: 0.7500Restoring model weights from the end of the best epoch: 3.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4114 - accuracy: 0.8276 - val_loss: 0.4472 - val_accuracy: 0.8145\n", - "Epoch 8: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 12ms/step - loss: 0.6544 - accuracy: 0.7343 - val_loss: 0.6236 - val_accuracy: 0.7742\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5872 - accuracy: 0.8195 - val_loss: 0.5829 - val_accuracy: 0.8065\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5399 - accuracy: 0.8337 - val_loss: 0.5523 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4999 - accuracy: 0.8296 - val_loss: 0.5274 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4624 - accuracy: 0.8296 - val_loss: 0.5054 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4303 - accuracy: 0.8337 - val_loss: 0.4846 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4009 - accuracy: 0.8337 - val_loss: 0.4644 - val_accuracy: 0.8145\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3761 - accuracy: 0.8377 - val_loss: 0.4436 - val_accuracy: 0.8226\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3531 - accuracy: 0.8418 - val_loss: 0.4292 - val_accuracy: 0.8306\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3350 - accuracy: 0.8560 - val_loss: 0.4087 - val_accuracy: 0.8548\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3170 - accuracy: 0.8641 - val_loss: 0.3964 - val_accuracy: 0.8548\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3027 - accuracy: 0.8763 - val_loss: 0.3821 - val_accuracy: 0.8548\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2901 - accuracy: 0.8884 - val_loss: 0.3719 - val_accuracy: 0.8468\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2780 - accuracy: 0.8884 - val_loss: 0.3595 - val_accuracy: 0.8468\n", - "Epoch 15/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.3253 - accuracy: 0.8438Restoring model weights from the end of the best epoch: 10.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2669 - accuracy: 0.8905 - val_loss: 0.3515 - val_accuracy: 0.8387\n", - "Epoch 15: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.7167 - accuracy: 0.4016 - val_loss: 0.6660 - val_accuracy: 0.7419\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6333 - accuracy: 0.8134 - val_loss: 0.6085 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5740 - accuracy: 0.8296 - val_loss: 0.5659 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5268 - accuracy: 0.8276 - val_loss: 0.5311 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4839 - accuracy: 0.8276 - val_loss: 0.5035 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4458 - accuracy: 0.8276 - val_loss: 0.4814 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.4365 - accuracy: 0.8125Restoring model weights from the end of the best epoch: 2.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4144 - accuracy: 0.8296 - val_loss: 0.4625 - val_accuracy: 0.8145\n", - "Epoch 7: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6406 - accuracy: 0.7748 - val_loss: 0.6278 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5914 - accuracy: 0.8276 - val_loss: 0.5930 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5532 - accuracy: 0.8276 - val_loss: 0.5637 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5181 - accuracy: 0.8296 - val_loss: 0.5366 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4864 - accuracy: 0.8296 - val_loss: 0.5129 - val_accuracy: 0.8226\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4590 - accuracy: 0.8316 - val_loss: 0.4941 - val_accuracy: 0.8226\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4364 - accuracy: 0.8479 - val_loss: 0.4788 - val_accuracy: 0.8145\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4184 - accuracy: 0.8519 - val_loss: 0.4679 - val_accuracy: 0.8145\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4022 - accuracy: 0.8560 - val_loss: 0.4592 - val_accuracy: 0.8226\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3879 - accuracy: 0.8519 - val_loss: 0.4513 - val_accuracy: 0.8387\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3750 - accuracy: 0.8560 - val_loss: 0.4450 - val_accuracy: 0.8226\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3633 - accuracy: 0.8641 - val_loss: 0.4407 - val_accuracy: 0.8306\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3527 - accuracy: 0.8742 - val_loss: 0.4373 - val_accuracy: 0.8387\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3427 - accuracy: 0.8742 - val_loss: 0.4344 - val_accuracy: 0.8387\n", - "Epoch 15/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.4001 - accuracy: 0.8125Restoring model weights from the end of the best epoch: 10.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3335 - accuracy: 0.8742 - val_loss: 0.4325 - val_accuracy: 0.8387\n", - "Epoch 15: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 11ms/step - loss: 0.7021 - accuracy: 0.5030 - val_loss: 0.6586 - val_accuracy: 0.7500\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6123 - accuracy: 0.8195 - val_loss: 0.5971 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5558 - accuracy: 0.8276 - val_loss: 0.5588 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5150 - accuracy: 0.8276 - val_loss: 0.5357 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4857 - accuracy: 0.8276 - val_loss: 0.5167 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4630 - accuracy: 0.8276 - val_loss: 0.5047 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.4823 - accuracy: 0.8125Restoring model weights from the end of the best epoch: 2.\n", - "16/16 [==============================] - 0s 4ms/step - loss: 0.4444 - accuracy: 0.8276 - val_loss: 0.4965 - val_accuracy: 0.8145\n", - "Epoch 7: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6257 - accuracy: 0.8276 - val_loss: 0.6095 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5894 - accuracy: 0.8276 - val_loss: 0.5793 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5589 - accuracy: 0.8276 - val_loss: 0.5529 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5315 - accuracy: 0.8276 - val_loss: 0.5309 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5081 - accuracy: 0.8276 - val_loss: 0.5100 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.4860 - accuracy: 0.8125Restoring model weights from the end of the best epoch: 1.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4862 - accuracy: 0.8276 - val_loss: 0.4923 - val_accuracy: 0.8145\n", - "Epoch 6: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.7314 - accuracy: 0.4280 - val_loss: 0.6812 - val_accuracy: 0.5887\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6296 - accuracy: 0.7586 - val_loss: 0.6090 - val_accuracy: 0.7903\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5709 - accuracy: 0.8398 - val_loss: 0.5648 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5313 - accuracy: 0.8377 - val_loss: 0.5325 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4999 - accuracy: 0.8377 - val_loss: 0.5115 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4748 - accuracy: 0.8377 - val_loss: 0.4959 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4524 - accuracy: 0.8377 - val_loss: 0.4852 - val_accuracy: 0.8145\n", - "Epoch 8/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.3754 - accuracy: 0.8750Restoring model weights from the end of the best epoch: 3.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4337 - accuracy: 0.8398 - val_loss: 0.4751 - val_accuracy: 0.8145\n", - "Epoch 8: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6437 - accuracy: 0.7911 - val_loss: 0.6425 - val_accuracy: 0.8065\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5960 - accuracy: 0.8276 - val_loss: 0.6170 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5598 - accuracy: 0.8276 - val_loss: 0.5949 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5261 - accuracy: 0.8276 - val_loss: 0.5758 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4953 - accuracy: 0.8276 - val_loss: 0.5590 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4689 - accuracy: 0.8276 - val_loss: 0.5445 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.6274 - accuracy: 0.7500Restoring model weights from the end of the best epoch: 2.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4458 - accuracy: 0.8276 - val_loss: 0.5328 - val_accuracy: 0.8145\n", - "Epoch 7: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.5711 - accuracy: 0.8215 - val_loss: 0.5378 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5041 - accuracy: 0.8276 - val_loss: 0.5101 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4647 - accuracy: 0.8296 - val_loss: 0.4918 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4302 - accuracy: 0.8316 - val_loss: 0.4775 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3998 - accuracy: 0.8418 - val_loss: 0.4641 - val_accuracy: 0.8065\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3730 - accuracy: 0.8458 - val_loss: 0.4516 - val_accuracy: 0.8226\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3490 - accuracy: 0.8600 - val_loss: 0.4413 - val_accuracy: 0.8387\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3264 - accuracy: 0.8783 - val_loss: 0.4327 - val_accuracy: 0.8306\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3070 - accuracy: 0.8803 - val_loss: 0.4249 - val_accuracy: 0.8306\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2916 - accuracy: 0.8925 - val_loss: 0.4151 - val_accuracy: 0.8548\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2754 - accuracy: 0.9087 - val_loss: 0.4093 - val_accuracy: 0.8387\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2631 - accuracy: 0.9067 - val_loss: 0.4039 - val_accuracy: 0.8387\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2511 - accuracy: 0.9168 - val_loss: 0.3972 - val_accuracy: 0.8306\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2393 - accuracy: 0.9209 - val_loss: 0.3952 - val_accuracy: 0.8306\n", - "Epoch 15/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.2679 - accuracy: 0.9375Restoring model weights from the end of the best epoch: 10.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2304 - accuracy: 0.9249 - val_loss: 0.3885 - val_accuracy: 0.8306\n", - "Epoch 15: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.7327 - accuracy: 0.3813 - val_loss: 0.6856 - val_accuracy: 0.6048\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.6392 - accuracy: 0.7099 - val_loss: 0.6180 - val_accuracy: 0.8065\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5745 - accuracy: 0.8235 - val_loss: 0.5673 - val_accuracy: 0.7984\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5219 - accuracy: 0.8256 - val_loss: 0.5291 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4776 - accuracy: 0.8276 - val_loss: 0.5011 - val_accuracy: 0.8145\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4428 - accuracy: 0.8276 - val_loss: 0.4801 - val_accuracy: 0.8145\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4128 - accuracy: 0.8276 - val_loss: 0.4647 - val_accuracy: 0.8145\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3893 - accuracy: 0.8296 - val_loss: 0.4509 - val_accuracy: 0.8226\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3696 - accuracy: 0.8418 - val_loss: 0.4410 - val_accuracy: 0.8226\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3536 - accuracy: 0.8438 - val_loss: 0.4312 - val_accuracy: 0.8226\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3386 - accuracy: 0.8499 - val_loss: 0.4237 - val_accuracy: 0.8306\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3252 - accuracy: 0.8560 - val_loss: 0.4134 - val_accuracy: 0.8306\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3125 - accuracy: 0.8600 - val_loss: 0.4061 - val_accuracy: 0.8548\n", - "Epoch 14/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2998 - accuracy: 0.8702 - val_loss: 0.3994 - val_accuracy: 0.8548\n", - "Epoch 15/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2885 - accuracy: 0.8742 - val_loss: 0.3908 - val_accuracy: 0.8629\n", - "Epoch 16/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2776 - accuracy: 0.8763 - val_loss: 0.3853 - val_accuracy: 0.8629\n", - "Epoch 17/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2677 - accuracy: 0.8803 - val_loss: 0.3806 - val_accuracy: 0.8629\n", - "Epoch 18/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2590 - accuracy: 0.8844 - val_loss: 0.3781 - val_accuracy: 0.8710\n", - "Epoch 19/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2499 - accuracy: 0.8905 - val_loss: 0.3772 - val_accuracy: 0.8710\n", - "Epoch 20/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2420 - accuracy: 0.8966 - val_loss: 0.3700 - val_accuracy: 0.8871\n", - "Epoch 21/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2338 - accuracy: 0.8925 - val_loss: 0.3657 - val_accuracy: 0.8871\n", - "Epoch 22/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2261 - accuracy: 0.8945 - val_loss: 0.3638 - val_accuracy: 0.8871\n", - "Epoch 23/100\n", - "16/16 [==============================] - 0s 4ms/step - loss: 0.2185 - accuracy: 0.9006 - val_loss: 0.3632 - val_accuracy: 0.8871\n", - "Epoch 24/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2112 - accuracy: 0.9026 - val_loss: 0.3578 - val_accuracy: 0.8710\n", - "Epoch 25/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.1851 - accuracy: 0.9375Restoring model weights from the end of the best epoch: 20.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2041 - accuracy: 0.9067 - val_loss: 0.3569 - val_accuracy: 0.8710\n", - "Epoch 25: early stopping\n", - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6720 - accuracy: 0.6653 - val_loss: 0.6142 - val_accuracy: 0.7903\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5802 - accuracy: 0.8276 - val_loss: 0.5626 - val_accuracy: 0.8226\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5303 - accuracy: 0.8296 - val_loss: 0.5280 - val_accuracy: 0.8226\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4908 - accuracy: 0.8316 - val_loss: 0.4977 - val_accuracy: 0.8226\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4535 - accuracy: 0.8337 - val_loss: 0.4688 - val_accuracy: 0.8306\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4192 - accuracy: 0.8418 - val_loss: 0.4455 - val_accuracy: 0.8387\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3893 - accuracy: 0.8458 - val_loss: 0.4266 - val_accuracy: 0.8468\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3631 - accuracy: 0.8519 - val_loss: 0.4089 - val_accuracy: 0.8629\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3392 - accuracy: 0.8600 - val_loss: 0.3951 - val_accuracy: 0.8629\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3170 - accuracy: 0.8742 - val_loss: 0.3878 - val_accuracy: 0.8629\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 4ms/step - loss: 0.2958 - accuracy: 0.8824 - val_loss: 0.3804 - val_accuracy: 0.8629\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2756 - accuracy: 0.8905 - val_loss: 0.3815 - val_accuracy: 0.8629\n", - "Epoch 13/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.2040 - accuracy: 0.9375Restoring model weights from the end of the best epoch: 8.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2603 - accuracy: 0.8925 - val_loss: 0.3772 - val_accuracy: 0.8629\n", - "Epoch 13: early stopping\n" - ] - } - ], - "source": [ - "grid_params = {\"units1\": [8,16], \"units2\": [16,32], \"units3\": [32,64], \"activation1\": [\"relu\"], \"activation2\": [\"relu\"], \n", - " \"activation3\": [\"relu\"], \"optimizer\": [Adam, RMSprop], \"learning_rate\": [0.001, 0.0005]}\n", - "\n", - "(train, greeks, test) = load_dataset()\n", - "(x_train, y_train) = preprocess_data(train)\n", - "x_test, id_number = preprocess_test_data(test)\n", - "input_shape = len(x_train[1])\n", - "output_shape = 1\n", - "\n", - "#GridSearch\n", - "grid = ParameterGrid(param_grid = grid_params)\n", - "results = []\n", - "for idx,params in enumerate(grid):\n", - " model = build_model(input_shape=input_shape, output_shape=output_shape, **params)\n", - " history = fit_model(model, x_train, y_train, 100, 0.2)\n", - " val_loss = history.history['val_loss'][-1] \n", - " val_acc = history.history['val_accuracy'][-1]\n", - " results.append([val_loss, val_acc])" - ] - }, - { - "cell_type": "markdown", - "id": "759f9fb3", - "metadata": { - "papermill": { - "duration": 0.006185, - "end_time": "2023-06-05T15:26:00.138109", - "exception": false, - "start_time": "2023-06-05T15:26:00.131924", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "get best params" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "62c2bfb8", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:26:00.152605Z", - "iopub.status.busy": "2023-06-05T15:26:00.152197Z", - "iopub.status.idle": "2023-06-05T15:26:00.159794Z", - "shell.execute_reply": "2023-06-05T15:26:00.158733Z" - }, - "papermill": { - "duration": 0.017578, - "end_time": "2023-06-05T15:26:00.162055", - "exception": false, - "start_time": "2023-06-05T15:26:00.144477", - "status": "completed" - }, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best acc at index 6: 0.8951612710952759\n", - "best loss at index 15: 0.25923117995262146\n", - "{'units3': 32, 'units2': 32, 'units1': 16, 'optimizer': , 'learning_rate': 0.001, 'activation3': 'relu', 'activation2': 'relu', 'activation1': 'relu'}\n" - ] - } - ], - "source": [ - "val_accuracies = [i[1] for i in results]\n", - "val_losses= [i[0] for i in results]\n", - "best_acc = val_accuracies.index(max(val_accuracies))\n", - "best_loss = val_losses.index(min(val_losses))\n", - "print(f\"best acc at index {best_acc}: {max(val_accuracies)}\")\n", - "print(f\"best loss at index {best_loss}: {min(val_losses)}\")\n", - "print(grid[best_acc])" - ] - }, - { - "cell_type": "markdown", - "id": "798cf6f6", - "metadata": { - "papermill": { - "duration": 0.00626, - "end_time": "2023-06-05T15:26:00.174963", - "exception": false, - "start_time": "2023-06-05T15:26:00.168703", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "save best model" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "bf73447f", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:26:00.189954Z", - "iopub.status.busy": "2023-06-05T15:26:00.189581Z", - "iopub.status.idle": "2023-06-05T15:26:03.662733Z", - "shell.execute_reply": "2023-06-05T15:26:03.661845Z" - }, - "papermill": { - "duration": 3.483411, - "end_time": "2023-06-05T15:26:03.665104", - "exception": false, - "start_time": "2023-06-05T15:26:00.181693", - "status": "completed" - }, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/100\n", - "16/16 [==============================] - 1s 10ms/step - loss: 0.6768 - accuracy: 0.6815 - val_loss: 0.6359 - val_accuracy: 0.8145\n", - "Epoch 2/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.5701 - accuracy: 0.8276 - val_loss: 0.5900 - val_accuracy: 0.8145\n", - "Epoch 3/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4954 - accuracy: 0.8276 - val_loss: 0.5519 - val_accuracy: 0.8145\n", - "Epoch 4/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.4312 - accuracy: 0.8296 - val_loss: 0.5085 - val_accuracy: 0.8145\n", - "Epoch 5/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3721 - accuracy: 0.8499 - val_loss: 0.4755 - val_accuracy: 0.8387\n", - "Epoch 6/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.3233 - accuracy: 0.8702 - val_loss: 0.4516 - val_accuracy: 0.8468\n", - "Epoch 7/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2864 - accuracy: 0.8925 - val_loss: 0.4315 - val_accuracy: 0.8548\n", - "Epoch 8/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2565 - accuracy: 0.9047 - val_loss: 0.4236 - val_accuracy: 0.8548\n", - "Epoch 9/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2310 - accuracy: 0.9108 - val_loss: 0.4129 - val_accuracy: 0.8629\n", - "Epoch 10/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.2107 - accuracy: 0.9229 - val_loss: 0.4088 - val_accuracy: 0.8629\n", - "Epoch 11/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1904 - accuracy: 0.9351 - val_loss: 0.4018 - val_accuracy: 0.8548\n", - "Epoch 12/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1739 - accuracy: 0.9432 - val_loss: 0.3975 - val_accuracy: 0.8629\n", - "Epoch 13/100\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1590 - accuracy: 0.9473 - val_loss: 0.3858 - val_accuracy: 0.8629\n", - "Epoch 14/100\n", - " 1/16 [>.............................] - ETA: 0s - loss: 0.0680 - accuracy: 1.0000Restoring model weights from the end of the best epoch: 9.\n", - "16/16 [==============================] - 0s 3ms/step - loss: 0.1441 - accuracy: 0.9533 - val_loss: 0.3783 - val_accuracy: 0.8629\n", - "Epoch 14: early stopping\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHFCAYAAAAOmtghAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABjQ0lEQVR4nO3dd1yVdf/H8ddhHTYIyHbgxD1w5CpNs51mpWU5WmZlpd7dpa27vO+ybHk31GzobeXItPFrW+6cuVPcAweKoAKy4Vy/P46iiB5RgQsO7+fjcT2E61znOp9zTHj3nRbDMAxEREREnISL2QWIiIiIlCaFGxEREXEqCjciIiLiVBRuRERExKko3IiIiIhTUbgRERERp6JwIyIiIk5F4UZEREScisKNiIiIOBWFGxGp8Pbu3YvFYmHq1KmX/NyFCxdisVhYuHBhqVwnIhWfwo2IiIg4FYUbERERcSoKNyJyUS+//DIWi4WNGzdy1113ERAQQFBQECNHjiQ/P59t27Zxww034OfnR+3atRk3blyxeyQkJHDfffcRGhqK1WqlUaNGvP3229hstiLXHTp0iL59++Ln50dAQAD9+vXj8OHD563rr7/+4rbbbiMoKAhPT09atWrFV199Varv/fvvv6dDhw54e3vj5+fHddddx/Lly4tcc/ToUYYMGUKNGjWwWq1Ur16dTp068fvvvxdes27dOm655ZbC9x8ZGcnNN9/MgQMHSrVeEQE3swsQkcqjb9++3HfffTzyyCPMmzePcePGkZeXx++//85jjz3G008/zfTp03n22WepV68effr0Aey//Dt27Ehubi7//ve/qV27Nj/88ANPP/00u3btYsKECQBkZWXRo0cPDh06xNixY2nQoAE//vgj/fr1K1bLggULuOGGG2jfvj2TJk0iICCAmTNn0q9fPzIzMxk8ePAVv9/p06dz77330rNnT2bMmEFOTg7jxo2ja9eu/PHHH3Tu3BmAAQMGsHbtWl599VUaNGjAiRMnWLt2LSkpKQBkZGRw3XXXERMTw4cffkhYWBiHDx9mwYIFpKenX3GdInIOQ0TkIv71r38ZgPH2228XOd+yZUsDMObOnVt4Li8vz6hevbrRp0+fwnOjRo0yAGPlypVFnv/oo48aFovF2LZtm2EYhjFx4kQDML777rsi1z388MMGYEyZMqXwXGxsrNGqVSsj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CuXm5rJmzRp69uxZ5HzPnj1ZtmyZSVVVPKmpqQAEBQWZXIn5Hn/8cW6++WZ69OhhdikVwvfff0+bNm246667CA0NpVWrVnz88cdml2Wqzp0788cff7B9+3YANmzYwNKlS7nppptMrqxi2LNnD4cPHy7yc9dqtXLNNdfo5+45UlNTsVgsVa4ltMptnFnakpOTKSgoICwsrMj5sLAwDh8+bFJVFYthGIwcOZLOnTvTtGlTs8sx1cyZM1m7di2rV682u5QKY/fu3UycOJGRI0fy3HPPsWrVKp588kmsVisDBw40uzxTPPvss6SmphIbG4urqysFBQW8+uqr3HPPPWaXViGc/tl6vp+7+/btM6OkCik7O5tRo0bRv39/p95M83wUbkqJxWIp8r1hGMXOVVXDhg1j48aNLF261OxSTLV//36eeuopfvvtNzw9Pc0up8Kw2Wy0adOG1157DYBWrVqxefNmJk6cWGXDzaxZs/jiiy+YPn06TZo0Yf369QwfPpzIyEgGDRpkdnkVhn7uXlheXh533303NpuNCRMmmF1OuVO4uUIhISG4uroWa6VJSkoq9n8VVdETTzzB999/z+LFi4mOjja7HFOtWbOGpKQk4uLiCs8VFBSwePFiPvjgA3JycnB1dTWxQnNERETQuHHjIucaNWrEnDlzTKrIfP/85z8ZNWoUd999NwDNmjVj3759jB07VuEGCA8PB+wtOBEREYXn9XPXLi8vj759+7Jnzx7mz59f5VptQLOlrpiHhwdxcXHMmzevyPl58+bRsWNHk6oyn2EYDBs2jLlz5zJ//nxiYmLMLsl03bt3Z9OmTaxfv77waNOmDffeey/r16+vksEGoFOnTsWWCdi+fTu1atUyqSLzZWZm4uJS9Mezq6trlZoK7khMTAzh4eFFfu7m5uayaNGiKv1zF84Emx07dvD7778THBxsdkmmUMtNKRg5ciQDBgygTZs2dOjQgcmTJ5OQkMDQoUPNLs00jz/+ONOnT+e7777Dz8+vsGUrICAALy8vk6szh5+fX7ExRz4+PgQHB1fpsUgjRoygY8eOvPbaa/Tt25dVq1YxefJkJk+ebHZpprn11lt59dVXqVmzJk2aNGHdunW88847PPDAA2aXVm5OnjzJzp07C7/fs2cP69evJygoiJo1azJ8+HBee+016tevT/369Xnttdfw9vamf//+JlZd9hx9LpGRkdx5552sXbuWH374gYKCgsKfvUFBQXh4eJhVdvkzd7KW8/jwww+NWrVqGR4eHkbr1q2r/JRn4LzHlClTzC6tQtFUcLv/+7//M5o2bWpYrVYjNjbWmDx5stklmSotLc146qmnjJo1axqenp5GnTp1jOeff97Iyckxu7Rys2DBgvP+DBk0aJBhGPbp4P/617+M8PBww2q1GldffbWxadMmc4suB44+lz179lzwZ++CBQvMLr1cWQzDMMozTImIiIiUJY25EREREaeicCMiIiJOReFGREREnIrCjYiIiDgVhRsRERFxKgo3IiIi4lQUbkRERMSpKNyISJW3cOFCLBYLJ06cMLsUESkFCjciIiLiVBRuRERExKko3IiI6QzDYNy4cdSpUwcvLy9atGjB119/DZzpMvrxxx9p0aIFnp6etG/fnk2bNhW5x5w5c2jSpAlWq5XatWvz9ttvF3k8JyeHZ555hho1amC1Wqlfvz6ffvppkWvWrFlDmzZt8Pb2pmPHjsV2KxeRykHhRkRM98ILLzBlyhQmTpzI5s2bGTFiBPfddx+LFi0qvOaf//wnb731FqtXryY0NJTbbruNvLw8wB5K+vbty913382mTZt4+eWXefHFF5k6dWrh8wcOHMjMmTN57733iI+PZ9KkSfj6+hap4/nnn+ftt9/mr7/+ws3NrUrtwi3iTLRxpoiYKiMjg5CQEObPn0+HDh0Kzz/00ENkZmYyZMgQunXrxsyZM+nXrx8Ax44dIzo6mqlTp9K3b1/uvfdejh49ym+//Vb4/GeeeYYff/yRzZs3s337dho2bMi8efPo0aNHsRoWLlxIt27d+P333+nevTsAP/30EzfffDNZWVl4enqW8acgIqVJLTciYqotW7aQnZ3Nddddh6+vb+Exbdo0du3aVXjd2cEnKCiIhg0bEh8fD0B8fDydOnUqct9OnTqxY8cOCgoKWL9+Pa6urlxzzTUOa2nevHnh1xEREQAkJSVd8XsUkfLlZnYBIlK12Ww2AH788UeioqKKPGa1WosEnHNZLBbAPmbn9Nennd0o7eXlVaJa3N3di937dH0iUnmo5UZETNW4cWOsVisJCQnUq1evyFGjRo3C61asWFH49fHjx9m+fTuxsbGF91i6dGmR+y5btowGDRrg6upKs2bNsNlsRcbwiIjzUsuNiJjKz8+Pp59+mhEjRmCz2ejcuTNpaWksW7YMX19fatWqBcCYMWMIDg4mLCyM559/npCQEHr37g3AP/7xD9q2bcu///1v+vXrx/Lly/nggw+YMGECALVr12bQoEE88MADvPfee7Ro0YJ9+/aRlJRE3759zXrrIlJGFG5ExHT//ve/CQ0NZezYsezevZvAwEBat27Nc889V9gt9Prrr/PUU0+xY8cOWrRowffff4+HhwcArVu35quvvuKll17i3//+NxEREYwZM4bBgwcXvsbEiRN57rnneOyxx0hJSaFmzZo899xzZrxdESljmi0lIhXa6ZlMx48fJzAw0OxyRKQS0JgbERERcSoKNyIiIuJU1C0lIiIiTkUtNyIiIuJUFG5ERETEqSjciIiIiFNRuBERERGnonAjIiIiTkXhRkRERJyKwo2IiIg4FYUbERERcSoKNyIiIuJU/h/wfsR+E4PhpgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "model = build_model(input_shape=input_shape, output_shape=output_shape, **grid[best_acc])\n", - "history = fit_model(model, x_train, y_train, 100, 0.2)\n", - "plot_acc(history)" - ] - }, - { - "cell_type": "markdown", - "id": "ffb846bf", - "metadata": { - "papermill": { - "duration": 0.013105, - "end_time": "2023-06-05T15:26:03.692004", - "exception": false, - "start_time": "2023-06-05T15:26:03.678899", - "status": "completed" - }, - "tags": [] - }, - "source": [ - "Submission" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4878fbac", - "metadata": { - "execution": { - "iopub.execute_input": "2023-06-05T15:26:03.721837Z", - "iopub.status.busy": "2023-06-05T15:26:03.720708Z", - "iopub.status.idle": "2023-06-05T15:26:03.893049Z", - "shell.execute_reply": "2023-06-05T15:26:03.891892Z" - }, - "papermill": { - "duration": 0.19032, - "end_time": "2023-06-05T15:26:03.895803", - "exception": false, - "start_time": "2023-06-05T15:26:03.705483", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "submission = pd.DataFrame()\n", - "prediction = model.predict(x_test)\n", - "submission.insert(0, \"Id\", id_number, False)\n", - "submission.insert(1, \"class_0\", [round(1-i[0],2) for i in prediction], True)\n", - "submission.insert(2, \"class_1\", [round(i[0],2) for i in prediction], True)\n", - "submission.to_csv(\"/kaggle/working/submission.csv\",index = False)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - }, - "papermill": { - "default_parameters": {}, - "duration": 28.693825, - "end_time": "2023-06-05T15:26:06.679501", - "environment_variables": {}, - "exception": null, - "input_path": "__notebook__.ipynb", - "output_path": "__notebook__.ipynb", - "parameters": {}, - "start_time": "2023-06-05T15:25:37.985676", - "version": "2.4.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/competitions/identify-age-related-conditions/train_models/RF_model.ipynb b/competitions/identify-age-related-conditions/train_models/RF_model.ipynb deleted file mode 100644 index 6e2a3c3..0000000 --- a/competitions/identify-age-related-conditions/train_models/RF_model.ipynb +++ /dev/null @@ -1,222 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1004, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.ensemble import RandomForestClassifier\n", - "from sklearn.impute import SimpleImputer\n", - "from sklearn.pipeline import Pipeline\n", - "from sklearn.preprocessing import OneHotEncoder\n", - "from sklearn.compose import ColumnTransformer\n", - "from sklearn.model_selection import train_test_split, cross_val_score\n", - "from sklearn.metrics import accuracy_score\n", - "from xgboost import XGBClassifier\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "from sklearn.feature_selection import mutual_info_regression\n", - "from sklearn.discriminant_analysis import StandardScaler\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 1005, - "metadata": {}, - "outputs": [], - "source": [ - "def load_dataset(columns_drop) -> tuple([pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]):\n", - " train = pd.read_csv(\"C:\\\\Projects\\\\kaggle\\\\competitions\\\\identify-age-related-conditions\\\\data\\\\train.csv\")\n", - " greeks = pd.read_csv(\"C:\\\\Projects\\\\kaggle\\\\competitions\\\\identify-age-related-conditions\\\\data\\\\greeks.csv\")\n", - " test = pd.read_csv(\"C:\\\\Projects\\\\kaggle\\\\competitions\\\\identify-age-related-conditions\\\\data\\\\test.csv\")\n", - " columns_drop = ['Id'] + columns_drop\n", - " id_list = test[\"Id\"]\n", - " train.drop(columns_drop, inplace=True, axis=1)\n", - " test.drop(columns_drop, inplace=True, axis=1)\n", - " print(len(train.columns))\n", - " return (train, greeks, test, id_list)" - ] - }, - { - "cell_type": "code", - "execution_count": 1006, - "metadata": {}, - "outputs": [], - "source": [ - "def split_data(df: pd.DataFrame, split)->tuple([pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]):\n", - " X = df.loc[:, df.columns != \"Class\"]\n", - " y = df.loc[:, \"Class\"]\n", - " return train_test_split(X, y, test_size=split, random_state=42)" - ] - }, - { - "cell_type": "code", - "execution_count": 1007, - "metadata": {}, - "outputs": [], - "source": [ - "def build_pipeline(df: pd.DataFrame) -> ColumnTransformer:\n", - " # Preprocessing for numerical data \n", - " numerical_transformer = Pipeline(steps=[\n", - " ('imputer',SimpleImputer(strategy='constant')),\n", - " ('scaler', StandardScaler())])\n", - " \n", - " # Preprocessing for categorical data\n", - " categorical_transformer = Pipeline(steps=[\n", - " ('imputer', SimpleImputer(strategy='most_frequent')),\n", - " ('onehot', OneHotEncoder(handle_unknown='ignore'))\n", - " ])\n", - "\n", - " # Bundle preprocessing for numerical and categorical data\n", - " numerical_cols = [cname for cname in df.columns if df[cname].dtype in [\"int64\", \"float64\"]]\n", - " categorical_cols = [cname for cname in df.columns if df[cname].nunique() < 10]\n", - " preprocessor = ColumnTransformer(\n", - " transformers=[\n", - " ('num', numerical_transformer, numerical_cols),\n", - " ('cat', categorical_transformer, categorical_cols)\n", - " ])\n", - " print(f\"Number of columns: {len(df.columns)}\")\n", - " return preprocessor" - ] - }, - { - "cell_type": "code", - "execution_count": 1008, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "57\n", - "dataset shape: (617, 57)\n", - "X shape: (431, 56) and y shape: (431,)\n" - ] - } - ], - "source": [ - "# Define model\n", - "#model = RandomForestClassifier(n_estimators=100, random_state=22)\n", - "model = XGBClassifier(n_estimators=500)\n", - "\n", - "#Splitting\n", - "train, greeks, test, id_list = load_dataset(columns_drop=[])\n", - "print(f\"dataset shape: {train.shape}\")\n", - "X_train, X_valid, y_train, y_valid = split_data(train, 0.3)\n", - "print(f\"X shape: {X_train.shape} and y shape: {y_train.shape}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 1009, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Columns with MI equal zero: ['DN', 'CC', 'EG', 'AB', 'FS', 'BD ', 'AY', 'AZ', 'GE', 'GB', 'DY', 'BN', 'FD ', 'CD ', 'CF', 'CU', 'DE', 'DF', 'CB'] --> total length: 19\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABREAAAUQCAYAAADTXhe6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAACsOUlEQVR4nOzde3jdVZ0v/vduUza0aVLbIikYKBBsR8pFdBDEGSi3BtuCcwABRYigZ5QOgiDTExytFWl6EI7YEcqobeMFOeCB46WOLWOFGR09gIMROLZcxglUbP0pl2xbMNKyf38w3YdQuint3gmU1+t51kO/67u+6/tJ8g/P+1nftQrlcrkcAAAAAIAtGDbUBQAAAAAAr2xCRAAAAACgKiEiAAAAAFCVEBEAAAAAqEqICAAAAABUJUQEAAAAAKoSIgIAAAAAVQkRAQAAAICqhIgAAAAAQFVCRADgVaW7uzuFQiGFQiG33377ZvfL5XLa2tpSKBRy1FFHbdM7/vEf/zGf+tSntqvOrdXb25tCoZDu7u6tGnfllVdu03v+9Kc/5UMf+lAmTJiQ4cOH5+CDD96meYbSN77xjVx99dUveq9QKAza3+yF7rjjjvzVX/1V9txzzxSLxey22245/PDDc/HFFw9JPQAA9SBEBABelUaPHp1FixZt1v/P//zP+fd///eMHj16m+f+x3/8x8ydO3d7ynvFWbhwYf7hH/4hH//4x/PjH/84X/va14a6pJetWoj405/+NB/4wAcGt6Ak3/ve9/L2t789pVIpV1xxRW699dZ8/vOfzxFHHJEbb7xx0OsBAKiXhqEuAABgW5x22mm5/vrrc80116SpqanSv2jRohx++OEplUpDWN0rz3333Zdddtklf/M3f1OzOZ9++unssssuNZtvexx22GFD8t4rrrgie++9d5YvX56Ghv/3v9ann356rrjiikGt5amnnsrIkSMH9Z0AwGuHlYgAwKvSGWeckSS54YYbKn19fX25+eabc84552w2/vbbb3/RT6Bf+DlxR0dHrrnmmiSpfDZdKBTS29tb9dPjF35O+9BDD+X9739/9ttvv4wcOTJ77LFHZs6cmXvvvXf7fvDn2fRp92233ZYPf/jDGT9+fMaNG5f/8l/+S37zm98MqO3LX/5ynn766crPs+ln+OMf/5jOzs7svffe2WmnnbLHHntk1qxZefLJJwe8a+LEiZkxY0ZuueWWvPnNb87OO++cuXPnVn6v3/jGNzJ79uxMmDAhjY2NmTlzZn7729/mD3/4Q/7rf/2vGT9+fMaPH5/3v//9Wbdu3YC5r7nmmvzlX/5lXv/612fUqFE54IADcsUVV+SZZ56pjDnqqKPyve99Lw8//PCAv8uWfv/Jc8HpSSedlNe97nXZeeedc/DBB+crX/nKgDGb6r/hhhvy8Y9/PLvvvnuamppy7LHH5v7773/Jv8Fjjz2W8ePHDwgQNxk2bPP/1f7GN76Rww8/PI2NjWlsbMzBBx+82YraxYsX56CDDsrOO++csWPH5q/+6q+ycuXKAWM6OjrS2NiYe++9N8cff3xGjx6dY445Jslzn65/5jOfyeTJk1MsFrPrrrvm/e9/f373u98NmOOHP/xhjjrqqIwbNy677LJL9txzz5x88sl56qmnXvLnBgBee4SIAMCrUlNTU0455ZQsXry40nfDDTdk2LBhOe2007Z53k984hM55ZRTkjz3ieymNmHChJc1z29+85uMGzcu8+fPz7Jly3LNNdekoaEhb3vb27YqnHo5PvCBD2TEiBH5xje+kSuuuCK33357zjzzzMr9n/70p3nnO9+ZXXbZpfLzTJ8+PeVyOe9617ty5ZVX5n3ve1++973v5aKLLspXvvKVHH300env7x/wnrvvvjuXXHJJPvKRj2TZsmU5+eSTK/cuvfTS/H//3/+X7u7uXHXVVbn99ttzxhln5OSTT05zc3NuuOGG/O3f/m2+9rWv5dJLLx0w77//+7/nPe95T772ta9l6dKlOffcc/PZz342f/3Xf10Zc+211+aII45IS0vLgL/Lltx///15+9vfnv/7f/9vFixYkFtuuSVvetOb0tHR8aIrBC+99NI8/PDD+fKXv5wvfvGLefDBBzNz5sxs3Lix6u/+8MMPzx133JGPfOQjueOOOwYEny/0yU9+Mu9973uz++67p7u7O//7f//vnH322Xn44YcrY7q6unLuuedm//33zy233JLPf/7zueeee3L44YfnwQcfHDDfn/70p5x44ok5+uij8+1vfztz587Ns88+m5NOOinz58/Pe97znnzve9/L/Pnz80//9E856qij8vTTTyd5LjyfPn16dtpppyxevDjLli3L/PnzM2rUqPzpT3+q+jMDAK9RZQCAV5ElS5aUk5Tvuuuu8m233VZOUr7vvvvK5XK5/Od//ufljo6OcrlcLu+///7lI488svLcprG33XbbgPn+4z/+o5ykvGTJkkrfrFmzyi/2v0kvNnaTJOU5c+Zsse4NGzaU//SnP5X322+/8kc/+tGtmvPF3v3Zz3620rfpd3HeeecNGHvFFVeUk5TXrFlT6Tv77LPLo0aNGjBu2bJl5STlK664YkD/jTfeWE5S/uIXv1jp22uvvcrDhw8v33///QPGbvq9zpw5c0D/hRdeWE5S/shHPjKg/13veld57NixW/w5N27cWH7mmWfKX/3qV8vDhw8vP/7445V706dPL++1114v+twLf/+nn356uVgslh955JEB40444YTyyJEjy08++eSA+t/5zncOGHfTTTeVk5R/+tOfbrHWcrlc/v3vf19+xzveUU5STlIeMWJE+e1vf3u5q6ur/Ic//KEy7le/+lV5+PDh5fe+971bnOuJJ54o77LLLpvV8sgjj5SLxWL5Pe95T6Xv7LPPLicpL168eMDYG264oZykfPPNNw/ov+uuu8pJytdee225XC6X/9f/+l/lJOWenp6qPx8AwCZWIgIAr1pHHnlk9t133yxevDj33ntv7rrrrhf9lHkobNiwIfPmzcub3vSm7LTTTmloaMhOO+2UBx98cLNPU7fXiSeeOOD6wAMPTJIBK9xezA9/+MMkz30a+3ynnnpqRo0alRUrVmw27xvf+MYXnWvGjBkDrv/sz/4sSTJ9+vTN+h9//PEBnzT//Oc/z4knnphx48Zl+PDhGTFiRM4666xs3LgxDzzwQNWfodrPdswxx6S1tXVAf0dHR5566qnNVjFu6+9w3Lhx+dGPfpS77ror8+fPz0knnZQHHnggnZ2dOeCAA/L73/8+SfJP//RP2bhxY2bNmrXFuX7605/m6aef3uzv0dramqOPPnqzv0eSAatBk2Tp0qUZM2ZMZs6cmQ0bNlTawQcfnJaWlsrn/AcffHB22mmn/Nf/+l/zla98Jb/61a+q/pwAAEJEAOBVq1Ao5P3vf3++/vWv57rrrssb3/jG/MVf/MVQl5Ukueiii/KJT3wi73rXu/Ld7343d9xxR+66664cdNBBlU9Ka2XcuHEDrovFYpK85Hsee+yxNDQ0ZNdddx3QXygU0tLSkscee2xAf7VPuseOHTvgeqeddqra/8c//jFJ8sgjj+Qv/uIv8uijj+bzn/98JZDbtC/ltv6uHnvssRetd/fdd6/cf75t/R1u8ta3vjWzZ8/ON7/5zfzmN7/JRz/60fT29lY+nd60H+Eb3vCGqjUnL/573n333TereeTIkQMOFUqS3/72t3nyySez0047ZcSIEQPa2rVrK6Hmvvvumx/84Ad5/etfn1mzZmXffffNvvvum89//vNb9fMCAK89TmcGAF7VOjo68slPfjLXXXddLr/88i2O23nnnZNks33+NoUqW2NLc7ww3EmSr3/96znrrLMyb968zd43ZsyYrX5nPY0bNy4bNmzI7373uwFBYrlcztq1a/Pnf/7nA8Y//yCTWvnWt76V9evX55Zbbslee+1V6e/p6dmueceNG5c1a9Zs1r/pwJnx48dv1/zVjBgxInPmzMnnPve53HfffUlS+f3++te/3mx15Cabgswt1f3Cml/s77HpcJ1ly5a96DtGjx5d+fdf/MVf5C/+4i+ycePG/OxnP8vf//3f58ILL8xuu+2W008/fSt+UgDgtcRKRADgVW2PPfbIJZdckpkzZ+bss8/e4riJEycmSe65554B/d/5znc2G7ulVWi77bZbdt55583m+Pa3v73ZHIVCoTLPJt/73vfy6KOPbvmHGWSbTvP9+te/PqD/5ptvzvr16yv362lTEPb831W5XM6XvvSlzcYWi8WtXhl4zDHH5Ic//OGAU6qT5Ktf/WpGjhyZww47bDuq/n9eLPBLUvlkfdPKx+OPPz7Dhw/PwoULtzjX4Ycfnl122WWzv8evf/3ryufZL2XGjBl57LHHsnHjxrz1rW/drE2aNGmzZ4YPH563ve1tldWfd99990u+BwB47bESEQB41Zs/f/5Ljmlpacmxxx6brq6uvO51r8tee+2VFStW5JZbbtls7AEHHJAk+e///b/nhBNOyPDhw3PggQdmp512yplnnpnFixdn3333zUEHHZQ777wz3/jGNzabY8aMGenu7s7kyZNz4IEH5t/+7d/y2c9+turnrIPtuOOOy7Rp0zJ79uyUSqUcccQRueeeezJnzpy8+c1vzvve975BqWGnnXbKGWeckb/927/NH//4xyxcuDBPPPHEZmMPOOCA3HLLLVm4cGHe8pa3ZNiwYXnrW9/6ovPOmTMnS5cuzdSpU/PJT34yY8eOzfXXX5/vfe97ueKKK9Lc3FyT+qdNm5Y3vOENmTlzZiZPnpxnn302PT09ueqqq9LY2JgLLrggyXMh9qWXXprLLrssTz/9dM4444w0Nzfnl7/8ZX7/+99n7ty5GTNmTD7xiU/k0ksvzVlnnZUzzjgjjz32WObOnZudd945c+bMecl6Tj/99Fx//fV55zvfmQsuuCCHHnpoRowYkV//+te57bbbctJJJ+Wv/uqvct111+WHP/xhpk+fnj333DN//OMfKyedH3vssTX53QAAOxYhIgDwmvG1r30t559/fmbPnp2NGzdm5syZueGGGzYLot7znvfkX//1X3Pttdfm05/+dMrlcv7jP/4jEydOzFVXXZUkueKKK7Ju3bocffTRWbp0aWWl4yaf//znM2LEiHR1dWXdunU55JBDcsstt+Tv/u7vBuvHfUmFQiHf+ta38qlPfSpLlizJ5ZdfnvHjx+d973tf5s2bt9lKynqYPHlybr755vzd3/1d/st/+S8ZN25c3vOe9+Siiy7KCSecMGDsBRdckP/7f/9vLr300vT19aVcLqdcLr/ovJMmTcpPfvKTXHrppZk1a1aefvrp/Nmf/VmWLFmy2cEl2+Pv/u7v8u1vfzuf+9znsmbNmvT392fChAk59thj09nZWTlgJkk+/elPZ7/99svf//3f573vfW8aGhqy33775SMf+UhlTGdnZ17/+tdnwYIFufHGG7PLLrvkqKOOyrx587Lffvu9ZD3Dhw/Pd77znXz+85/P1772tXR1daWhoSFveMMbcuSRR1YC8oMPPji33npr5syZk7Vr16axsTFTpkzJd77znRx//PE1+/0AADuOQnlL/+cFAAAAABB7IgIAAAAAL0GICAAAAABUJUQEAAAAAKoSIgIAAAAAVQkRAQAAAICqhIgAAAAAQFUNQ13A9nj22Wfzm9/8JqNHj06hUBjqcgAAAADgVaVcLucPf/hDdt999wwbtuX1hq/qEPE3v/lNWltbh7oMAAAAAHhVW716dd7whjds8f6rOkQcPXp0kud+yKampiGuBgAAAABeXUqlUlpbWys525a8qkPETZ8wNzU1CREBAAAAYBu91FaBDlYBAAAAAKoSIgIAAAAAVQkRAQAAAICqhIgAAAAAQFVCRAAAAACgKiEiAAAAAFCVEBEAAAAAqEqICAAAAABUJUQEAAAAAKoSIgIAAAAAVQkRAQAAAICqhIgAAAAAQFVCRAAAAACgKiEiAAAAAFCVEBEAAAAAqEqICAAAAABUJUQEAAAAAKoSIgIAAAAAVQkRAQAAAICqhIgAAAAAQFVCRAAAAACgKiEiAAAAAFCVEBEAAAAAqEqICAAAAABUJUQEAAAAAKoSIgIAAAAAVQkRAQAAAICqhIgAAAAAQFVCRAAAAACgKiEiAAAAAFCVEBEAAAAAqEqICAAAAABUJUQEAAAAAKoSIgIAAAAAVQkRAQAAAICqhIgAAAAAQFVCRAAAAACgKiEiAAAAAFCVEBEAAAAAqEqICAAAAABUJUQEAAAAAKoSIgIAAAAAVQkRAQAAAICqhIgAAAAAQFVCRAAAAACgKiEiAAAAAFCVEBEAAAAAqEqICAAAAABUJUQEAAAAAKoSIgIAAAAAVQkRAQAAAICqhIgAAAAAQFVCRAAAAACgqoahLqAWpsxZnmHFkUNdBgAAAAA7iN7504e6hFcUKxEBAAAAgKqEiAAAAABAVUJEAAAAAKCqmoWIHR0dKRQKKRQKGTFiRHbbbbccd9xxWbx4cZ599tnKuEKhkG9961ubPX/hhRfmqKOOqlU5AAAAAECN1HQlYnt7e9asWZPe3t58//vfz9SpU3PBBRdkxowZ2bBhQy1fBQAAAAAMkpqezlwsFtPS0pIk2WOPPXLIIYfksMMOyzHHHJPu7u584AMfqOXrAAAAAIBBUPc9EY8++ugcdNBBueWWW7Z7rv7+/pRKpQENAAAAAKivQTlYZfLkyent7d3uebq6utLc3Fxpra2t218cAAAAAFDVoISI5XI5hUJhu+fp7OxMX19fpa1evboG1QEAAAAA1dR0T8QtWblyZfbee+8kyejRo9PX17fZmCeffDLNzc1V5ykWiykWi3WpEQAAAAB4cXVfifjDH/4w9957b04++eQkz33afNdddw0YUy6X82//9m+ZNGlSvcsBAAAAAF6mmq5E7O/vz9q1a7Nx48b89re/zbJly9LV1ZUZM2bkrLPOSpJ87GMfy9lnn53Jkyfn+OOPz9NPP50vfvGL+fd///fMmjWrluUAAAAAADVQ0xBx2bJlmTBhQhoaGvK6170uBx10UBYsWJCzzz47w4Y9t+jx3e9+d8rlcq688sp8/OMfz84775w3v/nN+dGPfpS99tqrluUAAAAAADVQKJfL5aEuYluVSqXnTmm+8KYMK44c6nIAAAAA2EH0zp8+1CUMik35Wl9fX5qamrY4blBOZwYAAAAAXr0G5XTmertv7rSqSSkAAAAAsO2sRAQAAAAAqhIiAgAAAABVCREBAAAAgKp2iD0Rp8xZ7nRmAAAAYDOvlRN2od6sRAQAAAAAqhIiAgAAAABVCREBAAAAgKpqGiJ2dHSkUChU2rhx49Le3p577rlnwLilS5fmqKOOyujRozNy5Mj8+Z//ebq7u2tZCgAAAABQIzVfidje3p41a9ZkzZo1WbFiRRoaGjJjxozK/b//+7/PSSedlLe//e254447cs899+T000/Phz70oXzsYx+rdTkAAAAAwHaq+enMxWIxLS0tSZKWlpbMnj07f/mXf5nf/e53+eMf/5iLL744F154YebNm1d55uKLL85OO+2Uj3zkIzn11FPztre9rdZlAQAAAADbqK57Iq5bty7XX3992traMm7cuPyv//W/8swzz7zoisO//uu/TmNjY2644YYtztff359SqTSgAQAAAAD1VfOViEuXLk1jY2OSZP369ZkwYUKWLl2aYcOG5YEHHkhzc3MmTJiw2XM77bRT9tlnnzzwwANbnLurqytz586tdckAAAAAQBU1X4k4derU9PT0pKenJ3fccUeOP/74nHDCCXn44Ydf8tlyuZyddtppi/c7OzvT19dXaatXr65l6QAAAADAi6j5SsRRo0alra2tcv2Wt7wlzc3N+dKXvpT99tsvfX19+c1vfpPdd999wHN/+tOf8qtf/Srt7e1bnLtYLKZYLNa6ZAAAAACgirruiZgkhUIhw4YNy9NPP51TTjklDQ0NueqqqzYbd9111+Wpp57KWWedVe+SAAAAAICXoeYrEfv7+7N27dokyRNPPJEvfOELWbduXWbOnJk999wzV1xxRT72sY9l5513zvve976MGDEi3/72t3PppZfmM5/5TKZMmVLrkgAAAACA7VDzEHHZsmWVg1NGjx6dyZMn55vf/GaOOuqoJMlHP/rR7LPPPrnqqqvy+c9/PuvXr0+S3HDDDTn99NNrXQ4AAAAAsJ0K5XK5PJQFPP744znmmGPS1NSU73//+xk5cuRWP1sqldLc3JzWC2/KsOLWPwcAAAC8NvTOnz7UJcAr2qZ8ra+vL01NTVscV/c9EV/K2LFj84Mf/CDHHHNMfvrTnw51OQAAAADACwz5SsTtsbVJKQAAAACwuVfNSkQAAAAA4JVNiAgAAAAAVCVEBAAAAACqahjqAmphypzlTmcGAAAAKpzKDLVlJSIAAAAAUJUQEQAAAACoSogIAAAAAFRVtxCxo6MjhUJhs9be3p4kmThxYqVv5MiRmTJlSv7hH/6hXuUAAAAAANuorgertLe3Z8mSJQP6isVi5d+f/vSn88EPfjDr1q1Ld3d3PvShD2XMmDE57bTT6lkWAAAAAPAy1PVz5mKxmJaWlgHtda97XeX+6NGj09LSkra2tnzmM5/Jfvvtl29961v1LAkAAAAAeJnquhLx5dp5553zzDPPbPF+f39/+vv7K9elUmkwygIAAACA17S6rkRcunRpGhsbB7TLLrtss3EbNmxId3d37r333hxzzDFbnK+rqyvNzc2V1traWs/yAQAAAIAkhXK5XK7HxB0dHXn00UezcOHCAf1jx47N2LFjM3HixKxZsyYjRoxIf39/dtppp8yaNSvz58/PsGEvnm2+2ErE1tbWtF54U4YVR9bjxwAAAABehXrnTx/qEuBVoVQqpbm5OX19fWlqatriuLp+zjxq1Ki0tbVt8f4ll1ySjo6OjBw5MhMmTEihUKg6X7FYHHAwCwAAAABQf0O6J+L48eOrhowAAAAAwNCra4jY39+ftWvXDnxhQ0PGjx9fz9cCAAAAADVU1xBx2bJlmTBhwoC+SZMmZdWqVfV8LQAAAABQQ3ULEbu7u9Pd3b3F+729vfV6NQAAAABQQy9+DDIAAAAAwH8a0oNVauW+udOqHkENAAAAAGw7KxEBAAAAgKqEiAAAAABAVUJEAAAAAKCqHWJPxClzlmdYceRQlwEAAPCa1Tt/+lCXAEAdWYkIAAAAAFQlRAQAAAAAqhIiAgAAAABV1S1EXLt2bS644IK0tbVl5513zm677ZZ3vOMdue666/LUU08lSSZOnJirr766XiUAAAAAADVQl4NVfvWrX+WII47ImDFjMm/evBxwwAHZsGFDHnjggSxevDi77757TjzxxHq8GgAAAACosbqEiOedd14aGhrys5/9LKNGjar0H3DAATn55JNTLpfr8VoAAAAAoA5q/jnzY489lltvvTWzZs0aECA+X6FQqPVrAQAAAIA6qXmI+NBDD6VcLmfSpEkD+sePH5/GxsY0NjZm9uzZ2zR3f39/SqXSgAYAAAAA1FfdDlZ54WrDO++8Mz09Pdl///3T39+/TXN2dXWlubm50lpbW2tRKgAAAABQRc1DxLa2thQKhaxatWpA/z777JO2trbssssu2zx3Z2dn+vr6Km316tXbWy4AAAAA8BJqHiKOGzcuxx13XL7whS9k/fr1NZ27WCymqalpQAMAAAAA6qsupzNfe+21OeKII/LWt741n/rUp3LggQdm2LBhueuuu7Jq1aq85S1vqYx99NFH09PTM+D5PffcM2PHjq1HaQAAAADAy1Qol8vleky8Zs2azJs3L9/73vfy61//OsViMW9605ty6qmn5rzzzsvIkSMzceLEPPzww5s9u2TJknR0dLzkO0ql0nN7I154U4YVR9bhpwAAAGBr9M6fPtQlALANNuVrfX19Vb/6rVuIOBiEiAAAAK8MQkSAV6etDRHrdjozAAAAALBjECICAAAAAFXV5WCVwXbf3GlOagYAAACAOrESEQAAAACoSogIAAAAAFQlRAQAAAAAqtoh9kScMmd5hhVHDnUZAAAArwi986cPdQkA7GCsRAQAAAAAqhIiAgAAAABV1TxEXLt2bS644IK0tbVl5513zm677ZZ3vOMdue666/LUU08lSSZOnJirr756s2c/9alP5eCDD651SQAAAADAdqjpnoi/+tWvcsQRR2TMmDGZN29eDjjggGzYsCEPPPBAFi9enN133z0nnnhiLV8JAAAAANRZTUPE8847Lw0NDfnZz36WUaNGVfoPOOCAnHzyySmXy7V8HQAAAAAwCGr2OfNjjz2WW2+9NbNmzRoQID5foVCo1esAAAAAgEFSsxDxoYceSrlczqRJkwb0jx8/Po2NjWlsbMzs2bMr/bNnz670b2rz5s2r+o7+/v6USqUBDQAAAACor5ofrPLC1YZ33nlnenp6sv/++6e/v7/Sf8kll6Snp2dA+9CHPlR17q6urjQ3N1daa2trrcsHAAAAAF6gZnsitrW1pVAoZNWqVQP699lnnyTJLrvsMqB//PjxaWtrG9A3duzYqu/o7OzMRRddVLkulUqCRAAAAACos5qtRBw3blyOO+64fOELX8j69etrNe0AxWIxTU1NAxoAAAAAUF81/Zz52muvzYYNG/LWt741N954Y1auXJn7778/X//617Nq1aoMHz68lq8DAAAAAAZBzT5nTpJ99903P//5zzNv3rx0dnbm17/+dYrFYt70pjflYx/7WM4777xavg4AAAAAGASFcrlc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AAAAgFevunzOPNjumzutalIKAAAAAGw7KxEBAAAAgKqEiAAAAABAVUJEAAAAAKCqHWJPxClzljudGQBeQZy0DAAAOxYrEQEAAACAqoSIAAAAAEBVQkQAAAAAoKq6hIhr167N+eefn3322SfFYjGtra2ZOXNmVqxYkSSZOHFiCoVCCoVCdtlll0yePDmf/exnUy6X61EOAAAAALAdan6wSm9vb4444oiMGTMmV1xxRQ488MA888wzWb58eWbNmpVVq1YlST796U/ngx/8YP74xz/mBz/4QT784Q+nqakpf/3Xf13rkgAAAACA7VDzEPG8885LoVDInXfemVGjRlX6999//5xzzjmV69GjR6elpSVJ8oEPfCALFy7MrbfeKkQEAAAAgFeYmn7O/Pjjj2fZsmWZNWvWgABxkzFjxmzWVy6Xc/vtt2flypUZMWJE1fn7+/tTKpUGNAAAAACgvmoaIj700EMpl8uZPHnyS46dPXt2GhsbUywWM3Xq1JTL5XzkIx+p+kxXV1eam5srrbW1tValAwAAAABbUNMQcdPBKIVC4SXHXnLJJenp6ck///M/Z+rUqfn4xz+et7/97VWf6ezsTF9fX6WtXr26JnUDAAAAAFtW0z0R99tvvxQKhaxcuTLvete7qo4dP3582tra0tbWlptvvjltbW057LDDcuyxx27xmWKxmGKxWMuSAQAAAICXUNOViGPHjs20adNyzTXXZP369Zvdf/LJJ1/0ude97nU5//zz87GPfayymhEAAAAAeGWoaYiYJNdee202btyYQw89NDfffHMefPDBrFy5MgsWLMjhhx++xedmzZqV+++/PzfffHOtSwIAAAAAtkPNQ8S99947d999d6ZOnZqLL744U6ZMyXHHHZcVK1Zk4cKFW3xu1113zfve97586lOfyrPPPlvrsgAAAACAbVQov4q/Hy6VSs+d0nzhTRlWHDnU5QAA/6l3/vShLgEAANgKm/K1vr6+NDU1bXFczVciAgAAAAA7lpqezjxU7ps7rWpSCgAAAABsOysRAQAAAICqhIgAAAAAQFVCRAAAAACgqh1iT8Qpc5Y7nRkAqnBaMgAAsD2sRAQAAAAAqhIiAgAAAABVCREBAAAAgKrqGiJ2dHSkUChs1h566KEt3mtvb69nSQAAAADAy1T3g1Xa29uzZMmSAX277rrrFu8Vi8V6lwQAAAAAvAx1DxGLxWJaWlpe9j0AAAAA4JWh7iFiLfX396e/v79yXSqVhrAaAAAAAHhtqPvBKkuXLk1jY2OlnXrqqVu819jYmMsuu2yLc3V1daW5ubnSWltb610+AAAAALzm1X0l4tSpU7Nw4cLK9ahRo7Z4L0nGjh27xbk6Oztz0UUXVa5LpZIgEQAAAADqrO4h4qhRo9LW1vay772YYrHo4BUAAAAAGGR1/5wZAAAAAHh1G9KDVfr7+7N27doBfQ0NDRk/fvwQVQQAAAAAvNCQhojLli3LhAkTBvRNmjQpq1atGqKKAAAAAIAXKpTL5fJQF7GtSqXSc6c0X3hThhVHDnU5APCK1Tt/+lCXAAAAvAJtytf6+vrS1NS0xXH2RAQAAAAAqhrSz5lr5b6506ompQAAAADAtrMSEQAAAACoSogIAAAAAFQlRAQAAAAAqtoh9kScMme505kBXkOcNAwAADC4rEQEAAAAAKoSIgIAAAAAVQkRAQAAAICq6hoi/uQnP8nw4cPT3t4+oL+3tzeFQmGzduaZZ9azHAAAAABgG9T1YJXFixfn/PPPz5e//OU88sgj2XPPPQfc/8EPfpD999+/cr3LLrvUsxwAAAAAYBvULURcv359brrpptx1111Zu3Zturu788lPfnLAmHHjxqWlpaVeJQAAAAAANVC3z5lvvPHGTJo0KZMmTcqZZ56ZJUuWpFwub9ec/f39KZVKAxoAAAAAUF91CxEXLVpU2eOwvb0969aty4oVKwaMefvb357GxsZK+/nPf151zq6urjQ3N1daa2trvcoHAAAAAP5TXULE+++/P3feeWdOP/30JElDQ0NOO+20LF68eMC4G2+8MT09PZX2pje9qeq8nZ2d6evrq7TVq1fXo3wAAAAA4HnqsifiokWLsmHDhuyxxx6VvnK5nBEjRuSJJ56o9LW2tqatrW2r5y0WiykWizWtFQAAAACoruYrETds2JCvfvWrueqqqwasMvzFL36RvfbaK9dff32tXwkAAAAA1FHNVyIuXbo0TzzxRM4999w0NzcPuHfKKadk0aJFmTFjRq1fCwAAAADUSc1XIi5atCjHHnvsZgFikpx88snp6enJ448/XuvXAgAAAAB1UvOViN/97ne3eO+QQw5JuVxOksp/AQAAAIBXtrqczgwAAAAA7DjqcjrzYLtv7rQ0NTUNdRkAAAAAsEOyEhEAAAAAqEqICAAAAABUJUQEAAAAAKraIfZEnDJneYYVRw51GQD8p97504e6BAAAAGrISkQAAAAAoCohIgAAAABQlRARAAAAAKiqpiFiR0dHCoVCCoVCRowYkd122y3HHXdcFi9enGeffTb/9m//lkKhkB//+Mcv+vy0adNy4okn1rIkAAAAAGA71XwlYnt7e9asWZPe3t58//vfz9SpU3PBBRdkxowZOeigg3LQQQdlyZIlmz23evXq/OAHP8i5555b65IAAAAAgO1Q89OZi8ViWlpakiR77LFHDjnkkBx22GE55phj0t3dnXPPPTeXXnppFixYkFGjRlWe6+7uzq677prp053oCQAAAACvJIOyJ+LRRx+dgw46KLfcckve+9735plnnsk3v/nNyv1yuZzu7u6cffbZaWioea4JAAAAAGyHQTtYZfLkyent7c3YsWPzrne9a8Anzbfffnt+9atf5Zxzzqk6R39/f0ql0oAGAAAAANTXoIWI5XI5hUIhSXLuuefmX/7lX/LQQw8lSRYvXpwjjjgikyZNqjpHV1dXmpubK621tbXudQMAAADAa92ghYgrV67M3nvvnSQ59thjs9dee6W7uzulUim33HLLVh2o0tnZmb6+vkpbvXp1vcsGAAAAgNe8QdmA8Ic//GHuvffefPSjH02SFAqFvP/978+Xv/zlvOENb8iwYcPy7ne/+yXnKRaLKRaL9S4XAAAAAHiemq9E7O/vz9q1a/Poo4/m7rvvzrx583LSSSdlxowZOeussyrj3v/+9+c3v/lNLr300px++ukDTmoGAAAAAF45ar4ScdmyZZkwYUIaGhryute9LgcddFAWLFiQs88+O8OG/b/Mcs8998yxxx6bW2+99SUPVAEAAAAAhk6hXC6Xh7qIbVUqlZ47YOXCmzKsOHKoywHgP/XOnz7UJQAAALAVNuVrfX19aWpq2uK4QTtYBQAAAAB4dRIiAgAAAABVDcrpzPV239xpVZdbAgAAAADbzkpEAAAAAKAqISIAAAAAUJUQEQAAAACoaofYE3HKnOUZVhw51GUAvKb0zp8+1CUAAAAwSKxEBAAAAACqEiICAAAAAFXVLUTs6OhIoVDYrD300ENJkrVr1+b888/PPvvsk2KxmNbW1sycOTMrVqyoV0kAAAAAwDao656I7e3tWbJkyYC+XXfdNb29vTniiCMyZsyYXHHFFTnwwAPzzDPPZPny5Zk1a1ZWrVpVz7IAAAAAgJehriFisVhMS0vLZv3nnXdeCoVC7rzzzowaNarSv//+++ecc86pZ0kAAAAAwMs06HsiPv7441m2bFlmzZo1IEDcZMyYMYNdEgAAAABQRV1DxKVLl6axsbHSTj311Dz00EMpl8uZPHnyy56vv78/pVJpQAMAAAAA6quunzNPnTo1CxcurFyPGjUqjzzySJKkUCi87Pm6uroyd+7cmtUHAAAAALy0uq5EHDVqVNra2iptwoQJ2W+//VIoFLJy5cqXPV9nZ2f6+voqbfXq1XWoGgAAAAB4vkHfE3Hs2LGZNm1arrnmmqxfv36z+08++eQWny0Wi2lqahrQAAAAAID6GvQQMUmuvfbabNy4MYceemhuvvnmPPjgg1m5cmUWLFiQww8/fChKAgAAAAC2oK57Im7J3nvvnbvvvjuXX355Lr744qxZsya77rpr3vKWtwzYQxEAAAAAGHqFcrlcHuoitlWpVEpzc3NaL7wpw4ojh7ocgNeU3vnTh7oEAAAAttOmfK2vr6/q1oFD8jkzAAAAAPDqIUQEAAAAAKoakj0Ra+2+udOc1AwAAAAAdWIlIgAAAABQlRARAAAAAKhKiAgAAAAAVLVD7Ik4Zc7yDCuOHOoyAHYovfOnD3UJAAAAvEJYiQgAAAAAVCVEBAAAAACqetkh4tq1a3P++ednn332SbFYTGtra2bOnJkVK1YkSU4//fSccMIJA575/ve/n0KhkE984hMD+i+77LLsvvvu21E+AAAAAFBvL2tPxN7e3hxxxBEZM2ZMrrjiihx44IF55plnsnz58syaNSurVq3K1KlT87GPfSwbNmxIQ8Nz099+++1pbW3NbbfdNmC+22+/PVOnTq3dTwMAAAAA1NzLChHPO++8FAqF3HnnnRk1alSlf//9988555yTJJk6dWrWrVuXn/3sZznssMOSPBcW/rf/9t/y0Y9+NE899VRGjhyZP/3pT/npT3+aBQsW1PDHAQAAAABqbas/Z3788cezbNmyzJo1a0CAuMmYMWOSJG984xuz++67V1Yd/uEPf8jdd9+dU089Nfvuu2/+9V//NUnyf/7P/8nTTz9tJSIAAAAAvMJtdYj40EMPpVwuZ/LkyS859qijjsrtt9+eJPnRj36UN77xjdl1111z5JFHVvo3feK87777bnWx/f39KZVKAxoAAAAAUF9bHSKWy+UkSaFQeMmxU6dOzb/+67/mmWeeye23356jjjoqSTYLEY8++uiXVWxXV1eam5srrbW19WU9DwAAAAC8fFsdIu63334pFApZuXLlS46dOnVq1q9fn7vuuiu33XZbjjzyyCTPhYh33XVXHn/88fz0pz992Z8yd3Z2pq+vr9JWr179sp4HAAAAAF6+rQ4Rx44dm2nTpuWaa67J+vXrN7v/5JNPVv697777prW1Nd/5znfS09NTCREnTJiQiRMn5qqrrsof//jHlx0iFovFNDU1DWgAAAAAQH1tdYiYJNdee202btyYQw89NDfffHMefPDBrFy5MgsWLMjhhx8+YOzUqVNz7bXXpq2tLbvttlul/8gjj8zf//3fZ5999smee+5Zm58CAAAAAKiblxUi7r333rn77rszderUXHzxxZkyZUqOO+64rFixIgsXLhwwdurUqfnDH/5Q2Q9xkyOPPDJ/+MMfnMoMAAAAAK8ShfKmE1NehUql0nMHrFx4U4YVRw51OQA7lN7504e6BAAAAOpsU77W19dXdevAl7USEQAAAAB47REiAgAAAABVNQx1AbVw39xpTmoGAAAAgDqxEhEAAAAAqEqICAAAAABUJUQEAAAAAKraIfZEnDJneYYVRw51GQCvar3zpw91CQAAALxCWYkIAAAAAFQlRAQAAAAAqqpbiLh27dqcf/752WeffVIsFtPa2pqZM2dmxYoVSZKf//znmTFjRl7/+tdn5513zsSJE3Paaafl97//fb1KAgAAAAC2QV32ROzt7c0RRxyRMWPG5IorrsiBBx6YZ555JsuXL8+sWbPyL//yLzn22GMzc+bMLF++PGPGjMl//Md/5Dvf+U6eeuqpepQEAAAAAGyjQrlcLtd60ne+85255557cv/992fUqFED7j355JO5/fbbc+qpp+bpp59OQ8O255ilUinNzc1pvfAmB6sAbCcHqwAAALz2bMrX+vr60tTUtMVxNf+c+fHHH8+yZcsya9aszQLEJBkzZkxaWlqyYcOG/O///b9ThwwTAAAAAKihmoeIDz30UMrlciZPnrzFMYcddlguvfTSvOc978n48eNzwgkn5LOf/Wx++9vfVp27v78/pVJpQAMAAAAA6qvmIeKmlYWFQqHquMsvvzxr167Nddddlze96U25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/Md//EdWr16d73//+y85b39/f2X1YpKUSqV6lA8AAAAAPE9dViIuWrQoZ555ZpKkvb0969aty4oVKwaMOfroo3PKKafkpptuyoIFCzJ+/PiXnLerqyvNzc2V1traWo/yAQAAAIDnqXmIeP/99+fOO+/M6aefniRpaGjIaaedlsWLFw8Y95vf/CbLli3LyJEj86Mf/Wir5u7s7ExfX1+lrV69utblAwAAAAAvUPPPmRctWpQNGzZkjz32qPSVy+WMGDEiTzzxRF73utclST7wgQ/koIMOyty5c3PMMcfklFNOyZFHHll17mKxmGKxWOuSAQAAAIAqaroSccOGDfnqV7+aq666Kj09PZX2i1/8InvttVeuv/76JMmXv/zl/OhHP8qSJUty5JFH5m/+5m9yzjnnZP369bUsBwAAAACogZqGiEuXLs0TTzyRc889N1OmTBnQTjnllCxatCiPPPJILr744lx55ZXZe++9kyTz5s3LsGHD8t/+23+rZTkAAAAAQA3UNERctGhRjj322DQ3N2927+STT05PT086Ojpy2GGH5a//+q8r90aOHJklS5Zk4cKF+ed//udalgQAAAAAbKea7on43e9+d4v3DjnkkJTL5S3ef8c73pENGzbUshwAAAAAoAZqfjozAAAAALBjqfnpzEPhvrnT0tTUNNRlAAAAAMAOyUpEAAAAAKAqISIAAAAAUJUQEQAAAACoaofYE3HKnOUZVhw51GUAbFHv/OlDXQIAAABsMysRAQAAAICqhIgAAAAAQFVCRAAAAACgqkELEdeuXZsLLrggbW1t2XnnnbPbbrvlHe94R6677ro89dRTSZKJEyfm6quvHqySAAAAAICtMCgHq/zqV7/KEUcckTFjxmTevHk54IADsmHDhjzwwANZvHhxdt9995x44omDUQoAAAAA8DINSoh43nnnpaGhIT/72c8yatSoSv8BBxyQk08+OeVyeTDKAAAAAAC2Qd1DxMceeyy33npr5s2bNyBAfL5CobBVc/X396e/v79yXSqValIjAAAAALBldd8T8aGHHkq5XM6kSZMG9I8fPz6NjY1pbGzM7Nmzt2qurq6uNDc3V1pra2s9SgYAAAAAnmfQDlZ54WrDO++8Mz09Pdl///0HrC6sprOzM319fZW2evXqepQKAAAAADxP3T9nbmtrS6FQyKpVqwb077PPPkmS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HH300TF27Ng49dRT48gjj4xZs2alVRIAAAAA0AOphYiv5YgjjojJkyfHHXfcEXfeeWd873vfi49+9KNx7LHHxiOPPBKPPPJIX5YDAAAAAHRDn4aIERGTJk2Khx9+OCIivvWtb8U+++wT999/f9x2222x6667lry2UChEoVAoHufz+VRrBQAAAAD6YXfmJEkik8lERMSuu+4aH//4x+Otb31rfOADH3jda5uamiKXyxVbbW1t2uUCAAAAwL+8Pg8RW1paYty4ccXjioqKqKjo3oLIxsbG6OjoKLZ169alVSYAAAAA8P/r09eZ77333li9enWcc845Pbo+m81GNpstc1UAAAAAQCmphYiFQiHa29tj8+bN8cwzz0Rzc3M0NTVFQ0NDnHzyyWndFgAAAAAos9RCxObm5qipqYmKiorYaaedYvLkybFgwYI45ZRTYsCAPn+LGgAAAADooUySJEl/F9FT+Xw+crlcdHR0RFVVVX+XAwAAAABvKt3N1ywJBAAAAABKEiICAAAAACUJEQEAAACAkoSIAAAAAEBJQkQAAAAAoCQhIgAAAABQkhARAAAAAChJiAgAAAAAlCREBAAAAABKKnuI2N7eHnPmzIm6uroYMmRIjBo1Kg477LD4xje+ES+88EJERIwdOzYymUxkMpkYOHBg7LbbbnHqqafGhg0byl0OAAAAANBLFeUc7Mknn4xDDz00hg8fHvPnz4999903Ojs74/HHH4/FixfHbrvtFu9973sjIuKSSy6J008/PTZv3hyPP/54fPzjH49Pf/rT8e1vf7ucJQEAAAAAvVTWEPGMM86IioqKeOCBB6KysrJ4ft99941jjz02kiQpnhs2bFhUV1dHRMTo0aPj5JNPjptuuqmc5QAAAAAAZVC215mfffbZuOeee2L27NldAsR/lMlkXvP8n//851i2bFkcdNBB5SoHAAAAACiTsoWIa9eujSRJYuLEiV3Ojxw5MoYOHRpDhw6NuXPnFs/PnTs3hg4dGjvssEPsvvvukclk4utf/3rJexQKhcjn810aAAAAAJCusm+s8s+rDVeuXBmrVq2KvffeOwqFQvH8+eefH6tWrYqHH344li9fHhERxxxzTGzevHmrYzc1NUUulyu22tracpcPAAAAAPyTsoWIdXV1kclk4rHHHutyfvz48VFXVxc77LBDl/MjR46Murq6mDBh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AAAAlCREBAAAAABK2qZCxIULF8a4ceNiyJAhMWXKlLj//vtL9v/5z38eU6ZMiSFDhsT48ePjG9/4xhZ9br/99thrr70im83GXnvtFd/73vfSKp9tQLnn0O9///s49thjY+zYsZHJZOLKK69MsXq2BeWeQ9ddd128853vjJ122il22mmnmD59eqxcuTLNR6CflXsO3XHHHXHAAQfE8OHDo7KyMvbbb7/49re/neYj0M/S+PfQq2666abIZDLx/ve/v8xVsy0p9xxaunRpZDKZLdr//M//pPkY9KM0/g4999xzMXv27KipqYkhQ4bEW9/61rjzzjvTegT6Wbnn0OGHH/6af4eOOeaYNB+DfpTG36Err7wyJk6cGDvssEPU1tbGOeec43/L3qhkG3HTTTclgwYNSq677rrk0UcfTebMmZNUVlYmTz311Gv2f/LJJ5Mdd9wxmTNnTvLoo48m1113XTJo0KDktttuK/ZZsWJFMnDgwGT+/PlJS0tLMn/+/KSioiL51a9+1VePRR9KYw6tXLky+cxnPpN897vfTaqrq5N///d/76OnoT+kMYc+9KEPJddcc03y0EMPJS0tLclHP/rRJJfLJX/605/66rHoQ2nMoZ/97GfJHXfckTz66KPJ2rVrkyuvvDIZOHBg0tzc3FePRR9KYw69qrW1NRk9enTyzne+M3nf+96X8pPQX9KYQ0uWLEmqqqqStra2Lo3tUxpzqFAoJAcccEDynve8J/nlL3+ZtLa2Jvfff3+yatWqvnos+lAac+jZZ5/t8vfnkUceSQYOHJgsWbKkj56KvpTGHPrOd76TZLPZ5MYbb0z++Mc/JnfffXdSU1OTnH322X31WNuFbSZEPPDAA5NPfvKTXc5NmjQp+dznPvea/T/72c8mkyZN6nLuE5/4RDJ16tTi8fHHH5/U19d36TNjxozkxBNPLFPVbEvSmEP/aMyYMULE7VzacyhJkqSzszMZNmxY8p//+Z+9L5htTl/MoSRJkre//e3JF7/4xd4VyzYprTnU2dmZHHroocn111+fnHLKKULE7Vgac2jJkiVJLpcre61sm9KYQ9dee20yfvz45KWXXip/wWxz+uLfQ//+7/+eDBs2LNm4cWPvC2abk8Ycmj17dnLEEUd06XPuuecmhx12WJmq/tewTbzO/NJLL8Vvf/vbOProo7ucP/roo2PFihWv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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#get the mutual information of features\n", - "def make_mi_scores(X: pd.DataFrame, y: pd.DataFrame, discrete_features: list):\n", - " mi_scores = mutual_info_regression(X, y, discrete_features=discrete_features)\n", - " mi_scores = pd.Series(mi_scores, name=\"MI Scores\", index=X.columns)\n", - " mi_scores = mi_scores.sort_values(ascending=False)\n", - " return mi_scores\n", - "\n", - "def plot_mi_scores(scores):\n", - " scores = scores.sort_values(ascending=True)\n", - " width = np.arange(len(scores))\n", - " ticks = list(scores.index)\n", - " plt.figure(dpi=100, figsize=(16, 16))\n", - " plt.barh(width, scores)\n", - " plt.yticks(width, ticks)\n", - " plt.title(\"Mutual Information Scores\")\n", - "\n", - "\n", - "\n", - "cols = list(X_train.columns)\n", - "cols.append(\"1\")\n", - "X_transformed = X_train.fillna(0)\n", - "X_transformed[\"EJ\"].replace(['A', 'B'], [0, 1], inplace=True)\n", - "discrete_features = X_transformed.dtypes == int\n", - "mi_scores = make_mi_scores(X_transformed, y_train, discrete_features)\n", - "bad_scores = list(mi_scores.index[i] for i, score in zip(range(len(mi_scores)),mi_scores) if score < 0.01)\n", - "plot_mi_scores(mi_scores)\n", - "print(f\" Columns with MI equal zero: {bad_scores} --> total length: {len(bad_scores)}\")\n", - "#--> dropping the unecessary columns" - ] - }, - { - "cell_type": "code", - "execution_count": 1010, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "38\n", - "dataset shape: (617, 38)\n", - "Number of columns: 37\n", - "Accuracy of [0.92105263 0.91891892 0.89189189 0.97297297 0.86486486]\n" - ] - } - ], - "source": [ - "# Building Pipeline\n", - "train, greeks, test, id_list = load_dataset(columns_drop=bad_scores)\n", - "print(f\"dataset shape: {train.shape}\")\n", - "X_train, X_valid, y_train, y_valid = split_data(train, 0.3)\n", - "preprocessor = build_pipeline(X_train)\n", - "pipeline = Pipeline(steps=[('preprocessor', preprocessor),\n", - " ('model', model)\n", - " ])\n", - "\n", - "#Fit the Model and make preds\n", - "pipeline.fit(X_train, y_train)\n", - "preds = pipeline.predict(X_valid)\n", - "score = cross_val_score(pipeline, X_valid, y_valid, cv=5, scoring='accuracy')\n", - "print(f\"Accuracy of {score}\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/competitions/identify-age-related-conditions/train_models/training.ipynb b/competitions/identify-age-related-conditions/train_models/training.ipynb new file mode 100644 index 0000000..b5d97a5 --- /dev/null +++ b/competitions/identify-age-related-conditions/train_models/training.ipynb @@ -0,0 +1,633 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 159, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.impute import SimpleImputer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.preprocessing import OneHotEncoder\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.model_selection import train_test_split, cross_val_score\n", + "from sklearn.metrics import accuracy_score\n", + "from xgboost import XGBClassifier\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn.feature_selection import mutual_info_regression\n", + "from sklearn.discriminant_analysis import StandardScaler\n", + "import numpy as np\n", + "from sklearn.metrics import classification_report\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.model_selection import train_test_split, ParameterGrid\n", + "from keras.callbacks import TensorBoard, EarlyStopping, LearningRateScheduler\n", + "from keras.models import Model\n", + "from keras.layers import Activation, Dense, LSTM, Input\n", + "from keras.optimizers import Adam, RMSprop, SGD\n", + "from scikeras.wrappers import KerasClassifier\n", + "import tensorflow as tf\n", + "from os import path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Method to load the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": {}, + "outputs": [], + "source": [ + "def load_dataset(columns_drop) -> tuple([pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]):\n", + " train = pd.read_csv(\"C:\\\\Projects\\\\kaggle\\\\competitions\\\\identify-age-related-conditions\\\\data\\\\train.csv\")\n", + " greeks = pd.read_csv(\"C:\\\\Projects\\\\kaggle\\\\competitions\\\\identify-age-related-conditions\\\\data\\\\greeks.csv\")\n", + " test = pd.read_csv(\"C:\\\\Projects\\\\kaggle\\\\competitions\\\\identify-age-related-conditions\\\\data\\\\test.csv\")\n", + " columns_drop = ['Id'] + columns_drop\n", + " id_list = test[\"Id\"]\n", + " train.drop(columns_drop, inplace=True, axis=1)\n", + " test.drop(columns_drop, inplace=True, axis=1)\n", + " print(len(train.columns))\n", + " return (train, greeks, test, id_list)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Method to split the data in validation and train set randomly" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [], + "source": [ + "def split_data(df: pd.DataFrame, split)->tuple([pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]):\n", + " X = df.loc[:, df.columns != \"Class\"]\n", + " y = df.loc[:, \"Class\"]\n", + " return train_test_split(X, y, test_size=split, random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Method to build a Tensorflow model" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": {}, + "outputs": [], + "source": [ + "def build_tensorflow_model(input_shape:int, output_shape:int, units1: int, units2: int, units3: int, activation1: str, \n", + " activation2: str, activation3: str, optimizer: tf.keras.optimizers.Optimizer, learning_rate: float) -> Model:\n", + " input = Input(shape=input_shape)\n", + " x = Dense(units=units1, activation=activation1)(input)\n", + " x = Dense(units=units2, activation=activation2)(x)\n", + " x = Dense(units=units3, activation=activation3)(x)\n", + " output = Dense(units=output_shape, activation=\"softmax\")(x)\n", + " model = Model(inputs=[input], outputs=[output])\n", + " \n", + " model.compile(loss=\"categorical_crossentropy\",\n", + " optimizer=optimizer(learning_rate=learning_rate),\n", + " metrics=[\"accuracy\"]) \n", + " return model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Method to plot the accuracy of the model" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_acc_tf_model(history:Model):\n", + " # summarize history for accuracy\n", + " plt.plot(history.history['accuracy'])\n", + " plt.plot(history.history['val_accuracy'])\n", + " plt.title('model accuracy')\n", + " plt.ylabel('accuracy')\n", + " plt.xlabel('epoch')\n", + " plt.legend(['Train', 'Validation'], loc='upper left')\n", + " plt.show()\n", + " \n", + " # summarize history for loss\n", + " plt.plot(history.history['loss'])\n", + " plt.plot(history.history['val_loss'])\n", + " plt.title('model loss')\n", + " plt.ylabel('loss')\n", + " plt.xlabel('epoch')\n", + " plt.legend(['Train', 'Validation'], loc='upper left')\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Method to fit the Tensorflow model with ES Callback" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": {}, + "outputs": [], + "source": [ + "es_callback = EarlyStopping(\n", + " monitor=\"val_accuracy\",\n", + " patience=5,\n", + " verbose=1,\n", + " restore_best_weights=True,\n", + " min_delta=0.005\n", + " )\n", + " \n", + "def fit_model(model: Model, x: np.ndarray, y: np.ndarray, epochs: int, split: float) -> Model:\n", + " #split train and validation\n", + " x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=split, random_state=42)\n", + " #fit the model\n", + " history = model.fit(x_train, y_train, epochs=epochs, validation_data=(x_val,y_val), callbacks=[es_callback])\n", + " return history " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Method for GridSearch of Tensorflow model" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "metadata": {}, + "outputs": [], + "source": [ + "grid_params = {\"units1\": [8,16], \"units2\": [16,32], \"units3\": [32,64], \"activation1\": [\"relu\"], \"activation2\": [\"relu\"], \n", + " \"activation3\": [\"relu\"], \"optimizer\": [Adam], \"learning_rate\": [0.001]}\n", + "\n", + "#GridSearch\n", + "def grid_search_tf_model(X_train: pd.DataFrame, y_train: pd.DataFrame)->Model:\n", + " grid = ParameterGrid(param_grid = grid_params)\n", + " results = []\n", + " input_shape = len(X_train[1])\n", + " output_shape = 2\n", + " for idx,params in enumerate(grid):\n", + " model = build_tensorflow_model(input_shape=input_shape, output_shape=output_shape, **params)\n", + " history = fit_model(model, X_train, y_train, 100, 0.2)\n", + " val_loss = history.history['val_loss'][-1] \n", + " val_acc = history.history['val_accuracy'][-1]\n", + " results.append([val_loss, val_acc])\n", + " \n", + " val_accuracies = [i[1] for i in results]\n", + " val_losses= [i[0] for i in results]\n", + " best_acc = val_accuracies.index(max(val_accuracies))\n", + " best_loss = val_losses.index(min(val_losses))\n", + " print(f\"best acc at index {best_acc}: {max(val_accuracies)}\")\n", + " print(f\"best loss at index {best_loss}: {min(val_losses)}\")\n", + " print(grid[best_acc])\n", + " \n", + " model = build_tensorflow_model(input_shape=input_shape, output_shape=output_shape, **grid[best_acc])\n", + " history = fit_model(model, X_train, y_train, 100, 0.2)\n", + " #plot_acc_tf_model(history)\n", + " return model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Method to build a preprocessing pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": {}, + "outputs": [], + "source": [ + "def build_preprocessing_pipeline(df: pd.DataFrame) -> ColumnTransformer:\n", + " # Preprocessing for numerical data \n", + " numerical_transformer = Pipeline(steps=[\n", + " ('imputer',SimpleImputer(strategy='constant')),\n", + " ('scaler', StandardScaler())])\n", + " \n", + " # Preprocessing for categorical data\n", + " categorical_transformer = Pipeline(steps=[\n", + " ('imputer', SimpleImputer(strategy='most_frequent')),\n", + " ('onehot', OneHotEncoder(handle_unknown='ignore'))\n", + " ])\n", + "\n", + " # Bundle preprocessing for numerical and categorical data\n", + " numerical_cols = [cname for cname in df.columns if df[cname].dtype in [\"int64\", \"float64\"]]\n", + " categorical_cols = [cname for cname in df.columns if df[cname].nunique() < 10]\n", + " preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('num', numerical_transformer, numerical_cols),\n", + " ('cat', categorical_transformer, categorical_cols)\n", + " ])\n", + " print(f\"Number of columns: {len(df.columns)}\")\n", + " return preprocessor" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Method to generate the Mutual Info scores and plot them" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def make_mi_scores(X: pd.DataFrame, y: pd.DataFrame, discrete_features: list):\n", + " mi_scores = mutual_info_regression(X, y, discrete_features=discrete_features)\n", + " mi_scores = pd.Series(mi_scores, name=\"MI Scores\", index=X.columns)\n", + " mi_scores = mi_scores.sort_values(ascending=False)\n", + " return mi_scores\n", + "\n", + "def plot_mi_scores(scores):\n", + " scores = scores.sort_values(ascending=True)\n", + " width = np.arange(len(scores))\n", + " ticks = list(scores.index)\n", + " plt.figure(dpi=100, figsize=(16, 16))\n", + " plt.barh(width, scores)\n", + " plt.yticks(width, ticks)\n", + " plt.title(\"Mutual Information Scores\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Display MI scores that are beneath 0.01" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "57\n", + "dataset shape: (617, 57)\n", + "X shape: (431, 56) and y shape: (431,)\n", + " Columns with MI equal zero: ['DN', 'CW ', 'CC', 'EG', 'CU', 'AH', 'CL', 'DF', 'CD ', 'GE', 'GB', 'FS', 'DE', 'FI', 'BD ', 'CB', 'FD ', 'DY', 'AY', 'EP', 'AZ', 'EJ', 'CF'] --> total length: 23\n" + ] + } + ], + "source": [ + "#get the mutual information of features\n", + "train, greeks, test, id_list = load_dataset(columns_drop=[])\n", + "print(f\"dataset shape: {train.shape}\")\n", + "X_train, X_valid, y_train, y_valid = split_data(train, 0.3)\n", + "print(f\"X shape: {X_train.shape} and y shape: {y_train.shape}\")\n", + "\n", + "cols = list(X_train.columns)\n", + "cols.append(\"1\")\n", + "X_transformed = X_train.fillna(0)\n", + "X_transformed[\"EJ\"].replace(['A', 'B'], [0, 1], inplace=True)\n", + "discrete_features = X_transformed.dtypes == int\n", + "mi_scores = make_mi_scores(X_transformed, y_train, discrete_features)\n", + "bad_scores = list(mi_scores.index[i] for i, score in zip(range(len(mi_scores)),mi_scores) if score < 0.01)\n", + "#plot_mi_scores(mi_scores)\n", + "print(f\" Columns with MI equal zero: {bad_scores} --> total length: {len(bad_scores)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a model and preprocessor" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "34\n", + "dataset shape: (617, 34)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of columns: 33\n", + "Epoch 1/100\n", + "11/11 [==============================] - 0s 15ms/step - loss: 0.5836 - accuracy: 0.8372 - val_loss: 0.4572 - val_accuracy: 0.8391\n", + "Epoch 2/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5413 - accuracy: 0.8372 - val_loss: 0.4360 - val_accuracy: 0.8391\n", + "Epoch 3/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5107 - accuracy: 0.8372 - val_loss: 0.4228 - val_accuracy: 0.8391\n", + "Epoch 4/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4856 - accuracy: 0.8372 - val_loss: 0.4138 - val_accuracy: 0.8391\n", + "Epoch 5/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4655 - accuracy: 0.8372 - val_loss: 0.4073 - val_accuracy: 0.8391\n", + "Epoch 6/100\n", + " 1/11 [=>............................] - ETA: 0s - loss: 0.3383 - accuracy: 0.8438Restoring model weights from the end of the best epoch: 1.\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4464 - accuracy: 0.8372 - val_loss: 0.4030 - val_accuracy: 0.8391\n", + "Epoch 6: early stopping\n", + "Epoch 1/100\n", + "11/11 [==============================] - 0s 15ms/step - loss: 0.6535 - accuracy: 0.7297 - val_loss: 0.5649 - val_accuracy: 0.8391\n", + "Epoch 2/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.5767 - accuracy: 0.8372 - val_loss: 0.4984 - val_accuracy: 0.8391\n", + "Epoch 3/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.5286 - accuracy: 0.8372 - val_loss: 0.4690 - val_accuracy: 0.8391\n", + "Epoch 4/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4883 - accuracy: 0.8372 - val_loss: 0.4536 - val_accuracy: 0.8391\n", + "Epoch 5/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4519 - accuracy: 0.8372 - val_loss: 0.4419 - val_accuracy: 0.8391\n", + "Epoch 6/100\n", + " 1/11 [=>............................] - ETA: 0s - loss: 0.3956 - accuracy: 0.8438Restoring model weights from the end of the best epoch: 1.\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4211 - accuracy: 0.8372 - val_loss: 0.4367 - val_accuracy: 0.8391\n", + "Epoch 6: early stopping\n", + "Epoch 1/100\n", + "11/11 [==============================] - 0s 16ms/step - loss: 0.7554 - accuracy: 0.4244 - val_loss: 0.6338 - val_accuracy: 0.6667\n", + "Epoch 2/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.5835 - accuracy: 0.7733 - val_loss: 0.5112 - val_accuracy: 0.8391\n", + "Epoch 3/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5046 - accuracy: 0.8372 - val_loss: 0.4532 - val_accuracy: 0.8391\n", + "Epoch 4/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4713 - accuracy: 0.8372 - val_loss: 0.4223 - val_accuracy: 0.8391\n", + "Epoch 5/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4393 - accuracy: 0.8372 - val_loss: 0.4078 - val_accuracy: 0.8391\n", + "Epoch 6/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4144 - accuracy: 0.8372 - val_loss: 0.3960 - val_accuracy: 0.8391\n", + "Epoch 7/100\n", + " 1/11 [=>............................] - ETA: 0s - loss: 0.3674 - accuracy: 0.8750Restoring model weights from the end of the best epoch: 2.\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.3898 - accuracy: 0.8401 - val_loss: 0.3847 - val_accuracy: 0.8391\n", + "Epoch 7: early stopping\n", + "Epoch 1/100\n", + "11/11 [==============================] - 0s 15ms/step - loss: 0.6324 - accuracy: 0.8227 - val_loss: 0.5557 - val_accuracy: 0.8391\n", + "Epoch 2/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5711 - accuracy: 0.8372 - val_loss: 0.5040 - val_accuracy: 0.8391\n", + "Epoch 3/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5245 - accuracy: 0.8372 - val_loss: 0.4676 - val_accuracy: 0.8391\n", + "Epoch 4/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4838 - accuracy: 0.8372 - val_loss: 0.4399 - val_accuracy: 0.8391\n", + "Epoch 5/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4494 - accuracy: 0.8372 - val_loss: 0.4188 - val_accuracy: 0.8391\n", + "Epoch 6/100\n", + " 1/11 [=>............................] - ETA: 0s - loss: 0.3685 - accuracy: 0.8750Restoring model weights from the end of the best epoch: 1.\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4130 - accuracy: 0.8372 - val_loss: 0.4003 - val_accuracy: 0.8391\n", + "Epoch 6: early stopping\n", + "Epoch 1/100\n", + "11/11 [==============================] - 0s 15ms/step - loss: 0.8912 - accuracy: 0.1860 - val_loss: 0.7869 - val_accuracy: 0.2644\n", + "Epoch 2/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.7306 - accuracy: 0.4070 - val_loss: 0.6774 - val_accuracy: 0.6207\n", + "Epoch 3/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.6506 - accuracy: 0.7936 - val_loss: 0.6167 - val_accuracy: 0.8506\n", + "Epoch 4/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.6128 - accuracy: 0.8401 - val_loss: 0.5752 - val_accuracy: 0.8391\n", + "Epoch 5/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5760 - accuracy: 0.8401 - val_loss: 0.5514 - val_accuracy: 0.8391\n", + "Epoch 6/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5444 - accuracy: 0.8401 - val_loss: 0.5272 - val_accuracy: 0.8391\n", + "Epoch 7/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.5119 - accuracy: 0.8459 - val_loss: 0.4959 - val_accuracy: 0.8391\n", + "Epoch 8/100\n", + " 1/11 [=>............................] - ETA: 0s - loss: 0.4723 - accuracy: 0.9062Restoring model weights from the end of the best epoch: 3.\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4759 - accuracy: 0.8488 - val_loss: 0.4645 - val_accuracy: 0.8391\n", + "Epoch 8: early stopping\n", + "Epoch 1/100\n", + "11/11 [==============================] - 0s 16ms/step - loss: 0.7030 - accuracy: 0.5262 - val_loss: 0.6235 - val_accuracy: 0.7701\n", + "Epoch 2/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.6088 - accuracy: 0.8285 - val_loss: 0.5432 - val_accuracy: 0.8391\n", + "Epoch 3/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5630 - accuracy: 0.8372 - val_loss: 0.4939 - val_accuracy: 0.8391\n", + "Epoch 4/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5231 - accuracy: 0.8372 - val_loss: 0.4641 - val_accuracy: 0.8391\n", + "Epoch 5/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4851 - accuracy: 0.8372 - val_loss: 0.4443 - val_accuracy: 0.8391\n", + "Epoch 6/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4476 - accuracy: 0.8372 - val_loss: 0.4190 - val_accuracy: 0.8391\n", + "Epoch 7/100\n", + " 1/11 [=>............................] - ETA: 0s - loss: 0.4761 - accuracy: 0.7812Restoring model weights from the end of the best epoch: 2.\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4080 - accuracy: 0.8401 - val_loss: 0.3984 - val_accuracy: 0.8391\n", + "Epoch 7: early stopping\n", + "Epoch 1/100\n", + "11/11 [==============================] - 0s 15ms/step - loss: 0.8484 - accuracy: 0.2122 - val_loss: 0.7485 - val_accuracy: 0.3218\n", + "Epoch 2/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.7046 - accuracy: 0.5000 - val_loss: 0.6538 - val_accuracy: 0.7471\n", + "Epoch 3/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.6363 - accuracy: 0.7936 - val_loss: 0.5938 - val_accuracy: 0.8276\n", + "Epoch 4/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5827 - accuracy: 0.8372 - val_loss: 0.5511 - val_accuracy: 0.8506\n", + "Epoch 5/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5353 - accuracy: 0.8401 - val_loss: 0.5105 - val_accuracy: 0.8506\n", + "Epoch 6/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4874 - accuracy: 0.8430 - val_loss: 0.4787 - val_accuracy: 0.8506\n", + "Epoch 7/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4375 - accuracy: 0.8459 - val_loss: 0.4518 - val_accuracy: 0.8506\n", + "Epoch 8/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.3944 - accuracy: 0.8488 - val_loss: 0.4320 - val_accuracy: 0.8506\n", + "Epoch 9/100\n", + " 1/11 [=>............................] - ETA: 0s - loss: 0.4943 - accuracy: 0.7812Restoring model weights from the end of the best epoch: 4.\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.3565 - accuracy: 0.8547 - val_loss: 0.4221 - val_accuracy: 0.8506\n", + "Epoch 9: early stopping\n", + "Epoch 1/100\n", + "11/11 [==============================] - 0s 15ms/step - loss: 0.6726 - accuracy: 0.6483 - val_loss: 0.5800 - val_accuracy: 0.8391\n", + "Epoch 2/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5425 - accuracy: 0.8430 - val_loss: 0.5210 - val_accuracy: 0.8391\n", + "Epoch 3/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4813 - accuracy: 0.8430 - val_loss: 0.5047 - val_accuracy: 0.8391\n", + "Epoch 4/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4377 - accuracy: 0.8517 - val_loss: 0.4948 - val_accuracy: 0.8391\n", + "Epoch 5/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.3982 - accuracy: 0.8547 - val_loss: 0.4875 - val_accuracy: 0.8391\n", + "Epoch 6/100\n", + " 1/11 [=>............................] - ETA: 0s - loss: 0.3590 - accuracy: 0.8438Restoring model weights from the end of the best epoch: 1.\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.3683 - accuracy: 0.8663 - val_loss: 0.4850 - val_accuracy: 0.8391\n", + "Epoch 6: early stopping\n", + "best acc at index 6: 0.8505747318267822\n", + "best loss at index 2: 0.3847053050994873\n", + "{'units3': 32, 'units2': 32, 'units1': 16, 'optimizer': , 'learning_rate': 0.001, 'activation3': 'relu', 'activation2': 'relu', 'activation1': 'relu'}\n", + "Epoch 1/100\n", + "11/11 [==============================] - 0s 15ms/step - loss: 0.6807 - accuracy: 0.8372 - val_loss: 0.5413 - val_accuracy: 0.8391\n", + "Epoch 2/100\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.6144 - accuracy: 0.8372 - val_loss: 0.5060 - val_accuracy: 0.8391\n", + "Epoch 3/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5689 - accuracy: 0.8372 - val_loss: 0.4795 - val_accuracy: 0.8391\n", + "Epoch 4/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.5273 - accuracy: 0.8372 - val_loss: 0.4565 - val_accuracy: 0.8391\n", + "Epoch 5/100\n", + "11/11 [==============================] - 0s 3ms/step - loss: 0.4915 - accuracy: 0.8372 - val_loss: 0.4387 - val_accuracy: 0.8391\n", + "Epoch 6/100\n", + " 1/11 [=>............................] - ETA: 0s - loss: 0.5601 - accuracy: 0.7812Restoring model weights from the end of the best epoch: 1.\n", + "11/11 [==============================] - 0s 4ms/step - loss: 0.4573 - accuracy: 0.8401 - val_loss: 0.4216 - val_accuracy: 0.8391\n", + "Epoch 6: early stopping\n" + ] + } + ], + "source": [ + "#Newly load the dataset with columns drop and create preprocessing pipeline\n", + "train, greeks, test, id_list = load_dataset(columns_drop=bad_scores)\n", + "print(f\"dataset shape: {train.shape}\")\n", + "X_train, X_valid, y_train, y_valid = split_data(train, 0.3)\n", + "preprocessor = build_preprocessing_pipeline(X_train)\n", + "\n", + "\n", + "# Define model for the pipeline\n", + "#model = RandomForestClassifier(n_estimators=100, random_state=22)\n", + "#model = XGBClassifier(n_estimators=500)\n", + "preprocessor.fit(X_train)\n", + "X_preprocessed = preprocessor.transform(X_train)\n", + "y_train_ohe = pd.get_dummies(y_train, columns = ['Class'])\n", + "y_valid_ohe = pd.get_dummies(y_valid, columns = ['Class'])\n", + "model = KerasClassifier(model=grid_search_tf_model(X_train=X_preprocessed, y_train=y_train_ohe), epochs=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Build the final pipeline with preprocessor and model, fit it and display accuracy score" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [], + "source": [ + "# Building Pipeline\n", + "def fit_pipeline(X_train: pd.DataFrame, y_train: pd.DataFrame, preprocessor, model):\n", + " pipeline = Pipeline(steps=[('preprocessor', preprocessor),\n", + " ('model', model)\n", + " ])\n", + " #Fit the Model and make preds\n", + " pipeline.fit(X_train, y_train)\n", + " preds = pipeline.predict(X_valid)\n", + " \"\"\" score = cross_val_score(pipeline, X_valid, y_valid, cv=5, scoring='accuracy')\n", + " print(f\"Accuracy of {score}\") \"\"\"\n", + " print(classification_report(y_train.to_numpy(), preds))\n", + " correct_answers = 0\n", + " for y_pred,y_true in zip(preds,y_valid_ohe.to_numpy()):\n", + " if(y_pred[0] == y_true[0]):correct_answers+=1\n", + " print(correct_answers/len(preds))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print results of the model" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6/6 [==============================] - 0s 1ms/step\n" + ] + }, + { + "ename": "ValueError", + "evalue": "Found input variables with inconsistent numbers of samples: [431, 186]", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[171], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m fit_pipeline(X_train, y_train_ohe, preprocessor, model)\n", + "Cell \u001b[1;32mIn[170], line 11\u001b[0m, in \u001b[0;36mfit_pipeline\u001b[1;34m(X_train, y_train, preprocessor, model)\u001b[0m\n\u001b[0;32m 8\u001b[0m preds \u001b[39m=\u001b[39m pipeline\u001b[39m.\u001b[39mpredict(X_valid)\n\u001b[0;32m 9\u001b[0m \u001b[39m\"\"\" score = cross_val_score(pipeline, X_valid, y_valid, cv=5, scoring='accuracy')\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[39mprint(f\"Accuracy of {score}\") \"\"\"\u001b[39;00m\n\u001b[1;32m---> 11\u001b[0m \u001b[39mprint\u001b[39m(classification_report(y_train\u001b[39m.\u001b[39;49mto_numpy(), preds))\n\u001b[0;32m 12\u001b[0m correct_answers \u001b[39m=\u001b[39m \u001b[39m0\u001b[39m\n\u001b[0;32m 13\u001b[0m \u001b[39mfor\u001b[39;00m y_pred,y_true \u001b[39min\u001b[39;00m \u001b[39mzip\u001b[39m(preds,y_valid_ohe\u001b[39m.\u001b[39mto_numpy()):\n", + "File \u001b[1;32mc:\\Users\\yann.MSI\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:2310\u001b[0m, in \u001b[0;36mclassification_report\u001b[1;34m(y_true, y_pred, labels, target_names, sample_weight, digits, output_dict, zero_division)\u001b[0m\n\u001b[0;32m 2195\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mclassification_report\u001b[39m(\n\u001b[0;32m 2196\u001b[0m y_true,\n\u001b[0;32m 2197\u001b[0m y_pred,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 2204\u001b[0m zero_division\u001b[39m=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mwarn\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m 2205\u001b[0m ):\n\u001b[0;32m 2206\u001b[0m \u001b[39m\"\"\"Build a text report showing the main classification metrics.\u001b[39;00m\n\u001b[0;32m 2207\u001b[0m \n\u001b[0;32m 2208\u001b[0m \u001b[39m Read more in the :ref:`User Guide `.\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 2307\u001b[0m \u001b[39m \u001b[39;00m\n\u001b[0;32m 2308\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m-> 2310\u001b[0m y_type, y_true, y_pred \u001b[39m=\u001b[39m _check_targets(y_true, y_pred)\n\u001b[0;32m 2312\u001b[0m \u001b[39mif\u001b[39;00m labels \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m 2313\u001b[0m labels \u001b[39m=\u001b[39m unique_labels(y_true, y_pred)\n", + "File \u001b[1;32mc:\\Users\\yann.MSI\\anaconda3\\lib\\site-packages\\sklearn\\metrics\\_classification.py:86\u001b[0m, in \u001b[0;36m_check_targets\u001b[1;34m(y_true, y_pred)\u001b[0m\n\u001b[0;32m 59\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_check_targets\u001b[39m(y_true, y_pred):\n\u001b[0;32m 60\u001b[0m \u001b[39m\"\"\"Check that y_true and y_pred belong to the same classification task.\u001b[39;00m\n\u001b[0;32m 61\u001b[0m \n\u001b[0;32m 62\u001b[0m \u001b[39m This converts multiclass or binary types to a common shape, and raises a\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 84\u001b[0m \u001b[39m y_pred : array or indicator matrix\u001b[39;00m\n\u001b[0;32m 85\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m---> 86\u001b[0m check_consistent_length(y_true, y_pred)\n\u001b[0;32m 87\u001b[0m type_true \u001b[39m=\u001b[39m type_of_target(y_true, input_name\u001b[39m=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39my_true\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 88\u001b[0m type_pred \u001b[39m=\u001b[39m type_of_target(y_pred, input_name\u001b[39m=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39my_pred\u001b[39m\u001b[39m\"\u001b[39m)\n", + "File \u001b[1;32mc:\\Users\\yann.MSI\\anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:397\u001b[0m, in \u001b[0;36mcheck_consistent_length\u001b[1;34m(*arrays)\u001b[0m\n\u001b[0;32m 395\u001b[0m uniques \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39munique(lengths)\n\u001b[0;32m 396\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mlen\u001b[39m(uniques) \u001b[39m>\u001b[39m \u001b[39m1\u001b[39m:\n\u001b[1;32m--> 397\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[0;32m 398\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mFound input variables with inconsistent numbers of samples: \u001b[39m\u001b[39m%r\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[0;32m 399\u001b[0m \u001b[39m%\u001b[39m [\u001b[39mint\u001b[39m(l) \u001b[39mfor\u001b[39;00m l \u001b[39min\u001b[39;00m lengths]\n\u001b[0;32m 400\u001b[0m )\n", + "\u001b[1;31mValueError\u001b[0m: Found input variables with inconsistent numbers of samples: [431, 186]" + ] + } + ], + "source": [ + "fit_pipeline(X_train, y_train_ohe, preprocessor, model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Submission" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "' submission = pd.DataFrame()\\nprediction = model.predict(x_test)\\nsubmission.insert(0, \"Id\", id_number, False)\\nsubmission.insert(1, \"class_0\", [round(1-i[0],2) for i in prediction], True)\\nsubmission.insert(2, \"class_1\", [round(i[0],2) for i in prediction], True)\\nsubmission.to_csv(\"/kaggle/working/submission.csv\",index = False) '" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\" submission = pd.DataFrame()\n", + "prediction = model.predict(x_test)\n", + "submission.insert(0, \"Id\", id_number, False)\n", + "submission.insert(1, \"class_0\", [round(1-i[0],2) for i in prediction], True)\n", + "submission.insert(2, \"class_1\", [round(i[0],2) for i in prediction], True)\n", + "submission.to_csv(\"/kaggle/working/submission.csv\",index = False) \"\"\"" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +}