Sklearn clearly defines how to plot a confusion matrix using its own classification model with plot_confusion_matrix
.
But what about using it with Keras model using data generators? Let’s have a look at an example code:
First we need to train the model.
JavaScript
x
72
72
1
import numpy as np
2
from keras import backend as K
3
from keras.models import Sequential
4
from keras.layers.core import Dense, Dropout, Activation, Flatten
5
from keras.layers.convolutional import Convolution2D, MaxPooling2D
6
from keras.preprocessing.image import ImageDataGenerator
7
from sklearn.metrics import classification_report, confusion_matrix
8
9
#Start
10
train_data_path = 'F://data//Train'
11
test_data_path = 'F://data//Validation'
12
img_rows = 150
13
img_cols = 150
14
epochs = 30
15
batch_size = 32
16
num_of_train_samples = 3000
17
num_of_test_samples = 600
18
19
#Image Generator
20
train_datagen = ImageDataGenerator(rescale=1. / 255,
21
rotation_range=40,
22
width_shift_range=0.2,
23
height_shift_range=0.2,
24
shear_range=0.2,
25
zoom_range=0.2,
26
horizontal_flip=True,
27
fill_mode='nearest')
28
29
test_datagen = ImageDataGenerator(rescale=1. / 255)
30
31
train_generator = train_datagen.flow_from_directory(train_data_path,
32
target_size=(img_rows, img_cols),
33
batch_size=batch_size,
34
class_mode='categorical')
35
36
validation_generator = test_datagen.flow_from_directory(test_data_path,
37
target_size=(img_rows, img_cols),
38
batch_size=batch_size,
39
class_mode='categorical')
40
41
# Build model
42
model = Sequential()
43
model.add(Convolution2D(32, (3, 3), input_shape=(img_rows, img_cols, 3), padding='valid'))
44
model.add(Activation('relu'))
45
model.add(MaxPooling2D(pool_size=(2, 2)))
46
47
model.add(Convolution2D(32, (3, 3), padding='valid'))
48
model.add(Activation('relu'))
49
model.add(MaxPooling2D(pool_size=(2, 2)))
50
51
model.add(Convolution2D(64, (3, 3), padding='valid'))
52
model.add(Activation('relu'))
53
model.add(MaxPooling2D(pool_size=(2, 2)))
54
55
model.add(Flatten())
56
model.add(Dense(64))
57
model.add(Activation('relu'))
58
model.add(Dropout(0.5))
59
model.add(Dense(5))
60
model.add(Activation('softmax'))
61
62
model.compile(loss='categorical_crossentropy',
63
optimizer='rmsprop',
64
metrics=['accuracy'])
65
66
#Train
67
model.fit_generator(train_generator,
68
steps_per_epoch=num_of_train_samples // batch_size,
69
epochs=epochs,
70
validation_data=validation_generator,
71
validation_steps=num_of_test_samples // batch_size)
72
Now after the model is trained let’s build a confusion matrix.
JavaScript
1
9
1
#Confution Matrix and Classification Report
2
Y_pred = model.predict_generator(validation_generator, num_of_test_samples // batch_size+1)
3
y_pred = np.argmax(Y_pred, axis=1)
4
print('Confusion Matrix')
5
print(confusion_matrix(validation_generator.classes, y_pred))
6
print('Classification Report')
7
target_names = ['Cats', 'Dogs', 'Horse']
8
print(classification_report(validation_generator.classes, y_pred, target_names=target_names))
9
Now this works fine so far. But how do I save it as png in the same layout as in the above sklearn example?
Advertisement
Answer
Like this (also see ConfusionMatrixDisplay
and confusion_matrix
):
JavaScript
1
17
17
1
from sklearn.metrics import ConfusionMatrixDisplay
2
from sklearn.metrics import confusion_matrix
3
import matplotlib.pyplot as plt
4
import numpy as np
5
6
7
y_pred = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2])
8
y_test = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 2])
9
labels = ["Cats", "Dogs", "Horses"]
10
11
cm = confusion_matrix(y_test, y_pred)
12
13
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)
14
15
disp.plot(cmap=plt.cm.Blues)
16
plt.show()
17
Result: