Десятичная дробь для точности, отзыва, точности и f-меры - PullRequest
0 голосов
/ 10 марта 2020

Я провожу эксперимент CNN и оцениваю построенный классификатор, используя метрики точности, отзыва, точности и f-меры.

Полученные значения представляют собой только две десятичные дроби (т. Е. 0,95). Как я могу иметь по крайней мере 4 цифры дроби (то есть 0,9532)

Далее, как я могу округлить полученные значения, чтобы иметь пол или потолок округленного числа?

from keras.models import Sequential
from keras.layers import Conv2D,Activation,MaxPooling2D,Dense,Flatten,Dropout
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from IPython.display import display
import matplotlib.pyplot as plt
from PIL import Image
from sklearn.metrics import classification_report, confusion_matrix
import keras
from keras.layers import BatchNormalization
from keras.optimizers import Adam
import pickle
from keras.models import load_model
classifier = load_model('32_With_Dropout_rl_001_1_layer_2.h5')
classifier1 = load_model('32_With_Dropout_rl_001_2_layers_2.h5')
classifier2 = load_model('32_With_Dropout_rl_001_3_layers_2.h5')
test_datagen = ImageDataGenerator(rescale = 1./255)
batchsize=10
test_set = test_datagen.flow_from_directory('/home/osboxes/Downloads/Downloads/Journal_Paper/Benign_Malicious/Spectrogram/Test/',
                                           target_size = (200,200),
                                           batch_size = batchsize,
                       shuffle=False,
                                           class_mode ='categorical')
Y_pred = classifier.predict_generator(test_set, steps= 1023 // batchsize+1)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix 1 layer')
print(confusion_matrix(test_set.classes, y_pred))
print('Classification Report')
target_names = test_set.classes
class_labels = list(test_set.class_indices.keys()) 
target_names = ['Bening', 'Malicious'] 
report = classification_report(test_set.classes, y_pred, target_names=class_labels)
print(report) 

Y_pred = classifier1.predict_generator(test_set, steps= 1023 // batchsize+1)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix 2 layers')
print(confusion_matrix(test_set.classes, y_pred))
print('Classification Report')
target_names = test_set.classes
class_labels = list(test_set.class_indices.keys()) 
target_names = ['Bening', 'Malicious'] 
report = classification_report(test_set.classes, y_pred, target_names=class_labels)
print(report) 

Y_pred = classifier2.predict_generator(test_set, steps= 1023 // batchsize+1)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix 3 layers')
print(confusion_matrix(test_set.classes, y_pred))
print('Classification Report')
target_names = test_set.classes
class_labels = list(test_set.class_indices.keys()) 
target_names = ['Bening', 'Malicious'] 
report = classification_report(test_set.classes, y_pred, target_names=class_labels)
print(report) 


#f = open('32_With_Dropout_rl_001_1_layer', 'rb')
#history = pickle.load(f)

#f = open('32_With_Dropout_rl_001_2_layers', 'rb')
#history1 = pickle.load(f)


#f = open('32_With_Dropout_rl_001_3_layers', 'rb')
#history2 = pickle.load(f)





1 Ответ

1 голос
/ 10 марта 2020

Вам просто нужно использовать параметр output_dict при расчете отчета о классификации. Если установлено значение True, выходные данные возвращаются как dict (а не как строка). Затем вы можете получить доступ ко всем полям и изменить их по своему усмотрению (например, используя math.floor или math.ceil).

from math import ceil, floor

# do your stuff here
report = classification_report(..., output_dict=True)
# use the values of the report dictionary as you wish
print(floor(report[...]))

Если вы хотите получить отчет в виде строки, вам следует использовать digits параметр:

report = classification_report(..., digits=4)

Проверьте документацию здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...