Получение точности, отзыва и F1 баллов за класс в Керасе
Я обучил нейронную сеть, используя бэкэнд TensorFlow в Keras (2.1.5), и я также использовал библиотеку keras-contrib (2.0.8), чтобы добавить слой CRF в качестве выхода для сети.
Я хотел бы знать, как я могу получить точность, отзыв и оценку f1 для каждого класса после прогнозирования на тестовом наборе с использованием NN.
3 ответа
Предположим, что у вас есть функция get_model()
который строит вашу точно такую же модель, которую вы обучили, и путь weights_path
указывая на ваш файл HDF5, содержащий веса вашей модели:
model = get_model()
model.load_weights(weights_path)
Это должно правильно загрузить вашу модель. Тогда вам просто нужно определить ImageDataGenerator
ваших тестовых данных и подгоните модель для получения прогнозов:
# Path to your folder testing data
testing_folder = ""
# Image size (set up the image size used for training)
img_size = 256
# Batch size (you should tune it based on your memory)
batch_size = 16
val_datagen = ImageDataGenerator(
rescale=1. / 255)
validation_generator = val_datagen.flow_from_directory(
testing_folder,
target_size=(img_size, img_size),
batch_size=batch_size,
shuffle=False,
class_mode='categorical')
Затем вы можете заставить модель генерировать все прогнозы по всему набору данных, используя model.predict_generator()
метод:
# Number of steps corresponding to an epoch
steps = 100
predictions = model.predict_generator(validation_generator, steps=steps)
И, наконец, создать матрицу путаницы, используя metrics.confusion_matrix()
метод из sklearn
пакет:
val_preds = np.argmax(predictions, axis=-1)
val_trues = validation_generator.classes
cm = metrics.confusion_matrix(val_trues, val_preds)
Или получить все точности, отзывы и f1-оценки для всех классов, используя metrics.precision_recall_fscore_support()
метод из sklearn
(аргумент average=None
выводит показатели для всех классов):
# label names
labels = validation_generator.class_indices.keys()
precisions, recall, f1_score, _ = metrics.precision_recall_fscore_support(val_trues, val_preds, labels=labels)
Я не проверял это, но я думаю, это поможет вам.
Посмотри на sklearn.metrics.classification_report
:
from sklearn.metrics import classification_report
y_pred = model.predict(x_test)
print(classification_report(y_true, y_pred))
дает вам что-то вроде
precision recall f1-score support
class 0 0.50 1.00 0.67 1
class 1 0.00 0.00 0.00 1
class 2 1.00 0.67 0.80 3
avg / total 0.70 0.60 0.61 5
Смотри мой вопрос, где мне интересно, правильно ли я это делаю. Если да, то это может быть ответом на ваш вопрос.