Làm thế nào để có được độ chính xác, F1, độ chính xác và thu hồi, cho một mô hình máy ảnh?


18

Tôi muốn tính toán độ chính xác, thu hồi và điểm F1 cho mô hình KerasClassifier nhị phân của mình, nhưng không tìm thấy bất kỳ giải pháp nào.

Đây là mã thực tế của tôi:

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

Và sau đó tôi dự đoán về dữ liệu thử nghiệm mới và nhận được ma trận nhầm lẫn như thế này:

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

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

Nhưng có giải pháp nào để có được điểm chính xác, điểm F1, độ chính xác và thu hồi không? (Nếu không phức tạp, cũng là điểm xác thực chéo, nhưng không cần thiết cho câu trả lời này)

Cảm ơn bạn đã giúp đỡ!

Câu trả lời:


17

Số liệu đã được loại bỏ khỏi lõi Keras. Bạn cần tính toán chúng bằng tay. Họ đã loại bỏ chúng trên phiên bản 2.0 . Các số liệu đó là tất cả các số liệu toàn cầu, nhưng Keras hoạt động theo lô. Kết quả là, nó có thể gây hiểu lầm nhiều hơn là hữu ích.

Tuy nhiên, nếu bạn thực sự cần chúng, bạn có thể làm như thế này

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)

Nếu chúng có thể gây hiểu lầm, làm thế nào để đánh giá mô hình của Keras?
ZelelB

1
Vì Keras tính toán các số liệu đó vào cuối mỗi đợt, nên bạn có thể nhận được các kết quả khác nhau từ các số liệu "thực". Một cách khác là chia nhỏ tập dữ liệu của bạn trong đào tạo và kiểm tra và sử dụng phần kiểm tra để dự đoán kết quả. Sau đó, vì bạn biết nhãn thực, tính toán độ chính xác và thu hồi bằng tay.
TASos

Taso, tôi có thể vui lòng đề nghị bạn đăng lại câu trả lời của mình trong câu hỏi SO này không: Làm thế nào tôi nên thực hiện độ chính xác và nhớ lại các số liệu trong mô hình mạng thần kinh của mình trong máy ảnh? Chúc mừng, Iraklis
Sahnaut

Xin lỗi, chỉ cần thấy nó đã bị đóng :(
Sahnaut

Bất cứ ý tưởng tại sao điều này không làm việc xác nhận cho tôi? hoạt động tốt cho đào tạo.
Rodrigo Ruiz

11

Bạn có thể sử dụng báo cáo phân loại scikit-learn . Để chuyển đổi nhãn của bạn thành định dạng số hoặc nhị phân, hãy xem bộ mã hóa nhãn 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))

cung cấp cho bạn (đầu ra được sao chép từ ví dụ 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
Đây là những gì tôi sử dụng, đơn giản và hiệu quả.
Matthew

2

Bạn cũng có thể thử như được đề cập dưới đây.

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

Tôi cố gắng này: model.recision_recall_fscore_support (Y_test, y_pred, trung bình = 'vi') và nhận được lỗi này trên thực hiện: AttributeError: đối tượng 'tuần tự' không có thuộc tính 'recision_recall_fscore_support'
ZelelB

Bạn không cần phải xác định model.recision_recall_fscore_support (), chứ không phải chỉ recision_recall_fscore_support (Y_test, y_pred, trung bình = 'vi') (không có và chắc chắn rằng bạn có nhập đúng "mô hình.": Từ sklearn.metrics nhập precision_recall_fscore_support)
Viacheslav Komisarenko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.