Как получить точность, F1, точность и отзыв, для модели Keras?

21

Я хочу вычислить точность, отзыв и оценку F1 для моей двоичной модели KerasClassifier, но не нашел никакого решения.

Вот мой фактический код:

# Split dataset in train and test data 
X_train, X_test, Y_train, Y_test = train_test_split(normalized_X, Y, test_size=0.3, random_state=seed)

# Build the model
model = Sequential()
model.add(Dense(23, input_dim=45, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))

# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])


tensorboard = TensorBoard(log_dir="logs/{}".format(time.time()))

time_callback = TimeHistory()

# Fit the model
history = model.fit(X_train, Y_train, validation_split=0.3, epochs=200, batch_size=5, verbose=1, callbacks=[tensorboard, time_callback]) 

А затем я прогнозирую новые данные испытаний и получаю матрицу путаницы, например:

y_pred = model.predict(X_test)
y_pred =(y_pred>0.5)
list(y_pred)

cm = confusion_matrix(Y_test, y_pred)
print(cm)

Но есть ли какое-либо решение, чтобы получить оценку точности, оценку F1, точность и отзыв? (Если не сложно, также оценка перекрестной проверки, но не обязательно для этого ответа)

Спасибо за любую помощь!

ZelelB
источник

Ответы:

20

Метрики были удалены из ядра Keras. Вы должны рассчитать их вручную. Они удалили их на версии 2.0 . Все эти показатели являются глобальными, но Keras работает в пакетном режиме. В результате это может быть скорее вводящим в заблуждение, чем полезным.

Однако, если они вам действительно нужны, вы можете сделать это так

from keras import backend as K

def recall_m(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

def precision_m(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

def f1_m(y_true, y_pred):
    precision = precision_m(y_true, y_pred)
    recall = recall_m(y_true, y_pred)
    return 2*((precision*recall)/(precision+recall+K.epsilon()))

# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc',f1_m,precision_m, recall_m])

# fit the model
history = model.fit(Xtrain, ytrain, validation_split=0.3, epochs=10, verbose=0)

# evaluate the model
loss, accuracy, f1_score, precision, recall = model.evaluate(Xtest, ytest, verbose=0)
Тасос
источник
если они могут ввести в заблуждение, как оценить модель Keras' тогда?
ZelelB
1
Поскольку Keras вычисляет эти метрики в конце каждого пакета, вы можете получить разные результаты от «реальных» метрик. Альтернативным способом было бы разделить ваш набор данных при обучении и тестировании и использовать тестовую часть для прогнозирования результатов. Затем, поскольку вы знаете настоящие метки, рассчитайте точность и отзовитесь вручную.
Тасос
Тасо, могу ли я любезно предложить вам опубликовать свой ответ в следующем вопросе: как мне реализовать точность и вызвать метрики в моей модели нейронной сети в кератах? Приветствия, Ираклис
пустыненав
Извините, только что увидел, что это было закрыто :(
пустыненав
Любая идея, почему это не работает для проверки для меня? отлично работает для обучения.
Родриго Ruiz
13

Вы можете использовать отчет о классификации scikit-learn . Чтобы преобразовать ваши метки в числовой или двоичный формат, взгляните на кодировщик меток scikit-learn .

from sklearn.metrics import classification_report

y_pred = model.predict(x_test, batch_size=64, verbose=1)
y_pred_bool = np.argmax(y_pred, axis=1)

print(classification_report(y_test, y_pred_bool))

который дает вам (выход скопированный из scikit учиться пример):

             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
Matze
источник
2
Это то, что я использую, просто и эффективно.
Мэтью
2

Вы также можете попробовать, как указано ниже.

from sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix
y_pred1 = model.predict(X_test)
y_pred = np.argmax(y_pred1, axis=1)

# Print f1, precision, and recall scores
print(precision_score(y_test, y_pred , average="macro"))
print(recall_score(y_test, y_pred , average="macro"))
print(f1_score(y_test, y_pred , average="macro"))
Ашок Кумар Джаяраман
источник
0

Попробуйте это: https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html с Y_test, y_pred в качестве параметров.

Вячеслав Комисаренко
источник
Я попробовал это: model.recision_recall_fscore_support (Y_test, y_pred, average = 'micro') и получил эту ошибку при выполнении: AttributeError: у объекта 'Sequential' нет атрибута 'recision_recall_fscore_support'
ZelelB
Вам не нужно указывать model.recision_recall_fscore_support (), скорее просто recision_recall_fscore_support (Y_test, y_pred, average = 'micro') (без "model." И убедитесь, что вы имеете правильный импорт: из sklearn.metrics import precision_recall_fscore_support)
Вячеслав Комисаренко