Data Dictionary¶

The dataset contains several features which are considered important during the application for Masters Programs. The features included are:

  • GRE (Graduate Record Examination) Scores: (out of 340)

  • TOEFL (Test of English as a Forein Language) Scores: (out of 120)

  • University Rating: It indicates the Bachelor University ranking (out of 5)

  • Statement of Purpose Strength: (out of 5)

  • Letter of Recommendation Strength: (out of 5)

  • Undergraduate GPA: (out of 10)

  • Research Experience: (either 0 or 1)

  • Chance of Admit: (ranging from 0 to 1)

Importing libraries and loading the dataset¶

In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation

STEP 1: Data Preparation¶

In [2]:
# Importing the dataset
data = pd.read_csv('Admission_Predict.csv')
In [3]:
data.head()
Out[3]:
Serial No. GRE Score TOEFL Score University Rating SOP LOR CGPA Research Chance of Admit
0 1 337 118 4 4.5 4.5 9.65 1 0.92
1 2 324 107 4 4.0 4.5 8.87 1 0.76
2 3 316 104 3 3.0 3.5 8.00 1 0.72
3 4 322 110 3 3.5 2.5 8.67 1 0.80
4 5 314 103 2 2.0 3.0 8.21 0 0.65

"Chance of Admit" is the target value¶

In [4]:
# Converting the target variable into a categorical variable

data['Admit'] = data['Chance of Admit '].apply(lambda x: 1 if x > 0.8 else 0)
In [5]:
data.head()
Out[5]:
Serial No. GRE Score TOEFL Score University Rating SOP LOR CGPA Research Chance of Admit Admit
0 1 337 118 4 4.5 4.5 9.65 1 0.92 1
1 2 324 107 4 4.0 4.5 8.87 1 0.76 0
2 3 316 104 3 3.0 3.5 8.00 1 0.72 0
3 4 322 110 3 3.5 2.5 8.67 1 0.80 0
4 5 314 103 2 2.0 3.0 8.21 0 0.65 0

Now that we have created a new target variable, we can remove the column - Chance of Admit from the dataset. We can also remove the column - Serial No. as it would not add any value to our analysis.

In [6]:
# Dropping columns
data = data.drop(['Serial No.', 'Chance of Admit '], axis=1)
data.head()
Out[6]:
GRE Score TOEFL Score University Rating SOP LOR CGPA Research Admit
0 337 118 4 4.5 4.5 9.65 1 1
1 324 107 4 4.0 4.5 8.87 1 0
2 316 104 3 3.0 3.5 8.00 1 0
3 322 110 3 3.5 2.5 8.67 1 0
4 314 103 2 2.0 3.0 8.21 0 0

Exploratory data analysis¶

In [7]:
# Let's check the info of the data
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 500 entries, 0 to 499
Data columns (total 8 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   GRE Score          500 non-null    int64  
 1   TOEFL Score        500 non-null    int64  
 2   University Rating  500 non-null    int64  
 3   SOP                500 non-null    float64
 4   LOR                500 non-null    float64
 5   CGPA               500 non-null    float64
 6   Research           500 non-null    int64  
 7   Admit              500 non-null    int64  
dtypes: float64(3), int64(5)
memory usage: 31.4 KB

Observations:

  • There are 500 observations and 8 columns in the data.
  • All the columns are of numeric data type.
  • There are no missing values in the data.

Summary Statistics¶

In [8]:
# Let's check the summary statistics of the data
data.describe().T
Out[8]:
count mean std min 25% 50% 75% max
GRE Score 500.0 316.47200 11.295148 290.0 308.0000 317.00 325.00 340.00
TOEFL Score 500.0 107.19200 6.081868 92.0 103.0000 107.00 112.00 120.00
University Rating 500.0 3.11400 1.143512 1.0 2.0000 3.00 4.00 5.00
SOP 500.0 3.37400 0.991004 1.0 2.5000 3.50 4.00 5.00
LOR 500.0 3.48400 0.925450 1.0 3.0000 3.50 4.00 5.00
CGPA 500.0 8.57644 0.604813 6.8 8.1275 8.56 9.04 9.92
Research 500.0 0.56000 0.496884 0.0 0.0000 1.00 1.00 1.00
Admit 500.0 0.28400 0.451388 0.0 0.0000 0.00 1.00 1.00

Observations:

  • The average GRE score of students applying for UCLA is ~316 out of 340. Some students scored full marks on GRE.
  • The average TOEFL score of students applying for UCLA is ~107 out of 120. Some students scored full marks on TOEFL.
  • There are students with all kinds of ratings for bachelor's University, SOP, and LOR - ratings ranging from 1 to 5.
  • The average CGPA of students applying for UCLA is 8.57.
  • Majority of students (~56%) have research experience.
  • As per our assumption, on average 28.4% of students would get admission to UCLA.

Data visualization to observe the pattern¶

In [9]:
plt.figure(figsize=(15,8))
sns.scatterplot(data=data, 
           x='GRE Score', 
           y='TOEFL Score', 
           hue='Admit',
           size='SOP');

Data preparation¶

This dataset contains both numerical and categorical variables. We need to treat them first before we pass them onto the neural network. We will perform the below pre-processing steps:

  • One hot encoding of categorical variables
  • Scaling numerical variables

An important point to remember: Before we scale numerical variables, we would first split the dataset into train and test datasets and perform scaling separately. Otherwise, we would be leaking information from the test data to the train data and the resulting model might give a false sense of good performance. This is known as data leakage which we would like to avoid.

In this dataset, although the variable University Rating is encoded as a numerical variable. University Rating is denoting or signifying the quality of the university, so that is why this is a categorical variable and we would be creating one-hot encoding or dummy variables for this variable.

In [10]:
# Creating one hot encoding for the column - University Rating and then dropping University Rating
one_hot_data = pd.concat([data, pd.get_dummies(data['University Rating'], prefix = 'University Rating')], axis=1)

one_hot_data = one_hot_data.drop(columns = 'University Rating')

one_hot_data.head()
Out[10]:
GRE Score TOEFL Score SOP LOR CGPA Research Admit University Rating_1 University Rating_2 University Rating_3 University Rating_4 University Rating_5
0 337 118 4.5 4.5 9.65 1 1 0 0 0 1 0
1 324 107 4.0 4.5 8.87 1 0 0 0 0 1 0
2 316 104 3.0 3.5 8.00 1 0 0 0 1 0 0
3 322 110 3.5 2.5 8.67 1 0 0 0 1 0 0
4 314 103 2.0 3.0 8.21 0 0 0 1 0 0 0

Now, let's split the dataset into train and test datasets. To do that, we would be extracting all the independent variables and save them into a variable features. And the target variable Admit would be saved into a variable target. These two variables will be used to split the parent dataset into train and test datasets.

In [11]:
features = one_hot_data.drop(['Admit'], axis=1)

target = one_hot_data['Admit']

Splitting of data into train and test sets¶

In [12]:
# Splitting the dataset into train and test data
X_train, X_test, y_train, y_test =  train_test_split(features, target, test_size=0.2, random_state=42)

Now, we will perform scaling on the numerical variables separately for train and test sets. We will perform fit and transform on the train data and then only we will perform transform on the test data.

In [13]:
scaler = MinMaxScaler()

# Here, we are passing all the features (numerical and categorical), that's okay as min-max scaler will not change values of categorical variables
X_train_normalized = scaler.fit_transform(X_train)
In [14]:
X_test_normalized = scaler.transform(X_test)
In [15]:
# Fixing the seed for random number generators
np.random.seed(42)

import random
random.seed(42)

tf.random.set_seed(42)

STEP2 : Define the Artifial Neural Network Architecture¶

Building a feed forward neural network with 2 hidden layers and the output layer - Model 1¶

In [16]:
# We will be adding the layers sequentially
model_1 = Sequential()

# First hidden layer with 128 neurons and relu activation function, the input shape tuple denotes number of independent variables
model_1.add(Dense(128, activation='relu', input_shape=(11,)))

# We will be switching 20% of neurons off randomly at each iteration to avoid overfitting
model_1.add(Dropout(0.2))

# Second hidden layer with 64 neurons and relu activation function
model_1.add(Dense(64, activation='relu'))

# We will be switching 10% of neurons off randomly at each iteration to avoid overfitting
model_1.add(Dropout(0.1))

# Output layer with only one neuron and sigmoid as activation function will give the probability of students getting admitted into UCLA  
model_1.add(Dense(1, activation='sigmoid'))

STEP 3: Initialize and compile the model¶

Once we are done with the model architecture, we need to compile the model, where we need to provide the loss function that we want to optimize, the optimization algorithm, and the evaluation metric that we are interested in to evaluate the model.

Try adamax optimizer with accuracy as the metric and see the model's summary.

In [17]:
model_1.compile(loss = 'binary_crossentropy', optimizer='adamax', metrics=['accuracy'])

model_1.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 128)               1536      
                                                                 
 dropout (Dropout)           (None, 128)               0         
                                                                 
 dense_1 (Dense)             (None, 64)                8256      
                                                                 
 dropout_1 (Dropout)         (None, 64)                0         
                                                                 
 dense_2 (Dense)             (None, 1)                 65        
                                                                 
=================================================================
Total params: 9,857
Trainable params: 9,857
Non-trainable params: 0
_________________________________________________________________

From the above summary, we can see that this architecture will train a total of 9,857 parameters i.e. weights and biases in the network.

STEP 4 : Training the model¶

Model 1¶

In [18]:
history_1 = model_1.fit(X_train_normalized, 
                    y_train,
                    validation_split=0.1, 
                    epochs=150, 
                    verbose=2)
Epoch 1/150
12/12 - 1s - loss: 0.6542 - accuracy: 0.6639 - val_loss: 0.6546 - val_accuracy: 0.5750 - 838ms/epoch - 70ms/step
Epoch 2/150
12/12 - 0s - loss: 0.5893 - accuracy: 0.7306 - val_loss: 0.6212 - val_accuracy: 0.5750 - 39ms/epoch - 3ms/step
Epoch 3/150
12/12 - 0s - loss: 0.5492 - accuracy: 0.7333 - val_loss: 0.5885 - val_accuracy: 0.5750 - 35ms/epoch - 3ms/step
Epoch 4/150
12/12 - 0s - loss: 0.5131 - accuracy: 0.7417 - val_loss: 0.5413 - val_accuracy: 0.7500 - 20ms/epoch - 2ms/step
Epoch 5/150
12/12 - 0s - loss: 0.4815 - accuracy: 0.7861 - val_loss: 0.4917 - val_accuracy: 0.8250 - 35ms/epoch - 3ms/step
Epoch 6/150
12/12 - 0s - loss: 0.4416 - accuracy: 0.8444 - val_loss: 0.4530 - val_accuracy: 0.8500 - 37ms/epoch - 3ms/step
Epoch 7/150
12/12 - 0s - loss: 0.4091 - accuracy: 0.8667 - val_loss: 0.4109 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 8/150
12/12 - 0s - loss: 0.3828 - accuracy: 0.8889 - val_loss: 0.3816 - val_accuracy: 0.9250 - 24ms/epoch - 2ms/step
Epoch 9/150
12/12 - 0s - loss: 0.3606 - accuracy: 0.8861 - val_loss: 0.3552 - val_accuracy: 0.9250 - 45ms/epoch - 4ms/step
Epoch 10/150
12/12 - 0s - loss: 0.3350 - accuracy: 0.8806 - val_loss: 0.3328 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 11/150
12/12 - 0s - loss: 0.3267 - accuracy: 0.8778 - val_loss: 0.3170 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 12/150
12/12 - 0s - loss: 0.3113 - accuracy: 0.8861 - val_loss: 0.3135 - val_accuracy: 0.9250 - 43ms/epoch - 4ms/step
Epoch 13/150
12/12 - 0s - loss: 0.3109 - accuracy: 0.8806 - val_loss: 0.3039 - val_accuracy: 0.9250 - 43ms/epoch - 4ms/step
Epoch 14/150
12/12 - 0s - loss: 0.3151 - accuracy: 0.8806 - val_loss: 0.2907 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 15/150
12/12 - 0s - loss: 0.2965 - accuracy: 0.8806 - val_loss: 0.2904 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 16/150
12/12 - 0s - loss: 0.2915 - accuracy: 0.8806 - val_loss: 0.2887 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 17/150
12/12 - 0s - loss: 0.2727 - accuracy: 0.8972 - val_loss: 0.2780 - val_accuracy: 0.9250 - 24ms/epoch - 2ms/step
Epoch 18/150
12/12 - 0s - loss: 0.2789 - accuracy: 0.8861 - val_loss: 0.2777 - val_accuracy: 0.9250 - 46ms/epoch - 4ms/step
Epoch 19/150
12/12 - 0s - loss: 0.2776 - accuracy: 0.8778 - val_loss: 0.2802 - val_accuracy: 0.9250 - 19ms/epoch - 2ms/step
Epoch 20/150
12/12 - 0s - loss: 0.2660 - accuracy: 0.8833 - val_loss: 0.2819 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 21/150
12/12 - 0s - loss: 0.2639 - accuracy: 0.8889 - val_loss: 0.2776 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 22/150
12/12 - 0s - loss: 0.2543 - accuracy: 0.8944 - val_loss: 0.2706 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 23/150
12/12 - 0s - loss: 0.2546 - accuracy: 0.8861 - val_loss: 0.2649 - val_accuracy: 0.9250 - 22ms/epoch - 2ms/step
Epoch 24/150
12/12 - 0s - loss: 0.2558 - accuracy: 0.8972 - val_loss: 0.2663 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 25/150
12/12 - 0s - loss: 0.2586 - accuracy: 0.8889 - val_loss: 0.2692 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 26/150
12/12 - 0s - loss: 0.2475 - accuracy: 0.8972 - val_loss: 0.2692 - val_accuracy: 0.9250 - 24ms/epoch - 2ms/step
Epoch 27/150
12/12 - 0s - loss: 0.2496 - accuracy: 0.8889 - val_loss: 0.2652 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 28/150
12/12 - 0s - loss: 0.2443 - accuracy: 0.9056 - val_loss: 0.2710 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 29/150
12/12 - 0s - loss: 0.2477 - accuracy: 0.9056 - val_loss: 0.2682 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 30/150
12/12 - 0s - loss: 0.2611 - accuracy: 0.8917 - val_loss: 0.2594 - val_accuracy: 0.9250 - 43ms/epoch - 4ms/step
Epoch 31/150
12/12 - 0s - loss: 0.2471 - accuracy: 0.8972 - val_loss: 0.2620 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 32/150
12/12 - 0s - loss: 0.2444 - accuracy: 0.9000 - val_loss: 0.2673 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 33/150
12/12 - 0s - loss: 0.2494 - accuracy: 0.8944 - val_loss: 0.2646 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 34/150
12/12 - 0s - loss: 0.2414 - accuracy: 0.8917 - val_loss: 0.2636 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 35/150
12/12 - 0s - loss: 0.2371 - accuracy: 0.8944 - val_loss: 0.2650 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 36/150
12/12 - 0s - loss: 0.2453 - accuracy: 0.8917 - val_loss: 0.2609 - val_accuracy: 0.9250 - 41ms/epoch - 3ms/step
Epoch 37/150
12/12 - 0s - loss: 0.2394 - accuracy: 0.9056 - val_loss: 0.2549 - val_accuracy: 0.9250 - 43ms/epoch - 4ms/step
Epoch 38/150
12/12 - 0s - loss: 0.2207 - accuracy: 0.9139 - val_loss: 0.2541 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 39/150
12/12 - 0s - loss: 0.2447 - accuracy: 0.8917 - val_loss: 0.2570 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 40/150
12/12 - 0s - loss: 0.2322 - accuracy: 0.9000 - val_loss: 0.2529 - val_accuracy: 0.9250 - 21ms/epoch - 2ms/step
Epoch 41/150
12/12 - 0s - loss: 0.2320 - accuracy: 0.8917 - val_loss: 0.2561 - val_accuracy: 0.9250 - 49ms/epoch - 4ms/step
Epoch 42/150
12/12 - 0s - loss: 0.2215 - accuracy: 0.9028 - val_loss: 0.2527 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 43/150
12/12 - 0s - loss: 0.2282 - accuracy: 0.9000 - val_loss: 0.2593 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 44/150
12/12 - 0s - loss: 0.2375 - accuracy: 0.9000 - val_loss: 0.2602 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 45/150
12/12 - 0s - loss: 0.2329 - accuracy: 0.9139 - val_loss: 0.2579 - val_accuracy: 0.9250 - 25ms/epoch - 2ms/step
Epoch 46/150
12/12 - 0s - loss: 0.2317 - accuracy: 0.8972 - val_loss: 0.2586 - val_accuracy: 0.9250 - 44ms/epoch - 4ms/step
Epoch 47/150
12/12 - 0s - loss: 0.2283 - accuracy: 0.8917 - val_loss: 0.2558 - val_accuracy: 0.9250 - 21ms/epoch - 2ms/step
Epoch 48/150
12/12 - 0s - loss: 0.2239 - accuracy: 0.9167 - val_loss: 0.2516 - val_accuracy: 0.9250 - 48ms/epoch - 4ms/step
Epoch 49/150
12/12 - 0s - loss: 0.2286 - accuracy: 0.9056 - val_loss: 0.2533 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 50/150
12/12 - 0s - loss: 0.2269 - accuracy: 0.9000 - val_loss: 0.2485 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 51/150
12/12 - 0s - loss: 0.2281 - accuracy: 0.9028 - val_loss: 0.2519 - val_accuracy: 0.9250 - 28ms/epoch - 2ms/step
Epoch 52/150
12/12 - 0s - loss: 0.2215 - accuracy: 0.9056 - val_loss: 0.2530 - val_accuracy: 0.9250 - 49ms/epoch - 4ms/step
Epoch 53/150
12/12 - 0s - loss: 0.2151 - accuracy: 0.9028 - val_loss: 0.2488 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 54/150
12/12 - 0s - loss: 0.2220 - accuracy: 0.9083 - val_loss: 0.2501 - val_accuracy: 0.9250 - 25ms/epoch - 2ms/step
Epoch 55/150
12/12 - 0s - loss: 0.2073 - accuracy: 0.9056 - val_loss: 0.2472 - val_accuracy: 0.9250 - 45ms/epoch - 4ms/step
Epoch 56/150
12/12 - 0s - loss: 0.2170 - accuracy: 0.9056 - val_loss: 0.2443 - val_accuracy: 0.9250 - 26ms/epoch - 2ms/step
Epoch 57/150
12/12 - 0s - loss: 0.2069 - accuracy: 0.9083 - val_loss: 0.2437 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 58/150
12/12 - 0s - loss: 0.2219 - accuracy: 0.9056 - val_loss: 0.2461 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 59/150
12/12 - 0s - loss: 0.2207 - accuracy: 0.9083 - val_loss: 0.2485 - val_accuracy: 0.9250 - 29ms/epoch - 2ms/step
Epoch 60/150
12/12 - 0s - loss: 0.2064 - accuracy: 0.9278 - val_loss: 0.2469 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 61/150
12/12 - 0s - loss: 0.2081 - accuracy: 0.9083 - val_loss: 0.2505 - val_accuracy: 0.9250 - 20ms/epoch - 2ms/step
Epoch 62/150
12/12 - 0s - loss: 0.2068 - accuracy: 0.9111 - val_loss: 0.2541 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 63/150
12/12 - 0s - loss: 0.2194 - accuracy: 0.9056 - val_loss: 0.2546 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 64/150
12/12 - 0s - loss: 0.2115 - accuracy: 0.9139 - val_loss: 0.2484 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 65/150
12/12 - 0s - loss: 0.2226 - accuracy: 0.9000 - val_loss: 0.2448 - val_accuracy: 0.9250 - 26ms/epoch - 2ms/step
Epoch 66/150
12/12 - 0s - loss: 0.2078 - accuracy: 0.9083 - val_loss: 0.2457 - val_accuracy: 0.9250 - 55ms/epoch - 5ms/step
Epoch 67/150
12/12 - 0s - loss: 0.2090 - accuracy: 0.9083 - val_loss: 0.2419 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 68/150
12/12 - 0s - loss: 0.2153 - accuracy: 0.9111 - val_loss: 0.2422 - val_accuracy: 0.9250 - 26ms/epoch - 2ms/step
Epoch 69/150
12/12 - 0s - loss: 0.1951 - accuracy: 0.9139 - val_loss: 0.2469 - val_accuracy: 0.9250 - 44ms/epoch - 4ms/step
Epoch 70/150
12/12 - 0s - loss: 0.2186 - accuracy: 0.9056 - val_loss: 0.2424 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 71/150
12/12 - 0s - loss: 0.1959 - accuracy: 0.9167 - val_loss: 0.2476 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 72/150
12/12 - 0s - loss: 0.1978 - accuracy: 0.9139 - val_loss: 0.2420 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 73/150
12/12 - 0s - loss: 0.1924 - accuracy: 0.9250 - val_loss: 0.2429 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 74/150
12/12 - 0s - loss: 0.1984 - accuracy: 0.9167 - val_loss: 0.2443 - val_accuracy: 0.9250 - 23ms/epoch - 2ms/step
Epoch 75/150
12/12 - 0s - loss: 0.2103 - accuracy: 0.9056 - val_loss: 0.2506 - val_accuracy: 0.9250 - 45ms/epoch - 4ms/step
Epoch 76/150
12/12 - 0s - loss: 0.2041 - accuracy: 0.9167 - val_loss: 0.2568 - val_accuracy: 0.9250 - 20ms/epoch - 2ms/step
Epoch 77/150
12/12 - 0s - loss: 0.1994 - accuracy: 0.9000 - val_loss: 0.2470 - val_accuracy: 0.9250 - 23ms/epoch - 2ms/step
Epoch 78/150
12/12 - 0s - loss: 0.2001 - accuracy: 0.9139 - val_loss: 0.2413 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 79/150
12/12 - 0s - loss: 0.1874 - accuracy: 0.9222 - val_loss: 0.2482 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 80/150
12/12 - 0s - loss: 0.2024 - accuracy: 0.9139 - val_loss: 0.2463 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 81/150
12/12 - 0s - loss: 0.2056 - accuracy: 0.9083 - val_loss: 0.2418 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 82/150
12/12 - 0s - loss: 0.2031 - accuracy: 0.9028 - val_loss: 0.2521 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 83/150
12/12 - 0s - loss: 0.2094 - accuracy: 0.9083 - val_loss: 0.2492 - val_accuracy: 0.9250 - 27ms/epoch - 2ms/step
Epoch 84/150
12/12 - 0s - loss: 0.1924 - accuracy: 0.9139 - val_loss: 0.2428 - val_accuracy: 0.9250 - 42ms/epoch - 3ms/step
Epoch 85/150
12/12 - 0s - loss: 0.1901 - accuracy: 0.9167 - val_loss: 0.2494 - val_accuracy: 0.9250 - 22ms/epoch - 2ms/step
Epoch 86/150
12/12 - 0s - loss: 0.2101 - accuracy: 0.9083 - val_loss: 0.2483 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 87/150
12/12 - 0s - loss: 0.1870 - accuracy: 0.9167 - val_loss: 0.2384 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 88/150
12/12 - 0s - loss: 0.1905 - accuracy: 0.9222 - val_loss: 0.2412 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 89/150
12/12 - 0s - loss: 0.2027 - accuracy: 0.9111 - val_loss: 0.2435 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 90/150
12/12 - 0s - loss: 0.1886 - accuracy: 0.9250 - val_loss: 0.2403 - val_accuracy: 0.9250 - 27ms/epoch - 2ms/step
Epoch 91/150
12/12 - 0s - loss: 0.1944 - accuracy: 0.9111 - val_loss: 0.2426 - val_accuracy: 0.9250 - 43ms/epoch - 4ms/step
Epoch 92/150
12/12 - 0s - loss: 0.1913 - accuracy: 0.9167 - val_loss: 0.2495 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 93/150
12/12 - 0s - loss: 0.1975 - accuracy: 0.9111 - val_loss: 0.2474 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 94/150
12/12 - 0s - loss: 0.2025 - accuracy: 0.9056 - val_loss: 0.2478 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 95/150
12/12 - 0s - loss: 0.1951 - accuracy: 0.9111 - val_loss: 0.2454 - val_accuracy: 0.9250 - 47ms/epoch - 4ms/step
Epoch 96/150
12/12 - 0s - loss: 0.1828 - accuracy: 0.9278 - val_loss: 0.2449 - val_accuracy: 0.9250 - 25ms/epoch - 2ms/step
Epoch 97/150
12/12 - 0s - loss: 0.2039 - accuracy: 0.9139 - val_loss: 0.2455 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 98/150
12/12 - 0s - loss: 0.1939 - accuracy: 0.9167 - val_loss: 0.2500 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 99/150
12/12 - 0s - loss: 0.1915 - accuracy: 0.9083 - val_loss: 0.2419 - val_accuracy: 0.9250 - 29ms/epoch - 2ms/step
Epoch 100/150
12/12 - 0s - loss: 0.2021 - accuracy: 0.9194 - val_loss: 0.2448 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 101/150
12/12 - 0s - loss: 0.1905 - accuracy: 0.9222 - val_loss: 0.2425 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 102/150
12/12 - 0s - loss: 0.2028 - accuracy: 0.9139 - val_loss: 0.2481 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 103/150
12/12 - 0s - loss: 0.1908 - accuracy: 0.9250 - val_loss: 0.2416 - val_accuracy: 0.9250 - 25ms/epoch - 2ms/step
Epoch 104/150
12/12 - 0s - loss: 0.1891 - accuracy: 0.9111 - val_loss: 0.2479 - val_accuracy: 0.9250 - 60ms/epoch - 5ms/step
Epoch 105/150
12/12 - 0s - loss: 0.1901 - accuracy: 0.9139 - val_loss: 0.2560 - val_accuracy: 0.9250 - 47ms/epoch - 4ms/step
Epoch 106/150
12/12 - 0s - loss: 0.1914 - accuracy: 0.9167 - val_loss: 0.2474 - val_accuracy: 0.9250 - 43ms/epoch - 4ms/step
Epoch 107/150
12/12 - 0s - loss: 0.1850 - accuracy: 0.9083 - val_loss: 0.2492 - val_accuracy: 0.9250 - 48ms/epoch - 4ms/step
Epoch 108/150
12/12 - 0s - loss: 0.1943 - accuracy: 0.9111 - val_loss: 0.2484 - val_accuracy: 0.9250 - 39ms/epoch - 3ms/step
Epoch 109/150
12/12 - 0s - loss: 0.1840 - accuracy: 0.9111 - val_loss: 0.2435 - val_accuracy: 0.9250 - 25ms/epoch - 2ms/step
Epoch 110/150
12/12 - 0s - loss: 0.1894 - accuracy: 0.9278 - val_loss: 0.2481 - val_accuracy: 0.9250 - 41ms/epoch - 3ms/step
Epoch 111/150
12/12 - 0s - loss: 0.1975 - accuracy: 0.9167 - val_loss: 0.2445 - val_accuracy: 0.9000 - 22ms/epoch - 2ms/step
Epoch 112/150
12/12 - 0s - loss: 0.1778 - accuracy: 0.9306 - val_loss: 0.2479 - val_accuracy: 0.9000 - 35ms/epoch - 3ms/step
Epoch 113/150
12/12 - 0s - loss: 0.1776 - accuracy: 0.9083 - val_loss: 0.2538 - val_accuracy: 0.9000 - 40ms/epoch - 3ms/step
Epoch 114/150
12/12 - 0s - loss: 0.1869 - accuracy: 0.9222 - val_loss: 0.2550 - val_accuracy: 0.9250 - 44ms/epoch - 4ms/step
Epoch 115/150
12/12 - 0s - loss: 0.1853 - accuracy: 0.9306 - val_loss: 0.2563 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 116/150
12/12 - 0s - loss: 0.1885 - accuracy: 0.9056 - val_loss: 0.2498 - val_accuracy: 0.9250 - 24ms/epoch - 2ms/step
Epoch 117/150
12/12 - 0s - loss: 0.1759 - accuracy: 0.9250 - val_loss: 0.2436 - val_accuracy: 0.9250 - 48ms/epoch - 4ms/step
Epoch 118/150
12/12 - 0s - loss: 0.1692 - accuracy: 0.9306 - val_loss: 0.2458 - val_accuracy: 0.9250 - 39ms/epoch - 3ms/step
Epoch 119/150
12/12 - 0s - loss: 0.1830 - accuracy: 0.9111 - val_loss: 0.2466 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 120/150
12/12 - 0s - loss: 0.1710 - accuracy: 0.9278 - val_loss: 0.2506 - val_accuracy: 0.9250 - 24ms/epoch - 2ms/step
Epoch 121/150
12/12 - 0s - loss: 0.1773 - accuracy: 0.9333 - val_loss: 0.2485 - val_accuracy: 0.9250 - 43ms/epoch - 4ms/step
Epoch 122/150
12/12 - 0s - loss: 0.1900 - accuracy: 0.9083 - val_loss: 0.2518 - val_accuracy: 0.9250 - 26ms/epoch - 2ms/step
Epoch 123/150
12/12 - 0s - loss: 0.1683 - accuracy: 0.9222 - val_loss: 0.2481 - val_accuracy: 0.9250 - 43ms/epoch - 4ms/step
Epoch 124/150
12/12 - 0s - loss: 0.1714 - accuracy: 0.9139 - val_loss: 0.2426 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 125/150
12/12 - 0s - loss: 0.1941 - accuracy: 0.9111 - val_loss: 0.2437 - val_accuracy: 0.9000 - 34ms/epoch - 3ms/step
Epoch 126/150
12/12 - 0s - loss: 0.1827 - accuracy: 0.9111 - val_loss: 0.2516 - val_accuracy: 0.9250 - 29ms/epoch - 2ms/step
Epoch 127/150
12/12 - 0s - loss: 0.1703 - accuracy: 0.9222 - val_loss: 0.2489 - val_accuracy: 0.9250 - 42ms/epoch - 4ms/step
Epoch 128/150
12/12 - 0s - loss: 0.1824 - accuracy: 0.9167 - val_loss: 0.2540 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 129/150
12/12 - 0s - loss: 0.1762 - accuracy: 0.9222 - val_loss: 0.2447 - val_accuracy: 0.9000 - 34ms/epoch - 3ms/step
Epoch 130/150
12/12 - 0s - loss: 0.1769 - accuracy: 0.9306 - val_loss: 0.2507 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 131/150
12/12 - 0s - loss: 0.1786 - accuracy: 0.9194 - val_loss: 0.2470 - val_accuracy: 0.9250 - 28ms/epoch - 2ms/step
Epoch 132/150
12/12 - 0s - loss: 0.1900 - accuracy: 0.9083 - val_loss: 0.2471 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 133/150
12/12 - 0s - loss: 0.1731 - accuracy: 0.9389 - val_loss: 0.2409 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 134/150
12/12 - 0s - loss: 0.1755 - accuracy: 0.9250 - val_loss: 0.2442 - val_accuracy: 0.9250 - 41ms/epoch - 3ms/step
Epoch 135/150
12/12 - 0s - loss: 0.1704 - accuracy: 0.9250 - val_loss: 0.2451 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 136/150
12/12 - 0s - loss: 0.1739 - accuracy: 0.9167 - val_loss: 0.2508 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 137/150
12/12 - 0s - loss: 0.1786 - accuracy: 0.9222 - val_loss: 0.2564 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 138/150
12/12 - 0s - loss: 0.1654 - accuracy: 0.9250 - val_loss: 0.2580 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 139/150
12/12 - 0s - loss: 0.1913 - accuracy: 0.9111 - val_loss: 0.2514 - val_accuracy: 0.9000 - 36ms/epoch - 3ms/step
Epoch 140/150
12/12 - 0s - loss: 0.1732 - accuracy: 0.9083 - val_loss: 0.2555 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 141/150
12/12 - 0s - loss: 0.1794 - accuracy: 0.9139 - val_loss: 0.2530 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 142/150
12/12 - 0s - loss: 0.1657 - accuracy: 0.9222 - val_loss: 0.2526 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 143/150
12/12 - 0s - loss: 0.1735 - accuracy: 0.9278 - val_loss: 0.2661 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 144/150
12/12 - 0s - loss: 0.1865 - accuracy: 0.9111 - val_loss: 0.2609 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 145/150
12/12 - 0s - loss: 0.1748 - accuracy: 0.9278 - val_loss: 0.2508 - val_accuracy: 0.9000 - 36ms/epoch - 3ms/step
Epoch 146/150
12/12 - 0s - loss: 0.1768 - accuracy: 0.9194 - val_loss: 0.2559 - val_accuracy: 0.9250 - 22ms/epoch - 2ms/step
Epoch 147/150
12/12 - 0s - loss: 0.1656 - accuracy: 0.9333 - val_loss: 0.2558 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 148/150
12/12 - 0s - loss: 0.1860 - accuracy: 0.9278 - val_loss: 0.2594 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 149/150
12/12 - 0s - loss: 0.1750 - accuracy: 0.9250 - val_loss: 0.2585 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 150/150
12/12 - 0s - loss: 0.1863 - accuracy: 0.9083 - val_loss: 0.2544 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step

STEP 5 : Perforamcne evaluation on validation data¶

Plotting Accuracy vs Epoch Curve¶

In [24]:
plt.plot(history_1.history['accuracy'])
plt.plot(history_1.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()

Observations:

  • The training accuracy is fluctuating but overall it is increasing with the increase in the epochs.
  • The validation accuracy is constant between ~20 to 100 epochs and it is fluctuating a bit post 100 epochs.
  • The model is giving good accuracy. After 150 epochs, the accuracy of the model on the training data is similar to the validation accuracy (~93%). This indicates that the model is giving a generalized performance.

Let's try to improve the model performance by hyper parameter tuning

- Let's try by changing the number of hidden layerr and neurons, activation function, optimzer, and number of epochs
In [25]:
# Clearing backend
from tensorflow.keras import backend
backend.clear_session()
In [26]:
# Fixing the seed for random number generators
np.random.seed(42)

import random
random.seed(42)

tf.random.set_seed(42)

STEP 6: Fine tune the model - hyper parameterization¶

Building Model 2 with three Layers¶

In [27]:
model_2 = Sequential()
model_2.add(Dense(128, activation='tanh', input_shape=(11,)))
model_2.add(Dropout(0.1))
model_2.add(Dense(64, activation='tanh'))
model_2.add(Dropout(0.1))
model_2.add(Dense(32, activation='tanh'))
model_2.add(Dense(1, activation='sigmoid'))
In [28]:
model_2.compile(loss = 'binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model_2.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 128)               1536      
                                                                 
 dropout (Dropout)           (None, 128)               0         
                                                                 
 dense_1 (Dense)             (None, 64)                8256      
                                                                 
 dropout_1 (Dropout)         (None, 64)                0         
                                                                 
 dense_2 (Dense)             (None, 32)                2080      
                                                                 
 dense_3 (Dense)             (None, 1)                 33        
                                                                 
=================================================================
Total params: 11,905
Trainable params: 11,905
Non-trainable params: 0
_________________________________________________________________

Train the Model 2¶

In [29]:
history_2 = model_2.fit(X_train_normalized, 
                    y_train, 
                    validation_split=0.1, 
                    epochs=100, 
                    verbose=2)
Epoch 1/100
12/12 - 1s - loss: 0.6109 - accuracy: 0.6389 - val_loss: 0.5549 - val_accuracy: 0.6500 - 559ms/epoch - 47ms/step
Epoch 2/100
12/12 - 0s - loss: 0.4221 - accuracy: 0.8333 - val_loss: 0.3531 - val_accuracy: 0.8750 - 23ms/epoch - 2ms/step
Epoch 3/100
12/12 - 0s - loss: 0.3422 - accuracy: 0.8611 - val_loss: 0.3053 - val_accuracy: 0.9000 - 34ms/epoch - 3ms/step
Epoch 4/100
12/12 - 0s - loss: 0.3199 - accuracy: 0.8722 - val_loss: 0.2768 - val_accuracy: 0.9000 - 44ms/epoch - 4ms/step
Epoch 5/100
12/12 - 0s - loss: 0.3095 - accuracy: 0.8639 - val_loss: 0.2783 - val_accuracy: 0.9250 - 22ms/epoch - 2ms/step
Epoch 6/100
12/12 - 0s - loss: 0.2849 - accuracy: 0.8722 - val_loss: 0.2704 - val_accuracy: 0.9250 - 42ms/epoch - 3ms/step
Epoch 7/100
12/12 - 0s - loss: 0.2672 - accuracy: 0.8750 - val_loss: 0.2880 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 8/100
12/12 - 0s - loss: 0.2618 - accuracy: 0.8861 - val_loss: 0.2567 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 9/100
12/12 - 0s - loss: 0.2413 - accuracy: 0.8972 - val_loss: 0.2567 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 10/100
12/12 - 0s - loss: 0.2469 - accuracy: 0.8917 - val_loss: 0.2573 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 11/100
12/12 - 0s - loss: 0.2181 - accuracy: 0.9111 - val_loss: 0.2798 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 12/100
12/12 - 0s - loss: 0.2324 - accuracy: 0.8917 - val_loss: 0.2245 - val_accuracy: 0.8750 - 31ms/epoch - 3ms/step
Epoch 13/100
12/12 - 0s - loss: 0.2305 - accuracy: 0.8889 - val_loss: 0.2831 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 14/100
12/12 - 0s - loss: 0.2375 - accuracy: 0.8944 - val_loss: 0.2365 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 15/100
12/12 - 0s - loss: 0.2147 - accuracy: 0.9083 - val_loss: 0.2122 - val_accuracy: 0.9000 - 31ms/epoch - 3ms/step
Epoch 16/100
12/12 - 0s - loss: 0.2311 - accuracy: 0.8944 - val_loss: 0.2301 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 17/100
12/12 - 0s - loss: 0.2158 - accuracy: 0.9000 - val_loss: 0.2279 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 18/100
12/12 - 0s - loss: 0.2292 - accuracy: 0.9083 - val_loss: 0.1988 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 19/100
12/12 - 0s - loss: 0.2058 - accuracy: 0.8972 - val_loss: 0.2523 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 20/100
12/12 - 0s - loss: 0.1927 - accuracy: 0.9167 - val_loss: 0.2237 - val_accuracy: 0.9000 - 32ms/epoch - 3ms/step
Epoch 21/100
12/12 - 0s - loss: 0.1981 - accuracy: 0.9083 - val_loss: 0.2295 - val_accuracy: 0.9000 - 40ms/epoch - 3ms/step
Epoch 22/100
12/12 - 0s - loss: 0.1791 - accuracy: 0.9250 - val_loss: 0.2171 - val_accuracy: 0.9000 - 30ms/epoch - 2ms/step
Epoch 23/100
12/12 - 0s - loss: 0.1971 - accuracy: 0.9167 - val_loss: 0.2501 - val_accuracy: 0.9250 - 23ms/epoch - 2ms/step
Epoch 24/100
12/12 - 0s - loss: 0.1891 - accuracy: 0.9167 - val_loss: 0.2381 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 25/100
12/12 - 0s - loss: 0.1900 - accuracy: 0.9056 - val_loss: 0.2164 - val_accuracy: 0.9250 - 40ms/epoch - 3ms/step
Epoch 26/100
12/12 - 0s - loss: 0.1710 - accuracy: 0.9250 - val_loss: 0.2287 - val_accuracy: 0.9000 - 22ms/epoch - 2ms/step
Epoch 27/100
12/12 - 0s - loss: 0.1662 - accuracy: 0.9139 - val_loss: 0.2475 - val_accuracy: 0.9250 - 41ms/epoch - 3ms/step
Epoch 28/100
12/12 - 0s - loss: 0.1800 - accuracy: 0.9194 - val_loss: 0.2210 - val_accuracy: 0.9000 - 32ms/epoch - 3ms/step
Epoch 29/100
12/12 - 0s - loss: 0.1931 - accuracy: 0.9028 - val_loss: 0.2206 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 30/100
12/12 - 0s - loss: 0.2116 - accuracy: 0.9028 - val_loss: 0.2617 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 31/100
12/12 - 0s - loss: 0.1681 - accuracy: 0.9139 - val_loss: 0.2568 - val_accuracy: 0.9000 - 32ms/epoch - 3ms/step
Epoch 32/100
12/12 - 0s - loss: 0.1722 - accuracy: 0.9278 - val_loss: 0.2207 - val_accuracy: 0.9500 - 32ms/epoch - 3ms/step
Epoch 33/100
12/12 - 0s - loss: 0.1807 - accuracy: 0.9278 - val_loss: 0.2421 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 34/100
12/12 - 0s - loss: 0.1842 - accuracy: 0.9194 - val_loss: 0.2141 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 35/100
12/12 - 0s - loss: 0.1833 - accuracy: 0.9111 - val_loss: 0.2138 - val_accuracy: 0.9500 - 32ms/epoch - 3ms/step
Epoch 36/100
12/12 - 0s - loss: 0.1690 - accuracy: 0.9278 - val_loss: 0.2191 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 37/100
12/12 - 0s - loss: 0.1672 - accuracy: 0.9167 - val_loss: 0.2289 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 38/100
12/12 - 0s - loss: 0.1786 - accuracy: 0.9167 - val_loss: 0.2426 - val_accuracy: 0.9000 - 34ms/epoch - 3ms/step
Epoch 39/100
12/12 - 0s - loss: 0.1755 - accuracy: 0.9167 - val_loss: 0.2312 - val_accuracy: 0.9500 - 32ms/epoch - 3ms/step
Epoch 40/100
12/12 - 0s - loss: 0.1715 - accuracy: 0.9278 - val_loss: 0.2597 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 41/100
12/12 - 0s - loss: 0.1762 - accuracy: 0.9306 - val_loss: 0.2157 - val_accuracy: 0.9500 - 32ms/epoch - 3ms/step
Epoch 42/100
12/12 - 0s - loss: 0.1665 - accuracy: 0.9139 - val_loss: 0.2512 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 43/100
12/12 - 0s - loss: 0.1818 - accuracy: 0.9194 - val_loss: 0.2311 - val_accuracy: 0.9000 - 25ms/epoch - 2ms/step
Epoch 44/100
12/12 - 0s - loss: 0.1725 - accuracy: 0.9167 - val_loss: 0.2425 - val_accuracy: 0.9000 - 40ms/epoch - 3ms/step
Epoch 45/100
12/12 - 0s - loss: 0.1702 - accuracy: 0.9250 - val_loss: 0.2344 - val_accuracy: 0.9000 - 30ms/epoch - 3ms/step
Epoch 46/100
12/12 - 0s - loss: 0.1697 - accuracy: 0.9222 - val_loss: 0.2289 - val_accuracy: 0.9000 - 31ms/epoch - 3ms/step
Epoch 47/100
12/12 - 0s - loss: 0.1660 - accuracy: 0.9111 - val_loss: 0.2298 - val_accuracy: 0.9000 - 34ms/epoch - 3ms/step
Epoch 48/100
12/12 - 0s - loss: 0.1589 - accuracy: 0.9250 - val_loss: 0.2354 - val_accuracy: 0.9000 - 31ms/epoch - 3ms/step
Epoch 49/100
12/12 - 0s - loss: 0.1629 - accuracy: 0.9278 - val_loss: 0.2315 - val_accuracy: 0.9000 - 33ms/epoch - 3ms/step
Epoch 50/100
12/12 - 0s - loss: 0.1668 - accuracy: 0.9194 - val_loss: 0.2499 - val_accuracy: 0.9000 - 32ms/epoch - 3ms/step
Epoch 51/100
12/12 - 0s - loss: 0.1710 - accuracy: 0.9139 - val_loss: 0.2409 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 52/100
12/12 - 0s - loss: 0.1791 - accuracy: 0.9278 - val_loss: 0.2323 - val_accuracy: 0.9000 - 31ms/epoch - 3ms/step
Epoch 53/100
12/12 - 0s - loss: 0.1688 - accuracy: 0.9139 - val_loss: 0.2486 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 54/100
12/12 - 0s - loss: 0.1986 - accuracy: 0.9111 - val_loss: 0.2292 - val_accuracy: 0.9500 - 27ms/epoch - 2ms/step
Epoch 55/100
12/12 - 0s - loss: 0.1730 - accuracy: 0.9111 - val_loss: 0.2390 - val_accuracy: 0.9250 - 40ms/epoch - 3ms/step
Epoch 56/100
12/12 - 0s - loss: 0.1700 - accuracy: 0.9389 - val_loss: 0.2149 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 57/100
12/12 - 0s - loss: 0.1569 - accuracy: 0.9361 - val_loss: 0.2349 - val_accuracy: 0.9000 - 31ms/epoch - 3ms/step
Epoch 58/100
12/12 - 0s - loss: 0.1640 - accuracy: 0.9167 - val_loss: 0.2337 - val_accuracy: 0.9250 - 30ms/epoch - 3ms/step
Epoch 59/100
12/12 - 0s - loss: 0.1732 - accuracy: 0.9028 - val_loss: 0.2456 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 60/100
12/12 - 0s - loss: 0.1712 - accuracy: 0.9111 - val_loss: 0.2361 - val_accuracy: 0.9000 - 32ms/epoch - 3ms/step
Epoch 61/100
12/12 - 0s - loss: 0.1601 - accuracy: 0.9333 - val_loss: 0.2302 - val_accuracy: 0.9000 - 30ms/epoch - 2ms/step
Epoch 62/100
12/12 - 0s - loss: 0.1498 - accuracy: 0.9389 - val_loss: 0.2396 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 63/100
12/12 - 0s - loss: 0.1645 - accuracy: 0.9306 - val_loss: 0.2328 - val_accuracy: 0.9500 - 32ms/epoch - 3ms/step
Epoch 64/100
12/12 - 0s - loss: 0.1642 - accuracy: 0.9278 - val_loss: 0.2473 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 65/100
12/12 - 0s - loss: 0.1799 - accuracy: 0.9250 - val_loss: 0.2311 - val_accuracy: 0.9250 - 29ms/epoch - 2ms/step
Epoch 66/100
12/12 - 0s - loss: 0.1661 - accuracy: 0.9222 - val_loss: 0.2337 - val_accuracy: 0.9500 - 32ms/epoch - 3ms/step
Epoch 67/100
12/12 - 0s - loss: 0.1835 - accuracy: 0.9222 - val_loss: 0.2625 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 68/100
12/12 - 0s - loss: 0.1745 - accuracy: 0.9194 - val_loss: 0.2506 - val_accuracy: 0.9250 - 33ms/epoch - 3ms/step
Epoch 69/100
12/12 - 0s - loss: 0.1608 - accuracy: 0.9222 - val_loss: 0.2289 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 70/100
12/12 - 0s - loss: 0.1686 - accuracy: 0.9194 - val_loss: 0.2510 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 71/100
12/12 - 0s - loss: 0.1693 - accuracy: 0.9194 - val_loss: 0.2183 - val_accuracy: 0.9500 - 32ms/epoch - 3ms/step
Epoch 72/100
12/12 - 0s - loss: 0.1761 - accuracy: 0.9167 - val_loss: 0.2836 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 73/100
12/12 - 0s - loss: 0.1535 - accuracy: 0.9333 - val_loss: 0.2290 - val_accuracy: 0.9500 - 33ms/epoch - 3ms/step
Epoch 74/100
12/12 - 0s - loss: 0.1799 - accuracy: 0.9278 - val_loss: 0.2846 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 75/100
12/12 - 0s - loss: 0.1869 - accuracy: 0.9111 - val_loss: 0.2342 - val_accuracy: 0.9000 - 31ms/epoch - 3ms/step
Epoch 76/100
12/12 - 0s - loss: 0.1644 - accuracy: 0.9278 - val_loss: 0.2474 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 77/100
12/12 - 0s - loss: 0.1529 - accuracy: 0.9333 - val_loss: 0.2263 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 78/100
12/12 - 0s - loss: 0.1489 - accuracy: 0.9250 - val_loss: 0.2390 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 79/100
12/12 - 0s - loss: 0.1631 - accuracy: 0.9278 - val_loss: 0.2350 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 80/100
12/12 - 0s - loss: 0.1729 - accuracy: 0.9111 - val_loss: 0.2416 - val_accuracy: 0.9000 - 30ms/epoch - 3ms/step
Epoch 81/100
12/12 - 0s - loss: 0.1630 - accuracy: 0.9250 - val_loss: 0.2220 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 82/100
12/12 - 0s - loss: 0.1623 - accuracy: 0.9306 - val_loss: 0.2365 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 83/100
12/12 - 0s - loss: 0.1658 - accuracy: 0.9306 - val_loss: 0.2323 - val_accuracy: 0.9500 - 17ms/epoch - 1ms/step
Epoch 84/100
12/12 - 0s - loss: 0.1552 - accuracy: 0.9333 - val_loss: 0.2327 - val_accuracy: 0.9250 - 19ms/epoch - 2ms/step
Epoch 85/100
12/12 - 0s - loss: 0.1505 - accuracy: 0.9361 - val_loss: 0.2387 - val_accuracy: 0.9250 - 44ms/epoch - 4ms/step
Epoch 86/100
12/12 - 0s - loss: 0.1575 - accuracy: 0.9250 - val_loss: 0.2387 - val_accuracy: 0.9000 - 29ms/epoch - 2ms/step
Epoch 87/100
12/12 - 0s - loss: 0.1631 - accuracy: 0.9306 - val_loss: 0.2361 - val_accuracy: 0.9250 - 22ms/epoch - 2ms/step
Epoch 88/100
12/12 - 0s - loss: 0.1820 - accuracy: 0.9194 - val_loss: 0.2183 - val_accuracy: 0.9000 - 42ms/epoch - 4ms/step
Epoch 89/100
12/12 - 0s - loss: 0.1595 - accuracy: 0.9333 - val_loss: 0.2350 - val_accuracy: 0.9000 - 30ms/epoch - 2ms/step
Epoch 90/100
12/12 - 0s - loss: 0.1751 - accuracy: 0.9222 - val_loss: 0.2425 - val_accuracy: 0.9000 - 31ms/epoch - 3ms/step
Epoch 91/100
12/12 - 0s - loss: 0.1550 - accuracy: 0.9306 - val_loss: 0.2296 - val_accuracy: 0.9000 - 31ms/epoch - 3ms/step
Epoch 92/100
12/12 - 0s - loss: 0.1570 - accuracy: 0.9278 - val_loss: 0.2393 - val_accuracy: 0.9250 - 32ms/epoch - 3ms/step
Epoch 93/100
12/12 - 0s - loss: 0.1568 - accuracy: 0.9278 - val_loss: 0.2330 - val_accuracy: 0.9500 - 32ms/epoch - 3ms/step
Epoch 94/100
12/12 - 0s - loss: 0.1689 - accuracy: 0.9250 - val_loss: 0.2349 - val_accuracy: 0.9000 - 33ms/epoch - 3ms/step
Epoch 95/100
12/12 - 0s - loss: 0.1516 - accuracy: 0.9306 - val_loss: 0.2386 - val_accuracy: 0.9000 - 32ms/epoch - 3ms/step
Epoch 96/100
12/12 - 0s - loss: 0.1649 - accuracy: 0.9194 - val_loss: 0.2337 - val_accuracy: 0.9000 - 32ms/epoch - 3ms/step
Epoch 97/100
12/12 - 0s - loss: 0.1650 - accuracy: 0.9278 - val_loss: 0.2502 - val_accuracy: 0.9250 - 28ms/epoch - 2ms/step
Epoch 98/100
12/12 - 0s - loss: 0.1591 - accuracy: 0.9278 - val_loss: 0.2341 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 99/100
12/12 - 0s - loss: 0.1775 - accuracy: 0.9111 - val_loss: 0.2599 - val_accuracy: 0.9250 - 30ms/epoch - 3ms/step
Epoch 100/100
12/12 - 0s - loss: 0.1666 - accuracy: 0.9250 - val_loss: 0.2276 - val_accuracy: 0.9250 - 30ms/epoch - 3ms/step
In [30]:
plt.plot(history_2.history['accuracy'])
plt.plot(history_2.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()

Observations:

  • We are able to slightly improve the model performance on the training data and the validation accuracy has also increased.
  • The validation accuracy is slightly higher than the training accuracy. This might due to the small size of the validation set and the model is able is to correctly classify the data points in the validation set.
Further improve the Model performance by some of the hyperparamters¶
In [31]:
# Clearing the backend
from tensorflow.keras import backend
backend.clear_session()
In [32]:
# Fixing the seed for random number generators
np.random.seed(42)

import random
random.seed(42)

tf.random.set_seed(42)

Building Model 3 with four Layers¶

In [33]:
model_3 = Sequential()
model_3.add(Dense(256, activation='tanh', input_shape=(11,)))
model_3.add(Dropout(0.1))
model_3.add(Dense(128, activation='tanh'))
model_3.add(Dropout(0.1))
model_3.add(Dense(64, activation='tanh'))
model_3.add(Dropout(0.1))
model_3.add(Dense(32, activation='tanh'))
model_3.add(Dense(1, activation='sigmoid'))
In [34]:
model_3.compile(loss = 'binary_crossentropy', optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])
model_3.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 256)               3072      
                                                                 
 dropout (Dropout)           (None, 256)               0         
                                                                 
 dense_1 (Dense)             (None, 128)               32896     
                                                                 
 dropout_1 (Dropout)         (None, 128)               0         
                                                                 
 dense_2 (Dense)             (None, 64)                8256      
                                                                 
 dropout_2 (Dropout)         (None, 64)                0         
                                                                 
 dense_3 (Dense)             (None, 32)                2080      
                                                                 
 dense_4 (Dense)             (None, 1)                 33        
                                                                 
=================================================================
Total params: 46,337
Trainable params: 46,337
Non-trainable params: 0
_________________________________________________________________

Notice that the number of trainable parameters has increased substantially as compared to previous models.

Train the Model 3¶

In [35]:
history_3 = model_3.fit(X_train_normalized, 
                    y_train, 
                    validation_split=0.1, 
                    epochs=200,
                    verbose=2)
Epoch 1/200
12/12 - 1s - loss: 0.5423 - accuracy: 0.7278 - val_loss: 0.3818 - val_accuracy: 0.9000 - 656ms/epoch - 55ms/step
Epoch 2/200
12/12 - 0s - loss: 0.3642 - accuracy: 0.8611 - val_loss: 0.3379 - val_accuracy: 0.9000 - 45ms/epoch - 4ms/step
Epoch 3/200
12/12 - 0s - loss: 0.3222 - accuracy: 0.8528 - val_loss: 0.2938 - val_accuracy: 0.9000 - 36ms/epoch - 3ms/step
Epoch 4/200
12/12 - 0s - loss: 0.3090 - accuracy: 0.8694 - val_loss: 0.2875 - val_accuracy: 0.9250 - 22ms/epoch - 2ms/step
Epoch 5/200
12/12 - 0s - loss: 0.2804 - accuracy: 0.8889 - val_loss: 0.2543 - val_accuracy: 0.9000 - 38ms/epoch - 3ms/step
Epoch 6/200
12/12 - 0s - loss: 0.2878 - accuracy: 0.8722 - val_loss: 0.2619 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 7/200
12/12 - 0s - loss: 0.2469 - accuracy: 0.8861 - val_loss: 0.3036 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 8/200
12/12 - 0s - loss: 0.2286 - accuracy: 0.9139 - val_loss: 0.2800 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 9/200
12/12 - 0s - loss: 0.2340 - accuracy: 0.8944 - val_loss: 0.2364 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 10/200
12/12 - 0s - loss: 0.2057 - accuracy: 0.9139 - val_loss: 0.2412 - val_accuracy: 0.9250 - 39ms/epoch - 3ms/step
Epoch 11/200
12/12 - 0s - loss: 0.2164 - accuracy: 0.8972 - val_loss: 0.3028 - val_accuracy: 0.9000 - 40ms/epoch - 3ms/step
Epoch 12/200
12/12 - 0s - loss: 0.2042 - accuracy: 0.9056 - val_loss: 0.2487 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 13/200
12/12 - 0s - loss: 0.2097 - accuracy: 0.9000 - val_loss: 0.2663 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 14/200
12/12 - 0s - loss: 0.2282 - accuracy: 0.8889 - val_loss: 0.3329 - val_accuracy: 0.9000 - 37ms/epoch - 3ms/step
Epoch 15/200
12/12 - 0s - loss: 0.2526 - accuracy: 0.8917 - val_loss: 0.2168 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 16/200
12/12 - 0s - loss: 0.2114 - accuracy: 0.8972 - val_loss: 0.2221 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 17/200
12/12 - 0s - loss: 0.2066 - accuracy: 0.9139 - val_loss: 0.2658 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 18/200
12/12 - 0s - loss: 0.2062 - accuracy: 0.9139 - val_loss: 0.2330 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 19/200
12/12 - 0s - loss: 0.2265 - accuracy: 0.8806 - val_loss: 0.2557 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 20/200
12/12 - 0s - loss: 0.1930 - accuracy: 0.9000 - val_loss: 0.2354 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 21/200
12/12 - 0s - loss: 0.1977 - accuracy: 0.9167 - val_loss: 0.2267 - val_accuracy: 0.9500 - 38ms/epoch - 3ms/step
Epoch 22/200
12/12 - 0s - loss: 0.2029 - accuracy: 0.9139 - val_loss: 0.2237 - val_accuracy: 0.9000 - 37ms/epoch - 3ms/step
Epoch 23/200
12/12 - 0s - loss: 0.1953 - accuracy: 0.9000 - val_loss: 0.2593 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 24/200
12/12 - 0s - loss: 0.1918 - accuracy: 0.9167 - val_loss: 0.2423 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 25/200
12/12 - 0s - loss: 0.1900 - accuracy: 0.9250 - val_loss: 0.2089 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 26/200
12/12 - 0s - loss: 0.1736 - accuracy: 0.9278 - val_loss: 0.2240 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 27/200
12/12 - 0s - loss: 0.1691 - accuracy: 0.9278 - val_loss: 0.2439 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 28/200
12/12 - 0s - loss: 0.1759 - accuracy: 0.9222 - val_loss: 0.2218 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 29/200
12/12 - 0s - loss: 0.2031 - accuracy: 0.9083 - val_loss: 0.2225 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 30/200
12/12 - 0s - loss: 0.1922 - accuracy: 0.9139 - val_loss: 0.2477 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 31/200
12/12 - 0s - loss: 0.1821 - accuracy: 0.9083 - val_loss: 0.2595 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 32/200
12/12 - 0s - loss: 0.1775 - accuracy: 0.9278 - val_loss: 0.2263 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 33/200
12/12 - 0s - loss: 0.1634 - accuracy: 0.9306 - val_loss: 0.2359 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 34/200
12/12 - 0s - loss: 0.1687 - accuracy: 0.9250 - val_loss: 0.2272 - val_accuracy: 0.9250 - 40ms/epoch - 3ms/step
Epoch 35/200
12/12 - 0s - loss: 0.1733 - accuracy: 0.9139 - val_loss: 0.2205 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 36/200
12/12 - 0s - loss: 0.1794 - accuracy: 0.9167 - val_loss: 0.2343 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 37/200
12/12 - 0s - loss: 0.1691 - accuracy: 0.9083 - val_loss: 0.2241 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 38/200
12/12 - 0s - loss: 0.1627 - accuracy: 0.9306 - val_loss: 0.2337 - val_accuracy: 0.9000 - 38ms/epoch - 3ms/step
Epoch 39/200
12/12 - 0s - loss: 0.1716 - accuracy: 0.9222 - val_loss: 0.2296 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 40/200
12/12 - 0s - loss: 0.1847 - accuracy: 0.9111 - val_loss: 0.2777 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 41/200
12/12 - 0s - loss: 0.1776 - accuracy: 0.9139 - val_loss: 0.2185 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 42/200
12/12 - 0s - loss: 0.1675 - accuracy: 0.9167 - val_loss: 0.2414 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 43/200
12/12 - 0s - loss: 0.1736 - accuracy: 0.9139 - val_loss: 0.2509 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 44/200
12/12 - 0s - loss: 0.1689 - accuracy: 0.9194 - val_loss: 0.2278 - val_accuracy: 0.9000 - 41ms/epoch - 3ms/step
Epoch 45/200
12/12 - 0s - loss: 0.1643 - accuracy: 0.9333 - val_loss: 0.2224 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 46/200
12/12 - 0s - loss: 0.1686 - accuracy: 0.9222 - val_loss: 0.2191 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 47/200
12/12 - 0s - loss: 0.1633 - accuracy: 0.9278 - val_loss: 0.2202 - val_accuracy: 0.9250 - 39ms/epoch - 3ms/step
Epoch 48/200
12/12 - 0s - loss: 0.1603 - accuracy: 0.9306 - val_loss: 0.2401 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 49/200
12/12 - 0s - loss: 0.1621 - accuracy: 0.9250 - val_loss: 0.2283 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 50/200
12/12 - 0s - loss: 0.1557 - accuracy: 0.9250 - val_loss: 0.2553 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 51/200
12/12 - 0s - loss: 0.1601 - accuracy: 0.9167 - val_loss: 0.2362 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 52/200
12/12 - 0s - loss: 0.1632 - accuracy: 0.9306 - val_loss: 0.2249 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 53/200
12/12 - 0s - loss: 0.1679 - accuracy: 0.9278 - val_loss: 0.2710 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 54/200
12/12 - 0s - loss: 0.1963 - accuracy: 0.9056 - val_loss: 0.2263 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 55/200
12/12 - 0s - loss: 0.1809 - accuracy: 0.9083 - val_loss: 0.2273 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 56/200
12/12 - 0s - loss: 0.1663 - accuracy: 0.9222 - val_loss: 0.2370 - val_accuracy: 0.9250 - 25ms/epoch - 2ms/step
Epoch 57/200
12/12 - 0s - loss: 0.1547 - accuracy: 0.9333 - val_loss: 0.2292 - val_accuracy: 0.9500 - 50ms/epoch - 4ms/step
Epoch 58/200
12/12 - 0s - loss: 0.1570 - accuracy: 0.9417 - val_loss: 0.2321 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 59/200
12/12 - 0s - loss: 0.1879 - accuracy: 0.9028 - val_loss: 0.2576 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 60/200
12/12 - 0s - loss: 0.1583 - accuracy: 0.9306 - val_loss: 0.2330 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 61/200
12/12 - 0s - loss: 0.1558 - accuracy: 0.9250 - val_loss: 0.2385 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 62/200
12/12 - 0s - loss: 0.1534 - accuracy: 0.9361 - val_loss: 0.2402 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 63/200
12/12 - 0s - loss: 0.1681 - accuracy: 0.9139 - val_loss: 0.2342 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 64/200
12/12 - 0s - loss: 0.1473 - accuracy: 0.9361 - val_loss: 0.2455 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 65/200
12/12 - 0s - loss: 0.1642 - accuracy: 0.9278 - val_loss: 0.2365 - val_accuracy: 0.9000 - 37ms/epoch - 3ms/step
Epoch 66/200
12/12 - 0s - loss: 0.1691 - accuracy: 0.9250 - val_loss: 0.2342 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 67/200
12/12 - 0s - loss: 0.1959 - accuracy: 0.9194 - val_loss: 0.2604 - val_accuracy: 0.9250 - 40ms/epoch - 3ms/step
Epoch 68/200
12/12 - 0s - loss: 0.1824 - accuracy: 0.9167 - val_loss: 0.2428 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 69/200
12/12 - 0s - loss: 0.1634 - accuracy: 0.9278 - val_loss: 0.2301 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 70/200
12/12 - 0s - loss: 0.1536 - accuracy: 0.9306 - val_loss: 0.2351 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 71/200
12/12 - 0s - loss: 0.1588 - accuracy: 0.9278 - val_loss: 0.2299 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 72/200
12/12 - 0s - loss: 0.1563 - accuracy: 0.9278 - val_loss: 0.3029 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 73/200
12/12 - 0s - loss: 0.1565 - accuracy: 0.9278 - val_loss: 0.2332 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 74/200
12/12 - 0s - loss: 0.1445 - accuracy: 0.9417 - val_loss: 0.2911 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 75/200
12/12 - 0s - loss: 0.1841 - accuracy: 0.9083 - val_loss: 0.2349 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 76/200
12/12 - 0s - loss: 0.1484 - accuracy: 0.9306 - val_loss: 0.2409 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 77/200
12/12 - 0s - loss: 0.1530 - accuracy: 0.9306 - val_loss: 0.2322 - val_accuracy: 0.9500 - 34ms/epoch - 3ms/step
Epoch 78/200
12/12 - 0s - loss: 0.1583 - accuracy: 0.9139 - val_loss: 0.2438 - val_accuracy: 0.9000 - 37ms/epoch - 3ms/step
Epoch 79/200
12/12 - 0s - loss: 0.1604 - accuracy: 0.9222 - val_loss: 0.2364 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 80/200
12/12 - 0s - loss: 0.1662 - accuracy: 0.9222 - val_loss: 0.2506 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 81/200
12/12 - 0s - loss: 0.1588 - accuracy: 0.9361 - val_loss: 0.2366 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 82/200
12/12 - 0s - loss: 0.1471 - accuracy: 0.9333 - val_loss: 0.2444 - val_accuracy: 0.9000 - 36ms/epoch - 3ms/step
Epoch 83/200
12/12 - 0s - loss: 0.1612 - accuracy: 0.9222 - val_loss: 0.2409 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 84/200
12/12 - 0s - loss: 0.1381 - accuracy: 0.9361 - val_loss: 0.2427 - val_accuracy: 0.9250 - 34ms/epoch - 3ms/step
Epoch 85/200
12/12 - 0s - loss: 0.1550 - accuracy: 0.9306 - val_loss: 0.2363 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 86/200
12/12 - 0s - loss: 0.1413 - accuracy: 0.9278 - val_loss: 0.2448 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 87/200
12/12 - 0s - loss: 0.1468 - accuracy: 0.9361 - val_loss: 0.2490 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 88/200
12/12 - 0s - loss: 0.1662 - accuracy: 0.9028 - val_loss: 0.2290 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 89/200
12/12 - 0s - loss: 0.1437 - accuracy: 0.9278 - val_loss: 0.2439 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 90/200
12/12 - 0s - loss: 0.1412 - accuracy: 0.9306 - val_loss: 0.2447 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 91/200
12/12 - 0s - loss: 0.1404 - accuracy: 0.9417 - val_loss: 0.2482 - val_accuracy: 0.9000 - 34ms/epoch - 3ms/step
Epoch 92/200
12/12 - 0s - loss: 0.1423 - accuracy: 0.9333 - val_loss: 0.2453 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 93/200
12/12 - 0s - loss: 0.1402 - accuracy: 0.9417 - val_loss: 0.2408 - val_accuracy: 0.9500 - 23ms/epoch - 2ms/step
Epoch 94/200
12/12 - 0s - loss: 0.1535 - accuracy: 0.9333 - val_loss: 0.2506 - val_accuracy: 0.9250 - 49ms/epoch - 4ms/step
Epoch 95/200
12/12 - 0s - loss: 0.1583 - accuracy: 0.9306 - val_loss: 0.2510 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 96/200
12/12 - 0s - loss: 0.1624 - accuracy: 0.9250 - val_loss: 0.2409 - val_accuracy: 0.9500 - 32ms/epoch - 3ms/step
Epoch 97/200
12/12 - 0s - loss: 0.1466 - accuracy: 0.9389 - val_loss: 0.2408 - val_accuracy: 0.9500 - 43ms/epoch - 4ms/step
Epoch 98/200
12/12 - 0s - loss: 0.1394 - accuracy: 0.9472 - val_loss: 0.2423 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 99/200
12/12 - 0s - loss: 0.1612 - accuracy: 0.9111 - val_loss: 0.2612 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 100/200
12/12 - 0s - loss: 0.1314 - accuracy: 0.9333 - val_loss: 0.2427 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 101/200
12/12 - 0s - loss: 0.1434 - accuracy: 0.9361 - val_loss: 0.2363 - val_accuracy: 0.9500 - 25ms/epoch - 2ms/step
Epoch 102/200
12/12 - 0s - loss: 0.1478 - accuracy: 0.9417 - val_loss: 0.2428 - val_accuracy: 0.9500 - 49ms/epoch - 4ms/step
Epoch 103/200
12/12 - 0s - loss: 0.1441 - accuracy: 0.9278 - val_loss: 0.2889 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 104/200
12/12 - 0s - loss: 0.1591 - accuracy: 0.9222 - val_loss: 0.2469 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 105/200
12/12 - 0s - loss: 0.1388 - accuracy: 0.9417 - val_loss: 0.2549 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 106/200
12/12 - 0s - loss: 0.1540 - accuracy: 0.9361 - val_loss: 0.2402 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 107/200
12/12 - 0s - loss: 0.1482 - accuracy: 0.9278 - val_loss: 0.2399 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 108/200
12/12 - 0s - loss: 0.1359 - accuracy: 0.9361 - val_loss: 0.2484 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 109/200
12/12 - 0s - loss: 0.1497 - accuracy: 0.9250 - val_loss: 0.2524 - val_accuracy: 0.9000 - 34ms/epoch - 3ms/step
Epoch 110/200
12/12 - 0s - loss: 0.1456 - accuracy: 0.9250 - val_loss: 0.2436 - val_accuracy: 0.9500 - 25ms/epoch - 2ms/step
Epoch 111/200
12/12 - 0s - loss: 0.1638 - accuracy: 0.9167 - val_loss: 0.2809 - val_accuracy: 0.9250 - 48ms/epoch - 4ms/step
Epoch 112/200
12/12 - 0s - loss: 0.1485 - accuracy: 0.9306 - val_loss: 0.2412 - val_accuracy: 0.9500 - 40ms/epoch - 3ms/step
Epoch 113/200
12/12 - 0s - loss: 0.1397 - accuracy: 0.9361 - val_loss: 0.2495 - val_accuracy: 0.9500 - 25ms/epoch - 2ms/step
Epoch 114/200
12/12 - 0s - loss: 0.1378 - accuracy: 0.9333 - val_loss: 0.2357 - val_accuracy: 0.9250 - 46ms/epoch - 4ms/step
Epoch 115/200
12/12 - 0s - loss: 0.1482 - accuracy: 0.9278 - val_loss: 0.2543 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 116/200
12/12 - 0s - loss: 0.1311 - accuracy: 0.9361 - val_loss: 0.2377 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 117/200
12/12 - 0s - loss: 0.1418 - accuracy: 0.9444 - val_loss: 0.2588 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 118/200
12/12 - 0s - loss: 0.1590 - accuracy: 0.9194 - val_loss: 0.2548 - val_accuracy: 0.9500 - 25ms/epoch - 2ms/step
Epoch 119/200
12/12 - 0s - loss: 0.1457 - accuracy: 0.9361 - val_loss: 0.2575 - val_accuracy: 0.9500 - 48ms/epoch - 4ms/step
Epoch 120/200
12/12 - 0s - loss: 0.1443 - accuracy: 0.9250 - val_loss: 0.2575 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 121/200
12/12 - 0s - loss: 0.1355 - accuracy: 0.9389 - val_loss: 0.2463 - val_accuracy: 0.9500 - 28ms/epoch - 2ms/step
Epoch 122/200
12/12 - 0s - loss: 0.1392 - accuracy: 0.9361 - val_loss: 0.2425 - val_accuracy: 0.9500 - 46ms/epoch - 4ms/step
Epoch 123/200
12/12 - 0s - loss: 0.1325 - accuracy: 0.9389 - val_loss: 0.2549 - val_accuracy: 0.9500 - 39ms/epoch - 3ms/step
Epoch 124/200
12/12 - 0s - loss: 0.1564 - accuracy: 0.9167 - val_loss: 0.2673 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 125/200
12/12 - 0s - loss: 0.1432 - accuracy: 0.9306 - val_loss: 0.2514 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 126/200
12/12 - 0s - loss: 0.1511 - accuracy: 0.9222 - val_loss: 0.2447 - val_accuracy: 0.9500 - 38ms/epoch - 3ms/step
Epoch 127/200
12/12 - 0s - loss: 0.1356 - accuracy: 0.9278 - val_loss: 0.2615 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 128/200
12/12 - 0s - loss: 0.1431 - accuracy: 0.9333 - val_loss: 0.2502 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 129/200
12/12 - 0s - loss: 0.1537 - accuracy: 0.9167 - val_loss: 0.2573 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 130/200
12/12 - 0s - loss: 0.1319 - accuracy: 0.9361 - val_loss: 0.2438 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 131/200
12/12 - 0s - loss: 0.1386 - accuracy: 0.9306 - val_loss: 0.2573 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 132/200
12/12 - 0s - loss: 0.1445 - accuracy: 0.9278 - val_loss: 0.2508 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 133/200
12/12 - 0s - loss: 0.1429 - accuracy: 0.9222 - val_loss: 0.2633 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 134/200
12/12 - 0s - loss: 0.1345 - accuracy: 0.9250 - val_loss: 0.2462 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 135/200
12/12 - 0s - loss: 0.1303 - accuracy: 0.9417 - val_loss: 0.2662 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 136/200
12/12 - 0s - loss: 0.1347 - accuracy: 0.9333 - val_loss: 0.2461 - val_accuracy: 0.9500 - 29ms/epoch - 2ms/step
Epoch 137/200
12/12 - 0s - loss: 0.1276 - accuracy: 0.9389 - val_loss: 0.2602 - val_accuracy: 0.9500 - 43ms/epoch - 4ms/step
Epoch 138/200
12/12 - 0s - loss: 0.1392 - accuracy: 0.9333 - val_loss: 0.2678 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 139/200
12/12 - 0s - loss: 0.1384 - accuracy: 0.9361 - val_loss: 0.2815 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 140/200
12/12 - 0s - loss: 0.1354 - accuracy: 0.9278 - val_loss: 0.2483 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 141/200
12/12 - 0s - loss: 0.1364 - accuracy: 0.9472 - val_loss: 0.2705 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 142/200
12/12 - 0s - loss: 0.1472 - accuracy: 0.9306 - val_loss: 0.2489 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 143/200
12/12 - 0s - loss: 0.1551 - accuracy: 0.9278 - val_loss: 0.2510 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 144/200
12/12 - 0s - loss: 0.1484 - accuracy: 0.9361 - val_loss: 0.2678 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 145/200
12/12 - 0s - loss: 0.1327 - accuracy: 0.9361 - val_loss: 0.2510 - val_accuracy: 0.9500 - 23ms/epoch - 2ms/step
Epoch 146/200
12/12 - 0s - loss: 0.1429 - accuracy: 0.9417 - val_loss: 0.2578 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 147/200
12/12 - 0s - loss: 0.1407 - accuracy: 0.9222 - val_loss: 0.2788 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 148/200
12/12 - 0s - loss: 0.1403 - accuracy: 0.9417 - val_loss: 0.2479 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 149/200
12/12 - 0s - loss: 0.1479 - accuracy: 0.9167 - val_loss: 0.2480 - val_accuracy: 0.9500 - 23ms/epoch - 2ms/step
Epoch 150/200
12/12 - 0s - loss: 0.1395 - accuracy: 0.9361 - val_loss: 0.2537 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 151/200
12/12 - 0s - loss: 0.1323 - accuracy: 0.9417 - val_loss: 0.2489 - val_accuracy: 0.9250 - 31ms/epoch - 3ms/step
Epoch 152/200
12/12 - 0s - loss: 0.1347 - accuracy: 0.9417 - val_loss: 0.2521 - val_accuracy: 0.9500 - 49ms/epoch - 4ms/step
Epoch 153/200
12/12 - 0s - loss: 0.1355 - accuracy: 0.9361 - val_loss: 0.2511 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 154/200
12/12 - 0s - loss: 0.1445 - accuracy: 0.9361 - val_loss: 0.2797 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 155/200
12/12 - 0s - loss: 0.1427 - accuracy: 0.9333 - val_loss: 0.2603 - val_accuracy: 0.9500 - 27ms/epoch - 2ms/step
Epoch 156/200
12/12 - 0s - loss: 0.1324 - accuracy: 0.9417 - val_loss: 0.2505 - val_accuracy: 0.9500 - 46ms/epoch - 4ms/step
Epoch 157/200
12/12 - 0s - loss: 0.1324 - accuracy: 0.9389 - val_loss: 0.2770 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 158/200
12/12 - 0s - loss: 0.1406 - accuracy: 0.9306 - val_loss: 0.2639 - val_accuracy: 0.9250 - 38ms/epoch - 3ms/step
Epoch 159/200
12/12 - 0s - loss: 0.1242 - accuracy: 0.9389 - val_loss: 0.2501 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 160/200
12/12 - 0s - loss: 0.1274 - accuracy: 0.9306 - val_loss: 0.2664 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 161/200
12/12 - 0s - loss: 0.1511 - accuracy: 0.9361 - val_loss: 0.2757 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 162/200
12/12 - 0s - loss: 0.1485 - accuracy: 0.9306 - val_loss: 0.2702 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 163/200
12/12 - 0s - loss: 0.1424 - accuracy: 0.9278 - val_loss: 0.2795 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 164/200
12/12 - 0s - loss: 0.1277 - accuracy: 0.9333 - val_loss: 0.2529 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 165/200
12/12 - 0s - loss: 0.1430 - accuracy: 0.9306 - val_loss: 0.2540 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 166/200
12/12 - 0s - loss: 0.1475 - accuracy: 0.9306 - val_loss: 0.2791 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 167/200
12/12 - 0s - loss: 0.1470 - accuracy: 0.9250 - val_loss: 0.2519 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 168/200
12/12 - 0s - loss: 0.1267 - accuracy: 0.9500 - val_loss: 0.2532 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 169/200
12/12 - 0s - loss: 0.1250 - accuracy: 0.9333 - val_loss: 0.2575 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 170/200
12/12 - 0s - loss: 0.1276 - accuracy: 0.9333 - val_loss: 0.2489 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 171/200
12/12 - 0s - loss: 0.1331 - accuracy: 0.9278 - val_loss: 0.2939 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 172/200
12/12 - 0s - loss: 0.1203 - accuracy: 0.9528 - val_loss: 0.2518 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 173/200
12/12 - 0s - loss: 0.1381 - accuracy: 0.9333 - val_loss: 0.2617 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 174/200
12/12 - 0s - loss: 0.1300 - accuracy: 0.9444 - val_loss: 0.2532 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 175/200
12/12 - 0s - loss: 0.1256 - accuracy: 0.9389 - val_loss: 0.2580 - val_accuracy: 0.9500 - 24ms/epoch - 2ms/step
Epoch 176/200
12/12 - 0s - loss: 0.1240 - accuracy: 0.9389 - val_loss: 0.2568 - val_accuracy: 0.9500 - 50ms/epoch - 4ms/step
Epoch 177/200
12/12 - 0s - loss: 0.1336 - accuracy: 0.9417 - val_loss: 0.2569 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 178/200
12/12 - 0s - loss: 0.1423 - accuracy: 0.9333 - val_loss: 0.2612 - val_accuracy: 0.9500 - 34ms/epoch - 3ms/step
Epoch 179/200
12/12 - 0s - loss: 0.1187 - accuracy: 0.9528 - val_loss: 0.2588 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 180/200
12/12 - 0s - loss: 0.1271 - accuracy: 0.9361 - val_loss: 0.2568 - val_accuracy: 0.9250 - 36ms/epoch - 3ms/step
Epoch 181/200
12/12 - 0s - loss: 0.1294 - accuracy: 0.9361 - val_loss: 0.2566 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 182/200
12/12 - 0s - loss: 0.1262 - accuracy: 0.9389 - val_loss: 0.3305 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 183/200
12/12 - 0s - loss: 0.1367 - accuracy: 0.9500 - val_loss: 0.2602 - val_accuracy: 0.9250 - 35ms/epoch - 3ms/step
Epoch 184/200
12/12 - 0s - loss: 0.1413 - accuracy: 0.9250 - val_loss: 0.3078 - val_accuracy: 0.9250 - 25ms/epoch - 2ms/step
Epoch 185/200
12/12 - 0s - loss: 0.1381 - accuracy: 0.9306 - val_loss: 0.2628 - val_accuracy: 0.9250 - 49ms/epoch - 4ms/step
Epoch 186/200
12/12 - 0s - loss: 0.1411 - accuracy: 0.9333 - val_loss: 0.2582 - val_accuracy: 0.9500 - 37ms/epoch - 3ms/step
Epoch 187/200
12/12 - 0s - loss: 0.1224 - accuracy: 0.9417 - val_loss: 0.2595 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 188/200
12/12 - 0s - loss: 0.1242 - accuracy: 0.9389 - val_loss: 0.2571 - val_accuracy: 0.9500 - 34ms/epoch - 3ms/step
Epoch 189/200
12/12 - 0s - loss: 0.1240 - accuracy: 0.9361 - val_loss: 0.2583 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 190/200
12/12 - 0s - loss: 0.1293 - accuracy: 0.9333 - val_loss: 0.2574 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 191/200
12/12 - 0s - loss: 0.1299 - accuracy: 0.9389 - val_loss: 0.2635 - val_accuracy: 0.9500 - 38ms/epoch - 3ms/step
Epoch 192/200
12/12 - 0s - loss: 0.1214 - accuracy: 0.9444 - val_loss: 0.2575 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 193/200
12/12 - 0s - loss: 0.1241 - accuracy: 0.9444 - val_loss: 0.2577 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 194/200
12/12 - 0s - loss: 0.1434 - accuracy: 0.9361 - val_loss: 0.3077 - val_accuracy: 0.9250 - 37ms/epoch - 3ms/step
Epoch 195/200
12/12 - 0s - loss: 0.1362 - accuracy: 0.9417 - val_loss: 0.2577 - val_accuracy: 0.9500 - 42ms/epoch - 3ms/step
Epoch 196/200
12/12 - 0s - loss: 0.1449 - accuracy: 0.9333 - val_loss: 0.2561 - val_accuracy: 0.9500 - 36ms/epoch - 3ms/step
Epoch 197/200
12/12 - 0s - loss: 0.1335 - accuracy: 0.9361 - val_loss: 0.3176 - val_accuracy: 0.9250 - 39ms/epoch - 3ms/step
Epoch 198/200
12/12 - 0s - loss: 0.1437 - accuracy: 0.9333 - val_loss: 0.2585 - val_accuracy: 0.9500 - 38ms/epoch - 3ms/step
Epoch 199/200
12/12 - 0s - loss: 0.1255 - accuracy: 0.9417 - val_loss: 0.2586 - val_accuracy: 0.9500 - 35ms/epoch - 3ms/step
Epoch 200/200
12/12 - 0s - loss: 0.1235 - accuracy: 0.9444 - val_loss: 0.2710 - val_accuracy: 0.9250 - 40ms/epoch - 3ms/step
In [42]:
plt.plot(history_3.history['accuracy'])
plt.plot(history_3.history['val_accuracy'])
plt.title('Accuracy vs Epochs')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='lower right')
plt.show()

Observations:

  • This model is giving a generalized performance with 95% accuracy on the train as well as validation data.
  • The validation accuracy is similar to the previous model but the training accuracy has increased.
  • One reason for the algorithm not being able to reach higher than 95% even for training data might be due to the optimizer being stuck at some local minima.
  • One way to resolve that is to further tune the model with some other hyper-parameters.
  • Among all three models, model 3 has given the best performance. Let's check its performance on the test data.

STEP 7 : Model evaluation on the unseen data for prediction and deploy¶

In [43]:
model_3.evaluate(X_test_normalized, y_test, verbose = 1)
test_pred = np.round(model_3.predict(X_test_normalized))
4/4 [==============================] - 0s 1ms/step - loss: 0.1021 - accuracy: 0.9600
4/4 [==============================] - 0s 1ms/step

The test accuracy is also coming out to be 95% which implies that our model is able to replicate the performance from the train and validation data on the test (unseen) data.

In [44]:
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

print(classification_report(y_test, test_pred))
cm = confusion_matrix(y_test, test_pred)
plt.figure(figsize=(8,5))
sns.heatmap(cm, annot=True,  fmt='.0f',xticklabels=['Not Admitted', 'Admitted'], yticklabels=['Not Admitted', 'Admitted'])
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.show()
              precision    recall  f1-score   support

           0       0.96      0.99      0.97        73
           1       0.96      0.89      0.92        27

    accuracy                           0.96       100
   macro avg       0.96      0.94      0.95       100
weighted avg       0.96      0.96      0.96       100

Observations:

  • The confusion matrix shows that the model can identify the majority of students who would get admission and who won't get admission to UCLA.
  • The classification report shows that all the metrics except recall for class 1 are above 90%, which is good.

Conclusion: In this case study,

  • We have learned how to build a feed-forward neural network for a classification task using Keras.
  • We have seen different hyper-parameters and how they affect the network.
  • We also learned about the accuracy vs. epoch curve and how it aids in understanding how the model learns weights.
  • We were able to get the test accuracy of 95% using the final model.
  • Interested learners can further analyze the misclassified points and see if there is a pattern or if they were outliers that our model could not identify.
  • We would highly recommend you to play around with the other hyper-parameters and see for yourself how it affects your model.
In [ ]: