Як отримати точність, F1, точність та відкликання для моделі кераса?


22

Я хочу обчислити точність, відкликання та показник 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, точність та відкликання? (Якщо це не складно, також оцінка перехресної перевірки, але не потрібна для цієї відповіді)

Дякую за будь-яку допомогу!

Відповіді:


22

Метрики видалено з ядра Кераса. Розрахувати їх потрібно вручну. Вони видалили їх у версії 2.0 . Ці показники - це все глобальні показники, але Керас працює партіями. Як результат, це може бути більше оманливим, ніж корисним.

Однак якщо вони вам справді потрібні, ви можете зробити це так

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)

якщо вони можуть ввести в оману, як тоді оцінити модель Кераса?
ZelelB

1
Оскільки Керас обчислює ці показники в кінці кожної партії, ви можете отримати різні результати від "реальних" показників. Альтернативним способом було б розділити ваш набір даних під час навчання та тестування та використовувати тестову частину для прогнозування результатів. Тоді, оскільки ви знаєте справжні етикетки, обчисліть точність і запам’ятайте вручну.
Тасос

Тасо, я можу запропонувати вам повторно опублікувати свою відповідь у цьому запитанні ТА: Як я повинен реалізувати точність та згадати показники в моїй моделі нейронної мережі в керах? Ура, Іракліс
пустеля

Вибачте, щойно побачив, що це було закрито :(
пустельний

Будь-яка ідея, чому це не працює для перевірки для мене? прекрасно працює для навчання.
Родріго Руїз

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-learn):

             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

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, prosjeний = 'мікро') і отримаю цю помилку при виконанні: AttributeError: 'Послідовний' об’єкт не має атрибута 'recision_recall_fscore_support'
ZelelB

Вам не потрібно вказувати model.recision_recall_fscore_support (), а просто recision_recall_fscore_support (Y_test, y_pred, prosjeний = 'micro') (без "моделі." І переконайтеся, що ви правильно імпортуєте: з sklearn.metrics import precision_recall_fscore_support)
В’ячеслав Комісаренко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.