Je travaille sur un problème de régression. Une des métriques de performance pour ce problème est la "précision de signe", ce qui signifie que je veux voir si la valeur de prédiction a le même signe de la vraie valeur. Je sais que mse
pourrait en quelque sorte montrer la proximité entre la valeur prédite et la vraie valeur, mais j'aimerais voir la précision du signe lors de la validation. Pour être plus précis, après l'entraînement, j'utilise la méthode ci-dessous pour vérifier la précision. Ce que je veux personnaliser les métriques est de réaliser le chemin ci-dessous lors de la validation. (np.multiply(predict_label,test_label)>0).sum()/float(predict_label.shape[0])
Mesures personnalisées dans keras pour évaluer la prédiction des signes
1
A
Répondre
0
Vous pouvez la mettre en œuvre de manière similaire à la précision:
def sign_accuracy(y_true, y_pred):
return K.mean(K.greater(y_true * y_pred, 0.), axis=-1)
Pour le tester:
y_true = np.random.rand(5, 1) - 0.5
y_pred = np.random.rand(5, 1) - 0.5
acc = K.eval(sign_accuracy(K.variable(y_true), K.variable(y_pred)))
print(y_true)
[[ 0.20410185]
[ 0.12085985]
[ 0.39697642]
[-0.28178138]
[-0.37796012]]
print(y_pred)
[[-0.38281826]
[ 0.14268927]
[ 0.19218624]
[ 0.21394845]
[ 0.04044269]]
print(acc)
[ 0. 1. 1. 0. 0.]
La moyenne sur l'axe 0 est prise automatiquement par Keras lorsque vous appelez fit()
ou evaluate()
, vous n'avez donc pas besoin de totaliser acc
et le diviser par y_pred.shape[0]
.
Cette mesure peut également être appliquée aux variables multidimensionnelles:
y_true = np.random.rand(5, 3) - 0.5
y_pred = np.random.rand(5, 3) - 0.5
acc = K.eval(sign_accuracy(K.variable(y_true), K.variable(y_pred)))
print(y_true)
[[ 0.02745352 -0.27927986 -0.47882833]
[-0.40950793 -0.16218984 0.19184008]
[ 0.25002487 -0.08455175 -0.03606459]
[ 0.09315503 -0.19825522 0.19801222]
[-0.32129431 -0.02256616 0.47799333]]
print(y_pred)
[[-0.06733171 0.18156806 0.28396574]
[ 0.04054056 -0.45898607 -0.10661648]
[-0.05162396 -0.34005141 -0.25910923]
[-0.26283177 0.01532359 0.33764032]
[ 0.2754057 0.26896232 0.23089488]]
print(acc)
[ 0. 0.33333334 0.66666669 0.33333334 0.33333334]
Pour le premier cas, vous donnez, peut être la sortie désirée '40%' 'ou 0.4'? Voulez-vous dire que si je mets ce 'sign_accuracy' à la commande' model.compile (optimizer = 'adam', perte = 'mae', metrics = [sign_accuracy]) ', j'obtiendra' 0.4'? – Wedoso
Oui. Keras prend la moyenne en interne. –