keras 모델의 정확도, F1, 정밀도 및 리콜을 얻는 방법?


22

바이너리 KerasClassifier 모델의 정밀도, 리콜 및 F1- 점수를 계산하고 싶지만 해결책을 찾지 못했습니다.

내 실제 코드는 다음과 같습니다.

# 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

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는 각 배치가 끝날 때 해당 메트릭을 계산하므로 "실제"메트릭에서 다른 결과를 얻을 수 있습니다. 다른 방법은 교육 및 테스트에서 데이터 집합을 분할하고 테스트 부분을 사용하여 결과를 예측하는 것입니다. 그런 다음 실제 레이블을 알고 있으므로 정밀도를 계산하고 수동으로 호출하십시오.
Tasos

Taso,이 SO 질문에 답을 다시 게시하도록 제안하십시오. 케라의 신경망 모델에서 정밀도를 구현하고 메트릭을 호출하는 방법은 무엇입니까? 건배, Iraklis
desertnaut

죄송합니다, 그것이 닫혔습니다. :
desertnaut

왜 이것이 나를 위해 유효성 검사를 수행하지 않는지 알고 있습니까? 훈련을 위해 잘 작동합니다.
로드리고 루이즈

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
이것이 내가 사용하는 단순하고 효과적인 것입니다.
Matthew

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"없이)를 지정하고 올바른 가져 오기가 있는지 확인하십시오. from sklearn.metrics import precision_recall_fscore_support)
Viacheslav Komisarenko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.