Monday, October 9, 2017

Keras Quick Start : Multiclass classification



In [1]:
!pip install seaborn
Collecting seaborn
  Downloading seaborn-0.8.1.tar.gz (178kB)
    100% |████████████████████████████████| 184kB 4.2MB/s ta 0:00:01
Building wheels for collected packages: seaborn
  Running setup.py bdist_wheel for seaborn ... done
  Stored in directory: /root/.cache/pip/wheels/29/af/4b/ac6b04ec3e2da1a450e74c6a0e86ade83807b4aaf40466ecda
Successfully built seaborn
Installing collected packages: seaborn
Successfully installed seaborn-0.8.1
In [2]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
%config InlineBackend.figure_format = 'retina'
In [3]:
data = pd.read_csv("https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv")
In [4]:
data.head()
Out[4]:
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
In [5]:
data.shape
Out[5]:
(150, 5)
In [14]:
data.species.value_counts()
Out[14]:
setosa        50
versicolor    50
virginica     50
Name: species, dtype: int64
In [15]:
map_output = {"setosa" :0, "versicolor":1, "virginica":2}
In [17]:
data.species = data.species.replace(map_output)

Import necessary modules

In [9]:
import keras
from keras.layers import Dense
from keras.models import Sequential
from keras.utils import to_categorical
In [7]:
n_cols = data.shape[1]

Set up the model

In [26]:
model = Sequential()
In [11]:
X = data.iloc[:,:-1]
In [12]:
X.head()
Out[12]:
sepal_length sepal_width petal_length petal_width
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2

Convert the target to categorical

In [18]:
y = to_categorical(data.iloc[:,-1])

Add layers

In [27]:
model.add(Dense(32, activation = "relu", input_shape = (4,)))
model.add(Dense(10, activation= "relu"))

Add output layer

In [28]:
model.add(Dense(3,activation = "softmax"))

Compile the model

In [29]:
model.compile(optimizer = "sgd", loss = "categorical_crossentropy", metrics = ["accuracy"])

Fit the model

In [33]:
model.fit(X.values,y, epochs=25)
Epoch 1/25
150/150 [==============================] - 0s - loss: 0.1749 - acc: 0.9600     
Epoch 2/25
150/150 [==============================] - 0s - loss: 0.1726 - acc: 0.9600     
Epoch 3/25
150/150 [==============================] - 0s - loss: 0.1743 - acc: 0.9667     
Epoch 4/25
150/150 [==============================] - 0s - loss: 0.1720 - acc: 0.9733     
Epoch 5/25
150/150 [==============================] - 0s - loss: 0.1677 - acc: 0.9600     
Epoch 6/25
150/150 [==============================] - 0s - loss: 0.1631 - acc: 0.9867     
Epoch 7/25
150/150 [==============================] - 0s - loss: 0.1693 - acc: 0.9467     
Epoch 8/25
150/150 [==============================] - 0s - loss: 0.1652 - acc: 0.9667     
Epoch 9/25
150/150 [==============================] - 0s - loss: 0.1689 - acc: 0.9600     
Epoch 10/25
150/150 [==============================] - 0s - loss: 0.1642 - acc: 0.9667     
Epoch 11/25
150/150 [==============================] - 0s - loss: 0.1571 - acc: 0.9867     
Epoch 12/25
150/150 [==============================] - 0s - loss: 0.1600 - acc: 0.9800     
Epoch 13/25
150/150 [==============================] - 0s - loss: 0.1551 - acc: 0.9667     
Epoch 14/25
150/150 [==============================] - 0s - loss: 0.1572 - acc: 0.9733     
Epoch 15/25
150/150 [==============================] - 0s - loss: 0.1548 - acc: 0.9733     
Epoch 16/25
150/150 [==============================] - 0s - loss: 0.1530 - acc: 0.9733     
Epoch 17/25
150/150 [==============================] - 0s - loss: 0.1610 - acc: 0.9800     
Epoch 18/25
150/150 [==============================] - 0s - loss: 0.1540 - acc: 0.9867     
Epoch 19/25
150/150 [==============================] - 0s - loss: 0.1585 - acc: 0.9733     
Epoch 20/25
150/150 [==============================] - 0s - loss: 0.1525 - acc: 0.9600     
Epoch 21/25
150/150 [==============================] - 0s - loss: 0.1464 - acc: 0.9800     
Epoch 22/25
150/150 [==============================] - 0s - loss: 0.1507 - acc: 0.9733     
Epoch 23/25
150/150 [==============================] - 0s - loss: 0.1441 - acc: 0.9733     
Epoch 24/25
150/150 [==============================] - 0s - loss: 0.1457 - acc: 0.9800     
Epoch 25/25
150/150 [==============================] - 0s - loss: 0.1525 - acc: 0.9733     
Out[33]:
<keras.callbacks.History at 0x7fc590207d68>

Evaluating model accuracy on validation dataset

In [62]:
model = Sequential()
model.add(Dense(32, activation = "relu", input_shape = (4,)))
model.add(Dense(10, activation= "relu"))
model.add(Dense(3,activation = "softmax"))
In [63]:
model.compile(optimizer = "sgd", loss = "categorical_crossentropy", metrics = ["accuracy"])
In [64]:
hist = model.fit(X.values, y, validation_split = 0.3, epochs=14)
Train on 105 samples, validate on 45 samples
Epoch 1/14
105/105 [==============================] - 0s - loss: 1.4129 - acc: 0.3429 - val_loss: 1.2328 - val_acc: 0.0000e+00
Epoch 2/14
105/105 [==============================] - 0s - loss: 0.9677 - acc: 0.4762 - val_loss: 1.5067 - val_acc: 0.0000e+00
Epoch 3/14
105/105 [==============================] - 0s - loss: 0.8645 - acc: 0.5048 - val_loss: 1.7027 - val_acc: 0.0000e+00
Epoch 4/14
105/105 [==============================] - 0s - loss: 0.8095 - acc: 0.9429 - val_loss: 1.8981 - val_acc: 0.0000e+00
Epoch 5/14
105/105 [==============================] - 0s - loss: 0.7691 - acc: 0.9524 - val_loss: 1.9725 - val_acc: 0.0000e+00
Epoch 6/14
105/105 [==============================] - 0s - loss: 0.7360 - acc: 0.9524 - val_loss: 2.0676 - val_acc: 0.0000e+00
Epoch 7/14
105/105 [==============================] - 0s - loss: 0.7067 - acc: 0.9524 - val_loss: 2.1217 - val_acc: 0.0000e+00
Epoch 8/14
105/105 [==============================] - 0s - loss: 0.6775 - acc: 0.9524 - val_loss: 2.2155 - val_acc: 0.0000e+00
Epoch 9/14
105/105 [==============================] - 0s - loss: 0.6482 - acc: 0.9524 - val_loss: 2.2429 - val_acc: 0.0000e+00
Epoch 10/14
105/105 [==============================] - 0s - loss: 0.6204 - acc: 0.9524 - val_loss: 2.3575 - val_acc: 0.0000e+00
Epoch 11/14
105/105 [==============================] - 0s - loss: 0.5932 - acc: 0.9524 - val_loss: 2.4380 - val_acc: 0.0000e+00
Epoch 12/14
105/105 [==============================] - 0s - loss: 0.5671 - acc: 0.9524 - val_loss: 2.5223 - val_acc: 0.0000e+00
Epoch 13/14
105/105 [==============================] - 0s - loss: 0.5435 - acc: 0.9524 - val_loss: 2.5786 - val_acc: 0.0000e+00
Epoch 14/14
105/105 [==============================] - 0s - loss: 0.5209 - acc: 0.9524 - val_loss: 2.6375 - val_acc: 0.0000e+00

Early stopping

In [78]:
from keras.callbacks import EarlyStopping
In [79]:
model = Sequential()
model.add(Dense(32, activation = "relu", input_shape = (4,)))
model.add(Dense(10, activation= "relu"))
model.add(Dense(3,activation = "softmax"))
In [80]:
model.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
In [81]:
# Define early_stopping_monitor
early_stopping_monitor = EarlyStopping(patience = 15)
In [82]:
# Fit the model
model.fit(X.values, y, epochs = 100, validation_split = 0.3, callbacks = [early_stopping_monitor])
Train on 105 samples, validate on 45 samples
Epoch 1/100
105/105 [==============================] - 0s - loss: 0.9523 - acc: 0.4762 - val_loss: 2.5209 - val_acc: 0.0000e+00
Epoch 2/100
105/105 [==============================] - 0s - loss: 0.9196 - acc: 0.4762 - val_loss: 2.5905 - val_acc: 0.0000e+00
Epoch 3/100
105/105 [==============================] - 0s - loss: 0.8913 - acc: 0.4762 - val_loss: 2.6581 - val_acc: 0.0000e+00
Epoch 4/100
105/105 [==============================] - 0s - loss: 0.8707 - acc: 0.4762 - val_loss: 2.6418 - val_acc: 0.0000e+00
Epoch 5/100
105/105 [==============================] - 0s - loss: 0.8523 - acc: 0.4762 - val_loss: 2.6068 - val_acc: 0.0000e+00
Epoch 6/100
105/105 [==============================] - 0s - loss: 0.8395 - acc: 0.4762 - val_loss: 2.7025 - val_acc: 0.0000e+00
Epoch 7/100
105/105 [==============================] - 0s - loss: 0.8246 - acc: 0.4762 - val_loss: 2.8097 - val_acc: 0.0000e+00
Epoch 8/100
105/105 [==============================] - 0s - loss: 0.8097 - acc: 0.4762 - val_loss: 2.9407 - val_acc: 0.0000e+00
Epoch 9/100
105/105 [==============================] - 0s - loss: 0.7967 - acc: 0.4762 - val_loss: 3.0720 - val_acc: 0.0000e+00
Epoch 10/100
105/105 [==============================] - 0s - loss: 0.7833 - acc: 0.4857 - val_loss: 3.2252 - val_acc: 0.0000e+00
Epoch 11/100
105/105 [==============================] - 0s - loss: 0.7677 - acc: 0.5905 - val_loss: 3.3072 - val_acc: 0.0000e+00
Epoch 12/100
105/105 [==============================] - 0s - loss: 0.7529 - acc: 0.8571 - val_loss: 3.3230 - val_acc: 0.0000e+00
Epoch 13/100
105/105 [==============================] - 0s - loss: 0.7381 - acc: 0.9333 - val_loss: 3.2792 - val_acc: 0.0000e+00
Epoch 14/100
105/105 [==============================] - 0s - loss: 0.7253 - acc: 0.9524 - val_loss: 3.2435 - val_acc: 0.0000e+00
Epoch 15/100
105/105 [==============================] - 0s - loss: 0.7127 - acc: 0.9524 - val_loss: 3.2666 - val_acc: 0.0000e+00
Epoch 16/100
105/105 [==============================] - 0s - loss: 0.6972 - acc: 0.9524 - val_loss: 3.3013 - val_acc: 0.0000e+00
Epoch 17/100
105/105 [==============================] - 0s - loss: 0.6823 - acc: 0.9524 - val_loss: 3.3619 - val_acc: 0.0000e+00
Out[82]:
<keras.callbacks.History at 0x7fc58d374780>
In [84]:
hist.history
Out[84]:
{'acc': [0.34285714512779597,
  0.47619047647430784,
  0.50476190561339973,
  0.94285714342480609,
  0.95238095238095233,
  0.95238095294861569,
  0.95238095294861569,
  0.95238095238095233,
  0.95238095294861569,
  0.95238095238095233,
  0.95238095238095233,
  0.95238095238095233,
  0.95238095238095233,
  0.95238095238095233],
 'loss': [1.4129065644173395,
  0.96765276534216749,
  0.86446338721684046,
  0.80954791307449336,
  0.76913730303446448,
  0.73603272608348302,
  0.70666144007728215,
  0.67748971439543226,
  0.64823490494773506,
  0.62037620317368281,
  0.59315612401281081,
  0.56705364556539628,
  0.54347543460982184,
  0.52088925554638821],
 'val_acc': [0.0,
  0.0,
  0.0,
  0.0,
  0.0,
  0.0,
  0.0,
  0.0,
  0.0,
  0.0,
  0.0,
  0.0,
  0.0,
  0.0],
 'val_loss': [1.2327720589107938,
  1.5067431211471558,
  1.7026843229929607,
  1.8981436808904013,
  1.9724665217929416,
  2.0676198164621988,
  2.1216594166225855,
  2.2155206150478786,
  2.2428725666469997,
  2.3575476540459528,
  2.4380253897772897,
  2.5222516218821207,
  2.5786066691080731,
  2.6375213040245904]}

No comments :

Post a Comment