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.