Я хочу получить UAR (невзвешенную точность) из матрицы путаницы для мониторинга UAR данных проверки. Однако с тензором сложно разобраться.
https://www.davidtvs.com/keras-custom-metrics/
Я ссылался на этот сайт и пытался создать свои собственные метрики в Керасе.
Я делаю метрики с помощью первого метода, который использует ModelCheckpoint
и EarlyStopping
, поддерживаемые Keras.
model.compile(loss='categorical_crossentropy',optimizer=adam, metrics=['accuracy', uar_accuracy])
Однако я не знаю, как определить функцию uar_accuracy
.
def uar_accuracy(y_true, y_pred):
# Calculate the label from one-hot encoding
pred_class_label = K.argmax(y_pred, axis=-1)
true_class_label = K.argmax(y_true, axis=-1)
cf_mat = tf.confusion_matrix(true_class_label, pred_class_label )
diag = tf.linalg.tensor_diag_part(cf_mat)
uar = K.mean(diag)
return uar
Этот результат возвращает среднее количество правильных данных для каждого класса.
Но я не хочу, чтобы среднее число правильных данных, , но я хочу среднее значение правильных вероятностей для каждого класса.
Как я могу это реализовать?
Я реализовал следующее для типа numpy, а не типа Tensor, используя библиотеки sklearn.metrics
и collections
def get_accuracy_and_cnf_matrix(label, predict):
uar = 0
accuracy = []
cnf_matrix = confusion_matrix(label, predict)
diag=np.diagonal(cnf_matrix)
for index,i in enumerate(diag):
uar+=i/collections.Counter(label)[index]
# cnf_marix (Number of corrects -> Accuracy)
cnf_matrix = np.transpose(cnf_matrix)
cnf_matrix = cnf_matrix*100 / cnf_matrix.astype(np.int).sum(axis=0)
cnf_matrix = np.transpose(cnf_matrix).astype(float)
cnf_matrix = np.around(cnf_matrix, decimals=2)
# WAR, UAR
test_weighted_accuracy = np.sum(label==predict)/len(label)*100
test_unweighted_accuracy = uar/len(cnf_matrix)*100
accuracy.append(test_weighted_accuracy)
accuracy.append(test_unweighted_accuracy)
return np.around(np.array(accuracy),decimals=2), cnf_matrix