Bir keras modeli için doğruluk, F1, hassasiyet ve hatırlama nasıl elde edilir?


22

İkili KerasClassifier modelim için kesinlik, hatırlama ve F1 puanını hesaplamak istiyorum, ancak herhangi bir çözüm bulamıyorum.

İşte benim gerçek kod:

# 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]) 

Ve sonra ben yeni test verileri tahmin ve böyle karışıklık matrisi alıyorum:

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

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

Ancak doğruluk skoru, F1 skoru, kesinlik ve geri çağırma için herhangi bir çözüm var mı? (Karmaşık değilse, çapraz doğrulama skoru da vardır, ancak bu cevap için gerekli değildir)

Herhangi bir yardım için teşekkürler!

Yanıtlar:


22

Metrikler Keras çekirdeğinden kaldırıldı. Bunları manuel olarak hesaplamanız gerekir. 2.0 sürümünde kaldırmışlar . Bu metriklerin tümü küresel metriktir, ancak Keras toplu olarak çalışır. Sonuç olarak, yardımcı olmaktan daha yanıltıcı olabilir.

Ancak, gerçekten onlara ihtiyacınız varsa, bunu böyle yapabilirsiniz

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)

eğer yanıltıcı olabilirlerse, bir Keras'ın modeli nasıl değerlendirilir?
ZelelB

1
Keras her bir grubun sonunda bu metrikleri hesapladığından, "gerçek" metriklerden farklı sonuçlar alabilirsiniz. Alternatif bir yol, veri kümenizi eğitimde bölmek ve test etmek ve sonuçları tahmin etmek için test bölümünü kullanmaktır. Daha sonra gerçek etiketleri bildiğinizden, hassasiyeti hesaplayın ve manuel olarak geri çağırın.
Tasos

Taso, lütfen bu SO sorusunda cevabınızı tekrar göndermenizi tavsiye edebilirim: Keras'taki sinir ağı modelimde kesinlik ve hatırlama metriklerini nasıl uygulamalıyım? Cheers, Iraklis
desertnaut

Üzgünüz, kapatıldığını gördüm :(
desertnaut

Bunun benim için doğrulama üzerinde çalışmadığına dair bir fikrin var mı? eğitim için iyi çalışıyor.
Rodrigo Ruiz

13

Sen kullanabilirsiniz scikit-öğrenme sınıflandırma raporu . Etiketlerinizi sayısal veya ikili biçime dönüştürmek için scikit-learn etiket kodlayıcısına göz atın .

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

size (çıktılar scikit-learn örneğinden kopyalanır) verir:

             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
Kullandığım bu, basit ve etkili.
Matthew

2

Ayrıca aşağıda belirtildiği gibi deneyebilirsiniz.

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

Bunu denedim: model.recision_recall_fscore_support (Y_test, y_pred, average = 'micro') ve bu hatayı yürütmede alıyorum: AttributeError: 'Sıralı' nesnenin '
recision_recall_fscore_support

Model.recision_recall_fscore_support () belirtmeniz gerekmez, bunun yerine yalnızca recision_recall_fscore_support (Y_test, y_pred, average = 'micro') ("model" olmadan) ve doğru içe aktarma yaptığınızdan emin olun: sklearn.metrics import accuracy_recall_fscore_support)
Viacheslav Komisarenko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.